ZGlmZiAtLWdpdCBhL0RlbW8vdGl4L3NhbXBsZXMvQmFsbG9vbi5weSBiL0RlbW8vdGl4L3NhbXBsZXMvQmFsbG9vbi5weQppbmRleCA4MjVhZTZhLi4yMjk1OTA1IDEwMDc1NQotLS0gYS9EZW1vL3RpeC9zYW1wbGVzL0JhbGxvb24ucHkKKysrIGIvRGVtby90aXgvc2FtcGxlcy9CYWxsb29uLnB5CkBAIC0xNyw3ICsxNyw3IEBACiAKIGltcG9ydCBUaXgKIAotVENMX0FMTF9FVkVOVFMJCT0gMAorVENMX0FMTF9FVkVOVFMgICAgICAgICAgPSAwCiAKIGRlZiBSdW5TYW1wbGUgKHJvb3QpOgogICAgIGJhbGxvb24gPSBEZW1vQmFsbG9vbihyb290KQpkaWZmIC0tZ2l0IGEvRGVtby90aXgvc2FtcGxlcy9CdG5Cb3gucHkgYi9EZW1vL3RpeC9zYW1wbGVzL0J0bkJveC5weQppbmRleCA1N2QwMmRmLi5hZjJhMmE4IDEwMDc1NQotLS0gYS9EZW1vL3RpeC9zYW1wbGVzL0J0bkJveC5weQorKysgYi9EZW1vL3RpeC9zYW1wbGVzL0J0bkJveC5weQpAQCAtMSw1ICsxLDUgQEAKICMgLSotbW9kZTogcHl0aG9uOyBmaWxsLWNvbHVtbjogNzU7IHRhYi13aWR0aDogODsgY29kaW5nOiBpc28tbGF0aW4tMS11bml4IC0qLQotIyAKKyMKICMgJElkJAogIwogIyBUaXggRGVtb3N0cmF0aW9uIFByb2dyYW0KQEAgLTIxLDcgKzIxLDcgQEAKICAgICAjIENyZWF0ZSB0aGUgbGFiZWwgb24gdGhlIHRvcCBvZiB0aGUgZGlhbG9nIGJveAogICAgICMKICAgICB0b3AgPSBUaXguTGFiZWwodywgcGFkeD0yMCwgcGFkeT0xMCwgYmQ9MSwgcmVsaWVmPVRpeC5SQUlTRUQsCi0JCSAgICBhbmNob3I9VGl4LkNFTlRFUiwgdGV4dD0nVGhpcyBkaWFsb2cgYm94IGlzXG4gYSBkZW1vbnN0cmF0aW9uIG9mIHRoZVxuIHRpeEJ1dHRvbkJveCB3aWRnZXQnKQorICAgICAgICAgICAgICAgICAgICBhbmNob3I9VGl4LkNFTlRFUiwgdGV4dD0nVGhpcyBkaWFsb2cgYm94IGlzXG4gYSBkZW1vbnN0cmF0aW9uIG9mIHRoZVxuIHRpeEJ1dHRvbkJveCB3aWRnZXQnKQogCiAgICAgIyBDcmVhdGUgdGhlIGJ1dHRvbiBib3ggYW5kIGFkZCBhIGZldyBidXR0b25zIGluIGl0LiBTZXQgdGhlCiAgICAgIyAtd2lkdGggb2YgYWxsIHRoZSBidXR0b25zIHRvIHRoZSBzYW1lIHZhbHVlIHNvIHRoYXQgdGhleQpAQCAtMzIsOSArMzIsOSBAQAogICAgICMKICAgICBib3ggPSBUaXguQnV0dG9uQm94KHcsIG9yaWVudGF0aW9uPVRpeC5IT1JJWk9OVEFMKQogICAgIGJveC5hZGQoJ29rJywgdGV4dD0nT0snLCB1bmRlcmxpbmU9MCwgd2lkdGg9NSwKLQkgICAgY29tbWFuZD1sYW1iZGEgdz13OiB3LmRlc3Ryb3koKSkKKyAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhIHc9dzogdy5kZXN0cm95KCkpCiAgICAgYm94LmFkZCgnY2xvc2UnLCB0ZXh0PSdDYW5jZWwnLCB1bmRlcmxpbmU9MCwgd2lkdGg9NSwKLQkgICAgY29tbWFuZD1sYW1iZGEgdz13OiB3LmRlc3Ryb3koKSkKKyAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhIHc9dzogdy5kZXN0cm95KCkpCiAgICAgYm94LnBhY2soc2lkZT1UaXguQk9UVE9NLCBmaWxsPVRpeC5YKQogICAgIHRvcC5wYWNrKHNpZGU9VGl4LlRPUCwgZmlsbD1UaXguQk9USCwgZXhwYW5kPTEpCiAKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L3NhbXBsZXMvQ21wSW1nLnB5IGIvRGVtby90aXgvc2FtcGxlcy9DbXBJbWcucHkKaW5kZXggNGUwOGRmNy4uNDcyMGExMCAxMDA3NTUKLS0tIGEvRGVtby90aXgvc2FtcGxlcy9DbXBJbWcucHkKKysrIGIvRGVtby90aXgvc2FtcGxlcy9DbXBJbWcucHkKQEAgLTEsNSArMSw1IEBACiAjIC0qLW1vZGU6IHB5dGhvbjsgZmlsbC1jb2x1bW46IDc1OyB0YWItd2lkdGg6IDg7IGNvZGluZzogaXNvLWxhdGluLTEtdW5peCAtKi0KLSMgCisjCiAjICRJZCQKICMKICMgVGl4IERlbW9zdHJhdGlvbiBQcm9ncmFtCkBAIC0yMiwxMyArMjIsMTMgQEAKIC8qIHdpZHRoIGhlaWdodCBuY29sb3JzIGNoYXJzX3Blcl9waXhlbCAqLwogIjMyIDMyIDcgMSIsCiAvKiBjb2xvcnMgKi8KLSIgCXMgTm9uZQljIE5vbmUiLAotIi4JYyAjMDAwMDAwMDAwMDAwIiwKLSJYCWMgd2hpdGUiLAotIm8JYyAjYzAwMGMwMDBjMDAwIiwKLSJPCWMgIzQwNDA0MCIsCi0iKwljIGJsdWUiLAotIkAJYyByZWQiLAorIiAgICAgICBzIE5vbmUgIGMgTm9uZSIsCisiLiAgICAgIGMgIzAwMDAwMDAwMDAwMCIsCisiWCAgICAgIGMgd2hpdGUiLAorIm8gICAgICBjICNjMDAwYzAwMGMwMDAiLAorIk8gICAgICBjICM0MDQwNDAiLAorIisgICAgICBjIGJsdWUiLAorIkAgICAgICBjIHJlZCIsCiAvKiBwaXhlbHMgKi8KICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCiAiICAgICAgICAgICAgICAgICAuLi4uLi4uLi4uLi4uLiAiLApAQCAtNjksMTEgKzY5LDExIEBACiAvKiB3aWR0aCBoZWlnaHQgbmNvbG9ycyBjaGFyc19wZXJfcGl4ZWwgKi8KICIzMiAzMiA1IDEiLAogLyogY29sb3JzICovCi0iIAlzIE5vbmUJYyBOb25lIiwKLSIuCWMgIzAwMDAwMDAwMDAwMCIsCi0iWAljIHdoaXRlIiwKLSJvCWMgI2MwMDBjMDAwYzAwMCIsCi0iTwljICM4MDAwODAwMDgwMDAiLAorIiAgICAgICBzIE5vbmUgIGMgTm9uZSIsCisiLiAgICAgIGMgIzAwMDAwMDAwMDAwMCIsCisiWCAgICAgIGMgd2hpdGUiLAorIm8gICAgICBjICNjMDAwYzAwMGMwMDAiLAorIk8gICAgICBjICM4MDAwODAwMDgwMDAiLAogLyogcGl4ZWxzICovCiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKQEAgLTE0NiwxMCArMTQ2LDEwIEBACiBkZWYgUnVuU2FtcGxlKHcpOgogICAgIHcuaW1nMCA9IFRpeC5JbWFnZSgncGl4bWFwJywgZGF0YT1uZXR3b3JrX3BpeG1hcCkKICAgICBpZiBub3Qgdy5pbWcwOgotCXcuaW1nMCA9IFRpeC5JbWFnZSgnYml0bWFwJywgZGF0YT1uZXR3b3JrX2JpdG1hcCkKKyAgICAgICAgdy5pbWcwID0gVGl4LkltYWdlKCdiaXRtYXAnLCBkYXRhPW5ldHdvcmtfYml0bWFwKQogICAgIHcuaW1nMSA9IFRpeC5JbWFnZSgncGl4bWFwJywgZGF0YT1oYXJkX2Rpc2tfcGl4bWFwKQogICAgIGlmIG5vdCB3LmltZzA6Ci0Jdy5pbWcxID0gVGl4LkltYWdlKCdiaXRtYXAnLCBkYXRhPWhhcmRfZGlza19iaXRtYXApCisgICAgICAgIHcuaW1nMSA9IFRpeC5JbWFnZSgnYml0bWFwJywgZGF0YT1oYXJkX2Rpc2tfYml0bWFwKQogCiAgICAgaGRkID0gVGl4LkJ1dHRvbih3LCBwYWR4PTQsIHBhZHk9MSwgd2lkdGg9MTIwKQogICAgIG5ldCA9IFRpeC5CdXR0b24odywgcGFkeD00LCBwYWR5PTEsIHdpZHRoPTEyMCkKQEAgLTE2Myw3ICsxNjMsNyBAQAogICAgIHcuaGRkX2ltZyA9IFRpeC5JbWFnZSgnY29tcG91bmQnLCB3aW5kb3c9aGRkKQogICAgIHcuaGRkX2ltZy50ay5jYWxsKHN0cih3LmhkZF9pbWcpLCAnYWRkJywgJ2xpbmUnKQogICAgIHcuaGRkX2ltZy50ay5jYWxsKHN0cih3LmhkZF9pbWcpLCAnYWRkJywgJ3RleHQnLCAnLXRleHQnLCAnSGFyZCBEaXNrJywKLQkJICAgICctdW5kZXJsaW5lJywgJzAnKQorICAgICAgICAgICAgICAgICAgICAnLXVuZGVybGluZScsICcwJykKICAgICB3LmhkZF9pbWcudGsuY2FsbChzdHIody5oZGRfaW1nKSwgJ2FkZCcsICdzcGFjZScsICctd2lkdGgnLCAnNycpCiAgICAgdy5oZGRfaW1nLnRrLmNhbGwoc3RyKHcuaGRkX2ltZyksICdhZGQnLCAnaW1hZ2UnLCAnLWltYWdlJywgdy5pbWcxKQogCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICB3Lm5ldF9pbWcgPSBUaXguSW1hZ2UoJ2NvbXBvdW5kJywgd2luZG93PW5ldCkKICAgICB3Lm5ldF9pbWcudGsuY2FsbChzdHIody5uZXRfaW1nKSwgJ2FkZCcsICdsaW5lJykKICAgICB3Lm5ldF9pbWcudGsuY2FsbChzdHIody5uZXRfaW1nKSwgJ2FkZCcsICd0ZXh0JywgJy10ZXh0JywgJ05ldHdvcmsnLAotCQkgICAgJy11bmRlcmxpbmUnLCAnMCcpCisgICAgICAgICAgICAgICAgICAgICctdW5kZXJsaW5lJywgJzAnKQogICAgIHcubmV0X2ltZy50ay5jYWxsKHN0cih3Lm5ldF9pbWcpLCAnYWRkJywgJ3NwYWNlJywgJy13aWR0aCcsICc3JykKICAgICB3Lm5ldF9pbWcudGsuY2FsbChzdHIody5uZXRfaW1nKSwgJ2FkZCcsICdpbWFnZScsICctaW1hZ2UnLCB3LmltZzApCiAKQEAgLTE4NCw3ICsxODQsNyBAQAogICAgIG5ldFsnaW1hZ2UnXSA9IHcubmV0X2ltZwogCiAgICAgY2xvc2UgPSBUaXguQnV0dG9uKHcsIHBhZHk9MSwgdGV4dD0nQ2xvc2UnLAotCQkgICAgICAgY29tbWFuZD1sYW1iZGEgdz13OiB3LmRlc3Ryb3koKSkKKyAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1sYW1iZGEgdz13OiB3LmRlc3Ryb3koKSkKIAogICAgIGhkZC5wYWNrKHNpZGU9VGl4LkxFRlQsIHBhZHg9MTAsIHBhZHk9MTAsIGZpbGw9VGl4LlksIGV4cGFuZD0xKQogICAgIG5ldC5wYWNrKHNpZGU9VGl4LkxFRlQsIHBhZHg9MTAsIHBhZHk9MTAsIGZpbGw9VGl4LlksIGV4cGFuZD0xKQpAQCAtMTk0LDQgKzE5NCwzIEBACiAgICAgcm9vdCA9IFRpeC5UaygpCiAgICAgUnVuU2FtcGxlKHJvb3QpCiAgICAgcm9vdC5tYWlubG9vcCgpCi0gCmRpZmYgLS1naXQgYS9EZW1vL3RpeC9zYW1wbGVzL0NvbWJvQm94LnB5IGIvRGVtby90aXgvc2FtcGxlcy9Db21ib0JveC5weQppbmRleCBhZmVjZWE0Li45MTQwOTg3IDEwMDc1NQotLS0gYS9EZW1vL3RpeC9zYW1wbGVzL0NvbWJvQm94LnB5CisrKyBiL0RlbW8vdGl4L3NhbXBsZXMvQ29tYm9Cb3gucHkKQEAgLTEsNSArMSw1IEBACiAjIC0qLW1vZGU6IHB5dGhvbjsgZmlsbC1jb2x1bW46IDc1OyB0YWItd2lkdGg6IDg7IGNvZGluZzogaXNvLWxhdGluLTEtdW5peCAtKi0KLSMgCisjCiAjICRJZCQKICMKICMgVGl4IERlbW9zdHJhdGlvbiBQcm9ncmFtCkBAIC0yNywyNSArMjcsMjUgQEAKICAgICAjIHRvIGludmVudCBuZXcgbW9udGhzPwogICAgICMKICAgICAjIFtIaW50XSBUaGUgLW9wdGlvbnMgc3dpdGNoIHNldHMgdGhlIG9wdGlvbnMgb2YgdGhlIHN1YndpZGdldHMuCi0gICAgIyBbSGludF0gV2Ugc2V0IHRoZSBsYWJlbC53aWR0aCBzdWJ3aWRnZXQgb3B0aW9uIG9mIGJvdGggY29tYm9ib3hlcyB0byAKKyAgICAjIFtIaW50XSBXZSBzZXQgdGhlIGxhYmVsLndpZHRoIHN1YndpZGdldCBvcHRpb24gb2YgYm90aCBjb21ib2JveGVzIHRvCiAgICAgIyAgICAgICAgYmUgMTAgc28gdGhhdCB0aGVpciBsYWJlbHMgYXBwZWFyIHRvIGJlIGFsaWduZWQuCiAgICAgIwogICAgIGEgPSBUaXguQ29tYm9Cb3godG9wLCBsYWJlbD0iTW9udGg6ICIsIGRyb3Bkb3duPTEsCi0JY29tbWFuZD1zZWxlY3RfbW9udGgsIGVkaXRhYmxlPTAsIHZhcmlhYmxlPWRlbW9fbW9udGgsCi0Jb3B0aW9ucz0nbGlzdGJveC5oZWlnaHQgNiBsYWJlbC53aWR0aCAxMCBsYWJlbC5hbmNob3IgZScpCisgICAgICAgIGNvbW1hbmQ9c2VsZWN0X21vbnRoLCBlZGl0YWJsZT0wLCB2YXJpYWJsZT1kZW1vX21vbnRoLAorICAgICAgICBvcHRpb25zPSdsaXN0Ym94LmhlaWdodCA2IGxhYmVsLndpZHRoIDEwIGxhYmVsLmFuY2hvciBlJykKIAogICAgICMgJHcudG9wLmIgaXMgYSBub24tZHJvcC1kb3duIGNvbWJvIGJveC4gSXQgaXMgbm90IGVkaXRhYmxlOiB3ZSBwcm92aWRlCiAgICAgIyBmb3VyIGNob2ljZXMgZm9yIHRoZSB1c2VyLCBidXQgaGUgY2FuIGVudGVyIGFuIGFsdGVybmF0aXZlIHllYXIgaWYgaGUKICAgICAjIHdhbnRzIHRvLgogICAgICMKICAgICAjIFtIaW50XSBVc2UgdGhlIHBhZFkgYW5kIGFuY2hvciBvcHRpb25zIG9mIHRoZSBsYWJlbCBzdWJ3aWRnZXQgdG8KLSAgICAjCSAgICAgYWxpZ24gdGhlIGxhYmVsIHdpdGggdGhlIGVudHJ5IHN1YndpZGdldC4KKyAgICAjICAgICAgICBhbGlnbiB0aGUgbGFiZWwgd2l0aCB0aGUgZW50cnkgc3Vid2lkZ2V0LgogICAgICMgW0hpbnRdIE5vdGljZSB0aGF0IHlvdSBzaG91bGQgdXNlIHBhZFkgKHRoZSBOQU1FIG9mIHRoZSBvcHRpb24pIGFuZCBub3QKICAgICAjICAgICAgICBwYWR5ICh0aGUgU1dJVENIIG9mIHRoZSBvcHRpb24pLgogICAgICMKICAgICBiID0gVGl4LkNvbWJvQm94KHRvcCwgbGFiZWw9IlllYXI6ICIsIGRyb3Bkb3duPTAsCi0JY29tbWFuZD1zZWxlY3RfeWVhciwgZWRpdGFibGU9MSwgdmFyaWFibGU9ZGVtb195ZWFyLAotCW9wdGlvbnM9J2xpc3Rib3guaGVpZ2h0IDQgbGFiZWwucGFkWSA1IGxhYmVsLndpZHRoIDEwIGxhYmVsLmFuY2hvciBuZScpCisgICAgICAgIGNvbW1hbmQ9c2VsZWN0X3llYXIsIGVkaXRhYmxlPTEsIHZhcmlhYmxlPWRlbW9feWVhciwKKyAgICAgICAgb3B0aW9ucz0nbGlzdGJveC5oZWlnaHQgNCBsYWJlbC5wYWRZIDUgbGFiZWwud2lkdGggMTAgbGFiZWwuYW5jaG9yIG5lJykKIAogICAgIGEucGFjayhzaWRlPVRpeC5UT1AsIGFuY2hvcj1UaXguVykKICAgICBiLnBhY2soc2lkZT1UaXguVE9QLCBhbmNob3I9VGl4LlcpCkBAIC03MCw3ICs3MCw3IEBACiAgICAgYi5pbnNlcnQoVGl4LkVORCwgJzE5OTYnKQogCiAgICAgIyBVc2UgInRpeFNldFNpbGVudCIgdG8gc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGNvbWJvIGJveCBpZiB5b3UKLSAgICAjIGRvbid0IHdhbnQgeW91ciAtY29tbWFuZCBwcm9jZWR1cmVzIChjYng6c2VsZWN0X21vbnRoIGFuZCAKKyAgICAjIGRvbid0IHdhbnQgeW91ciAtY29tbWFuZCBwcm9jZWR1cmVzIChjYng6c2VsZWN0X21vbnRoIGFuZAogICAgICMgY2J4OnNlbGVjdF95ZWFyKSB0byBiZSBjYWxsZWQuCiAgICAgIwogICAgIGEuc2V0X3NpbGVudCgnSmFudWFyeScpCkBAIC03OCw5ICs3OCw5IEBACiAKICAgICBib3ggPSBUaXguQnV0dG9uQm94KHcsIG9yaWVudGF0aW9uPVRpeC5IT1JJWk9OVEFMKQogICAgIGJveC5hZGQoJ29rJywgdGV4dD0nT2snLCB1bmRlcmxpbmU9MCwgd2lkdGg9NiwKLQkgICAgY29tbWFuZD1sYW1iZGEgdz13OiBva19jb21tYW5kKHcpKQorICAgICAgICAgICAgY29tbWFuZD1sYW1iZGEgdz13OiBva19jb21tYW5kKHcpKQogICAgIGJveC5hZGQoJ2NhbmNlbCcsIHRleHQ9J0NhbmNlbCcsIHVuZGVybGluZT0wLCB3aWR0aD02LAotCSAgICBjb21tYW5kPWxhbWJkYSB3PXc6IHcuZGVzdHJveSgpKQorICAgICAgICAgICAgY29tbWFuZD1sYW1iZGEgdz13OiB3LmRlc3Ryb3koKSkKICAgICBib3gucGFjayhzaWRlPVRpeC5CT1RUT00sIGZpbGw9VGl4LlgpCiAgICAgdG9wLnBhY2soc2lkZT1UaXguVE9QLCBmaWxsPVRpeC5CT1RILCBleHBhbmQ9MSkKIApkaWZmIC0tZ2l0IGEvRGVtby90aXgvc2FtcGxlcy9Db250cm9sLnB5IGIvRGVtby90aXgvc2FtcGxlcy9Db250cm9sLnB5CmluZGV4IGU4NWVlODQuLjNhMzQ0YzEgMTAwNzU1Ci0tLSBhL0RlbW8vdGl4L3NhbXBsZXMvQ29udHJvbC5weQorKysgYi9EZW1vL3RpeC9zYW1wbGVzL0NvbnRyb2wucHkKQEAgLTIwLDcgKzIwLDcgQEAKIAogaW1wb3J0IFRpeAogCi1UQ0xfQUxMX0VWRU5UUwkJPSAwCitUQ0xfQUxMX0VWRU5UUyAgICAgICAgICA9IDAKIAogZGVmIFJ1blNhbXBsZSAocm9vdCk6CiAgICAgY29udHJvbCA9IERlbW9Db250cm9sKHJvb3QpCkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgICMgJHcudG9wLmEgYWxsb3dzIG9ubHkgaW50ZWdlciB2YWx1ZXMKICAgICAgICAgIwogICAgICAgICAjIFtIaW50XSBUaGUgLW9wdGlvbnMgc3dpdGNoIHNldHMgdGhlIG9wdGlvbnMgb2YgdGhlIHN1YndpZGdldHMuCi0gICAgICAgICMgW0hpbnRdIFdlIHNldCB0aGUgbGFiZWwud2lkdGggc3Vid2lkZ2V0IG9wdGlvbiBvZiB0aGUgQ29udHJvbHMgdG8gCisgICAgICAgICMgW0hpbnRdIFdlIHNldCB0aGUgbGFiZWwud2lkdGggc3Vid2lkZ2V0IG9wdGlvbiBvZiB0aGUgQ29udHJvbHMgdG8KICAgICAgICAgIyAgICAgICAgYmUgMTYgc28gdGhhdCB0aGVpciBsYWJlbHMgYXBwZWFyIHRvIGJlIGFsaWduZWQuCiAgICAgICAgICMKICAgICAgICAgYSA9IFRpeC5Db250cm9sKHRvcCwgbGFiZWw9J051bWJlciBvZiBFbmdpbmVzOiAnLCBpbnRlZ2VyPTEsCkBAIC04Myw3ICs4Myw3IEBACiAgICAgZGVmIG9rY21kIChzZWxmKToKICAgICAgICAgIyB0aXhEZW1vOlN0YXR1cyAiU2VsZWN0ZWQgJWQgb2YgJXMgZW5naW5lcyBlYWNoIG9mIHRocnVzdCAlZCIsIChkZW1vX251bV9lbmdpbmVzLmdldCgpLCBkZW1vX21ha2VyLmdldCgpLCBkZW1vX3RocnVzdC5nZXQoKSkKICAgICAgICAgc2VsZi5xdWl0Y21kKCkKLSAgICAgICAgCisKICAgICBkZWYgcXVpdGNtZCAoc2VsZik6CiAgICAgICAgIHNlbGYuZXhpdCA9IDAKIApAQCAtMTAwLDkgKzEwMCw5IEBACiAgICAgaSA9IG1ha2VyX2xpc3QuaW5kZXgoZGVtb19tYWtlci5nZXQoKSkKICAgICBpID0gaSArIGluYwogICAgIGlmIGkgPj0gbGVuKG1ha2VyX2xpc3QpOgotCWkgPSAwCisgICAgICAgIGkgPSAwCiAgICAgZWxpZiBpIDwgMDoKLQlpID0gbGVuKG1ha2VyX2xpc3QpIC0gMQorICAgICAgICBpID0gbGVuKG1ha2VyX2xpc3QpIC0gMQogCiAgICAgIyBJbiBUY2wvVGl4IHdlIHNob3VsZCByZXR1cm4gdGhlIHN0cmluZyBtYWtlcl9saXN0W2ldLiBXZSBjYW4ndAogICAgICMgZG8gdGhhdCBpbiBUa2ludGVyIHNvIHdlIHNldCB0aGUgZ2xvYmFsIHZhcmlhYmxlLiAoVGhpcyB3b3JrcykuCkBAIC0xMTAsMTAgKzExMCwxMCBAQAogCiBkZWYgdmFsaWRhdGVfbWFrZXIodyk6CiAgICAgdHJ5OgotCWkgPSBtYWtlcl9saXN0LmluZGV4KGRlbW9fbWFrZXIuZ2V0KCkpCisgICAgICAgIGkgPSBtYWtlcl9saXN0LmluZGV4KGRlbW9fbWFrZXIuZ2V0KCkpCiAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0JIyBXb3JrcyBoZXJlIHRob3VnaC4gV2h5ID8gQmVhdHMgbWUuCi0JcmV0dXJuIG1ha2VyX2xpc3RbMF0KKyAgICAgICAgIyBXb3JrcyBoZXJlIHRob3VnaC4gV2h5ID8gQmVhdHMgbWUuCisgICAgICAgIHJldHVybiBtYWtlcl9saXN0WzBdCiAgICAgIyBXb3JrcyBoZXJlIHRob3VnaC4gV2h5ID8gQmVhdHMgbWUuCiAgICAgcmV0dXJuIG1ha2VyX2xpc3RbaV0KIApkaWZmIC0tZ2l0IGEvRGVtby90aXgvc2FtcGxlcy9EaXJMaXN0LnB5IGIvRGVtby90aXgvc2FtcGxlcy9EaXJMaXN0LnB5CmluZGV4IDhkNzUzNmMuLjVmZDhjMGQgMTAwNzU1Ci0tLSBhL0RlbW8vdGl4L3NhbXBsZXMvRGlyTGlzdC5weQorKysgYi9EZW1vL3RpeC9zYW1wbGVzL0Rpckxpc3QucHkKQEAgLTEsNiArMSw2IEBACiAjIC0qLW1vZGU6IHB5dGhvbjsgZmlsbC1jb2x1bW46IDc1OyB0YWItd2lkdGg6IDg7IGNvZGluZzogaXNvLWxhdGluLTEtdW5peCAtKi0KICMKLSMJJElkJAorIyAgICAgICAkSWQkCiAjCiAjIFRpeCBEZW1vc3RyYXRpb24gUHJvZ3JhbQogIwpAQCAtMTksMjEgKzE5LDIxIEBACiBpbXBvcnQgVGl4LCBvcywgY29weQogZnJvbSBUa2NvbnN0YW50cyBpbXBvcnQgKgogCi1UQ0xfQUxMX0VWRU5UUwkJPSAwCitUQ0xfQUxMX0VWRU5UUyAgICAgICAgICA9IDAKIAogZGVmIFJ1blNhbXBsZSAocm9vdCk6CiAgICAgZGlybGlzdCA9IERlbW9EaXJMaXN0KHJvb3QpCiAgICAgZGlybGlzdC5tYWlubG9vcCgpCiAgICAgZGlybGlzdC5kZXN0cm95KCkKLSAgICAKKwogY2xhc3MgRGVtb0Rpckxpc3Q6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHcpOgogICAgICAgICBzZWxmLnJvb3QgPSB3CiAgICAgICAgIHNlbGYuZXhpdCA9IC0xCi0gICAgICAgIAorCiAgICAgICAgIHogPSB3LndpbmZvX3RvcGxldmVsKCkKICAgICAgICAgei53bV9wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIGxhbWJkYSBzZWxmPXNlbGY6IHNlbGYucXVpdGNtZCgpKQotICAgICAgICAKKwogICAgICAgICAjIENyZWF0ZSB0aGUgdGl4RGlyTGlzdCBhbmQgdGhlIHRpeExhYmVsRW50cnkgd2lkZ2V0cyBvbiB0aGUgb24gdGhlIHRvcAogICAgICAgICAjIG9mIHRoZSBkaWFsb2cgYm94CiAKQEAgLTQ4LDE0ICs0OCwxNCBAQAogICAgICAgICAjCiAgICAgICAgIHRvcC5kaXIgPSBUaXguRGlyTGlzdCh0b3ApCiAgICAgICAgIHRvcC5kaXIuaGxpc3RbJ3dpZHRoJ10gPSA0MAotICAgICAgICAKKwogICAgICAgICAjIFdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgIi4uIiBidXR0b24sIHRoZSBzZWxlY3RlZCBkaXJlY3RvcnkKICAgICAgICAgIyBpcyAidHJhbnNmZXJyZWQiIGludG8gdGhlIGVudHJ5IHdpZGdldAogICAgICAgICAjCiAgICAgICAgIHRvcC5idG4gPSBUaXguQnV0dG9uKHRvcCwgdGV4dCA9ICIgID4+ICAiLCBwYWR5ID0gMCkKIAogICAgICAgICAjIFdlIHVzZSBhIExhYmVsRW50cnkgdG8gaG9sZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gVGhlIHVzZXIKLSAgICAgICAgIyBjYW4gY2hvb3NlIGZyb20gdGhlIERpckxpc3Qgd2lkZ2V0LCBvciBoZSBjYW4gdHlwZSBpbiB0aGUgZGlyZWN0b3J5IAorICAgICAgICAjIGNhbiBjaG9vc2UgZnJvbSB0aGUgRGlyTGlzdCB3aWRnZXQsIG9yIGhlIGNhbiB0eXBlIGluIHRoZSBkaXJlY3RvcnkKICAgICAgICAgIyBtYW51YWxseQogICAgICAgICAjCiAgICAgICAgIHRvcC5lbnQgPSBUaXguTGFiZWxFbnRyeSh0b3AsIGxhYmVsPSJJbnN0YWxsYXRpb24gRGlyZWN0b3J5OiIsCkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkud2lkdGggNDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5hbmNob3IgdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnJykKLSAgICAgICAgCisKICAgICAgICAgZm9udCA9IHNlbGYucm9vdC50ay5ldmFsKCd0aXggb3B0aW9uIGdldCBmaXhlZF9mb250JykKICAgICAgICAgIyBmb250ID0gc2VsZi5yb290Lm1hc3Rlci50aXhfb3B0aW9uX2dldCgnZml4ZWRfZm9udCcpCiAgICAgICAgIHRvcC5lbnQuZW50cnlbJ2ZvbnQnXSA9IGZvbnQKQEAgLTEyOSw0ICsxMjksMyBAQAogICAgICAgICBmb3IgbGluZSBpbiB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbih0LHYsdGIpOgogICAgICAgICAgICAgdGV4dCA9IHRleHQgKyBsaW5lICsgJ1xuJwogICAgICAgICAgICAgZCA9IHRrTWVzc2FnZUJveC5zaG93ZXJyb3IgKCAnVGl4IERlbW8gRXJyb3InLCB0ZXh0KQotCmRpZmYgLS1naXQgYS9EZW1vL3RpeC9zYW1wbGVzL0RpclRyZWUucHkgYi9EZW1vL3RpeC9zYW1wbGVzL0RpclRyZWUucHkKaW5kZXggZDAwN2EyYi4uMmU0ZmUwYiAxMDA3NTUKLS0tIGEvRGVtby90aXgvc2FtcGxlcy9EaXJUcmVlLnB5CisrKyBiL0RlbW8vdGl4L3NhbXBsZXMvRGlyVHJlZS5weQpAQCAtMSw2ICsxLDYgQEAKICMgLSotbW9kZTogcHl0aG9uOyBmaWxsLWNvbHVtbjogNzU7IHRhYi13aWR0aDogODsgY29kaW5nOiBpc28tbGF0aW4tMS11bml4IC0qLQogIwotIwkkSWQkCisjICAgICAgICRJZCQKICMKICMgVGl4IERlbW9zdHJhdGlvbiBQcm9ncmFtCiAjCkBAIC0xOSw3ICsxOSw3IEBACiBpbXBvcnQgVGl4LCBvcywgY29weQogZnJvbSBUa2NvbnN0YW50cyBpbXBvcnQgKgogCi1UQ0xfQUxMX0VWRU5UUwkJPSAwCitUQ0xfQUxMX0VWRU5UUyAgICAgICAgICA9IDAKIAogZGVmIFJ1blNhbXBsZSAocm9vdCk6CiAgICAgZGlydHJlZSA9IERlbW9EaXJUcmVlKHJvb3QpCkBAIC0zMCw3ICszMCw3IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHcpOgogICAgICAgICBzZWxmLnJvb3QgPSB3CiAgICAgICAgIHNlbGYuZXhpdCA9IC0xCi0gICAgICAgIAorCiAgICAgICAgIHogPSB3LndpbmZvX3RvcGxldmVsKCkKICAgICAgICAgei53bV9wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIGxhbWJkYSBzZWxmPXNlbGY6IHNlbGYucXVpdGNtZCgpKQogCkBAIC00OCwxNCArNDgsMTQgQEAKICAgICAgICAgIwogICAgICAgICB0b3AuZGlyID0gVGl4LkRpclRyZWUodG9wKQogICAgICAgICB0b3AuZGlyLmhsaXN0Wyd3aWR0aCddID0gNDAKLSAgICAgICAgCisKICAgICAgICAgIyBXaGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlICIuLiIgYnV0dG9uLCB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5CiAgICAgICAgICMgaXMgInRyYW5zZmVycmVkIiBpbnRvIHRoZSBlbnRyeSB3aWRnZXQKICAgICAgICAgIwogICAgICAgICB0b3AuYnRuID0gVGl4LkJ1dHRvbih0b3AsIHRleHQgPSAiICA+PiAgIiwgcGFkeSA9IDApCiAKICAgICAgICAgIyBXZSB1c2UgYSBMYWJlbEVudHJ5IHRvIGhvbGQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuIFRoZSB1c2VyCi0gICAgICAgICMgY2FuIGNob29zZSBmcm9tIHRoZSBEaXJUcmVlIHdpZGdldCwgb3IgaGUgY2FuIHR5cGUgaW4gdGhlIGRpcmVjdG9yeSAKKyAgICAgICAgIyBjYW4gY2hvb3NlIGZyb20gdGhlIERpclRyZWUgd2lkZ2V0LCBvciBoZSBjYW4gdHlwZSBpbiB0aGUgZGlyZWN0b3J5CiAgICAgICAgICMgbWFudWFsbHkKICAgICAgICAgIwogICAgICAgICB0b3AuZW50ID0gVGl4LkxhYmVsRW50cnkodG9wLCBsYWJlbD0iSW5zdGFsbGF0aW9uIERpcmVjdG9yeToiLApAQCAtMTE1LDQgKzExNSwzIEBACiBpZiBfX25hbWVfXz09ICdfX21haW5fXycgOgogICAgIHJvb3Q9VGl4LlRrKCkKICAgICBSdW5TYW1wbGUocm9vdCkKLQpkaWZmIC0tZ2l0IGEvRGVtby90aXgvc2FtcGxlcy9Ob3RlQm9vay5weSBiL0RlbW8vdGl4L3NhbXBsZXMvTm90ZUJvb2sucHkKaW5kZXggYWJmM2JmZC4uMWUwZGEzZSAxMDA3NTUKLS0tIGEvRGVtby90aXgvc2FtcGxlcy9Ob3RlQm9vay5weQorKysgYi9EZW1vL3RpeC9zYW1wbGVzL05vdGVCb29rLnB5CkBAIC0xLDUgKzEsNSBAQAogIyAtKi1tb2RlOiBweXRob247IGZpbGwtY29sdW1uOiA3NTsgdGFiLXdpZHRoOiA4OyBjb2Rpbmc6IGlzby1sYXRpbi0xLXVuaXggLSotCi0jIAorIwogIyAkSWQkCiAjCiAjIFRpeCBEZW1vc3RyYXRpb24gUHJvZ3JhbQpAQCAtMjMsOSArMjMsOSBAQAogICAgICMgbm90ZWJvb2ssIHNvIHRoYXQgdGhleSBhcmUgd2VsbC1hbGlnbmVkIG9uIHRoZSBzY3JlZW4uCiAgICAgcHJlZml4ID0gVGl4Lk9wdGlvbk5hbWUodykKICAgICBpZiBwcmVmaXg6Ci0JcHJlZml4ID0gJyonK3ByZWZpeAorICAgICAgICBwcmVmaXggPSAnKicrcHJlZml4CiAgICAgZWxzZToKLQlwcmVmaXggPSAnJworICAgICAgICBwcmVmaXggPSAnJwogICAgIHcub3B0aW9uX2FkZChwcmVmaXgrJypUaXhDb250cm9sKmVudHJ5LndpZHRoJywgMTApCiAgICAgdy5vcHRpb25fYWRkKHByZWZpeCsnKlRpeENvbnRyb2wqbGFiZWwud2lkdGgnLCAxOCkKICAgICB3Lm9wdGlvbl9hZGQocHJlZml4KycqVGl4Q29udHJvbCpsYWJlbC5hbmNob3InLCBUaXguRSkKQEAgLTM3LDE0ICszNywxNCBAQAogICAgIG5iID0gVGl4Lk5vdGVCb29rKHcsIG5hbWU9J25iJywgaXBhZHg9NiwgaXBhZHk9NikKICAgICBuYlsnYmcnXSA9ICdncmF5JwogICAgIG5iLm5iZnJhbWVbJ2JhY2twYWdlY29sb3InXSA9ICdncmF5JwotCQorCiAgICAgIyBDcmVhdGUgdGhlIHR3byB0YWJzIG9uIHRoZSBub3RlYm9vay4gVGhlIC11bmRlcmxpbmUgb3B0aW9uCiAgICAgIyBwdXRzIGEgdW5kZXJsaW5lIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGxhYmVscyBvZiB0aGUgdGFicy4KICAgICAjIEtleWJvYXJkIGFjY2VsZXJhdG9ycyB3aWxsIGJlIGRlZmluZWQgYXV0b21hdGljYWxseSBhY2NvcmRpbmcKLSAgICAjIHRvIHRoZSB1bmRlcmxpbmVkIGNoYXJhY3Rlci4JCisgICAgIyB0byB0aGUgdW5kZXJsaW5lZCBjaGFyYWN0ZXIuCiAgICAgbmIuYWRkKCdoYXJkX2Rpc2snLCBsYWJlbD0iSGFyZCBEaXNrIiwgdW5kZXJsaW5lPTApCiAgICAgbmIuYWRkKCduZXR3b3JrJywgbGFiZWw9Ik5ldHdvcmsiLCB1bmRlcmxpbmU9MCkKLQkKKwogICAgIG5iLnBhY2soZXhwYW5kPTEsIGZpbGw9VGl4LkJPVEgsIHBhZHg9NSwgcGFkeT01ICxzaWRlPVRpeC5UT1ApCiAKICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTYsNjIgKzU2LDYyIEBACiAgICAgdGFiPW5iLmhhcmRfZGlzawogICAgIGYgPSBUaXguRnJhbWUodGFiKQogICAgIGNvbW1vbiA9IFRpeC5GcmFtZSh0YWIpCi0JCisKICAgICBmLnBhY2soc2lkZT1UaXguTEVGVCwgcGFkeD0yLCBwYWR5PTIsIGZpbGw9VGl4LkJPVEgsIGV4cGFuZD0xKQogICAgIGNvbW1vbi5wYWNrKHNpZGU9VGl4LlJJR0hULCBwYWR4PTIsIGZpbGw9VGl4LlkpCi0JCisKICAgICBhID0gVGl4LkNvbnRyb2woZiwgdmFsdWU9MTIsICAgbGFiZWw9J0FjY2VzcyB0aW1lOiAnKQogICAgIHcgPSBUaXguQ29udHJvbChmLCB2YWx1ZT00MDAsICBsYWJlbD0nV3JpdGUgVGhyb3VnaHB1dDogJykKICAgICByID0gVGl4LkNvbnRyb2woZiwgdmFsdWU9NDAwLCAgbGFiZWw9J1JlYWQgVGhyb3VnaHB1dDogJykKICAgICBjID0gVGl4LkNvbnRyb2woZiwgdmFsdWU9MTAyMSwgbGFiZWw9J0NhcGFjaXR5OiAnKQotCQorCiAgICAgYS5wYWNrKHNpZGU9VGl4LlRPUCwgcGFkeD0yMCwgcGFkeT0yKQogICAgIHcucGFjayhzaWRlPVRpeC5UT1AsIHBhZHg9MjAsIHBhZHk9MikKICAgICByLnBhY2soc2lkZT1UaXguVE9QLCBwYWR4PTIwLCBwYWR5PTIpCiAgICAgYy5wYWNrKHNpZGU9VGl4LlRPUCwgcGFkeD0yMCwgcGFkeT0yKQotCQorCiAgICAgIyBDcmVhdGUgdGhlIGNvbW1vbiBidXR0b25zCiAgICAgY3JlYXRlQ29tbW9uQnV0dG9ucyhjb21tb24pCi0JCisKICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICMgQ3JlYXRlIHRoZSBzZWNvbmQgcGFnZQkKKyAgICAjIENyZWF0ZSB0aGUgc2Vjb25kIHBhZ2UKICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQorCiAgICAgdGFiID0gbmIubmV0d29yawogCiAgICAgZiA9IFRpeC5GcmFtZSh0YWIpCiAgICAgY29tbW9uID0gVGl4LkZyYW1lKHRhYikKLQkKKwogICAgIGYucGFjayhzaWRlPVRpeC5MRUZULCBwYWR4PTIsIHBhZHk9MiwgZmlsbD1UaXguQk9USCwgZXhwYW5kPTEpCiAgICAgY29tbW9uLnBhY2soc2lkZT1UaXguUklHSFQsIHBhZHg9MiwgZmlsbD1UaXguWSkKLQkKKwogICAgIGEgPSBUaXguQ29udHJvbChmLCB2YWx1ZT0xMiwgICBsYWJlbD0nQWNjZXNzIHRpbWU6ICcpCiAgICAgdyA9IFRpeC5Db250cm9sKGYsIHZhbHVlPTQwMCwgIGxhYmVsPSdXcml0ZSBUaHJvdWdocHV0OiAnKQogICAgIHIgPSBUaXguQ29udHJvbChmLCB2YWx1ZT00MDAsICBsYWJlbD0nUmVhZCBUaHJvdWdocHV0OiAnKQogICAgIGMgPSBUaXguQ29udHJvbChmLCB2YWx1ZT0xMDIxLCBsYWJlbD0nQ2FwYWNpdHk6ICcpCiAgICAgdSA9IFRpeC5Db250cm9sKGYsIHZhbHVlPTEwLCAgIGxhYmVsPSdVc2VyczogJykKLQkKKwogICAgIGEucGFjayhzaWRlPVRpeC5UT1AsIHBhZHg9MjAsIHBhZHk9MikKICAgICB3LnBhY2soc2lkZT1UaXguVE9QLCBwYWR4PTIwLCBwYWR5PTIpCiAgICAgci5wYWNrKHNpZGU9VGl4LlRPUCwgcGFkeD0yMCwgcGFkeT0yKQogICAgIGMucGFjayhzaWRlPVRpeC5UT1AsIHBhZHg9MjAsIHBhZHk9MikKICAgICB1LnBhY2soc2lkZT1UaXguVE9QLCBwYWR4PTIwLCBwYWR5PTIpCi0JCisKICAgICBjcmVhdGVDb21tb25CdXR0b25zKGNvbW1vbikKLQkKKwogZGVmIGRvRGVzdHJveSgpOgogICAgIGdsb2JhbCByb290CiAgICAgcm9vdC5kZXN0cm95KCkKIAogZGVmIGNyZWF0ZUNvbW1vbkJ1dHRvbnMobWFzdGVyKToKLSAgICBvayA9IFRpeC5CdXR0b24obWFzdGVyLCBuYW1lPSdvaycsIHRleHQ9J09LJywgd2lkdGg9NiwgCi0JCWNvbW1hbmQ9ZG9EZXN0cm95KQotICAgIGNhbmNlbCA9IFRpeC5CdXR0b24obWFzdGVyLCBuYW1lPSdjYW5jZWwnLCAKLQkJICAgIHRleHQ9J0NhbmNlbCcsIHdpZHRoPTYsIAotCQkgICAgY29tbWFuZD1kb0Rlc3Ryb3kpCi0gICAgCisgICAgb2sgPSBUaXguQnV0dG9uKG1hc3RlciwgbmFtZT0nb2snLCB0ZXh0PSdPSycsIHdpZHRoPTYsCisgICAgICAgICAgICAgICAgY29tbWFuZD1kb0Rlc3Ryb3kpCisgICAgY2FuY2VsID0gVGl4LkJ1dHRvbihtYXN0ZXIsIG5hbWU9J2NhbmNlbCcsCisgICAgICAgICAgICAgICAgICAgIHRleHQ9J0NhbmNlbCcsIHdpZHRoPTYsCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9ZG9EZXN0cm95KQorCiAgICAgb2sucGFjayhzaWRlPVRpeC5UT1AsIHBhZHg9MiwgcGFkeT0yKQotICAgIGNhbmNlbC5wYWNrKHNpZGU9VGl4LlRPUCwgcGFkeD0yLCBwYWR5PTIpCQorICAgIGNhbmNlbC5wYWNrKHNpZGU9VGl4LlRPUCwgcGFkeD0yLCBwYWR5PTIpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgcm9vdCA9IFRpeC5UaygpCmRpZmYgLS1naXQgYS9EZW1vL3RpeC9zYW1wbGVzL09wdE1lbnUucHkgYi9EZW1vL3RpeC9zYW1wbGVzL09wdE1lbnUucHkKaW5kZXggZWNiMGM4Ni4uMWQzOTQyMCAxMDA3NTUKLS0tIGEvRGVtby90aXgvc2FtcGxlcy9PcHRNZW51LnB5CisrKyBiL0RlbW8vdGl4L3NhbXBsZXMvT3B0TWVudS5weQpAQCAtMSw1ICsxLDUgQEAKICMgLSotbW9kZTogcHl0aG9uOyBmaWxsLWNvbHVtbjogNzU7IHRhYi13aWR0aDogODsgY29kaW5nOiBpc28tbGF0aW4tMS11bml4IC0qLQotIyAKKyMKICMgJElkJAogIwogIyBUaXggRGVtb3N0cmF0aW9uIFByb2dyYW0KQEAgLTE2LDcgKzE2LDcgQEAKIGltcG9ydCBUaXgKIAogb3B0aW9ucyA9IHsndGV4dCc6J1BsYWluIFRleHQnLCAncG9zdCc6J1Bvc3RTY3JpcHQnLCAnaHRtbCc6J0hUTUwnLAotCSAgICd0ZXgnOidMYVRlWCcsICdydGYnOidSaWNoIFRleHQgRm9ybWF0J30KKyAgICAgICAgICAgJ3RleCc6J0xhVGVYJywgJ3J0Zic6J1JpY2ggVGV4dCBGb3JtYXQnfQogCiBkZWYgUnVuU2FtcGxlKHcpOgogICAgIGdsb2JhbCBkZW1vX29wdF9mcm9tLCBkZW1vX29wdF90bwpAQCAtMjcsMjIgKzI3LDIyIEBACiAgICAgdG9wID0gVGl4LkZyYW1lKHcsIGJkPTEsIHJlbGllZj1UaXguUkFJU0VEKQogCiAgICAgZnJvbV9maWxlID0gVGl4Lk9wdGlvbk1lbnUodG9wLCBsYWJlbD0iRnJvbSBGaWxlIEZvcm1hdCA6ICIsCi0JCQkgICAgICAgdmFyaWFibGU9ZGVtb19vcHRfZnJvbSwKLQkJCSAgICAgICBvcHRpb25zID0gJ2xhYmVsLndpZHRoICAxOSBsYWJlbC5hbmNob3IgZSBtZW51YnV0dG9uLndpZHRoIDE1JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT1kZW1vX29wdF9mcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAnbGFiZWwud2lkdGggIDE5IGxhYmVsLmFuY2hvciBlIG1lbnVidXR0b24ud2lkdGggMTUnKQogCiAgICAgdG9fZmlsZSA9IFRpeC5PcHRpb25NZW51KHRvcCwgbGFiZWw9IlRvIEZpbGUgRm9ybWF0IDogIiwKLQkJCSAgICAgdmFyaWFibGU9ZGVtb19vcHRfdG8sCi0JCQkgICAgIG9wdGlvbnM9J2xhYmVsLndpZHRoICAxOSBsYWJlbC5hbmNob3IgZSBtZW51YnV0dG9uLndpZHRoIDE1JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU9ZGVtb19vcHRfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9J2xhYmVsLndpZHRoICAxOSBsYWJlbC5hbmNob3IgZSBtZW51YnV0dG9uLndpZHRoIDE1JykKIAogICAgICMgQWRkIHRoZSBhdmFpbGFibGUgb3B0aW9ucyB0byB0aGUgdHdvIE9wdGlvbk1lbnUgd2lkZ2V0cwogICAgICMKICAgICAjIFtIaW50XSBZb3UgaGF2ZSB0byBhZGQgdGhlIG9wdGlvbnMgZmlyc3QgYmVmb3JlIHlvdSBzZXQgdGhlCi0gICAgIwkgICAgIGdsb2JhbCB2YXJpYWJsZXMgImRlbW9fb3B0X2Zyb20iIGFuZCAiZGVtb19vcHRfdG8iLiBPdGhlcndpc2UKLSAgICAjCSAgICAgdGhlIE9wdGlvbk1lbnUgd2lkZ2V0IHdpbGwgY29tcGxhaW4gYWJvdXQgInVua25vd24gb3B0aW9ucyIhCisgICAgIyAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyAiZGVtb19vcHRfZnJvbSIgYW5kICJkZW1vX29wdF90byIuIE90aGVyd2lzZQorICAgICMgICAgICAgIHRoZSBPcHRpb25NZW51IHdpZGdldCB3aWxsIGNvbXBsYWluIGFib3V0ICJ1bmtub3duIG9wdGlvbnMiIQogICAgICMKICAgICBmb3Igb3B0IGluIG9wdGlvbnMua2V5cygpOgotCWZyb21fZmlsZS5hZGRfY29tbWFuZChvcHQsIGxhYmVsPW9wdGlvbnNbb3B0XSkKLQl0b19maWxlLmFkZF9jb21tYW5kKG9wdCwgbGFiZWw9b3B0aW9uc1tvcHRdKQorICAgICAgICBmcm9tX2ZpbGUuYWRkX2NvbW1hbmQob3B0LCBsYWJlbD1vcHRpb25zW29wdF0pCisgICAgICAgIHRvX2ZpbGUuYWRkX2NvbW1hbmQob3B0LCBsYWJlbD1vcHRpb25zW29wdF0pCiAKICAgICBkZW1vX29wdF9mcm9tLnNldCgnaHRtbCcpCiAgICAgZGVtb19vcHRfdG8uc2V0KCdwb3N0JykKQEAgLTUyLDkgKzUyLDkgQEAKIAogICAgIGJveCA9IFRpeC5CdXR0b25Cb3godywgb3JpZW50YXRpb249VGl4LkhPUklaT05UQUwpCiAgICAgYm94LmFkZCgnb2snLCB0ZXh0PSdPaycsIHVuZGVybGluZT0wLCB3aWR0aD02LAotCSAgICBjb21tYW5kPWxhbWJkYSB3PXc6IG9rX2NvbW1hbmQodykpCisgICAgICAgICAgICBjb21tYW5kPWxhbWJkYSB3PXc6IG9rX2NvbW1hbmQodykpCiAgICAgYm94LmFkZCgnY2FuY2VsJywgdGV4dD0nQ2FuY2VsJywgdW5kZXJsaW5lPTAsIHdpZHRoPTYsCi0JICAgIGNvbW1hbmQ9bGFtYmRhIHc9dzogdy5kZXN0cm95KCkpCisgICAgICAgICAgICBjb21tYW5kPWxhbWJkYSB3PXc6IHcuZGVzdHJveSgpKQogICAgIGJveC5wYWNrKHNpZGU9VGl4LkJPVFRPTSwgZmlsbD1UaXguWCkKICAgICB0b3AucGFjayhzaWRlPVRpeC5UT1AsIGZpbGw9VGl4LkJPVEgsIGV4cGFuZD0xKQogCmRpZmYgLS1naXQgYS9EZW1vL3RpeC9zYW1wbGVzL1BhbmVkV2luLnB5IGIvRGVtby90aXgvc2FtcGxlcy9QYW5lZFdpbi5weQppbmRleCBiZmUxMGMyLi4zZWZjNzMxIDEwMDc1NQotLS0gYS9EZW1vL3RpeC9zYW1wbGVzL1BhbmVkV2luLnB5CisrKyBiL0RlbW8vdGl4L3NhbXBsZXMvUGFuZWRXaW4ucHkKQEAgLTE3LDcgKzE3LDcgQEAKIAogaW1wb3J0IFRpeAogCi1UQ0xfQUxMX0VWRU5UUwkJPSAwCitUQ0xfQUxMX0VWRU5UUyAgICAgICAgICA9IDAKIAogZGVmIFJ1blNhbXBsZSAocm9vdCk6CiAgICAgcGFuZWR3aW4gPSBEZW1vUGFuZWR3aW4ocm9vdCkKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L3NhbXBsZXMvUG9wTWVudS5weSBiL0RlbW8vdGl4L3NhbXBsZXMvUG9wTWVudS5weQppbmRleCA2MDJlYWZkLi4zMmYzMjI5IDEwMDc1NQotLS0gYS9EZW1vL3RpeC9zYW1wbGVzL1BvcE1lbnUucHkKKysrIGIvRGVtby90aXgvc2FtcGxlcy9Qb3BNZW51LnB5CkBAIC0xLDYgKzEsNiBAQAogIyAtKi1tb2RlOiBweXRob247IGZpbGwtY29sdW1uOiA3NTsgdGFiLXdpZHRoOiA4OyBjb2Rpbmc6IGlzby1sYXRpbi0xLXVuaXggLSotCiAjCi0jCSRJZCQKKyMgICAgICAgJElkJAogIwogIyBUaXggRGVtb3N0cmF0aW9uIFByb2dyYW0KICMKQEAgLTI3LDkgKzI3LDkgQEAKICAgICBwLmJpbmRfd2lkZ2V0KHRvcCkKICAgICBwLmJpbmRfd2lkZ2V0KGJ1dCkKIAotICAgICMgU2V0IHRoZSBlbnRyaWVzIGluc2lkZSB0aGUgUG9wdXBNZW51IHdpZGdldC4gCisgICAgIyBTZXQgdGhlIGVudHJpZXMgaW5zaWRlIHRoZSBQb3B1cE1lbnUgd2lkZ2V0LgogICAgICMgW0hpbnRdIFlvdSBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlICJtZW51IiBzdWJ3aWRnZXQuCi0gICAgIwkgICAgICR3LnRvcC5wIGl0c2VsZiBpcyBOT1QgYSBtZW51IHdpZGdldC4KKyAgICAjICAgICAgICAkdy50b3AucCBpdHNlbGYgaXMgTk9UIGEgbWVudSB3aWRnZXQuCiAgICAgIyBbSGludF0gV2F0Y2ggY2FyZWZ1bGx5IGhvdyB0aGUgc3ViLW1lbnUgaXMgY3JlYXRlZAogICAgICMKICAgICBwLm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9J0Rlc2t0b3AnLCB1bmRlcmxpbmU9MCkKQEAgLTQ1LDkgKzQ1LDkgQEAKIAogICAgIGJveCA9IFRpeC5CdXR0b25Cb3godywgb3JpZW50YXRpb249VGl4LkhPUklaT05UQUwpCiAgICAgYm94LmFkZCgnb2snLCB0ZXh0PSdPaycsIHVuZGVybGluZT0wLCB3aWR0aD02LAotCSAgICBjb21tYW5kPWxhbWJkYSB3PXc6IHcuZGVzdHJveSgpKQorICAgICAgICAgICAgY29tbWFuZD1sYW1iZGEgdz13OiB3LmRlc3Ryb3koKSkKICAgICBib3guYWRkKCdjYW5jZWwnLCB0ZXh0PSdDYW5jZWwnLCB1bmRlcmxpbmU9MCwgd2lkdGg9NiwKLQkgICAgY29tbWFuZD1sYW1iZGEgdz13OiB3LmRlc3Ryb3koKSkKKyAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhIHc9dzogdy5kZXN0cm95KCkpCiAgICAgYm94LnBhY2soc2lkZT1UaXguQk9UVE9NLCBmaWxsPVRpeC5YKQogICAgIHRvcC5wYWNrKHNpZGU9VGl4LlRPUCwgZmlsbD1UaXguQk9USCwgZXhwYW5kPTEpCiAKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L3NhbXBsZXMvU0hMaXN0MS5weSBiL0RlbW8vdGl4L3NhbXBsZXMvU0hMaXN0MS5weQppbmRleCAwMTE0ZGM4Li43Y2E3YjNlIDEwMDc1NQotLS0gYS9EZW1vL3RpeC9zYW1wbGVzL1NITGlzdDEucHkKKysrIGIvRGVtby90aXgvc2FtcGxlcy9TSExpc3QxLnB5CkBAIC0xLDUgKzEsNSBAQAogIyAtKi1tb2RlOiBweXRob247IGZpbGwtY29sdW1uOiA3NTsgdGFiLXdpZHRoOiA4OyBjb2Rpbmc6IGlzby1sYXRpbi0xLXVuaXggLSotCi0jIAorIwogIyAkSWQkCiAjCiAjIFRpeCBEZW1vc3RyYXRpb24gUHJvZ3JhbQpAQCAtMTUsMTMgKzE1LDEzIEBACiAKIGltcG9ydCBUaXgKIAotVENMX0FMTF9FVkVOVFMJCT0gMAorVENMX0FMTF9FVkVOVFMgICAgICAgICAgPSAwCiAKIGRlZiBSdW5TYW1wbGUgKHJvb3QpOgogICAgIHNobGlzdCA9IERlbW9TSExpc3Qocm9vdCkKICAgICBzaGxpc3QubWFpbmxvb3AoKQogICAgIHNobGlzdC5kZXN0cm95KCkKLSAgICAKKwogY2xhc3MgRGVtb1NITGlzdDoKICAgICBkZWYgX19pbml0X18oc2VsZiwgdyk6CiAgICAgICAgIHNlbGYucm9vdCA9IHcKQEAgLTI5LDcgKzI5LDcgQEAKIAogICAgICAgICB6ID0gdy53aW5mb190b3BsZXZlbCgpCiAgICAgICAgIHoud21fcHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBsYW1iZGEgc2VsZj1zZWxmOiBzZWxmLnF1aXRjbWQoKSkKLSAgICAgICAgCisKICAgICAgICAgIyBXZSBjcmVhdGUgdGhlIGZyYW1lIGFuZCB0aGUgU2Nyb2xsZWRITGlzdCB3aWRnZXQKICAgICAgICAgIyBhdCB0aGUgdG9wIG9mIHRoZSBkaWFsb2cgYm94CiAgICAgICAgICMKQEAgLTYxLDcgKzYxLDcgQEAKIAogICAgICAgICBobGlzdD10b3AuYS5obGlzdAogCi0gICAgICAgICMgTGV0IGNvbmZpZ3VyZSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgSExpc3Qgc3Vid2lkZ2V0IAorICAgICAgICAjIExldCBjb25maWd1cmUgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIEhMaXN0IHN1YndpZGdldAogICAgICAgICAjCiAgICAgICAgIGhsaXN0LmNvbmZpZyggc2VwYXJhdG9yPScuJywgd2lkdGg9MjUsIGRyYXdicmFuY2g9MCwgaW5kZW50PTEwKQogCkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgICAgICAgICAgZj1UaXguRnJhbWUoaGxpc3QsIG5hbWU9J3NlcCVkJyAlIGNvdW50LCBoZWlnaHQ9Miwgd2lkdGg9MTUwLAogICAgICAgICAgICAgICAgICAgICBiZD0yLCByZWxpZWY9VGl4LlNVTktFTiApCiAKLSAgICAgICAgICAgICAgICBobGlzdC5hZGRfY2hpbGQoIGl0ZW10eXBlPVRpeC5XSU5ET1csIAorICAgICAgICAgICAgICAgIGhsaXN0LmFkZF9jaGlsZCggaXRlbXR5cGU9VGl4LldJTkRPVywKICAgICAgICAgICAgICAgICAgICAgd2luZG93PWYsIHN0YXRlPVRpeC5ESVNBQkxFRCApCiAKICAgICAgICAgICAgIGhsaXN0LmFkZChib3NzLCBpdGVtdHlwZT1UaXguVEVYVCwgdGV4dD1uYW1lKQpAQCAtODgsMTMgKzg4LDEzIEBACiAgICAgICAgICAgICBobGlzdC5hZGQoIGtleSwgdGV4dD1uYW1lICkKIAogICAgICAgICAgICAgIyBbSGludF0gTWFrZSBzdXJlIHRoZSBrZXlzIChlLmcuICdib3NzLnBlcnNvbicpIHlvdSBjaG9vc2UKLSAgICAgICAgICAgICMJIGFyZSB1bmlxdWUgbmFtZXMuIElmIHlvdSBjYW5ub3QgYmUgc3VyZSBvZiB0aGlzIChiZWNhdXNlIG9mCi0gICAgICAgICAgICAjCSB0aGUgc3RydWN0dXJlIG9mIHlvdXIgZGF0YWJhc2UsIGUuZy4pIHlvdSBjYW4gdXNlIHRoZQotICAgICAgICAgICAgIwkgImFkZF9jaGlsZCIgY29tbWFuZCBpbnN0ZWFkOgorICAgICAgICAgICAgIyAgICBhcmUgdW5pcXVlIG5hbWVzLiBJZiB5b3UgY2Fubm90IGJlIHN1cmUgb2YgdGhpcyAoYmVjYXVzZSBvZgorICAgICAgICAgICAgIyAgICB0aGUgc3RydWN0dXJlIG9mIHlvdXIgZGF0YWJhc2UsIGUuZy4pIHlvdSBjYW4gdXNlIHRoZQorICAgICAgICAgICAgIyAgICAiYWRkX2NoaWxkIiBjb21tYW5kIGluc3RlYWQ6CiAgICAgICAgICAgICAjCiAgICAgICAgICAgICAjICBobGlzdC5hZGRjaGlsZCggYm9zcywgIHRleHQ9bmFtZSkKICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICBeXl5eCi0gICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgcGFyZW50IGVudHJ5UGF0aCAKKyAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICBwYXJlbnQgZW50cnlQYXRoCiAKIAogICAgICAgICAjIFVzZSBhIEJ1dHRvbkJveCB0byBob2xkIHRoZSBidXR0b25zLgpAQCAtMTI5LDQgKzEyOSwzIEBACiBpZiBfX25hbWVfXz09ICdfX21haW5fXycgOgogICAgIHJvb3Q9VGl4LlRrKCkKICAgICBSdW5TYW1wbGUocm9vdCkKLQpkaWZmIC0tZ2l0IGEvRGVtby90aXgvc2FtcGxlcy9TSExpc3QyLnB5IGIvRGVtby90aXgvc2FtcGxlcy9TSExpc3QyLnB5CmluZGV4IGU4MmQxZTUuLjE3ZmQ1NTEgMTAwNzU1Ci0tLSBhL0RlbW8vdGl4L3NhbXBsZXMvU0hMaXN0Mi5weQorKysgYi9EZW1vL3RpeC9zYW1wbGVzL1NITGlzdDIucHkKQEAgLTEsNSArMSw1IEBACiAjIC0qLW1vZGU6IHB5dGhvbjsgZmlsbC1jb2x1bW46IDc1OyB0YWItd2lkdGg6IDg7IGNvZGluZzogaXNvLWxhdGluLTEtdW5peCAtKi0KLSMgCisjCiAjICRJZCQKICMKICMgVGl4IERlbW9zdHJhdGlvbiBQcm9ncmFtCkBAIC0xMywxOCArMTMsMTggQEAKICMgVGhpcyBmaWxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIG11bHRpcGxlIGNvbHVtbnMgYW5kIG11bHRpcGxlIHN0eWxlcwogIyBpbiB0aGUgdGl4SExpc3Qgd2lkZ2V0CiAjCi0jIEluIGEgdGl4SExpc3Qgd2lkZ2V0LCB5b3UgY2FuIGhhdmUgb25lIG9yZSBtb3JlIGNvbHVtbnMuIAorIyBJbiBhIHRpeEhMaXN0IHdpZGdldCwgeW91IGNhbiBoYXZlIG9uZSBvcmUgbW9yZSBjb2x1bW5zLgogIwogCiBpbXBvcnQgVGl4CiAKLVRDTF9BTExfRVZFTlRTCQk9IDAKK1RDTF9BTExfRVZFTlRTICAgICAgICAgID0gMAogCiBkZWYgUnVuU2FtcGxlIChyb290KToKICAgICBzaGxpc3QgPSBEZW1vU0hMaXN0KHJvb3QpCiAgICAgc2hsaXN0Lm1haW5sb29wKCkKICAgICBzaGxpc3QuZGVzdHJveSgpCi0gICAgCisKIGNsYXNzIERlbW9TSExpc3Q6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHcpOgogICAgICAgICBzZWxmLnJvb3QgPSB3CkBAIC0zMiw3ICszMiw3IEBACiAKICAgICAgICAgeiA9IHcud2luZm9fdG9wbGV2ZWwoKQogICAgICAgICB6LndtX3Byb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgbGFtYmRhIHNlbGY9c2VsZjogc2VsZi5xdWl0Y21kKCkpCi0gICAgICAgIAorCiAgICAgICAgICMgV2UgY3JlYXRlIHRoZSBmcmFtZSBhbmQgdGhlIFNjcm9sbGVkSExpc3Qgd2lkZ2V0CiAgICAgICAgICMgYXQgdGhlIHRvcCBvZiB0aGUgZGlhbG9nIGJveAogICAgICAgICAjCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIGhsaXN0PXRvcC5hLmhsaXN0CiAKICAgICAgICAgIyBDcmVhdGUgdGhlIHRpdGxlIGZvciB0aGUgSExpc3Qgd2lkZ2V0Ci0gICAgICAgICMJPj4gTm90aWNlIHRoYXQgd2UgaGF2ZSBzZXQgdGhlIGhsaXN0LmhlYWRlciBzdWJ3aWRnZXQgb3B0aW9uIHRvIHRydWUKKyAgICAgICAgIyAgICAgICA+PiBOb3RpY2UgdGhhdCB3ZSBoYXZlIHNldCB0aGUgaGxpc3QuaGVhZGVyIHN1YndpZGdldCBvcHRpb24gdG8gdHJ1ZQogICAgICAgICAjICAgICAgc28gdGhhdCB0aGUgaGVhZGVyIGlzIGRpc3BsYXllZAogICAgICAgICAjCiAKQEAgLTcyLDIyICs3MiwyMiBAQAogCiAgICAgICAgICMgVGhpcyBpcyBvdXIgbGl0dGxlIHJlbGF0aW9uYWwgZGF0YWJhc2UKICAgICAgICAgIwotICAgICAgICBib3NzID0gKCdkb2UnLCAnSm9obiBEb2UnLAknRGlyZWN0b3InKQorICAgICAgICBib3NzID0gKCdkb2UnLCAnSm9obiBEb2UnLCAgICAgICdEaXJlY3RvcicpCiAKICAgICAgICAgbWFuYWdlcnMgPSBbCi0gICAgICAgICAgICAoJ2plZmYnLCAgJ0plZmYgV2F4bWFuJywJJ01hbmFnZXInKSwKLSAgICAgICAgICAgICgnam9obicsICAnSm9obiBMZWUnLAkJJ01hbmFnZXInKSwKLSAgICAgICAgICAgICgncGV0ZXInLCAnUGV0ZXIgS2Vuc29uJywJJ01hbmFnZXInKQorICAgICAgICAgICAgKCdqZWZmJywgICdKZWZmIFdheG1hbicsICAgICdNYW5hZ2VyJyksCisgICAgICAgICAgICAoJ2pvaG4nLCAgJ0pvaG4gTGVlJywgICAgICAgICAgICAgICAnTWFuYWdlcicpLAorICAgICAgICAgICAgKCdwZXRlcicsICdQZXRlciBLZW5zb24nLCAgICdNYW5hZ2VyJykKICAgICAgICAgXQogCiAgICAgICAgIGVtcGxveWVlcyA9IFsKLSAgICAgICAgICAgICgnYWxleCcsICAnam9obicsCSdBbGV4IEtlbGxtYW4nLAkJJ0NsZXJrJyksCi0gICAgICAgICAgICAoJ2FsYW4nLCAgJ2pvaG4nLCAgICAgICAnQWxhbiBBZGFtcycsCQknQ2xlcmsnKSwKLSAgICAgICAgICAgICgnYW5keScsICAncGV0ZXInLCAgICAgICdBbmRyZWFzIENyYXdmb3JkJywJJ1NhbGVzbWFuJyksCi0gICAgICAgICAgICAoJ2RvdWcnLCAgJ2plZmYnLCAgICAgICAnRG91Z2xhcyBCbG9vbScsCSdDbGVyaycpLAotICAgICAgICAgICAgKCdqb24nLCAgICdwZXRlcicsICAgICAgJ0pvbiBCYXJha2knLAkJJ1NhbGVzbWFuJyksCi0gICAgICAgICAgICAoJ2NocmlzJywgJ2plZmYnLCAgICAgICAnQ2hyaXMgR2VvZmZyZXknLAknQ2xlcmsnKSwKLSAgICAgICAgICAgICgnY2h1Y2snLCAnamVmZicsICAgICAgICdDaHVjayBNY0xlYW4nLAkJJ0NsZWFuZXInKQorICAgICAgICAgICAgKCdhbGV4JywgICdqb2huJywgICAnQWxleCBLZWxsbWFuJywgICAgICAgICAnQ2xlcmsnKSwKKyAgICAgICAgICAgICgnYWxhbicsICAnam9obicsICAgICAgICdBbGFuIEFkYW1zJywgICAgICAgICAgICAgICAnQ2xlcmsnKSwKKyAgICAgICAgICAgICgnYW5keScsICAncGV0ZXInLCAgICAgICdBbmRyZWFzIENyYXdmb3JkJywgJ1NhbGVzbWFuJyksCisgICAgICAgICAgICAoJ2RvdWcnLCAgJ2plZmYnLCAgICAgICAnRG91Z2xhcyBCbG9vbScsICAgICdDbGVyaycpLAorICAgICAgICAgICAgKCdqb24nLCAgICdwZXRlcicsICAgICAgJ0pvbiBCYXJha2knLCAgICAgICAgICAgICAgICdTYWxlc21hbicpLAorICAgICAgICAgICAgKCdjaHJpcycsICdqZWZmJywgICAgICAgJ0NocmlzIEdlb2ZmcmV5JywgICAnQ2xlcmsnKSwKKyAgICAgICAgICAgICgnY2h1Y2snLCAnamVmZicsICAgICAgICdDaHVjayBNY0xlYW4nLCAgICAgICAgICAgICAnQ2xlYW5lcicpCiAgICAgICAgIF0KIAogICAgICAgICBzdHlsZVsnbWdyX25hbWUnXSA9IFRpeC5EaXNwbGF5U3R5bGUoVGl4LlRFWFQsIHJlZndpbmRvdz1obGlzdCkKQEAgLTk4LDcgKzk4LDcgQEAKIAogICAgICAgICBzdHlsZVsnZW1wbF9wb3NuJ10gPSBUaXguRGlzcGxheVN0eWxlKFRpeC5URVhULCBwYWR4PTgsIHJlZndpbmRvdz1obGlzdCkKIAotICAgICAgICAjIExldCBjb25maWd1cmUgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIEhMaXN0IHN1YndpZGdldCAKKyAgICAgICAgIyBMZXQgY29uZmlndXJlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBITGlzdCBzdWJ3aWRnZXQKICAgICAgICAgIwogICAgICAgICBobGlzdC5jb25maWcoc2VwYXJhdG9yPScuJywgd2lkdGg9MjUsIGRyYXdicmFuY2g9MCwgaW5kZW50PTEwKQogICAgICAgICBobGlzdC5jb2x1bW5fd2lkdGgoMCwgY2hhcnM9MjApCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogICAgICAgICBmb3Iga2V5LG1ncixuYW1lLHBvc24gaW4gZW1wbG95ZWVzIDoKICAgICAgICAgICAgICMgIi4iIGlzIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIHdlIGNob3NlIGFib3ZlCiAKLSAgICAgICAgICAgIGVudHJ5cGF0aCA9ICcuJyArIG1nciAgICAgICAgKyAnLicgKyBrZXkgCisgICAgICAgICAgICBlbnRyeXBhdGggPSAnLicgKyBtZ3IgICAgICAgICsgJy4nICsga2V5CiAKICAgICAgICAgICAgICMgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXiAgXl5eXl5eXl5eXl5eXl5eCi0gICAgICAgICAgICAjCSAgICBwYXJlbnQgZW50cnlQYXRoIC8gY2hpbGQncyBuYW1lCisgICAgICAgICAgICAjICAgICAgIHBhcmVudCBlbnRyeVBhdGggLyBjaGlsZCdzIG5hbWUKIAogICAgICAgICAgICAgaGxpc3QuYWRkKGVudHJ5cGF0aCwgdGV4dD1uYW1lLCBzdHlsZT1zdHlsZVsnZW1wbF9uYW1lJ10pCiAgICAgICAgICAgICBobGlzdC5pdGVtX2NyZWF0ZShlbnRyeXBhdGgsIDEsIGl0ZW10eXBlPVRpeC5URVhULApAQCAtMTY2LDQgKzE2NiwzIEBACiBpZiBfX25hbWVfXz09ICdfX21haW5fXycgOgogICAgIHJvb3Q9VGl4LlRrKCkKICAgICBSdW5TYW1wbGUocm9vdCkKLQpkaWZmIC0tZ2l0IGEvRGVtby90aXgvc2FtcGxlcy9UcmVlLnB5IGIvRGVtby90aXgvc2FtcGxlcy9UcmVlLnB5CmluZGV4IDJmZGQ3YzcuLjlhN2U0ODEgMTAwNzU1Ci0tLSBhL0RlbW8vdGl4L3NhbXBsZXMvVHJlZS5weQorKysgYi9EZW1vL3RpeC9zYW1wbGVzL1RyZWUucHkKQEAgLTEsNSArMSw1IEBACiAjIC0qLW1vZGU6IHB5dGhvbjsgZmlsbC1jb2x1bW46IDc1OyB0YWItd2lkdGg6IDg7IGNvZGluZzogaXNvLWxhdGluLTEtdW5peCAtKi0KLSMgCisjCiAjICRJZCQKICMKICMgVGl4IERlbW9zdHJhdGlvbiBQcm9ncmFtCkBAIC0zNCwxNyArMzQsMTcgQEAKIAogZGVmIGFkZGRpcih0cmVlLCBkaXIpOgogICAgIGlmIGRpciA9PSAnLyc6Ci0JdGV4dCA9ICcvJworICAgICAgICB0ZXh0ID0gJy8nCiAgICAgZWxzZToKLQl0ZXh0ID0gb3MucGF0aC5iYXNlbmFtZShkaXIpCisgICAgICAgIHRleHQgPSBvcy5wYXRoLmJhc2VuYW1lKGRpcikKICAgICB0cmVlLmhsaXN0LmFkZChkaXIsIGl0ZW10eXBlPVRpeC5JTUFHRVRFWFQsIHRleHQ9dGV4dCwKLQkJICAgaW1hZ2U9dHJlZS50ay5jYWxsKCd0aXgnLCAnZ2V0aW1hZ2UnLCAnZm9sZGVyJykpCisgICAgICAgICAgICAgICAgICAgaW1hZ2U9dHJlZS50ay5jYWxsKCd0aXgnLCAnZ2V0aW1hZ2UnLCAnZm9sZGVyJykpCiAgICAgdHJ5OgotCW9zLmxpc3RkaXIoZGlyKQotCXRyZWUuc2V0bW9kZShkaXIsICdvcGVuJykKKyAgICAgICAgb3MubGlzdGRpcihkaXIpCisgICAgICAgIHRyZWUuc2V0bW9kZShkaXIsICdvcGVuJykKICAgICBleGNlcHQgb3MuZXJyb3I6Ci0JIyBObyByZWFkIHBlcm1pc3Npb24gPwotCXBhc3MKKyAgICAgICAgIyBObyByZWFkIHBlcm1pc3Npb24gPworICAgICAgICBwYXNzCiAKICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHVzZXIgcHJlc3NlcyB0aGUgKCspIGluZGljYXRvciBvcgogIyBkb3VibGUgY2xpY2tzIG9uIGEgZGlyZWN0b3J5IHdob3NlIG1vZGUgaXMgIm9wZW4iLiBJdCBsb2FkcyB0aGUgZmlsZXMKQEAgLTU3LDIyICs1NywyMiBAQAogZGVmIG9wZW5kaXIodHJlZSwgZGlyKToKICAgICBlbnRyaWVzID0gdHJlZS5obGlzdC5pbmZvX2NoaWxkcmVuKGRpcikKICAgICBpZiBlbnRyaWVzOgotCSMgV2UgaGF2ZSBhbHJlYWR5IGxvYWRlZCB0aGlzIGRpcmVjdG9yeS4gTGV0J3MganVzdAotCSMgc2hvdyBhbGwgdGhlIGNoaWxkIGVudHJpZXMKLQkjCi0JIyBOb3RlOiBzaW5jZSB3ZSBsb2FkIHRoZSBkaXJlY3Rvcnkgb25seSBvbmNlLCBpdCB3aWxsIG5vdCBiZQotCSMgICAgICAgcmVmcmVzaGVkIGlmIHRoZSB5b3UgYWRkIG9yIHJlbW92ZSBmaWxlcyBmcm9tIHRoaXMKLQkjCWRpcmVjdG9yeS4KLQkjCi0JZm9yIGVudHJ5IGluIGVudHJpZXM6Ci0JICAgIHRyZWUuaGxpc3Quc2hvd19lbnRyeShlbnRyeSkKKyAgICAgICAgIyBXZSBoYXZlIGFscmVhZHkgbG9hZGVkIHRoaXMgZGlyZWN0b3J5LiBMZXQncyBqdXN0CisgICAgICAgICMgc2hvdyBhbGwgdGhlIGNoaWxkIGVudHJpZXMKKyAgICAgICAgIworICAgICAgICAjIE5vdGU6IHNpbmNlIHdlIGxvYWQgdGhlIGRpcmVjdG9yeSBvbmx5IG9uY2UsIGl0IHdpbGwgbm90IGJlCisgICAgICAgICMgICAgICAgcmVmcmVzaGVkIGlmIHRoZSB5b3UgYWRkIG9yIHJlbW92ZSBmaWxlcyBmcm9tIHRoaXMKKyAgICAgICAgIyAgICAgICBkaXJlY3RvcnkuCisgICAgICAgICMKKyAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICAgICAgICB0cmVlLmhsaXN0LnNob3dfZW50cnkoZW50cnkpCiAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpcikKICAgICBmb3IgZmlsZSBpbiBmaWxlczoKLQlpZiBvcy5wYXRoLmlzZGlyKGRpciArICcvJyArIGZpbGUpOgotCSAgICBhZGRkaXIodHJlZSwgZGlyICsgJy8nICsgZmlsZSkKLQllbHNlOgotCSAgICB0cmVlLmhsaXN0LmFkZChkaXIgKyAnLycgKyBmaWxlLCBpdGVtdHlwZT1UaXguSU1BR0VURVhULCB0ZXh0PWZpbGUsCi0JCQkgICBpbWFnZT10cmVlLnRrLmNhbGwoJ3RpeCcsICdnZXRpbWFnZScsICdmaWxlJykpCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlyICsgJy8nICsgZmlsZSk6CisgICAgICAgICAgICBhZGRkaXIodHJlZSwgZGlyICsgJy8nICsgZmlsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyZWUuaGxpc3QuYWRkKGRpciArICcvJyArIGZpbGUsIGl0ZW10eXBlPVRpeC5JTUFHRVRFWFQsIHRleHQ9ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlPXRyZWUudGsuY2FsbCgndGl4JywgJ2dldGltYWdlJywgJ2ZpbGUnKSkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICByb290ID0gVGl4LlRrKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGl4L3RpeHdpZGdldHMucHkgYi9EZW1vL3RpeC90aXh3aWRnZXRzLnB5CmluZGV4IGFlN2IwNjMuLmRlMmUyMmUgMTAwNjQ0Ci0tLSBhL0RlbW8vdGl4L3RpeHdpZGdldHMucHkKKysrIGIvRGVtby90aXgvdGl4d2lkZ2V0cy5weQpAQCAtNCwzOCArNCwzOCBAQAogIwogIyB0aXh3aWRnZXRzLnB5IC0tCiAjCi0jCUZvciBUaXgsIHNlZSBodHRwOi8vdGl4LnNvdXJjZWZvcmdlLm5ldAorIyAgICAgICBGb3IgVGl4LCBzZWUgaHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQKICMKLSMgCVRoaXMgaXMgYSBkZW1vIHByb2dyYW0gb2Ygc29tZSBvZiB0aGUgVGl4IHdpZGdldHMgYXZhaWxhYmxlIGluIFB5dGhvbi4KLSMJSWYgeW91IGhhdmUgaW5zdGFsbGVkIFB5dGhvbiAmIFRpeCBwcm9wZXJseSwgeW91IGNhbiBleGVjdXRlIHRoaXMgYXMKKyMgICAgICAgVGhpcyBpcyBhIGRlbW8gcHJvZ3JhbSBvZiBzb21lIG9mIHRoZSBUaXggd2lkZ2V0cyBhdmFpbGFibGUgaW4gUHl0aG9uLgorIyAgICAgICBJZiB5b3UgaGF2ZSBpbnN0YWxsZWQgUHl0aG9uICYgVGl4IHByb3Blcmx5LCB5b3UgY2FuIGV4ZWN1dGUgdGhpcyBhcwogIwotIwkJJSBweXRob24gdGl4d2lkZ2V0cy5weQorIyAgICAgICAgICAgICAgICUgcHl0aG9uIHRpeHdpZGdldHMucHkKICMKIAogaW1wb3J0IG9zLCBvcy5wYXRoLCBzeXMsIFRpeAogZnJvbSBUa2NvbnN0YW50cyBpbXBvcnQgKgogaW1wb3J0IHRyYWNlYmFjaywgdGtNZXNzYWdlQm94CiAKLVRDTF9ET05UX1dBSVQJCT0gMTw8MQotVENMX1dJTkRPV19FVkVOVFMJPSAxPDwyCi1UQ0xfRklMRV9FVkVOVFMJCT0gMTw8MwotVENMX1RJTUVSX0VWRU5UUwk9IDE8PDQKLVRDTF9JRExFX0VWRU5UUwkJPSAxPDw1Ci1UQ0xfQUxMX0VWRU5UUwkJPSAwCitUQ0xfRE9OVF9XQUlUICAgICAgICAgICA9IDE8PDEKK1RDTF9XSU5ET1dfRVZFTlRTICAgICAgID0gMTw8MgorVENMX0ZJTEVfRVZFTlRTICAgICAgICAgPSAxPDwzCitUQ0xfVElNRVJfRVZFTlRTICAgICAgICA9IDE8PDQKK1RDTF9JRExFX0VWRU5UUyAgICAgICAgID0gMTw8NQorVENMX0FMTF9FVkVOVFMgICAgICAgICAgPSAwCiAKIGNsYXNzIERlbW86CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvcCk6CiAgICAgICAgIHNlbGYucm9vdCA9IHRvcAogICAgICAgICBzZWxmLmV4aXQgPSAtMQogCi0gICAgICAgIHNlbGYuZGlyID0gTm9uZQkJCQkjIHNjcmlwdCBkaXJlY3RvcnkKLSAgICAgICAgc2VsZi5iYWxsb29uID0gTm9uZQkJCSMgYmFsbG9vbiB3aWRnZXQKKyAgICAgICAgc2VsZi5kaXIgPSBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICMgc2NyaXB0IGRpcmVjdG9yeQorICAgICAgICBzZWxmLmJhbGxvb24gPSBOb25lICAgICAgICAgICAgICAgICAgICAgIyBiYWxsb29uIHdpZGdldAogICAgICAgICBzZWxmLnVzZUJhbGxvb25zID0gVGl4LlN0cmluZ1ZhcigpCiAgICAgICAgIHNlbGYudXNlQmFsbG9vbnMuc2V0KCcwJykKLSAgICAgICAgc2VsZi5zdGF0dXNiYXIgPSBOb25lCQkJIyBzdGF0dXMgYmFyIHdpZGdldAotICAgICAgICBzZWxmLndlbG1zZyA9IE5vbmUJCQkjIE1zZyB3aWRnZXQKLSAgICAgICAgc2VsZi53ZWxmb250ID0gJycJCQkjIGZvbnQgbmFtZQotICAgICAgICBzZWxmLndlbHNpemUgPSAnJwkJCSMgZm9udCBzaXplCisgICAgICAgIHNlbGYuc3RhdHVzYmFyID0gTm9uZSAgICAgICAgICAgICAgICAgICAjIHN0YXR1cyBiYXIgd2lkZ2V0CisgICAgICAgIHNlbGYud2VsbXNnID0gTm9uZSAgICAgICAgICAgICAgICAgICAgICAjIE1zZyB3aWRnZXQKKyAgICAgICAgc2VsZi53ZWxmb250ID0gJycgICAgICAgICAgICAgICAgICAgICAgICMgZm9udCBuYW1lCisgICAgICAgIHNlbGYud2Vsc2l6ZSA9ICcnICAgICAgICAgICAgICAgICAgICAgICAjIGZvbnQgc2l6ZQogCiAgICAgICAgIHByb2duYW1lID0gc3lzLmFyZ3ZbMF0KICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShwcm9nbmFtZSkKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYudXNlQmFsbG9vbnMpCiAgICAgICAgICMgVGhlIHRyYWNlIHZhcmlhYmxlIG9wdGlvbiBkb2Vzbid0IHNlZW0gdG8gd29yaywgaW5zdGVhZCBJIHVzZSAnY29tbWFuZCcKICAgICAgICAgI2FwcGx5KHcudGsuY2FsbCwgKCd0cmFjZScsICd2YXJpYWJsZScsIHNlbGYudXNlQmFsbG9vbnMsICd3JywKLSAgICAgICAgIwkJICAgICAgVG9nZ2xlSGVscCkpCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICBUb2dnbGVIZWxwKSkKIAogICAgICAgICByZXR1cm4gdwogCkBAIC0xMzAsMTUgKzEzMCwxNSBAQAogICAgICAgICAjIFRvIHNob3cgVGNsIGVycm9ycyAtIHVuY29tbWVudCB0aGlzIHRvIHNlZSB0aGUgbGlzdGJveCBidWcuCiAgICAgICAgICMgVGtpbnRlciBkZWZpbmVzIGEgVGNsIHRrZXJyb3IgcHJvY2VkdXJlIHRoYXQgaW4gZWZmZWN0CiAgICAgICAgICMgc2lsZW5jZXMgYWxsIGJhY2tncm91bmQgVGNsIGVycm9yIHJlcG9ydGluZy4KLQkjIHJvb3QudGsuZXZhbCgnaWYge1tpbmZvIGNvbW1hbmRzIHRrZXJyb3JdICE9ICIifSB7cmVuYW1lIHRrZXJyb3IgcHl0a2Vycm9yfScpCisgICAgICAgICMgcm9vdC50ay5ldmFsKCdpZiB7W2luZm8gY29tbWFuZHMgdGtlcnJvcl0gIT0gIiJ9IHtyZW5hbWUgdGtlcnJvciBweXRrZXJyb3J9JykKICAgICBkZWYgcXVpdGNtZCAoc2VsZik6CiAgICAgICAgICIiIlF1aXQgb3VyIG1haW5sb29wLiBJdCBpcyB1cCB0byB5b3UgdG8gY2FsbCByb290LmRlc3Ryb3koKSBhZnRlci4iIiIKICAgICAgICAgc2VsZi5leGl0ID0gMAogCiAgICAgZGVmIGxvb3Aoc2VsZik6Ci0JIiIiVGhpcyBpcyBhbiBleHBsaWN0IHJlcGxhY2VtZW50IGZvciBfdGtpbnRlciBtYWlubG9vcCgpCi0JSXQgbGV0cyB5b3UgY2F0Y2gga2V5Ym9hcmQgaW50ZXJydXB0cyBlYXNpZXIsIGFuZCBhdm9pZHMKLQl0aGUgMjAgbXNlYy4gZGVhZCBzbGVlcCgpIHdoaWNoIGJ1cm5zIGEgY29uc3RhbnQgQ1BVLiIiIgorICAgICAgICAiIiJUaGlzIGlzIGFuIGV4cGxpY3QgcmVwbGFjZW1lbnQgZm9yIF90a2ludGVyIG1haW5sb29wKCkKKyAgICAgICAgSXQgbGV0cyB5b3UgY2F0Y2gga2V5Ym9hcmQgaW50ZXJydXB0cyBlYXNpZXIsIGFuZCBhdm9pZHMKKyAgICAgICAgdGhlIDIwIG1zZWMuIGRlYWQgc2xlZXAoKSB3aGljaCBidXJucyBhIGNvbnN0YW50IENQVS4iIiIKICAgICAgICAgd2hpbGUgc2VsZi5leGl0IDwgMDoKICAgICAgICAgICAgICMgVGhlcmUgYXJlIDIgd2hpbGVzIGhlcmUuIFRoZSBvdXRlciBvbmUgbGV0cyB5b3UgY29udGludWUKICAgICAgICAgICAgICMgYWZ0ZXIgYSBeQyBpbnRlcnJ1cHQuCkBAIC0yMjEsOSArMjIxLDkgQEAKICAgICBiMi5wYWNrKHNpZGU9VGl4LkxFRlQsIHBhZHg9NCwgcGFkeT00KQogCiAgICAgZGVtby5iYWxsb29uLmJpbmRfd2lkZ2V0KGIxLCBtc2c9J0Nob29zZVxuYSBmb250JywKLQkJCSAgICAgc3RhdHVzbXNnPSdDaG9vc2UgYSBmb250IGZvciB0aGlzIHBhZ2UnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNtc2c9J0Nob29zZSBhIGZvbnQgZm9yIHRoaXMgcGFnZScpCiAgICAgZGVtby5iYWxsb29uLmJpbmRfd2lkZ2V0KGIyLCBtc2c9J1BvaW50IHNpemUnLAotCQkJICAgICBzdGF0dXNtc2c9J0Nob29zZSB0aGUgZm9udCBzaXplIGZvciB0aGlzIHBhZ2UnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNtc2c9J0Nob29zZSB0aGUgZm9udCBzaXplIGZvciB0aGlzIHBhZ2UnKQogICAgIHJldHVybiB3CiAKIGRlZiBNa1dlbGNvbWVUZXh0KHRvcCk6CkBAIC0yMzMsMTAgKzIzMywxMCBAQAogICAgIHdpbiA9IHcud2luZG93CiAgICAgdGV4dCA9ICdXZWxjb21lIHRvIFRJWCBpbiBQeXRob24nCiAgICAgdGl0bGUgPSBUaXguTGFiZWwod2luLAotCQkgICAgICBiZD0wLCB3aWR0aD0zMCwgYW5jaG9yPVRpeC5OLCB0ZXh0PXRleHQpCisgICAgICAgICAgICAgICAgICAgICAgYmQ9MCwgd2lkdGg9MzAsIGFuY2hvcj1UaXguTiwgdGV4dD10ZXh0KQogICAgIG1zZyA9IFRpeC5NZXNzYWdlKHdpbiwKLQkJICAgICAgYmQ9MCwgd2lkdGg9NDAwLCBhbmNob3I9VGl4Lk4sCi0JCSAgICAgIHRleHQ9J1RpeCBpcyBhIHNldCBvZiBtZWdhLXdpZGdldHMgYmFzZWQgb24gVEsuIFRoaXMgcHJvZ3JhbSBcCisgICAgICAgICAgICAgICAgICAgICAgYmQ9MCwgd2lkdGg9NDAwLCBhbmNob3I9VGl4Lk4sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nVGl4IGlzIGEgc2V0IG9mIG1lZ2Etd2lkZ2V0cyBiYXNlZCBvbiBUSy4gVGhpcyBwcm9ncmFtIFwKIGRlbW9uc3RyYXRlcyB0aGUgd2lkZ2V0cyBpbiB0aGUgVGl4IHdpZGdldCBzZXQuIFlvdSBjYW4gY2hvb3NlIHRoZSBwYWdlcyBcCiBpbiB0aGlzIHdpbmRvdyB0byBsb29rIGF0IHRoZSBjb3JyZXNwb25kaW5nIHdpZGdldHMuIFxuXG5cCiBUbyBxdWl0IHRoaXMgcHJvZ3JhbSwgY2hvb3NlIHRoZSAiRmlsZSB8IEV4aXQiIGNvbW1hbmQuXG5cblwKQEAgLTI1MCwxOSArMjUwLDE5IEBACiAgICAgZ2xvYmFsIGRlbW8KIAogICAgIGlmIG5vdCBkZW1vLndlbG1zZzoKLQlyZXR1cm4KKyAgICAgICAgcmV0dXJuCiAgICAgZm9udCA9IGRlbW8ud2VsZm9udFsndmFsdWUnXQogICAgIHBvaW50ID0gZGVtby53ZWxzaXplWyd2YWx1ZSddCiAgICAgaWYgZm9udCA9PSAnVGltZXMgUm9tYW4nOgotCWZvbnQgPSAndGltZXMnCisgICAgICAgIGZvbnQgPSAndGltZXMnCiAgICAgZm9udHN0ciA9ICclcyAlcycgJSAoZm9udCwgcG9pbnQpCiAgICAgZGVtby53ZWxtc2dbJ2ZvbnQnXSA9IGZvbnRzdHIKIAogZGVmIFRvZ2dsZUhlbHAoKToKICAgICBpZiBkZW1vLnVzZUJhbGxvb25zLmdldCgpID09ICcxJzoKLQlkZW1vLmJhbGxvb25bJ3N0YXRlJ10gPSAnYm90aCcKKyAgICAgICAgZGVtby5iYWxsb29uWydzdGF0ZSddID0gJ2JvdGgnCiAgICAgZWxzZToKLQlkZW1vLmJhbGxvb25bJ3N0YXRlJ10gPSAnbm9uZScKKyAgICAgICAgZGVtby5iYWxsb29uWydzdGF0ZSddID0gJ25vbmUnCiAKIGRlZiBNa0Nob29zZXJzKG5iLCBuYW1lKToKICAgICB3ID0gbmIucGFnZShuYW1lKQpAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgc3RhdGljID0gVGl4LkNvbWJvQm94KHcsIGxhYmVsPSdTdGF0aWMnLCBlZGl0YWJsZT0wLCBvcHRpb25zPW9wdGlvbnMpCiAgICAgZWRpdGFibGUgPSBUaXguQ29tYm9Cb3godywgbGFiZWw9J0VkaXRhYmxlJywgZWRpdGFibGU9MSwgb3B0aW9ucz1vcHRpb25zKQogICAgIGhpc3RvcnkgPSBUaXguQ29tYm9Cb3godywgbGFiZWw9J0hpc3RvcnknLCBlZGl0YWJsZT0xLCBoaXN0b3J5PTEsCi0JCQkgICBhbmNob3I9VGl4LkUsIG9wdGlvbnM9b3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcj1UaXguRSwgb3B0aW9ucz1vcHRpb25zKQogICAgIHN0YXRpYy5pbnNlcnQoVGl4LkVORCwgJ0phbnVhcnknKQogICAgIHN0YXRpYy5pbnNlcnQoVGl4LkVORCwgJ0ZlYnJ1YXJ5JykKICAgICBzdGF0aWMuaW5zZXJ0KFRpeC5FTkQsICdNYXJjaCcpCkBAIC0zNDAsMjAgKzM0MCwyMCBAQAogZGVmIHNwaW5fY21kKHcsIGluYyk6CiAgICAgaWR4ID0gc3RhdGVzLmluZGV4KGRlbW9fc3BpbnR4dC5nZXQoKSkgKyBpbmMKICAgICBpZiBpZHggPCAwOgotCWlkeCA9IGxlbihzdGF0ZXMpIC0gMQorICAgICAgICBpZHggPSBsZW4oc3RhdGVzKSAtIDEKICAgICBlbGlmIGlkeCA+PSBsZW4oc3RhdGVzKToKLQlpZHggPSAwCisgICAgICAgIGlkeCA9IDAKICMgZm9sbG93aW5nIGRvZXNuJ3Qgd29yay4KICMgICAgcmV0dXJuIHN0YXRlc1tpZHhdCi0gICAgZGVtb19zcGludHh0LnNldChzdGF0ZXNbaWR4XSkJIyB0aGlzIHdvcmtzCisgICAgZGVtb19zcGludHh0LnNldChzdGF0ZXNbaWR4XSkgICAgICAgIyB0aGlzIHdvcmtzCiAKIGRlZiBzcGluX3ZhbGlkYXRlKHcpOgogICAgIGdsb2JhbCBzdGF0ZXMsIGRlbW9fc3BpbnR4dAogCiAgICAgdHJ5OgotCWkgPSBzdGF0ZXMuaW5kZXgoZGVtb19zcGludHh0LmdldCgpKQorICAgICAgICBpID0gc3RhdGVzLmluZGV4KGRlbW9fc3BpbnR4dC5nZXQoKSkKICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLQlyZXR1cm4gc3RhdGVzWzBdCisgICAgICAgIHJldHVybiBzdGF0ZXNbMF0KICAgICByZXR1cm4gc3RhdGVzW2ldCiAgICAgIyB3aHkgdGhpcyBwcm9jZWR1cmUgd29ya3MgYXMgb3Bwb3NlZCB0byB0aGUgcHJldmlvdXMgb25lIGJlYXRzIG1lLgogCkBAIC00MTcsOCArNDE3LDggQEAKIAogZGVmIE1rRmlsZUVudCh3KToKICAgICBtc2cgPSBUaXguTWVzc2FnZSh3LAotCQkgICAgICByZWxpZWY9VGl4LkZMQVQsIHdpZHRoPTI0MCwgYW5jaG9yPVRpeC5OLAotCQkgICAgICB0ZXh0PSdQcmVzcyB0aGUgIm9wZW4gZmlsZSIgaWNvbiBidXR0b24gYW5kIGEgVGl4RmlsZVNlbGVjdERpYWxvZyB3aWxsIHBvcHVwLicpCisgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yNDAsIGFuY2hvcj1UaXguTiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdQcmVzcyB0aGUgIm9wZW4gZmlsZSIgaWNvbiBidXR0b24gYW5kIGEgVGl4RmlsZVNlbGVjdERpYWxvZyB3aWxsIHBvcHVwLicpCiAgICAgZW50ID0gVGl4LkZpbGVFbnRyeSh3LCBsYWJlbD0nU2VsZWN0IGEgZmlsZSA6ICcpCiAgICAgbXNnLnBhY2soc2lkZT1UaXguVE9QLCBleHBhbmQ9MSwgZmlsbD1UaXguQk9USCwgcGFkeD0zLCBwYWR5PTMpCiAgICAgZW50LnBhY2soc2lkZT1UaXguVE9QLCBmaWxsPVRpeC5YLCBwYWR4PTMsIHBhZHk9MykKQEAgLTQyOSw4ICs0MjksOCBAQAogICAgIGFuZCB5b3VyIHBhc3Qgc2VsZWN0aW9ucyBhcmUgcmVjb3JkZWQuCiAgICAgIiIiCiAgICAgbXNnID0gVGl4Lk1lc3NhZ2UodywKLQkJICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yNDAsIGFuY2hvcj1UaXguTiwKLQkJICAgICAgdGV4dD0nVGhlIFRpeCBGaWxlU2VsZWN0Qm94IGlzIGEgTW90aWYtc3R5bGUgYm94IHdpdGggdmFyaW91cyBlbmhhbmNlbWVudHMuIEZvciBleGFtcGxlLCB5b3UgY2FuIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3Rib3hlcyBhbmQgeW91ciBwYXN0IHNlbGVjdGlvbnMgYXJlIHJlY29yZGVkLicpCisgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yNDAsIGFuY2hvcj1UaXguTiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdUaGUgVGl4IEZpbGVTZWxlY3RCb3ggaXMgYSBNb3RpZi1zdHlsZSBib3ggd2l0aCB2YXJpb3VzIGVuaGFuY2VtZW50cy4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSB0d28gbGlzdGJveGVzIGFuZCB5b3VyIHBhc3Qgc2VsZWN0aW9ucyBhcmUgcmVjb3JkZWQuJykKICAgICBib3ggPSBUaXguRmlsZVNlbGVjdEJveCh3KQogICAgIG1zZy5wYWNrKHNpZGU9VGl4LlRPUCwgZXhwYW5kPTEsIGZpbGw9VGl4LkJPVEgsIHBhZHg9MywgcGFkeT0zKQogICAgIGJveC5wYWNrKHNpZGU9VGl4LlRPUCwgZmlsbD1UaXguWCwgcGFkeD0zLCBwYWR5PTMpCkBAIC00NDMsOCArNDQzLDggQEAKICAgICBvcHRpb25zPSdmcmFtZS5ib3JkZXJXaWR0aCAxJwogCiAgICAgbXNnID0gVGl4Lk1lc3NhZ2UodywKLQkJICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yNDAsIGFuY2hvcj1UaXguTiwKLQkJICAgICAgdGV4dD0nVGhlIFNlbGVjdCB3aWRnZXQgaXMgYWxzbyBnb29kIGZvciBhcnJhbmdpbmcgYnV0dG9ucyBpbiBhIHRvb2wgYmFyLicpCisgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yNDAsIGFuY2hvcj1UaXguTiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdUaGUgU2VsZWN0IHdpZGdldCBpcyBhbHNvIGdvb2QgZm9yIGFycmFuZ2luZyBidXR0b25zIGluIGEgdG9vbCBiYXIuJykKICAgICBiYXIgPSBUaXguRnJhbWUodywgYmQ9MiwgcmVsaWVmPVRpeC5SQUlTRUQpCiAgICAgZm9udCA9IFRpeC5TZWxlY3QodywgYWxsb3d6ZXJvPTEsIHJhZGlvPTAsIGxhYmVsPScnLCBvcHRpb25zPW9wdGlvbnMpCiAgICAgcGFyYSA9IFRpeC5TZWxlY3QodywgYWxsb3d6ZXJvPTAsIHJhZGlvPTEsIGxhYmVsPScnLCBvcHRpb25zPW9wdGlvbnMpCkBAIC00NjYsOCArNDY2LDggQEAKIAogZGVmIE1rVGl0bGUodyk6CiAgICAgbXNnID0gVGl4Lk1lc3NhZ2UodywKLQkJICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yNDAsIGFuY2hvcj1UaXguTiwKLQkJICAgICAgdGV4dD0nVGhlcmUgYXJlIG1hbnkgdHlwZXMgb2YgImNob29zZXIiIHdpZGdldHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBpbnB1dCBkaWZmZXJlbnQgdHlwZXMgb2YgaW5mb3JtYXRpb24nKQorICAgICAgICAgICAgICAgICAgICAgIHJlbGllZj1UaXguRkxBVCwgd2lkdGg9MjQwLCBhbmNob3I9VGl4Lk4sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nVGhlcmUgYXJlIG1hbnkgdHlwZXMgb2YgImNob29zZXIiIHdpZGdldHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBpbnB1dCBkaWZmZXJlbnQgdHlwZXMgb2YgaW5mb3JtYXRpb24nKQogICAgIG1zZy5wYWNrKHNpZGU9VGl4LlRPUCwgZXhwYW5kPTEsIGZpbGw9VGl4LkJPVEgsIHBhZHg9MywgcGFkeT0zKQogCiBkZWYgTWtTY3JvbGwobmIsIG5hbWUpOgpAQCAtNDk0LDggKzQ5NCw4IEBACiAgICAgdG9wID0gVGl4LkZyYW1lKHcsIHdpZHRoPTMwMCwgaGVpZ2h0PTMzMCkKICAgICBib3QgPSBUaXguRnJhbWUodykKICAgICBtc2cgPSBUaXguTWVzc2FnZSh0b3AsCi0JCSAgICAgIHJlbGllZj1UaXguRkxBVCwgd2lkdGg9MjAwLCBhbmNob3I9VGl4Lk4sCi0JCSAgICAgIHRleHQ9J1RoaXMgVGl4U2Nyb2xsZWRMaXN0Qm94IGlzIGNvbmZpZ3VyZWQgc28gdGhhdCBpdCB1c2VzIHNjcm9sbGJhcnMgb25seSB3aGVuIGl0IGlzIG5lY2Vzc2FyeS4gVXNlIHRoZSBoYW5kbGVzIHRvIHJlc2l6ZSB0aGUgbGlzdGJveCBhbmQgd2F0Y2ggdGhlIHNjcm9sbGJhcnMgYXV0b21hdGljYWxseSBhcHBlYXIgYW5kIGRpc2FwcGVhci4nKQorICAgICAgICAgICAgICAgICAgICAgIHJlbGllZj1UaXguRkxBVCwgd2lkdGg9MjAwLCBhbmNob3I9VGl4Lk4sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nVGhpcyBUaXhTY3JvbGxlZExpc3RCb3ggaXMgY29uZmlndXJlZCBzbyB0aGF0IGl0IHVzZXMgc2Nyb2xsYmFycyBvbmx5IHdoZW4gaXQgaXMgbmVjZXNzYXJ5LiBVc2UgdGhlIGhhbmRsZXMgdG8gcmVzaXplIHRoZSBsaXN0Ym94IGFuZCB3YXRjaCB0aGUgc2Nyb2xsYmFycyBhdXRvbWF0aWNhbGx5IGFwcGVhciBhbmQgZGlzYXBwZWFyLicpCiAKICAgICBsaXN0ID0gVGl4LlNjcm9sbGVkTGlzdEJveCh0b3AsIHNjcm9sbGJhcj0nYXV0bycpCiAgICAgbGlzdC5wbGFjZSh4PTUwLCB5PTE1MCwgd2lkdGg9MTIwLCBoZWlnaHQ9ODApCkBAIC01MDgsOCArNTA4LDggQEAKICAgICBsaXN0Lmxpc3Rib3guaW5zZXJ0KFRpeC5FTkQsICdXYXNoaW5ndG9uJykKIAogICAgIHJoID0gVGl4LlJlc2l6ZUhhbmRsZSh0b3AsIGJnPSdibGFjaycsCi0JCQkgIHJlbGllZj1UaXguUkFJU0VELAotCQkJICBoYW5kbGVzaXplPTgsIGdyaWRkZWQ9MSwgbWlud2lkdGg9NTAsIG1pbmhlaWdodD0zMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVRpeC5SQUlTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXNpemU9OCwgZ3JpZGRlZD0xLCBtaW53aWR0aD01MCwgbWluaGVpZ2h0PTMwKQogICAgIGJ0biA9IFRpeC5CdXR0b24oYm90LCB0ZXh0PSdSZXNldCcsIGNvbW1hbmQ9bGFtYmRhIHc9cmgsIHg9bGlzdDogU0xpc3RfcmVzZXQodyx4KSkKICAgICB0b3AucHJvcGFnYXRlKDApCiAgICAgbXNnLnBhY2soZmlsbD1UaXguWCkKQEAgLTUxNyw3ICs1MTcsNyBAQAogICAgIHRvcC5wYWNrKGV4cGFuZD0xLCBmaWxsPVRpeC5CT1RIKQogICAgIGJvdC5wYWNrKGZpbGw9VGl4LkJPVEgpCiAgICAgbGlzdC5iaW5kKCc8TWFwPicsIGZ1bmM9bGFtYmRhIGFyZz0wLCByaD1yaCwgbGlzdD1saXN0OgotCSAgICAgIGxpc3QudGsuY2FsbCgndGl4RG9XaGVuSWRsZScsIHN0cihyaCksICdhdHRhY2h3aWRnZXQnLCBzdHIobGlzdCkpKQorICAgICAgICAgICAgICBsaXN0LnRrLmNhbGwoJ3RpeERvV2hlbklkbGUnLCBzdHIocmgpLCAnYXR0YWNod2lkZ2V0Jywgc3RyKGxpc3QpKSkKIAogZGVmIFNMaXN0X3Jlc2V0KHJoLCBsaXN0KToKICAgICBsaXN0LnBsYWNlKHg9NTAsIHk9MTUwLCB3aWR0aD0xMjAsIGhlaWdodD04MCkKQEAgLTUzOSw4ICs1MzksOCBAQAogICAgIHRvcCA9IFRpeC5GcmFtZSh3LCB3aWR0aD0zMzAsIGhlaWdodD0zMzApCiAgICAgYm90ID0gVGl4LkZyYW1lKHcpCiAgICAgbXNnID0gVGl4Lk1lc3NhZ2UodG9wLAotCQkgICAgICByZWxpZWY9VGl4LkZMQVQsIHdpZHRoPTIwMCwgYW5jaG9yPVRpeC5OLAotCQkgICAgICB0ZXh0PXRleHQpCisgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yMDAsIGFuY2hvcj1UaXguTiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0PXRleHQpCiAKICAgICB3aW4gPSBUaXguU2Nyb2xsZWRXaW5kb3codG9wLCBzY3JvbGxiYXI9J2F1dG8nKQogCkBAIC01NTEsOCArNTUxLDggQEAKICAgICB3aW4ucGxhY2UoeD0zMCwgeT0xNTAsIHdpZHRoPTE5MCwgaGVpZ2h0PTEyMCkKIAogICAgIHJoID0gVGl4LlJlc2l6ZUhhbmRsZSh0b3AsIGJnPSdibGFjaycsCi0JCQkgIHJlbGllZj1UaXguUkFJU0VELAotCQkJICBoYW5kbGVzaXplPTgsIGdyaWRkZWQ9MSwgbWlud2lkdGg9NTAsIG1pbmhlaWdodD0zMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVRpeC5SQUlTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXNpemU9OCwgZ3JpZGRlZD0xLCBtaW53aWR0aD01MCwgbWluaGVpZ2h0PTMwKQogICAgIGJ0biA9IFRpeC5CdXR0b24oYm90LCB0ZXh0PSdSZXNldCcsIGNvbW1hbmQ9bGFtYmRhIHc9cmgsIHg9d2luOiBTV2luZG93X3Jlc2V0KHcseCkpCiAgICAgdG9wLnByb3BhZ2F0ZSgwKQogICAgIG1zZy5wYWNrKGZpbGw9VGl4LlgpCkBAIC01NjEsNyArNTYxLDcgQEAKICAgICBib3QucGFjayhmaWxsPVRpeC5CT1RIKQogCiAgICAgd2luLmJpbmQoJzxNYXA+JywgZnVuYz1sYW1iZGEgYXJnPTAsIHJoPXJoLCB3aW49d2luOgotCSAgICAgd2luLnRrLmNhbGwoJ3RpeERvV2hlbklkbGUnLCBzdHIocmgpLCAnYXR0YWNod2lkZ2V0Jywgc3RyKHdpbikpKQorICAgICAgICAgICAgIHdpbi50ay5jYWxsKCd0aXhEb1doZW5JZGxlJywgc3RyKHJoKSwgJ2F0dGFjaHdpZGdldCcsIHN0cih3aW4pKSkKIAogZGVmIFNXaW5kb3dfcmVzZXQocmgsIHdpbik6CiAgICAgd2luLnBsYWNlKHg9MzAsIHk9MTUwLCB3aWR0aD0xOTAsIGhlaWdodD0xMjApCkBAIC01NzQsMjcgKzU3NCwyNyBAQAogICAgIHRvcCA9IFRpeC5GcmFtZSh3LCB3aWR0aD0zMzAsIGhlaWdodD0zMzApCiAgICAgYm90ID0gVGl4LkZyYW1lKHcpCiAgICAgbXNnID0gVGl4Lk1lc3NhZ2UodG9wLAotCQkgICAgICByZWxpZWY9VGl4LkZMQVQsIHdpZHRoPTIwMCwgYW5jaG9yPVRpeC5OLAotCQkgICAgICB0ZXh0PSdUaGUgVGl4IFNjcm9sbGVkV2luZG93IHdpZGdldCBhbGxvd3MgeW91IHRvIHNjcm9sbCBhbnkga2luZCBvZiBUayB3aWRnZXQuIEl0IGlzIG1vcmUgdmVyc2F0aWxlIHRoYW4gYSBzY3JvbGxlZCBjYW52YXMgd2lkZ2V0LicpCisgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yMDAsIGFuY2hvcj1UaXguTiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdUaGUgVGl4IFNjcm9sbGVkV2luZG93IHdpZGdldCBhbGxvd3MgeW91IHRvIHNjcm9sbCBhbnkga2luZCBvZiBUayB3aWRnZXQuIEl0IGlzIG1vcmUgdmVyc2F0aWxlIHRoYW4gYSBzY3JvbGxlZCBjYW52YXMgd2lkZ2V0LicpCiAKICAgICB3aW4gPSBUaXguU2Nyb2xsZWRUZXh0KHRvcCwgc2Nyb2xsYmFyPSdhdXRvJykKICAgICB3aW4udGV4dFsnd3JhcCddID0gJ25vbmUnCiAgICAgd2luLnRleHQuaW5zZXJ0KFRpeC5FTkQsICcnJ1doZW4gLXNjcm9sbGJhciBpcyBzZXQgdG8gImF1dG8iLCB0aGUKLXNjcm9sbGJhcnMgYXJlIHNob3duIG9ubHkgd2hlbiBuZWVkZWQuIAorc2Nyb2xsYmFycyBhcmUgc2hvd24gb25seSB3aGVuIG5lZWRlZC4KIEFkZGl0aW9uYWwgbW9kaWZpZXJzIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEKLXNjcm9sbGJhciB0byBiZSBzaG93biBvciBoaWRkZW4uIEZvciBleGFtcGxlLCAKLSJhdXRvIC15IiBtZWFucyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgCi1zaG91bGQgYmUgc2hvd24gd2hlbiBuZWVkZWQgYnV0IHRoZSB2ZXJ0aWNhbCAKK3Njcm9sbGJhciB0byBiZSBzaG93biBvciBoaWRkZW4uIEZvciBleGFtcGxlLAorImF1dG8gLXkiIG1lYW5zIHRoZSBob3Jpem9udGFsIHNjcm9sbGJhcgorc2hvdWxkIGJlIHNob3duIHdoZW4gbmVlZGVkIGJ1dCB0aGUgdmVydGljYWwKIHNjcm9sbGJhciBzaG91bGQgYWx3YXlzIGJlIGhpZGRlbjsKICJhdXRvICt4IiBtZWFucyB0aGUgdmVydGljYWwgc2Nyb2xsYmFyCi1zaG91bGQgYmUgc2hvd24gd2hlbiBuZWVkZWQgYnV0IHRoZSBob3Jpem9udGFsIAorc2hvdWxkIGJlIHNob3duIHdoZW4gbmVlZGVkIGJ1dCB0aGUgaG9yaXpvbnRhbAogc2Nyb2xsYmFyIHNob3VsZCBhbHdheXMgYmUgc2hvd24sIGFuZCBzbyBvbi4nJycKICkKICAgICB3aW4ucGxhY2UoeD0zMCwgeT0xNTAsIHdpZHRoPTE5MCwgaGVpZ2h0PTEwMCkKIAogICAgIHJoID0gVGl4LlJlc2l6ZUhhbmRsZSh0b3AsIGJnPSdibGFjaycsCi0JCQkgIHJlbGllZj1UaXguUkFJU0VELAotCQkJICBoYW5kbGVzaXplPTgsIGdyaWRkZWQ9MSwgbWlud2lkdGg9NTAsIG1pbmhlaWdodD0zMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVRpeC5SQUlTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXNpemU9OCwgZ3JpZGRlZD0xLCBtaW53aWR0aD01MCwgbWluaGVpZ2h0PTMwKQogICAgIGJ0biA9IFRpeC5CdXR0b24oYm90LCB0ZXh0PSdSZXNldCcsIGNvbW1hbmQ9bGFtYmRhIHc9cmgsIHg9d2luOiBTVGV4dF9yZXNldCh3LHgpKQogICAgIHRvcC5wcm9wYWdhdGUoMCkKICAgICBtc2cucGFjayhmaWxsPVRpeC5YKQpAQCAtNjAyLDcgKzYwMiw3IEBACiAgICAgdG9wLnBhY2soZXhwYW5kPTEsIGZpbGw9VGl4LkJPVEgpCiAgICAgYm90LnBhY2soZmlsbD1UaXguQk9USCkKICAgICB3aW4uYmluZCgnPE1hcD4nLCBmdW5jPWxhbWJkYSBhcmc9MCwgcmg9cmgsIHdpbj13aW46Ci0JICAgICB3aW4udGsuY2FsbCgndGl4RG9XaGVuSWRsZScsIHN0cihyaCksICdhdHRhY2h3aWRnZXQnLCBzdHIod2luKSkpCisgICAgICAgICAgICAgd2luLnRrLmNhbGwoJ3RpeERvV2hlbklkbGUnLCBzdHIocmgpLCAnYXR0YWNod2lkZ2V0Jywgc3RyKHdpbikpKQogCiBkZWYgU1RleHRfcmVzZXQocmgsIHdpbik6CiAgICAgd2luLnBsYWNlKHg9MzAsIHk9MTUwLCB3aWR0aD0xOTAsIGhlaWdodD0xMjApCkBAIC02MjgsOCArNjI4LDggQEAKICAgICBvciBob3Jpem9udGFsbHkuCiAgICAgIiIiCiAgICAgbXNnID0gVGl4Lk1lc3NhZ2UodywKLQkJICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yNDAsIGFuY2hvcj1UaXguTiwKLQkJICAgICAgdGV4dD0nVGhlIFBhbmVkV2luZG93IHdpZGdldCBhbGxvd3MgdGhlIHVzZXIgdG8gaW50ZXJhY3RpdmVseSBtYW5pcHVsYXRlIHRoZSBzaXplcyBvZiBzZXZlcmFsIHBhbmVzLiBUaGUgcGFuZXMgY2FuIGJlIGFycmFuZ2VkIGVpdGhlciB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseS4nKQorICAgICAgICAgICAgICAgICAgICAgIHJlbGllZj1UaXguRkxBVCwgd2lkdGg9MjQwLCBhbmNob3I9VGl4Lk4sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nVGhlIFBhbmVkV2luZG93IHdpZGdldCBhbGxvd3MgdGhlIHVzZXIgdG8gaW50ZXJhY3RpdmVseSBtYW5pcHVsYXRlIHRoZSBzaXplcyBvZiBzZXZlcmFsIHBhbmVzLiBUaGUgcGFuZXMgY2FuIGJlIGFycmFuZ2VkIGVpdGhlciB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseS4nKQogICAgIGdyb3VwID0gVGl4LkxhYmVsRW50cnkodywgbGFiZWw9J05ld3Nncm91cDonLCBvcHRpb25zPSdlbnRyeS53aWR0aCAyNScpCiAgICAgZ3JvdXAuZW50cnkuaW5zZXJ0KDAsJ2NvbXAubGFuZy5weXRob24nKQogICAgIHBhbmUgPSBUaXguUGFuZWRXaW5kb3codywgb3JpZW50YXRpb249J3ZlcnRpY2FsJykKQEAgLTY3MSw4ICs2NzEsOCBAQAogCiBkZWYgTWtOb3RlQm9vayh3KToKICAgICBtc2cgPSBUaXguTWVzc2FnZSh3LAotCQkgICAgICByZWxpZWY9VGl4LkZMQVQsIHdpZHRoPTI0MCwgYW5jaG9yPVRpeC5OLAotCQkgICAgICB0ZXh0PSdUaGUgTm90ZUJvb2sgd2lkZ2V0IGFsbG93cyB5b3UgdG8gbGF5b3V0IGEgY29tcGxleCBpbnRlcmZhY2UgaW50byBpbmRpdmlkdWFsIHBhZ2VzLicpCisgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yNDAsIGFuY2hvcj1UaXguTiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdUaGUgTm90ZUJvb2sgd2lkZ2V0IGFsbG93cyB5b3UgdG8gbGF5b3V0IGEgY29tcGxleCBpbnRlcmZhY2UgaW50byBpbmRpdmlkdWFsIHBhZ2VzLicpCiAgICAgIyBwcmVmaXggPSBUaXguT3B0aW9uTmFtZSh3KQogICAgICMgaWYgbm90IHByZWZpeDogcHJlZml4ID0gJycKICAgICAjIHcub3B0aW9uX2FkZCgnKicgKyBwcmVmaXggKyAnKlRpeE5vdGVCb29rKnRhZ1BhZFgnLCA4KQpAQCAtNzM4LDggKzczOCw4IEBACiAgICAgZGlyZWN0b3JpZXMuCiAgICAgIiIiCiAgICAgbXNnID0gVGl4Lk1lc3NhZ2UodywKLQkJICAgICAgcmVsaWVmPVRpeC5GTEFULCB3aWR0aD0yNDAsIGFuY2hvcj1UaXguTiwKLQkJICAgICAgdGV4dD0nVGhlIFRpeCBEaXJMaXN0IHdpZGdldCBnaXZlcyBhIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5IGFuZCBtYWtlcyBpdCBlYXN5IGZvciB0aGUgdXNlciB0byBjaG9vc2UgYW5kIGFjY2VzcyBkaXJlY3Rvcmllcy4nKQorICAgICAgICAgICAgICAgICAgICAgIHJlbGllZj1UaXguRkxBVCwgd2lkdGg9MjQwLCBhbmNob3I9VGl4Lk4sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nVGhlIFRpeCBEaXJMaXN0IHdpZGdldCBnaXZlcyBhIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5IGFuZCBtYWtlcyBpdCBlYXN5IGZvciB0aGUgdXNlciB0byBjaG9vc2UgYW5kIGFjY2VzcyBkaXJlY3Rvcmllcy4nKQogICAgIGRpcmxpc3QgPSBUaXguRGlyTGlzdCh3LCBvcHRpb25zPSdobGlzdC5wYWRZIDEgaGxpc3Qud2lkdGggMjUgaGxpc3QuaGVpZ2h0IDE2JykKICAgICBtc2cucGFjayhzaWRlPVRpeC5UT1AsIGV4cGFuZD0xLCBmaWxsPVRpeC5CT1RILCBwYWR4PTMsIHBhZHk9MykKICAgICBkaXJsaXN0LnBhY2soc2lkZT1UaXguVE9QLCBwYWR4PTMsIHBhZHk9MykKQEAgLTc0OCw4ICs3NDgsOCBAQAogICAgICIiIlRoZSBUaXhFeEZpbGVTZWxlY3RCb3ggd2lkZ2V0IGlzIG1vcmUgdXNlciBmcmllbmRseSB0aGFuIHRoZSBNb3RpZgogICAgIHN0eWxlIEZpbGVTZWxlY3RCb3guICAiIiIKICAgICBtc2cgPSBUaXguTWVzc2FnZSh3LAotCQkgICAgICByZWxpZWY9VGl4LkZMQVQsIHdpZHRoPTI0MCwgYW5jaG9yPVRpeC5OLAotCQkgICAgICB0ZXh0PSdUaGUgVGl4IEV4RmlsZVNlbGVjdEJveCB3aWRnZXQgaXMgbW9yZSB1c2VyIGZyaWVuZGx5IHRoYW4gdGhlIE1vdGlmIHN0eWxlIEZpbGVTZWxlY3RCb3guJykKKyAgICAgICAgICAgICAgICAgICAgICByZWxpZWY9VGl4LkZMQVQsIHdpZHRoPTI0MCwgYW5jaG9yPVRpeC5OLAorICAgICAgICAgICAgICAgICAgICAgIHRleHQ9J1RoZSBUaXggRXhGaWxlU2VsZWN0Qm94IHdpZGdldCBpcyBtb3JlIHVzZXIgZnJpZW5kbHkgdGhhbiB0aGUgTW90aWYgc3R5bGUgRmlsZVNlbGVjdEJveC4nKQogICAgICMgVGhlcmUncyBhIGJ1ZyBpbiB0aGUgQ29tYm9Cb3hlcyAtIHRoZSBzY3JvbGxlZGxpc3Rib3ggaXMgZGVzdHJveWVkCiAgICAgYm94ID0gVGl4LkV4RmlsZVNlbGVjdEJveCh3LCBiZD0yLCByZWxpZWY9VGl4LlJBSVNFRCkKICAgICBtc2cucGFjayhzaWRlPVRpeC5UT1AsIGV4cGFuZD0xLCBmaWxsPVRpeC5CT1RILCBwYWR4PTMsIHBhZHk9MykKQEAgLTc1OCwxMTggKzc1OCwxMTggQEAKICMjIwogIyMjIExpc3Qgb2YgYWxsIHRoZSBkZW1vcyB3ZSB3YW50IHRvIHNob3cgb2ZmCiBjb21tZW50cyA9IHsnd2lkZ2V0JyA6ICdXaWRnZXQgRGVtb3MnLCAnaW1hZ2UnIDogJ0ltYWdlIERlbW9zJ30KLXNhbXBsZXMgPSB7J0JhbGxvb24nCQk6ICdCYWxsb29uJywKLQkgICAnQnV0dG9uIEJveCcJCTogJ0J0bkJveCcsCi0JICAgJ0NvbWJvIEJveCcJCTogJ0NvbWJvQm94JywKLQkgICAnQ29tcG91bmQgSW1hZ2UnCTogJ0NtcEltZycsCi0JICAgJ0RpcmVjdG9yeSBMaXN0Jwk6ICdEaXJMaXN0JywKLQkgICAnRGlyZWN0b3J5IFRyZWUnCTogJ0RpclRyZWUnLAotCSAgICdDb250cm9sJwkJOiAnQ29udHJvbCcsCi0JICAgJ05vdGVib29rJwkJOiAnTm90ZUJvb2snLAotCSAgICdPcHRpb24gTWVudScJOiAnT3B0TWVudScsCi0JICAgJ1BhbmVkIFdpbmRvdycJOiAnUGFuZWRXaW4nLAotCSAgICdQb3B1cCBNZW51JwkJOiAnUG9wTWVudScsCi0JICAgJ1Njcm9sbGVkSExpc3QgKDEpJwk6ICdTSExpc3QxJywKLQkgICAnU2Nyb2xsZWRITGlzdCAoMiknCTogJ1NITGlzdDInLAotCSAgICdUcmVlIChkeW5hbWljKScJOiAnVHJlZScKK3NhbXBsZXMgPSB7J0JhbGxvb24nICAgICAgICAgICAgOiAnQmFsbG9vbicsCisgICAgICAgICAgICdCdXR0b24gQm94JyAgICAgICAgIDogJ0J0bkJveCcsCisgICAgICAgICAgICdDb21ibyBCb3gnICAgICAgICAgIDogJ0NvbWJvQm94JywKKyAgICAgICAgICAgJ0NvbXBvdW5kIEltYWdlJyAgICAgOiAnQ21wSW1nJywKKyAgICAgICAgICAgJ0RpcmVjdG9yeSBMaXN0JyAgICAgOiAnRGlyTGlzdCcsCisgICAgICAgICAgICdEaXJlY3RvcnkgVHJlZScgICAgIDogJ0RpclRyZWUnLAorICAgICAgICAgICAnQ29udHJvbCcgICAgICAgICAgICA6ICdDb250cm9sJywKKyAgICAgICAgICAgJ05vdGVib29rJyAgICAgICAgICAgOiAnTm90ZUJvb2snLAorICAgICAgICAgICAnT3B0aW9uIE1lbnUnICAgICAgICA6ICdPcHRNZW51JywKKyAgICAgICAgICAgJ1BhbmVkIFdpbmRvdycgICAgICAgOiAnUGFuZWRXaW4nLAorICAgICAgICAgICAnUG9wdXAgTWVudScgICAgICAgICA6ICdQb3BNZW51JywKKyAgICAgICAgICAgJ1Njcm9sbGVkSExpc3QgKDEpJyAgOiAnU0hMaXN0MScsCisgICAgICAgICAgICdTY3JvbGxlZEhMaXN0ICgyKScgIDogJ1NITGlzdDInLAorICAgICAgICAgICAnVHJlZSAoZHluYW1pYyknICAgICA6ICdUcmVlJwogfQogCiAjIFRoZXJlIGFyZSBzdGlsbCBhIGxvdCBvZiBkZW1vcyB0byBiZSB0cmFuc2xhdGVkOgotIyMJc2V0IHJvb3QgewotIyMJICAgIHtkICJGaWxlIFNlbGVjdG9ycyIJCWZpbGUJfQotIyMJICAgIHtkICJIaWVyYWNoaWNhbCBMaXN0Qm94IglobGlzdAl9Ci0jIwkgICAge2QgIlRhYnVsYXIgTGlzdEJveCIJdGxpc3QJe2MgdGl4VExpc3R9fQotIyMJICAgIHtkICJHcmlkIFdpZGdldCIJCWdyaWQJe2MgdGl4R3JpZH19Ci0jIwkgICAge2QgIk1hbmFnZXIgV2lkZ2V0cyIJbWFuYWdlcgl9Ci0jIwkgICAge2QgIlNjcm9sbGVkIFdpZGdldHMiCXNjcm9sbAl9Ci0jIwkgICAge2QgIk1pc2NlbGxhbmVvdXMgV2lkZ2V0cyIJbWlzYwl9Ci0jIwkgICAge2QgIkltYWdlIFR5cGVzIgkJaW1hZ2UJfQotIyMJfQorIyMgICAgICBzZXQgcm9vdCB7CisjIyAgICAgICAgICB7ZCAiRmlsZSBTZWxlY3RvcnMiICAgICAgICAgZmlsZSAgICB9CisjIyAgICAgICAgICB7ZCAiSGllcmFjaGljYWwgTGlzdEJveCIgICAgaGxpc3QgICB9CisjIyAgICAgICAgICB7ZCAiVGFidWxhciBMaXN0Qm94IiAgICAgICAgdGxpc3QgICB7YyB0aXhUTGlzdH19CisjIyAgICAgICAgICB7ZCAiR3JpZCBXaWRnZXQiICAgICAgICAgICAgZ3JpZCAgICB7YyB0aXhHcmlkfX0KKyMjICAgICAgICAgIHtkICJNYW5hZ2VyIFdpZGdldHMiICAgICAgICBtYW5hZ2VyIH0KKyMjICAgICAgICAgIHtkICJTY3JvbGxlZCBXaWRnZXRzIiAgICAgICBzY3JvbGwgIH0KKyMjICAgICAgICAgIHtkICJNaXNjZWxsYW5lb3VzIFdpZGdldHMiICBtaXNjICAgIH0KKyMjICAgICAgICAgIHtkICJJbWFnZSBUeXBlcyIgICAgICAgICAgICBpbWFnZSAgIH0KKyMjICAgICAgfQogIyMKLSMjCXNldCBpbWFnZSB7Ci0jIwkgICAge2QgIkNvbXBvdW5kIEltYWdlIgkJY21waW1nCX0KLSMjCSAgICB7ZCAiWFBNIEltYWdlIgkJeHBtCXtpIHBpeG1hcH19Ci0jIwl9CisjIyAgICAgIHNldCBpbWFnZSB7CisjIyAgICAgICAgICB7ZCAiQ29tcG91bmQgSW1hZ2UiICAgICAgICAgY21waW1nICB9CisjIyAgICAgICAgICB7ZCAiWFBNIEltYWdlIiAgICAgICAgICAgICAgeHBtICAgICB7aSBwaXhtYXB9fQorIyMgICAgICB9CiAjIwotIyMJc2V0IGNtcGltZyB7Ci0jI2RvbmUJICAgIHtmICJJbiBCdXR0b25zIgkJQ21wSW1nLnRjbAl9Ci0jIwkgICAge2YgIkluIE5vdGVCb29rIgkJQ21wSW1nMi50Y2wJfQotIyMJICAgIHtmICJOb3RlYm9vayBDb2xvciBUYWJzIglDbXBJbWc0LnRjbAl9Ci0jIwkgICAge2YgIkljb25zIgkJCUNtcEltZzMudGNsCX0KLSMjCX0KKyMjICAgICAgc2V0IGNtcGltZyB7CisjI2RvbmUgICAgICB7ZiAiSW4gQnV0dG9ucyIgICAgICAgICAgICAgQ21wSW1nLnRjbCAgICAgIH0KKyMjICAgICAgICAgIHtmICJJbiBOb3RlQm9vayIgICAgICAgICAgICBDbXBJbWcyLnRjbCAgICAgfQorIyMgICAgICAgICAge2YgIk5vdGVib29rIENvbG9yIFRhYnMiICAgIENtcEltZzQudGNsICAgICB9CisjIyAgICAgICAgICB7ZiAiSWNvbnMiICAgICAgICAgICAgICAgICAgQ21wSW1nMy50Y2wgICAgIH0KKyMjICAgICAgfQogIyMKLSMjCXNldCB4cG0gewotIyMJICAgIHtmICJJbiBCdXR0b24iCQlYcG0udGNsCQl7aSBwaXhtYXB9fQotIyMJICAgIHtmICJJbiBNZW51IgkJWHBtMS50Y2wJe2kgcGl4bWFwfX0KLSMjCX0KKyMjICAgICAgc2V0IHhwbSB7CisjIyAgICAgICAgICB7ZiAiSW4gQnV0dG9uIiAgICAgICAgICAgICAgWHBtLnRjbCAgICAgICAgIHtpIHBpeG1hcH19CisjIyAgICAgICAgICB7ZiAiSW4gTWVudSIgICAgICAgICAgICAgICAgWHBtMS50Y2wgICAgICAgIHtpIHBpeG1hcH19CisjIyAgICAgIH0KICMjCi0jIwlzZXQgZmlsZSB7Ci0jI2FkZGVkCSAgICB7ZiBEaXJMaXN0CQkJCURpckxpc3QudGNsCX0KLSMjYWRkZWQJICAgIHtmIERpclRyZWUJCQkJRGlyVHJlZS50Y2wJfQotIyMJICAgIHtmIERpclNlbGVjdERpYWxvZwkJCURpckRsZy50Y2wJfQotIyMJICAgIHtmIEV4RmlsZVNlbGVjdERpYWxvZwkJRUZpbGVEbGcudGNsCX0KLSMjCSAgICB7ZiBGaWxlU2VsZWN0RGlhbG9nCQkJRmlsZURsZy50Y2wJfQotIyMJICAgIHtmIEZpbGVFbnRyeQkJCUZpbGVFbnQudGNsCX0KLSMjCX0KKyMjICAgICAgc2V0IGZpbGUgeworIyNhZGRlZCAgICAge2YgRGlyTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyTGlzdC50Y2wgICAgIH0KKyMjYWRkZWQgICAgIHtmIERpclRyZWUgICAgICAgICAgICAgICAgICAgICAgICAgIERpclRyZWUudGNsICAgICB9CisjIyAgICAgICAgICB7ZiBEaXJTZWxlY3REaWFsb2cgICAgICAgICAgICAgICAgICBEaXJEbGcudGNsICAgICAgfQorIyMgICAgICAgICAge2YgRXhGaWxlU2VsZWN0RGlhbG9nICAgICAgICAgICAgICAgRUZpbGVEbGcudGNsICAgIH0KKyMjICAgICAgICAgIHtmIEZpbGVTZWxlY3REaWFsb2cgICAgICAgICAgICAgICAgIEZpbGVEbGcudGNsICAgICB9CisjIyAgICAgICAgICB7ZiBGaWxlRW50cnkgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRW50LnRjbCAgICAgfQorIyMgICAgICB9CiAjIwotIyMJc2V0IGhsaXN0IHsKLSMjCSAgICB7ZiBITGlzdAkJCUhMaXN0MS50Y2wJfQotIyMJICAgIHtmIENoZWNrTGlzdAkJQ2hrTGlzdC50Y2wJe2MgdGl4Q2hlY2tMaXN0fX0KLSMjZG9uZQkgICAge2YgIlNjcm9sbGVkSExpc3QgKDEpIglTSExpc3QudGNsCX0KLSMjZG9uZQkgICAge2YgIlNjcm9sbGVkSExpc3QgKDIpIglTSExpc3QyLnRjbAl9Ci0jI2RvbmUJICAgIHtmIFRyZWUJCQlUcmVlLnRjbAl9Ci0jI2RvbmUJICAgIHtmICJUcmVlIChEeW5hbWljKSIJCUR5blRyZWUudGNsCXt2IHdpbn19Ci0jIwl9CisjIyAgICAgIHNldCBobGlzdCB7CisjIyAgICAgICAgICB7ZiBITGlzdCAgICAgICAgICAgICAgICAgICAgSExpc3QxLnRjbCAgICAgIH0KKyMjICAgICAgICAgIHtmIENoZWNrTGlzdCAgICAgICAgICAgICAgICBDaGtMaXN0LnRjbCAgICAge2MgdGl4Q2hlY2tMaXN0fX0KKyMjZG9uZSAgICAgIHtmICJTY3JvbGxlZEhMaXN0ICgxKSIgICAgICBTSExpc3QudGNsICAgICAgfQorIyNkb25lICAgICAge2YgIlNjcm9sbGVkSExpc3QgKDIpIiAgICAgIFNITGlzdDIudGNsICAgICB9CisjI2RvbmUgICAgICB7ZiBUcmVlICAgICAgICAgICAgICAgICAgICAgVHJlZS50Y2wgICAgICAgIH0KKyMjZG9uZSAgICAgIHtmICJUcmVlIChEeW5hbWljKSIgICAgICAgICBEeW5UcmVlLnRjbCAgICAge3Ygd2lufX0KKyMjICAgICAgfQogIyMKLSMjCXNldCB0bGlzdCB7Ci0jIwkgICAge2YgIlNjcm9sbGVkVExpc3QgKDEpIglTVExpc3QxLnRjbAl7YyB0aXhUTGlzdH19Ci0jIwkgICAge2YgIlNjcm9sbGVkVExpc3QgKDIpIglTVExpc3QyLnRjbAl7YyB0aXhUTGlzdH19Ci0jIwl9Ci0jIwlnbG9iYWwgdGNsX3BsYXRmb3JtCi0jIwkjICBUaGlzIGRlbW8gaGFuZ3Mgd2luZG93cwotIyMJaWYgeyR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICE9ICJ3aW5kb3dzIn0gewotIyNuYQlsYXBwZW5kIHRsaXN0ICAgICB7ZiAiVExpc3QgRmlsZSBWaWV3ZXIiCVNUTGlzdDMudGNsCXtjIHRpeFRMaXN0fX0KLSMjCX0KKyMjICAgICAgc2V0IHRsaXN0IHsKKyMjICAgICAgICAgIHtmICJTY3JvbGxlZFRMaXN0ICgxKSIgICAgICBTVExpc3QxLnRjbCAgICAge2MgdGl4VExpc3R9fQorIyMgICAgICAgICAge2YgIlNjcm9sbGVkVExpc3QgKDIpIiAgICAgIFNUTGlzdDIudGNsICAgICB7YyB0aXhUTGlzdH19CisjIyAgICAgIH0KKyMjICAgICAgZ2xvYmFsIHRjbF9wbGF0Zm9ybQorIyMgICAgICAjICBUaGlzIGRlbW8gaGFuZ3Mgd2luZG93cworIyMgICAgICBpZiB7JHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIT0gIndpbmRvd3MifSB7CisjI25hICAgIGxhcHBlbmQgdGxpc3QgICAgIHtmICJUTGlzdCBGaWxlIFZpZXdlciIgICAgICAgIFNUTGlzdDMudGNsICAgICB7YyB0aXhUTGlzdH19CisjIyAgICAgIH0KICMjCi0jIwlzZXQgZ3JpZCB7Ci0jI25hCSAgICB7ZiAiU2ltcGxlIEdyaWQiCQlTR3JpZDAudGNsCXtjIHRpeEdyaWR9fQotIyNuYQkgICAge2YgIlNjcm9sbGVkR3JpZCIJCVNHcmlkMS50Y2wJe2MgdGl4R3JpZH19Ci0jI25hCSAgICB7ZiAiRWRpdGFibGUgR3JpZCIJCUVkaXRHcmlkLnRjbAl7YyB0aXhHcmlkfX0KLSMjCX0KKyMjICAgICAgc2V0IGdyaWQgeworIyNuYSAgICAgICAge2YgIlNpbXBsZSBHcmlkIiAgICAgICAgICAgIFNHcmlkMC50Y2wgICAgICB7YyB0aXhHcmlkfX0KKyMjbmEgICAgICAgIHtmICJTY3JvbGxlZEdyaWQiICAgICAgICAgICBTR3JpZDEudGNsICAgICAge2MgdGl4R3JpZH19CisjI25hICAgICAgICB7ZiAiRWRpdGFibGUgR3JpZCIgICAgICAgICAgRWRpdEdyaWQudGNsICAgIHtjIHRpeEdyaWR9fQorIyMgICAgICB9CiAjIwotIyMJc2V0IHNjcm9sbCB7Ci0jIwkgICAge2YgU2Nyb2xsZWRMaXN0Qm94CQlTTGlzdEJveC50Y2wJfQotIyMJICAgIHtmIFNjcm9sbGVkVGV4dAkJU1RleHQudGNsCX0KLSMjCSAgICB7ZiBTY3JvbGxlZFdpbmRvdwkJU1dpbmRvdy50Y2wJfQotIyNuYQkgICAge2YgIkNhbnZhcyBPYmplY3QgVmlldyIJQ09ialZpZXcudGNsCXtjIHRpeENPYmpWaWV3fX0KLSMjCX0KKyMjICAgICAgc2V0IHNjcm9sbCB7CisjIyAgICAgICAgICB7ZiBTY3JvbGxlZExpc3RCb3ggICAgICAgICAgU0xpc3RCb3gudGNsICAgIH0KKyMjICAgICAgICAgIHtmIFNjcm9sbGVkVGV4dCAgICAgICAgICAgICBTVGV4dC50Y2wgICAgICAgfQorIyMgICAgICAgICAge2YgU2Nyb2xsZWRXaW5kb3cgICAgICAgICAgIFNXaW5kb3cudGNsICAgICB9CisjI25hICAgICAgICB7ZiAiQ2FudmFzIE9iamVjdCBWaWV3IiAgICAgQ09ialZpZXcudGNsICAgIHtjIHRpeENPYmpWaWV3fX0KKyMjICAgICAgfQogIyMKLSMjCXNldCBtYW5hZ2VyIHsKLSMjCSAgICB7ZiBMaXN0Tm90ZUJvb2sJCUxpc3ROQksudGNsCX0KLSMjZG9uZQkgICAge2YgTm90ZUJvb2sJCQlOb3RlQm9vay50Y2wJfQotIyNkb25lCSAgICB7ZiBQYW5lZFdpbmRvdwkJUGFuZWRXaW4udGNsCX0KLSMjCX0KKyMjICAgICAgc2V0IG1hbmFnZXIgeworIyMgICAgICAgICAge2YgTGlzdE5vdGVCb29rICAgICAgICAgICAgIExpc3ROQksudGNsICAgICB9CisjI2RvbmUgICAgICB7ZiBOb3RlQm9vayAgICAgICAgICAgICAgICAgTm90ZUJvb2sudGNsICAgIH0KKyMjZG9uZSAgICAgIHtmIFBhbmVkV2luZG93ICAgICAgICAgICAgICBQYW5lZFdpbi50Y2wgICAgfQorIyMgICAgICB9CiAjIwotIyMJc2V0IG1pc2MgewotIyNkb25lCSAgICB7ZiBCYWxsb29uCQkJQmFsbG9vbi50Y2wJfQotIyNkb25lCSAgICB7ZiBCdXR0b25Cb3gJCUJ0bkJveC50Y2wJfQotIyNkb25lCSAgICB7ZiBDb21ib0JveAkJCUNvbWJvQm94LnRjbAl9Ci0jI2RvbmUJICAgIHtmIENvbnRyb2wJCQlDb250cm9sLnRjbAl9Ci0jIwkgICAge2YgTGFiZWxFbnRyeQkJTGFiRW50cnkudGNsCX0KLSMjCSAgICB7ZiBMYWJlbEZyYW1lCQlMYWJGcmFtZS50Y2wJfQotIyMJICAgIHtmIE1ldGVyCQkJTWV0ZXIudGNsCXtjIHRpeE1ldGVyfX0KLSMjZG9uZQkgICAge2YgT3B0aW9uTWVudQkJT3B0TWVudS50Y2wJfQotIyNkb25lCSAgICB7ZiBQb3B1cE1lbnUJCVBvcE1lbnUudGNsCX0KLSMjCSAgICB7ZiBTZWxlY3QJCQlTZWxlY3QudGNsCX0KLSMjCSAgICB7ZiBTdGRCdXR0b25Cb3gJCVN0ZEJCb3gudGNsCX0KLSMjCX0KKyMjICAgICAgc2V0IG1pc2MgeworIyNkb25lICAgICAge2YgQmFsbG9vbiAgICAgICAgICAgICAgICAgIEJhbGxvb24udGNsICAgICB9CisjI2RvbmUgICAgICB7ZiBCdXR0b25Cb3ggICAgICAgICAgICAgICAgQnRuQm94LnRjbCAgICAgIH0KKyMjZG9uZSAgICAgIHtmIENvbWJvQm94ICAgICAgICAgICAgICAgICBDb21ib0JveC50Y2wgICAgfQorIyNkb25lICAgICAge2YgQ29udHJvbCAgICAgICAgICAgICAgICAgIENvbnRyb2wudGNsICAgICB9CisjIyAgICAgICAgICB7ZiBMYWJlbEVudHJ5ICAgICAgICAgICAgICAgTGFiRW50cnkudGNsICAgIH0KKyMjICAgICAgICAgIHtmIExhYmVsRnJhbWUgICAgICAgICAgICAgICBMYWJGcmFtZS50Y2wgICAgfQorIyMgICAgICAgICAge2YgTWV0ZXIgICAgICAgICAgICAgICAgICAgIE1ldGVyLnRjbCAgICAgICB7YyB0aXhNZXRlcn19CisjI2RvbmUgICAgICB7ZiBPcHRpb25NZW51ICAgICAgICAgICAgICAgT3B0TWVudS50Y2wgICAgIH0KKyMjZG9uZSAgICAgIHtmIFBvcHVwTWVudSAgICAgICAgICAgICAgICBQb3BNZW51LnRjbCAgICAgfQorIyMgICAgICAgICAge2YgU2VsZWN0ICAgICAgICAgICAgICAgICAgIFNlbGVjdC50Y2wgICAgICB9CisjIyAgICAgICAgICB7ZiBTdGRCdXR0b25Cb3ggICAgICAgICAgICAgU3RkQkJveC50Y2wgICAgIH0KKyMjICAgICAgfQogIyMKIAogc3R5cGVzID0ge30KIHN0eXBlc1snd2lkZ2V0J10gPSBbJ0JhbGxvb24nLCAnQnV0dG9uIEJveCcsICdDb21ibyBCb3gnLCAnQ29udHJvbCcsCiAgICAgICAgICAgICAgICAgICAgICdEaXJlY3RvcnkgTGlzdCcsICdEaXJlY3RvcnkgVHJlZScsCi0JCSAgICAnTm90ZWJvb2snLCAnT3B0aW9uIE1lbnUnLCAnUG9wdXAgTWVudScsICdQYW5lZCBXaW5kb3cnLAotCQkgICAgJ1Njcm9sbGVkSExpc3QgKDEpJywgJ1Njcm9sbGVkSExpc3QgKDIpJywgJ1RyZWUgKGR5bmFtaWMpJ10KKyAgICAgICAgICAgICAgICAgICAgJ05vdGVib29rJywgJ09wdGlvbiBNZW51JywgJ1BvcHVwIE1lbnUnLCAnUGFuZWQgV2luZG93JywKKyAgICAgICAgICAgICAgICAgICAgJ1Njcm9sbGVkSExpc3QgKDEpJywgJ1Njcm9sbGVkSExpc3QgKDIpJywgJ1RyZWUgKGR5bmFtaWMpJ10KIHN0eXBlc1snaW1hZ2UnXSA9IFsnQ29tcG91bmQgSW1hZ2UnXQogCiBkZWYgTWtTYW1wbGUobmIsIG5hbWUpOgpAQCAtOTIyLDE1ICs5MjIsMTUgQEAKICAgICB2aWV3Wydjb21tYW5kJ10gPSBsYW1iZGEgYXJncz0wLCB3PXcsc2xiPXNsYixzdGV4dD1zdGV4dCxydW49cnVuLHZpZXc9dmlldzogU2FtcGxlX0FjdGlvbih3LCBzbGIsIHN0ZXh0LCBydW4sIHZpZXcsICd2aWV3JykKIAogICAgIGZvciB0eXBlIGluIFsnd2lkZ2V0JywgJ2ltYWdlJ106Ci0JaWYgdHlwZSAhPSAnd2lkZ2V0JzoKLQkgICAgeCA9IFRpeC5GcmFtZShzbGIuaGxpc3QsIGJkPTIsIGhlaWdodD0yLCB3aWR0aD0xNTAsCi0JCQkgIHJlbGllZj1UaXguU1VOS0VOLCBiZz1zbGIuaGxpc3RbJ2JnJ10pCi0JICAgIHNsYi5obGlzdC5hZGRfY2hpbGQoaXRlbXR5cGU9VGl4LldJTkRPVywgd2luZG93PXgsIHN0YXRlPSdkaXNhYmxlZCcpCi0JeCA9IHNsYi5obGlzdC5hZGRfY2hpbGQoaXRlbXR5cGU9VGl4LlRFWFQsIHN0YXRlPSdkaXNhYmxlZCcsCi0JCQkJdGV4dD1jb21tZW50c1t0eXBlXSkKLQlmb3Iga2V5IGluIHN0eXBlc1t0eXBlXToKLQkgICAgc2xiLmhsaXN0LmFkZF9jaGlsZCh4LCBpdGVtdHlwZT1UaXguVEVYVCwgZGF0YT1rZXksCi0JCQkJdGV4dD1rZXkpCisgICAgICAgIGlmIHR5cGUgIT0gJ3dpZGdldCc6CisgICAgICAgICAgICB4ID0gVGl4LkZyYW1lKHNsYi5obGlzdCwgYmQ9MiwgaGVpZ2h0PTIsIHdpZHRoPTE1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVRpeC5TVU5LRU4sIGJnPXNsYi5obGlzdFsnYmcnXSkKKyAgICAgICAgICAgIHNsYi5obGlzdC5hZGRfY2hpbGQoaXRlbXR5cGU9VGl4LldJTkRPVywgd2luZG93PXgsIHN0YXRlPSdkaXNhYmxlZCcpCisgICAgICAgIHggPSBzbGIuaGxpc3QuYWRkX2NoaWxkKGl0ZW10eXBlPVRpeC5URVhULCBzdGF0ZT0nZGlzYWJsZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWNvbW1lbnRzW3R5cGVdKQorICAgICAgICBmb3Iga2V5IGluIHN0eXBlc1t0eXBlXToKKyAgICAgICAgICAgIHNsYi5obGlzdC5hZGRfY2hpbGQoeCwgaXRlbXR5cGU9VGl4LlRFWFQsIGRhdGE9a2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWtleSkKICAgICBzbGIuaGxpc3Quc2VsZWN0aW9uX2NsZWFyKCkKIAogICAgIHJ1blsnc3RhdGUnXSA9ICdkaXNhYmxlZCcKQEAgLTk0MiwxMSArOTQyLDExIEBACiAgICAgaGxpc3QgPSBzbGIuaGxpc3QKICAgICBhbmNob3IgPSBobGlzdC5pbmZvX2FuY2hvcigpCiAgICAgaWYgbm90IGFuY2hvcjoKLQlydW5bJ3N0YXRlJ10gPSAnZGlzYWJsZWQnCi0Jdmlld1snc3RhdGUnXSA9ICdkaXNhYmxlZCcKKyAgICAgICAgcnVuWydzdGF0ZSddID0gJ2Rpc2FibGVkJworICAgICAgICB2aWV3WydzdGF0ZSddID0gJ2Rpc2FibGVkJwogICAgIGVsaWYgbm90IGhsaXN0LmluZm9fcGFyZW50KGFuY2hvcik6Ci0JIyBhIGNvbW1lbnQKLQlyZXR1cm4KKyAgICAgICAgIyBhIGNvbW1lbnQKKyAgICAgICAgcmV0dXJuCiAKICAgICBydW5bJ3N0YXRlJ10gPSAnbm9ybWFsJwogICAgIHZpZXdbJ3N0YXRlJ10gPSAnbm9ybWFsJwpAQCAtOTU1LDE3ICs5NTUsMTcgQEAKICAgICBwcm9nID0gc2FtcGxlc1trZXldCiAKICAgICBpZiBhY3Rpb24gPT0gJ3J1bic6Ci0JZXhlYygnaW1wb3J0ICcgKyBwcm9nKQotCXcgPSBUaXguVG9wbGV2ZWwoKQotCXcudGl0bGUodGl0bGUpCi0JcnRuID0gZXZhbChwcm9nICsgJy5SdW5TYW1wbGUnKQotCXJ0bih3KQorICAgICAgICBleGVjKCdpbXBvcnQgJyArIHByb2cpCisgICAgICAgIHcgPSBUaXguVG9wbGV2ZWwoKQorICAgICAgICB3LnRpdGxlKHRpdGxlKQorICAgICAgICBydG4gPSBldmFsKHByb2cgKyAnLlJ1blNhbXBsZScpCisgICAgICAgIHJ0bih3KQogICAgIGVsaWYgYWN0aW9uID09ICd2aWV3JzoKLQl3ID0gVGl4LlRvcGxldmVsKCkKLQl3LnRpdGxlKCdTb3VyY2UgdmlldzogJyArIHRpdGxlKQotCUxvYWRGaWxlKHcsIGRlbW8uZGlyICsgJy9zYW1wbGVzLycgKyBwcm9nICsgJy5weScpCisgICAgICAgIHcgPSBUaXguVG9wbGV2ZWwoKQorICAgICAgICB3LnRpdGxlKCdTb3VyY2UgdmlldzogJyArIHRpdGxlKQorICAgICAgICBMb2FkRmlsZSh3LCBkZW1vLmRpciArICcvc2FtcGxlcy8nICsgcHJvZyArICcucHknKQogICAgIGVsaWYgYWN0aW9uID09ICdicm93c2UnOgotCVJlYWRGaWxlKHN0ZXh0LnRleHQsIGRlbW8uZGlyICsgJy9zYW1wbGVzLycgKyBwcm9nICsgJy5weScpCisgICAgICAgIFJlYWRGaWxlKHN0ZXh0LnRleHQsIGRlbW8uZGlyICsgJy9zYW1wbGVzLycgKyBwcm9nICsgJy5weScpCiAKIGRlZiBMb2FkRmlsZSh3LCBmbmFtZSk6CiAgICAgZ2xvYmFsIHJvb3QKQEAgLTk4OSwxNiArOTg5LDE1IEBACiAgICAgdy5kZWxldGUoJzAuMCcsIFRpeC5FTkQpCiAKICAgICB0cnk6Ci0JZiA9IG9wZW4oZm5hbWUpCi0JbGluZXMgPSBmLnJlYWRsaW5lcygpCi0JZm9yIHMgaW4gbGluZXM6Ci0JICAgIHcuaW5zZXJ0KFRpeC5FTkQsIHMpCi0JZi5jbG9zZSgpCisgICAgICAgIGYgPSBvcGVuKGZuYW1lKQorICAgICAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkKKyAgICAgICAgZm9yIHMgaW4gbGluZXM6CisgICAgICAgICAgICB3Lmluc2VydChUaXguRU5ELCBzKQorICAgICAgICBmLmNsb3NlKCkKICAgICBmaW5hbGx5OgotIwl3LnNlZSgnMS4wJykKLQl3WydzdGF0ZSddID0gb2xkX3N0YXRlCisjICAgICAgIHcuc2VlKCcxLjAnKQorICAgICAgICB3WydzdGF0ZSddID0gb2xkX3N0YXRlCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgcm9vdCA9IFRpeC5UaygpCiAgICAgUnVuTWFpbihyb290KQotCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvZ3VpZG8vQXR0ckRpYWxvZy5weSBiL0RlbW8vdGtpbnRlci9ndWlkby9BdHRyRGlhbG9nLnB5CmluZGV4IDQ4NzhjYjUuLjg2MzMzYWQgMTAwNzU1Ci0tLSBhL0RlbW8vdGtpbnRlci9ndWlkby9BdHRyRGlhbG9nLnB5CisrKyBiL0RlbW8vdGtpbnRlci9ndWlkby9BdHRyRGlhbG9nLnB5CkBAIC0xNiw0MzcgKzE2LDQzNyBAQAogCiBjbGFzcyBPcHRpb246CiAKLQl2YXJjbGFzcyA9IFN0cmluZ1ZhcgkJIyBNYXkgYmUgb3ZlcnJpZGRlbgorICAgIHZhcmNsYXNzID0gU3RyaW5nVmFyICAgICAgICAgICAgIyBNYXkgYmUgb3ZlcnJpZGRlbgogCi0JZGVmIF9faW5pdF9fKHNlbGYsIGRpYWxvZywgb3B0aW9uKToKLQkJc2VsZi5kaWFsb2cgPSBkaWFsb2cKLQkJc2VsZi5vcHRpb24gPSBvcHRpb24KLQkJc2VsZi5tYXN0ZXIgPSBkaWFsb2cudG9wCi0JCXNlbGYuZGVmYXVsdCwgc2VsZi5rbGFzcyA9IGRpYWxvZy5vcHRpb25zW29wdGlvbl0KLQkJc2VsZi52YXIgPSBzZWxmLnZhcmNsYXNzKHNlbGYubWFzdGVyKQotCQlzZWxmLmZyYW1lID0gRnJhbWUoc2VsZi5tYXN0ZXIpCi0JCXNlbGYuZnJhbWUucGFjayhmaWxsPVgpCi0JCXNlbGYubGFiZWwgPSBMYWJlbChzZWxmLmZyYW1lLCB0ZXh0PShvcHRpb24gKyAiOiIpKQotCQlzZWxmLmxhYmVsLnBhY2soc2lkZT1MRUZUKQotCQlzZWxmLnVwZGF0ZSgpCi0JCXNlbGYuYWRkb3B0aW9uKCkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlhbG9nLCBvcHRpb24pOgorICAgICAgICBzZWxmLmRpYWxvZyA9IGRpYWxvZworICAgICAgICBzZWxmLm9wdGlvbiA9IG9wdGlvbgorICAgICAgICBzZWxmLm1hc3RlciA9IGRpYWxvZy50b3AKKyAgICAgICAgc2VsZi5kZWZhdWx0LCBzZWxmLmtsYXNzID0gZGlhbG9nLm9wdGlvbnNbb3B0aW9uXQorICAgICAgICBzZWxmLnZhciA9IHNlbGYudmFyY2xhc3Moc2VsZi5tYXN0ZXIpCisgICAgICAgIHNlbGYuZnJhbWUgPSBGcmFtZShzZWxmLm1hc3RlcikKKyAgICAgICAgc2VsZi5mcmFtZS5wYWNrKGZpbGw9WCkKKyAgICAgICAgc2VsZi5sYWJlbCA9IExhYmVsKHNlbGYuZnJhbWUsIHRleHQ9KG9wdGlvbiArICI6IikpCisgICAgICAgIHNlbGYubGFiZWwucGFjayhzaWRlPUxFRlQpCisgICAgICAgIHNlbGYudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hZGRvcHRpb24oKQogCi0JZGVmIHJlZnJlc2goc2VsZik6Ci0JCXNlbGYuZGlhbG9nLnJlZnJlc2goKQotCQlzZWxmLnVwZGF0ZSgpCisgICAgZGVmIHJlZnJlc2goc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLnJlZnJlc2goKQorICAgICAgICBzZWxmLnVwZGF0ZSgpCiAKLQlkZWYgdXBkYXRlKHNlbGYpOgotCQl0cnk6Ci0JCQlzZWxmLmN1cnJlbnQgPSBzZWxmLmRpYWxvZy5jdXJyZW50W3NlbGYub3B0aW9uXQotCQlleGNlcHQgS2V5RXJyb3I6Ci0JCQlzZWxmLmN1cnJlbnQgPSBzZWxmLmRlZmF1bHQKLQkJc2VsZi52YXIuc2V0KHNlbGYuY3VycmVudCkKKyAgICBkZWYgdXBkYXRlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnQgPSBzZWxmLmRpYWxvZy5jdXJyZW50W3NlbGYub3B0aW9uXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnQgPSBzZWxmLmRlZmF1bHQKKyAgICAgICAgc2VsZi52YXIuc2V0KHNlbGYuY3VycmVudCkKIAotCWRlZiBzZXQoc2VsZiwgZT1Ob25lKToJCSMgU2hvdWxkIGJlIG92ZXJyaWRkZW4KLQkJcGFzcworICAgIGRlZiBzZXQoc2VsZiwgZT1Ob25lKTogICAgICAgICAgIyBTaG91bGQgYmUgb3ZlcnJpZGRlbgorICAgICAgICBwYXNzCiAKIGNsYXNzIEJvb2xlYW5PcHRpb24oT3B0aW9uKToKIAotCXZhcmNsYXNzID0gQm9vbGVhblZhcgorICAgIHZhcmNsYXNzID0gQm9vbGVhblZhcgogCi0JZGVmIGFkZG9wdGlvbihzZWxmKToKLQkJc2VsZi5idXR0b24gPSBDaGVja2J1dHRvbihzZWxmLmZyYW1lLAotCQkJCQkgdGV4dD0nb24vb2ZmJywKLQkJCQkJIG9udmFsdWU9MSwKLQkJCQkJIG9mZnZhbHVlPTAsCi0JCQkJCSB2YXJpYWJsZT1zZWxmLnZhciwKLQkJCQkJIHJlbGllZj1SQUlTRUQsCi0JCQkJCSBib3JkZXJ3aWR0aD0yLAotCQkJCQkgY29tbWFuZD1zZWxmLnNldCkKLQkJc2VsZi5idXR0b24ucGFjayhzaWRlPVJJR0hUKQorICAgIGRlZiBhZGRvcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYnV0dG9uID0gQ2hlY2tidXR0b24oc2VsZi5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9J29uL29mZicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbnZhbHVlPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZ2YWx1ZT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU9c2VsZi52YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZWY9UkFJU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGg9MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5zZXQpCisgICAgICAgIHNlbGYuYnV0dG9uLnBhY2soc2lkZT1SSUdIVCkKIAogY2xhc3MgRW51bU9wdGlvbihPcHRpb24pOgogCi0JZGVmIGFkZG9wdGlvbihzZWxmKToKLQkJc2VsZi5idXR0b24gPSBNZW51YnV0dG9uKHNlbGYuZnJhbWUsCi0JCQkJCSB0ZXh0dmFyaWFibGU9c2VsZi52YXIsCi0JCQkJCSByZWxpZWY9UkFJU0VELCBib3JkZXJ3aWR0aD0yKQotCQlzZWxmLmJ1dHRvbi5wYWNrKHNpZGU9UklHSFQpCi0JCXNlbGYubWVudSA9IE1lbnUoc2VsZi5idXR0b24pCi0JCXNlbGYuYnV0dG9uWydtZW51J10gPSBzZWxmLm1lbnUKLQkJZm9yIHYgaW4gc2VsZi5kaWFsb2cuY2xhc3Nlc1tzZWxmLmtsYXNzXToKLQkJCXNlbGYubWVudS5hZGRfcmFkaW9idXR0b24oCi0JCQkgICAgbGFiZWw9diwKLQkJCSAgICB2YXJpYWJsZT1zZWxmLnZhciwKLQkJCSAgICB2YWx1ZT12LAotCQkJICAgIGNvbW1hbmQ9c2VsZi5zZXQpCisgICAgZGVmIGFkZG9wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5idXR0b24gPSBNZW51YnV0dG9uKHNlbGYuZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dmFyaWFibGU9c2VsZi52YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZWY9UkFJU0VELCBib3JkZXJ3aWR0aD0yKQorICAgICAgICBzZWxmLmJ1dHRvbi5wYWNrKHNpZGU9UklHSFQpCisgICAgICAgIHNlbGYubWVudSA9IE1lbnUoc2VsZi5idXR0b24pCisgICAgICAgIHNlbGYuYnV0dG9uWydtZW51J10gPSBzZWxmLm1lbnUKKyAgICAgICAgZm9yIHYgaW4gc2VsZi5kaWFsb2cuY2xhc3Nlc1tzZWxmLmtsYXNzXToKKyAgICAgICAgICAgIHNlbGYubWVudS5hZGRfcmFkaW9idXR0b24oCisgICAgICAgICAgICAgICAgbGFiZWw9diwKKyAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLnZhciwKKyAgICAgICAgICAgICAgICB2YWx1ZT12LAorICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5zZXQpCiAKIGNsYXNzIFN0cmluZ09wdGlvbihPcHRpb24pOgogCi0JZGVmIGFkZG9wdGlvbihzZWxmKToKLQkJc2VsZi5lbnRyeSA9IEVudHJ5KHNlbGYuZnJhbWUsCi0JCQkJICAgdGV4dHZhcmlhYmxlPXNlbGYudmFyLAotCQkJCSAgIHdpZHRoPTEwLAotCQkJCSAgIHJlbGllZj1TVU5LRU4sCi0JCQkJICAgYm9yZGVyd2lkdGg9MikKLQkJc2VsZi5lbnRyeS5wYWNrKHNpZGU9UklHSFQsIGZpbGw9WCwgZXhwYW5kPTEpCi0JCXNlbGYuZW50cnkuYmluZCgnPFJldHVybj4nLCBzZWxmLnNldCkKKyAgICBkZWYgYWRkb3B0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmVudHJ5ID0gRW50cnkoc2VsZi5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR2YXJpYWJsZT1zZWxmLnZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVNVTktFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcndpZHRoPTIpCisgICAgICAgIHNlbGYuZW50cnkucGFjayhzaWRlPVJJR0hULCBmaWxsPVgsIGV4cGFuZD0xKQorICAgICAgICBzZWxmLmVudHJ5LmJpbmQoJzxSZXR1cm4+Jywgc2VsZi5zZXQpCiAKIGNsYXNzIFJlYWRvbmx5T3B0aW9uKE9wdGlvbik6CiAKLQlkZWYgYWRkb3B0aW9uKHNlbGYpOgotCQlzZWxmLmxhYmVsID0gTGFiZWwoc2VsZi5mcmFtZSwgdGV4dHZhcmlhYmxlPXNlbGYudmFyLAotCQkJCSAgIGFuY2hvcj1FKQotCQlzZWxmLmxhYmVsLnBhY2soc2lkZT1SSUdIVCkKKyAgICBkZWYgYWRkb3B0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmxhYmVsID0gTGFiZWwoc2VsZi5mcmFtZSwgdGV4dHZhcmlhYmxlPXNlbGYudmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yPUUpCisgICAgICAgIHNlbGYubGFiZWwucGFjayhzaWRlPVJJR0hUKQogCiBjbGFzcyBEaWFsb2c6CiAKLQlkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyKToKLQkJc2VsZi5tYXN0ZXIgPSBtYXN0ZXIKLQkJc2VsZi5maXhjbGFzc2VzKCkKLQkJc2VsZi5yZWZyZXNoKCkKLQkJc2VsZi50b3AgPSBUb3BsZXZlbChzZWxmLm1hc3RlcikKLQkJc2VsZi50b3AudGl0bGUoc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCi0JCXNlbGYudG9wLm1pbnNpemUoMSwgMSkKLQkJc2VsZi5hZGRjaG9pY2VzKCkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyKToKKyAgICAgICAgc2VsZi5tYXN0ZXIgPSBtYXN0ZXIKKyAgICAgICAgc2VsZi5maXhjbGFzc2VzKCkKKyAgICAgICAgc2VsZi5yZWZyZXNoKCkKKyAgICAgICAgc2VsZi50b3AgPSBUb3BsZXZlbChzZWxmLm1hc3RlcikKKyAgICAgICAgc2VsZi50b3AudGl0bGUoc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIHNlbGYudG9wLm1pbnNpemUoMSwgMSkKKyAgICAgICAgc2VsZi5hZGRjaG9pY2VzKCkKIAotCWRlZiByZWZyZXNoKHNlbGYpOiBwYXNzCQkjIE11c3Qgb3ZlcnJpZGUKKyAgICBkZWYgcmVmcmVzaChzZWxmKTogcGFzcyAgICAgICAgICMgTXVzdCBvdmVycmlkZQogCi0JZGVmIGZpeGNsYXNzZXMoc2VsZik6IHBhc3MJIyBNYXkgb3ZlcnJpZGUKKyAgICBkZWYgZml4Y2xhc3NlcyhzZWxmKTogcGFzcyAgICAgICMgTWF5IG92ZXJyaWRlCiAKLQlkZWYgYWRkY2hvaWNlcyhzZWxmKToKLQkJc2VsZi5jaG9pY2VzID0ge30KLQkJbGlzdCA9IFtdCi0JCWZvciBrLCBkYyBpbiBzZWxmLm9wdGlvbnMuaXRlbXMoKToKLQkJCWxpc3QuYXBwZW5kKChrLCBkYykpCi0JCWxpc3Quc29ydCgpCi0JCWZvciBrLCAoZCwgYykgaW4gbGlzdDoKLQkJCXRyeToKLQkJCQljbCA9IHNlbGYuY2xhc3Nlc1tjXQotCQkJZXhjZXB0IEtleUVycm9yOgotCQkJCWNsID0gJ3Vua25vd24nCi0JCQlpZiB0eXBlKGNsKSA9PSBUdXBsZVR5cGU6Ci0JCQkJY2wgPSBzZWxmLmVudW1vcHRpb24KLQkJCWVsaWYgY2wgPT0gJ2Jvb2xlYW4nOgotCQkJCWNsID0gc2VsZi5ib29sZWFub3B0aW9uCi0JCQllbGlmIGNsID09ICdyZWFkb25seSc6Ci0JCQkJY2wgPSBzZWxmLnJlYWRvbmx5b3B0aW9uCi0JCQllbHNlOgotCQkJCWNsID0gc2VsZi5zdHJpbmdvcHRpb24KLQkJCXNlbGYuY2hvaWNlc1trXSA9IGNsKHNlbGYsIGspCisgICAgZGVmIGFkZGNob2ljZXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hvaWNlcyA9IHt9CisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICBmb3IgaywgZGMgaW4gc2VsZi5vcHRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICBsaXN0LmFwcGVuZCgoaywgZGMpKQorICAgICAgICBsaXN0LnNvcnQoKQorICAgICAgICBmb3IgaywgKGQsIGMpIGluIGxpc3Q6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2wgPSBzZWxmLmNsYXNzZXNbY10KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjbCA9ICd1bmtub3duJworICAgICAgICAgICAgaWYgdHlwZShjbCkgPT0gVHVwbGVUeXBlOgorICAgICAgICAgICAgICAgIGNsID0gc2VsZi5lbnVtb3B0aW9uCisgICAgICAgICAgICBlbGlmIGNsID09ICdib29sZWFuJzoKKyAgICAgICAgICAgICAgICBjbCA9IHNlbGYuYm9vbGVhbm9wdGlvbgorICAgICAgICAgICAgZWxpZiBjbCA9PSAncmVhZG9ubHknOgorICAgICAgICAgICAgICAgIGNsID0gc2VsZi5yZWFkb25seW9wdGlvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjbCA9IHNlbGYuc3RyaW5nb3B0aW9uCisgICAgICAgICAgICBzZWxmLmNob2ljZXNba10gPSBjbChzZWxmLCBrKQogCi0JIyBNdXN0IG92ZXJyaWRlOgotCW9wdGlvbnMgPSB7fQotCWNsYXNzZXMgPSB7fQorICAgICMgTXVzdCBvdmVycmlkZToKKyAgICBvcHRpb25zID0ge30KKyAgICBjbGFzc2VzID0ge30KIAotCSMgTWF5IG92ZXJyaWRlOgotCWJvb2xlYW5vcHRpb24gPSBCb29sZWFuT3B0aW9uCi0Jc3RyaW5nb3B0aW9uID0gU3RyaW5nT3B0aW9uCi0JZW51bW9wdGlvbiA9IEVudW1PcHRpb24KLQlyZWFkb25seW9wdGlvbiA9IFJlYWRvbmx5T3B0aW9uCisgICAgIyBNYXkgb3ZlcnJpZGU6CisgICAgYm9vbGVhbm9wdGlvbiA9IEJvb2xlYW5PcHRpb24KKyAgICBzdHJpbmdvcHRpb24gPSBTdHJpbmdPcHRpb24KKyAgICBlbnVtb3B0aW9uID0gRW51bU9wdGlvbgorICAgIHJlYWRvbmx5b3B0aW9uID0gUmVhZG9ubHlPcHRpb24KIAogY2xhc3MgUGFja0RpYWxvZyhEaWFsb2cpOgogCi0JZGVmIF9faW5pdF9fKHNlbGYsIHdpZGdldCk6Ci0JCXNlbGYud2lkZ2V0ID0gd2lkZ2V0Ci0JCURpYWxvZy5fX2luaXRfXyhzZWxmLCB3aWRnZXQpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdpZGdldCk6CisgICAgICAgIHNlbGYud2lkZ2V0ID0gd2lkZ2V0CisgICAgICAgIERpYWxvZy5fX2luaXRfXyhzZWxmLCB3aWRnZXQpCiAKLQlkZWYgcmVmcmVzaChzZWxmKToKLQkJc2VsZi5jdXJyZW50ID0gc2VsZi53aWRnZXQuaW5mbygpCi0JCXNlbGYuY3VycmVudFsnLmNsYXNzJ10gPSBzZWxmLndpZGdldC53aW5mb19jbGFzcygpCi0JCXNlbGYuY3VycmVudFsnLm5hbWUnXSA9IHNlbGYud2lkZ2V0Ll93CisgICAgZGVmIHJlZnJlc2goc2VsZik6CisgICAgICAgIHNlbGYuY3VycmVudCA9IHNlbGYud2lkZ2V0LmluZm8oKQorICAgICAgICBzZWxmLmN1cnJlbnRbJy5jbGFzcyddID0gc2VsZi53aWRnZXQud2luZm9fY2xhc3MoKQorICAgICAgICBzZWxmLmN1cnJlbnRbJy5uYW1lJ10gPSBzZWxmLndpZGdldC5fdwogCi0JY2xhc3MgcGFja29wdGlvbjogIyBNaXgtaW4gY2xhc3MKLQkJZGVmIHNldChzZWxmLCBlPU5vbmUpOgotCQkJc2VsZi5jdXJyZW50ID0gc2VsZi52YXIuZ2V0KCkKLQkJCXRyeToKLQkJCQlhcHBseShzZWxmLmRpYWxvZy53aWRnZXQucGFjaywgKCksCi0JCQkJICAgICAge3NlbGYub3B0aW9uOiBzZWxmLmN1cnJlbnR9KQotCQkJZXhjZXB0IFRjbEVycm9yLCBtc2c6Ci0JCQkJcHJpbnQgbXNnCi0JCQkJc2VsZi5yZWZyZXNoKCkKKyAgICBjbGFzcyBwYWNrb3B0aW9uOiAjIE1peC1pbiBjbGFzcworICAgICAgICBkZWYgc2V0KHNlbGYsIGU9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnQgPSBzZWxmLnZhci5nZXQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGFwcGx5KHNlbGYuZGlhbG9nLndpZGdldC5wYWNrLCAoKSwKKyAgICAgICAgICAgICAgICAgICAgICB7c2VsZi5vcHRpb246IHNlbGYuY3VycmVudH0pCisgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2goKQogCi0JY2xhc3MgYm9vbGVhbm9wdGlvbihwYWNrb3B0aW9uLCBCb29sZWFuT3B0aW9uKTogcGFzcwotCWNsYXNzIGVudW1vcHRpb24ocGFja29wdGlvbiwgRW51bU9wdGlvbik6IHBhc3MKLQljbGFzcyBzdHJpbmdvcHRpb24ocGFja29wdGlvbiwgU3RyaW5nT3B0aW9uKTogcGFzcwotCWNsYXNzIHJlYWRvbmx5b3B0aW9uKHBhY2tvcHRpb24sIFJlYWRvbmx5T3B0aW9uKTogcGFzcworICAgIGNsYXNzIGJvb2xlYW5vcHRpb24ocGFja29wdGlvbiwgQm9vbGVhbk9wdGlvbik6IHBhc3MKKyAgICBjbGFzcyBlbnVtb3B0aW9uKHBhY2tvcHRpb24sIEVudW1PcHRpb24pOiBwYXNzCisgICAgY2xhc3Mgc3RyaW5nb3B0aW9uKHBhY2tvcHRpb24sIFN0cmluZ09wdGlvbik6IHBhc3MKKyAgICBjbGFzcyByZWFkb25seW9wdGlvbihwYWNrb3B0aW9uLCBSZWFkb25seU9wdGlvbik6IHBhc3MKIAotCW9wdGlvbnMgPSB7Ci0JCScuY2xhc3MnOiAoTm9uZSwgJ0NsYXNzJyksCi0JCScubmFtZSc6IChOb25lLCAnTmFtZScpLAotCQknYWZ0ZXInOiAoTm9uZSwgJ1dpZGdldCcpLAotCQknYW5jaG9yJzogKCdjZW50ZXInLCAnQW5jaG9yJyksCi0JCSdiZWZvcmUnOiAoTm9uZSwgJ1dpZGdldCcpLAotCQknZXhwYW5kJzogKCdubycsICdCb29sZWFuJyksCi0JCSdmaWxsJzogKCdub25lJywgJ0ZpbGwnKSwKLQkJJ2luJzogKE5vbmUsICdXaWRnZXQnKSwKLQkJJ2lwYWR4JzogKDAsICdQYWQnKSwKLQkJJ2lwYWR5JzogKDAsICdQYWQnKSwKLQkJJ3BhZHgnOiAoMCwgJ1BhZCcpLAotCQkncGFkeSc6ICgwLCAnUGFkJyksCi0JCSdzaWRlJzogKCd0b3AnLCAnU2lkZScpLAotCQl9CisgICAgb3B0aW9ucyA9IHsKKyAgICAgICAgICAgICcuY2xhc3MnOiAoTm9uZSwgJ0NsYXNzJyksCisgICAgICAgICAgICAnLm5hbWUnOiAoTm9uZSwgJ05hbWUnKSwKKyAgICAgICAgICAgICdhZnRlcic6IChOb25lLCAnV2lkZ2V0JyksCisgICAgICAgICAgICAnYW5jaG9yJzogKCdjZW50ZXInLCAnQW5jaG9yJyksCisgICAgICAgICAgICAnYmVmb3JlJzogKE5vbmUsICdXaWRnZXQnKSwKKyAgICAgICAgICAgICdleHBhbmQnOiAoJ25vJywgJ0Jvb2xlYW4nKSwKKyAgICAgICAgICAgICdmaWxsJzogKCdub25lJywgJ0ZpbGwnKSwKKyAgICAgICAgICAgICdpbic6IChOb25lLCAnV2lkZ2V0JyksCisgICAgICAgICAgICAnaXBhZHgnOiAoMCwgJ1BhZCcpLAorICAgICAgICAgICAgJ2lwYWR5JzogKDAsICdQYWQnKSwKKyAgICAgICAgICAgICdwYWR4JzogKDAsICdQYWQnKSwKKyAgICAgICAgICAgICdwYWR5JzogKDAsICdQYWQnKSwKKyAgICAgICAgICAgICdzaWRlJzogKCd0b3AnLCAnU2lkZScpLAorICAgICAgICAgICAgfQogCi0JY2xhc3NlcyA9IHsKLQkJJ0FuY2hvcic6IChOLCBORSwgRSwgU0UsIFMsIFNXLCBXLCBOVywgQ0VOVEVSKSwKLQkJJ0Jvb2xlYW4nOiAnYm9vbGVhbicsCi0JCSdDbGFzcyc6ICdyZWFkb25seScsCi0JCSdFeHBhbmQnOiAnYm9vbGVhbicsCi0JCSdGaWxsJzogKE5PTkUsIFgsIFksIEJPVEgpLAotCQknTmFtZSc6ICdyZWFkb25seScsCi0JCSdQYWQnOiAncGl4ZWwnLAotCQknU2lkZSc6IChUT1AsIFJJR0hULCBCT1RUT00sIExFRlQpLAotCQknV2lkZ2V0JzogJ3JlYWRvbmx5JywKLQkJfQorICAgIGNsYXNzZXMgPSB7CisgICAgICAgICAgICAnQW5jaG9yJzogKE4sIE5FLCBFLCBTRSwgUywgU1csIFcsIE5XLCBDRU5URVIpLAorICAgICAgICAgICAgJ0Jvb2xlYW4nOiAnYm9vbGVhbicsCisgICAgICAgICAgICAnQ2xhc3MnOiAncmVhZG9ubHknLAorICAgICAgICAgICAgJ0V4cGFuZCc6ICdib29sZWFuJywKKyAgICAgICAgICAgICdGaWxsJzogKE5PTkUsIFgsIFksIEJPVEgpLAorICAgICAgICAgICAgJ05hbWUnOiAncmVhZG9ubHknLAorICAgICAgICAgICAgJ1BhZCc6ICdwaXhlbCcsCisgICAgICAgICAgICAnU2lkZSc6IChUT1AsIFJJR0hULCBCT1RUT00sIExFRlQpLAorICAgICAgICAgICAgJ1dpZGdldCc6ICdyZWFkb25seScsCisgICAgICAgICAgICB9CiAKIGNsYXNzIFJlbW90ZVBhY2tEaWFsb2coUGFja0RpYWxvZyk6CiAKLQlkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBhcHAsIHdpZGdldCk6Ci0JCXNlbGYubWFzdGVyID0gbWFzdGVyCi0JCXNlbGYuYXBwID0gYXBwCi0JCXNlbGYud2lkZ2V0ID0gd2lkZ2V0Ci0JCXNlbGYucmVmcmVzaCgpCi0JCXNlbGYudG9wID0gVG9wbGV2ZWwoc2VsZi5tYXN0ZXIpCi0JCXNlbGYudG9wLnRpdGxlKHNlbGYuYXBwICsgJyBQYWNrRGlhbG9nJykKLQkJc2VsZi50b3AubWluc2l6ZSgxLCAxKQotCQlzZWxmLmFkZGNob2ljZXMoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGFwcCwgd2lkZ2V0KToKKyAgICAgICAgc2VsZi5tYXN0ZXIgPSBtYXN0ZXIKKyAgICAgICAgc2VsZi5hcHAgPSBhcHAKKyAgICAgICAgc2VsZi53aWRnZXQgPSB3aWRnZXQKKyAgICAgICAgc2VsZi5yZWZyZXNoKCkKKyAgICAgICAgc2VsZi50b3AgPSBUb3BsZXZlbChzZWxmLm1hc3RlcikKKyAgICAgICAgc2VsZi50b3AudGl0bGUoc2VsZi5hcHAgKyAnIFBhY2tEaWFsb2cnKQorICAgICAgICBzZWxmLnRvcC5taW5zaXplKDEsIDEpCisgICAgICAgIHNlbGYuYWRkY2hvaWNlcygpCiAKLQlkZWYgcmVmcmVzaChzZWxmKToKLQkJdHJ5OgotCQkJd29yZHMgPSBzZWxmLm1hc3Rlci50ay5zcGxpdGxpc3QoCi0JCQkJc2VsZi5tYXN0ZXIuc2VuZChzZWxmLmFwcCwKLQkJCQkJCSAncGFjaycsCi0JCQkJCQkgJ2luZm8nLAotCQkJCQkJIHNlbGYud2lkZ2V0KSkKLQkJZXhjZXB0IFRjbEVycm9yLCBtc2c6Ci0JCQlwcmludCBtc2cKLQkJCXJldHVybgotCQlkaWN0ID0ge30KLQkJZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHdvcmRzKSwgMik6Ci0JCQlrZXkgPSB3b3Jkc1tpXVsxOl0KLQkJCXZhbHVlID0gd29yZHNbaSsxXQotCQkJZGljdFtrZXldID0gdmFsdWUKLQkJZGljdFsnLmNsYXNzJ10gPSBzZWxmLm1hc3Rlci5zZW5kKHNlbGYuYXBwLAotCQkJCQkJICAnd2luZm8nLAotCQkJCQkJICAnY2xhc3MnLAotCQkJCQkJICBzZWxmLndpZGdldCkKLQkJZGljdFsnLm5hbWUnXSA9IHNlbGYud2lkZ2V0Ci0JCXNlbGYuY3VycmVudCA9IGRpY3QKKyAgICBkZWYgcmVmcmVzaChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd29yZHMgPSBzZWxmLm1hc3Rlci50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICAgICAgICAgIHNlbGYubWFzdGVyLnNlbmQoc2VsZi5hcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2snLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmZvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpZGdldCkpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvciwgbXNnOgorICAgICAgICAgICAgcHJpbnQgbXNnCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZGljdCA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih3b3JkcyksIDIpOgorICAgICAgICAgICAga2V5ID0gd29yZHNbaV1bMTpdCisgICAgICAgICAgICB2YWx1ZSA9IHdvcmRzW2krMV0KKyAgICAgICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlCisgICAgICAgIGRpY3RbJy5jbGFzcyddID0gc2VsZi5tYXN0ZXIuc2VuZChzZWxmLmFwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aW5mbycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xhc3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aWRnZXQpCisgICAgICAgIGRpY3RbJy5uYW1lJ10gPSBzZWxmLndpZGdldAorICAgICAgICBzZWxmLmN1cnJlbnQgPSBkaWN0CiAKLQljbGFzcyByZW1vdGVwYWNrb3B0aW9uOiAjIE1peC1pbiBjbGFzcwotCQlkZWYgc2V0KHNlbGYsIGU9Tm9uZSk6Ci0JCQlzZWxmLmN1cnJlbnQgPSBzZWxmLnZhci5nZXQoKQotCQkJdHJ5OgotCQkJCXNlbGYuZGlhbG9nLm1hc3Rlci5zZW5kKAotCQkJCQlzZWxmLmRpYWxvZy5hcHAsCi0JCQkJCSdwYWNrJywKLQkJCQkJJ2NvbmZpZycsCi0JCQkJCXNlbGYuZGlhbG9nLndpZGdldCwKLQkJCQkJJy0nK3NlbGYub3B0aW9uLAotCQkJCQlzZWxmLmRpYWxvZy5tYXN0ZXIudGsubWVyZ2UoCi0JCQkJCQlzZWxmLmN1cnJlbnQpKQotCQkJZXhjZXB0IFRjbEVycm9yLCBtc2c6Ci0JCQkJcHJpbnQgbXNnCi0JCQkJc2VsZi5yZWZyZXNoKCkKKyAgICBjbGFzcyByZW1vdGVwYWNrb3B0aW9uOiAjIE1peC1pbiBjbGFzcworICAgICAgICBkZWYgc2V0KHNlbGYsIGU9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnQgPSBzZWxmLnZhci5nZXQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZGlhbG9nLm1hc3Rlci5zZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaWFsb2cuYXBwLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2snLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZycsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpYWxvZy53aWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAnLScrc2VsZi5vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpYWxvZy5tYXN0ZXIudGsubWVyZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudCkpCisgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2goKQogCi0JY2xhc3MgYm9vbGVhbm9wdGlvbihyZW1vdGVwYWNrb3B0aW9uLCBCb29sZWFuT3B0aW9uKTogcGFzcwotCWNsYXNzIGVudW1vcHRpb24ocmVtb3RlcGFja29wdGlvbiwgRW51bU9wdGlvbik6IHBhc3MKLQljbGFzcyBzdHJpbmdvcHRpb24ocmVtb3RlcGFja29wdGlvbiwgU3RyaW5nT3B0aW9uKTogcGFzcwotCWNsYXNzIHJlYWRvbmx5b3B0aW9uKHJlbW90ZXBhY2tvcHRpb24sIFJlYWRvbmx5T3B0aW9uKTogcGFzcworICAgIGNsYXNzIGJvb2xlYW5vcHRpb24ocmVtb3RlcGFja29wdGlvbiwgQm9vbGVhbk9wdGlvbik6IHBhc3MKKyAgICBjbGFzcyBlbnVtb3B0aW9uKHJlbW90ZXBhY2tvcHRpb24sIEVudW1PcHRpb24pOiBwYXNzCisgICAgY2xhc3Mgc3RyaW5nb3B0aW9uKHJlbW90ZXBhY2tvcHRpb24sIFN0cmluZ09wdGlvbik6IHBhc3MKKyAgICBjbGFzcyByZWFkb25seW9wdGlvbihyZW1vdGVwYWNrb3B0aW9uLCBSZWFkb25seU9wdGlvbik6IHBhc3MKIAogY2xhc3MgV2lkZ2V0RGlhbG9nKERpYWxvZyk6CiAKLQlkZWYgX19pbml0X18oc2VsZiwgd2lkZ2V0KToKLQkJc2VsZi53aWRnZXQgPSB3aWRnZXQKLQkJc2VsZi5rbGFzcyA9IHdpZGdldC53aW5mb19jbGFzcygpCi0JCURpYWxvZy5fX2luaXRfXyhzZWxmLCB3aWRnZXQpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdpZGdldCk6CisgICAgICAgIHNlbGYud2lkZ2V0ID0gd2lkZ2V0CisgICAgICAgIHNlbGYua2xhc3MgPSB3aWRnZXQud2luZm9fY2xhc3MoKQorICAgICAgICBEaWFsb2cuX19pbml0X18oc2VsZiwgd2lkZ2V0KQogCi0JZGVmIGZpeGNsYXNzZXMoc2VsZik6Ci0JCWlmIHNlbGYuYWRkY2xhc3Nlcy5oYXNfa2V5KHNlbGYua2xhc3MpOgotCQkJY2xhc3NlcyA9IHt9Ci0JCQlmb3IgYyBpbiAoc2VsZi5jbGFzc2VzLAotCQkJCSAgc2VsZi5hZGRjbGFzc2VzW3NlbGYua2xhc3NdKToKLQkJCQlmb3IgayBpbiBjLmtleXMoKToKLQkJCQkJY2xhc3Nlc1trXSA9IGNba10KLQkJCXNlbGYuY2xhc3NlcyA9IGNsYXNzZXMKKyAgICBkZWYgZml4Y2xhc3NlcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5hZGRjbGFzc2VzLmhhc19rZXkoc2VsZi5rbGFzcyk6CisgICAgICAgICAgICBjbGFzc2VzID0ge30KKyAgICAgICAgICAgIGZvciBjIGluIChzZWxmLmNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRjbGFzc2VzW3NlbGYua2xhc3NdKToKKyAgICAgICAgICAgICAgICBmb3IgayBpbiBjLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgY2xhc3Nlc1trXSA9IGNba10KKyAgICAgICAgICAgIHNlbGYuY2xhc3NlcyA9IGNsYXNzZXMKIAotCWRlZiByZWZyZXNoKHNlbGYpOgotCQlzZWxmLmNvbmZpZ3VyYXRpb24gPSBzZWxmLndpZGdldC5jb25maWcoKQotCQlzZWxmLnVwZGF0ZSgpCi0JCXNlbGYuY3VycmVudFsnLmNsYXNzJ10gPSBzZWxmLndpZGdldC53aW5mb19jbGFzcygpCi0JCXNlbGYuY3VycmVudFsnLm5hbWUnXSA9IHNlbGYud2lkZ2V0Ll93CisgICAgZGVmIHJlZnJlc2goc2VsZik6CisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbiA9IHNlbGYud2lkZ2V0LmNvbmZpZygpCisgICAgICAgIHNlbGYudXBkYXRlKCkKKyAgICAgICAgc2VsZi5jdXJyZW50WycuY2xhc3MnXSA9IHNlbGYud2lkZ2V0LndpbmZvX2NsYXNzKCkKKyAgICAgICAgc2VsZi5jdXJyZW50WycubmFtZSddID0gc2VsZi53aWRnZXQuX3cKIAotCWRlZiB1cGRhdGUoc2VsZik6Ci0JCXNlbGYuY3VycmVudCA9IHt9Ci0JCXNlbGYub3B0aW9ucyA9IHt9Ci0JCWZvciBrLCB2IGluIHNlbGYuY29uZmlndXJhdGlvbi5pdGVtcygpOgotCQkJaWYgbGVuKHYpID4gNDoKLQkJCQlzZWxmLmN1cnJlbnRba10gPSB2WzRdCi0JCQkJc2VsZi5vcHRpb25zW2tdID0gdlszXSwgdlsyXSAjIGRlZmF1bHQsIGtsYXNzCi0JCXNlbGYub3B0aW9uc1snLmNsYXNzJ10gPSAoTm9uZSwgJ0NsYXNzJykKLQkJc2VsZi5vcHRpb25zWycubmFtZSddID0gKE5vbmUsICdOYW1lJykKKyAgICBkZWYgdXBkYXRlKHNlbGYpOgorICAgICAgICBzZWxmLmN1cnJlbnQgPSB7fQorICAgICAgICBzZWxmLm9wdGlvbnMgPSB7fQorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmNvbmZpZ3VyYXRpb24uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGxlbih2KSA+IDQ6CisgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50W2tdID0gdls0XQorICAgICAgICAgICAgICAgIHNlbGYub3B0aW9uc1trXSA9IHZbM10sIHZbMl0gIyBkZWZhdWx0LCBrbGFzcworICAgICAgICBzZWxmLm9wdGlvbnNbJy5jbGFzcyddID0gKE5vbmUsICdDbGFzcycpCisgICAgICAgIHNlbGYub3B0aW9uc1snLm5hbWUnXSA9IChOb25lLCAnTmFtZScpCiAKLQljbGFzcyB3aWRnZXRvcHRpb246ICMgTWl4LWluIGNsYXNzCi0JCWRlZiBzZXQoc2VsZiwgZT1Ob25lKToKLQkJCXNlbGYuY3VycmVudCA9IHNlbGYudmFyLmdldCgpCi0JCQl0cnk6Ci0JCQkJc2VsZi5kaWFsb2cud2lkZ2V0W3NlbGYub3B0aW9uXSA9IHNlbGYuY3VycmVudAotCQkJZXhjZXB0IFRjbEVycm9yLCBtc2c6Ci0JCQkJcHJpbnQgbXNnCi0JCQkJc2VsZi5yZWZyZXNoKCkKKyAgICBjbGFzcyB3aWRnZXRvcHRpb246ICMgTWl4LWluIGNsYXNzCisgICAgICAgIGRlZiBzZXQoc2VsZiwgZT1Ob25lKToKKyAgICAgICAgICAgIHNlbGYuY3VycmVudCA9IHNlbGYudmFyLmdldCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5kaWFsb2cud2lkZ2V0W3NlbGYub3B0aW9uXSA9IHNlbGYuY3VycmVudAorICAgICAgICAgICAgZXhjZXB0IFRjbEVycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcHJpbnQgbXNnCisgICAgICAgICAgICAgICAgc2VsZi5yZWZyZXNoKCkKIAotCWNsYXNzIGJvb2xlYW5vcHRpb24od2lkZ2V0b3B0aW9uLCBCb29sZWFuT3B0aW9uKTogcGFzcwotCWNsYXNzIGVudW1vcHRpb24od2lkZ2V0b3B0aW9uLCBFbnVtT3B0aW9uKTogcGFzcwotCWNsYXNzIHN0cmluZ29wdGlvbih3aWRnZXRvcHRpb24sIFN0cmluZ09wdGlvbik6IHBhc3MKLQljbGFzcyByZWFkb25seW9wdGlvbih3aWRnZXRvcHRpb24sIFJlYWRvbmx5T3B0aW9uKTogcGFzcworICAgIGNsYXNzIGJvb2xlYW5vcHRpb24od2lkZ2V0b3B0aW9uLCBCb29sZWFuT3B0aW9uKTogcGFzcworICAgIGNsYXNzIGVudW1vcHRpb24od2lkZ2V0b3B0aW9uLCBFbnVtT3B0aW9uKTogcGFzcworICAgIGNsYXNzIHN0cmluZ29wdGlvbih3aWRnZXRvcHRpb24sIFN0cmluZ09wdGlvbik6IHBhc3MKKyAgICBjbGFzcyByZWFkb25seW9wdGlvbih3aWRnZXRvcHRpb24sIFJlYWRvbmx5T3B0aW9uKTogcGFzcwogCi0JIyBVbml2ZXJzYWwgY2xhc3NlcwotCWNsYXNzZXMgPSB7Ci0JCSdBbmNob3InOiAoTiwgTkUsIEUsIFNFLCBTLCBTVywgVywgTlcsIENFTlRFUiksCi0JCSdBc3BlY3QnOiAnaW50ZWdlcicsCi0JCSdCYWNrZ3JvdW5kJzogJ2NvbG9yJywKLQkJJ0JpdG1hcCc6ICdiaXRtYXAnLAotCQknQm9yZGVyV2lkdGgnOiAncGl4ZWwnLAotCQknQ2xhc3MnOiAncmVhZG9ubHknLAotCQknQ2xvc2VFbm91Z2gnOiAnZG91YmxlJywKLQkJJ0NvbW1hbmQnOiAnY29tbWFuZCcsCi0JCSdDb25maW5lJzogJ2Jvb2xlYW4nLAotCQknQ3Vyc29yJzogJ2N1cnNvcicsCi0JCSdDdXJzb3JXaWR0aCc6ICdwaXhlbCcsCi0JCSdEaXNhYmxlZEZvcmVncm91bmQnOiAnY29sb3InLAotCQknRXhwb3J0U2VsZWN0aW9uJzogJ2Jvb2xlYW4nLAotCQknRm9udCc6ICdmb250JywKLQkJJ0ZvcmVncm91bmQnOiAnY29sb3InLAotCQknRnJvbSc6ICdpbnRlZ2VyJywKLQkJJ0dlb21ldHJ5JzogJ2dlb21ldHJ5JywKLQkJJ0hlaWdodCc6ICdwaXhlbCcsCi0JCSdJbnNlcnRXaWR0aCc6ICd0aW1lJywKLQkJJ0p1c3RpZnknOiAoTEVGVCwgQ0VOVEVSLCBSSUdIVCksCi0JCSdMYWJlbCc6ICdzdHJpbmcnLAotCQknTGVuZ3RoJzogJ3BpeGVsJywKLQkJJ01lbnVOYW1lJzogJ3dpZGdldCcsCi0JCSdOYW1lJzogJ3JlYWRvbmx5JywKLQkJJ09mZlRpbWUnOiAndGltZScsCi0JCSdPblRpbWUnOiAndGltZScsCi0JCSdPcmllbnQnOiAoSE9SSVpPTlRBTCwgVkVSVElDQUwpLAotCQknUGFkJzogJ3BpeGVsJywKLQkJJ1JlbGllZic6IChSQUlTRUQsIFNVTktFTiwgRkxBVCwgUklER0UsIEdST09WRSksCi0JCSdSZXBlYXREZWxheSc6ICd0aW1lJywKLQkJJ1JlcGVhdEludGVydmFsJzogJ3RpbWUnLAotCQknU2Nyb2xsQ29tbWFuZCc6ICdjb21tYW5kJywKLQkJJ1Njcm9sbEluY3JlbWVudCc6ICdwaXhlbCcsCi0JCSdTY3JvbGxSZWdpb24nOiAncmVjdGFuZ2xlJywKLQkJJ1Nob3dWYWx1ZSc6ICdib29sZWFuJywKLQkJJ1NldEdyaWQnOiAnYm9vbGVhbicsCi0JCSdTbGlkZXJmb3JlZ3JvdW5kJzogJ2NvbG9yJywKLQkJJ1NsaWRlckxlbmd0aCc6ICdwaXhlbCcsCi0JCSdUZXh0JzogJ3N0cmluZycsCi0JCSdUaWNrSW50ZXJ2YWwnOiAnaW50ZWdlcicsCi0JCSdUbyc6ICdpbnRlZ2VyJywKLQkJJ1VuZGVybGluZSc6ICdpbmRleCcsCi0JCSdWYXJpYWJsZSc6ICd2YXJpYWJsZScsCi0JCSdWYWx1ZSc6ICdzdHJpbmcnLAotCQknV2lkdGgnOiAncGl4ZWwnLAotCQknV3JhcCc6IChOT05FLCBDSEFSLCBXT1JEKSwKLQkJfQorICAgICMgVW5pdmVyc2FsIGNsYXNzZXMKKyAgICBjbGFzc2VzID0geworICAgICAgICAgICAgJ0FuY2hvcic6IChOLCBORSwgRSwgU0UsIFMsIFNXLCBXLCBOVywgQ0VOVEVSKSwKKyAgICAgICAgICAgICdBc3BlY3QnOiAnaW50ZWdlcicsCisgICAgICAgICAgICAnQmFja2dyb3VuZCc6ICdjb2xvcicsCisgICAgICAgICAgICAnQml0bWFwJzogJ2JpdG1hcCcsCisgICAgICAgICAgICAnQm9yZGVyV2lkdGgnOiAncGl4ZWwnLAorICAgICAgICAgICAgJ0NsYXNzJzogJ3JlYWRvbmx5JywKKyAgICAgICAgICAgICdDbG9zZUVub3VnaCc6ICdkb3VibGUnLAorICAgICAgICAgICAgJ0NvbW1hbmQnOiAnY29tbWFuZCcsCisgICAgICAgICAgICAnQ29uZmluZSc6ICdib29sZWFuJywKKyAgICAgICAgICAgICdDdXJzb3InOiAnY3Vyc29yJywKKyAgICAgICAgICAgICdDdXJzb3JXaWR0aCc6ICdwaXhlbCcsCisgICAgICAgICAgICAnRGlzYWJsZWRGb3JlZ3JvdW5kJzogJ2NvbG9yJywKKyAgICAgICAgICAgICdFeHBvcnRTZWxlY3Rpb24nOiAnYm9vbGVhbicsCisgICAgICAgICAgICAnRm9udCc6ICdmb250JywKKyAgICAgICAgICAgICdGb3JlZ3JvdW5kJzogJ2NvbG9yJywKKyAgICAgICAgICAgICdGcm9tJzogJ2ludGVnZXInLAorICAgICAgICAgICAgJ0dlb21ldHJ5JzogJ2dlb21ldHJ5JywKKyAgICAgICAgICAgICdIZWlnaHQnOiAncGl4ZWwnLAorICAgICAgICAgICAgJ0luc2VydFdpZHRoJzogJ3RpbWUnLAorICAgICAgICAgICAgJ0p1c3RpZnknOiAoTEVGVCwgQ0VOVEVSLCBSSUdIVCksCisgICAgICAgICAgICAnTGFiZWwnOiAnc3RyaW5nJywKKyAgICAgICAgICAgICdMZW5ndGgnOiAncGl4ZWwnLAorICAgICAgICAgICAgJ01lbnVOYW1lJzogJ3dpZGdldCcsCisgICAgICAgICAgICAnTmFtZSc6ICdyZWFkb25seScsCisgICAgICAgICAgICAnT2ZmVGltZSc6ICd0aW1lJywKKyAgICAgICAgICAgICdPblRpbWUnOiAndGltZScsCisgICAgICAgICAgICAnT3JpZW50JzogKEhPUklaT05UQUwsIFZFUlRJQ0FMKSwKKyAgICAgICAgICAgICdQYWQnOiAncGl4ZWwnLAorICAgICAgICAgICAgJ1JlbGllZic6IChSQUlTRUQsIFNVTktFTiwgRkxBVCwgUklER0UsIEdST09WRSksCisgICAgICAgICAgICAnUmVwZWF0RGVsYXknOiAndGltZScsCisgICAgICAgICAgICAnUmVwZWF0SW50ZXJ2YWwnOiAndGltZScsCisgICAgICAgICAgICAnU2Nyb2xsQ29tbWFuZCc6ICdjb21tYW5kJywKKyAgICAgICAgICAgICdTY3JvbGxJbmNyZW1lbnQnOiAncGl4ZWwnLAorICAgICAgICAgICAgJ1Njcm9sbFJlZ2lvbic6ICdyZWN0YW5nbGUnLAorICAgICAgICAgICAgJ1Nob3dWYWx1ZSc6ICdib29sZWFuJywKKyAgICAgICAgICAgICdTZXRHcmlkJzogJ2Jvb2xlYW4nLAorICAgICAgICAgICAgJ1NsaWRlcmZvcmVncm91bmQnOiAnY29sb3InLAorICAgICAgICAgICAgJ1NsaWRlckxlbmd0aCc6ICdwaXhlbCcsCisgICAgICAgICAgICAnVGV4dCc6ICdzdHJpbmcnLAorICAgICAgICAgICAgJ1RpY2tJbnRlcnZhbCc6ICdpbnRlZ2VyJywKKyAgICAgICAgICAgICdUbyc6ICdpbnRlZ2VyJywKKyAgICAgICAgICAgICdVbmRlcmxpbmUnOiAnaW5kZXgnLAorICAgICAgICAgICAgJ1ZhcmlhYmxlJzogJ3ZhcmlhYmxlJywKKyAgICAgICAgICAgICdWYWx1ZSc6ICdzdHJpbmcnLAorICAgICAgICAgICAgJ1dpZHRoJzogJ3BpeGVsJywKKyAgICAgICAgICAgICdXcmFwJzogKE5PTkUsIENIQVIsIFdPUkQpLAorICAgICAgICAgICAgfQogCi0JIyBDbGFzc2VzIHRoYXQgKG1heSkgZGlmZmVyIHBlciB3aWRnZXQgdHlwZQotCV90cmlzdGF0ZSA9IHsnU3RhdGUnOiAoTk9STUFMLCBBQ1RJVkUsIERJU0FCTEVEKX0KLQlfYmlzdGF0ZSA9IHsnU3RhdGUnOiAoTk9STUFMLCBESVNBQkxFRCl9Ci0JYWRkY2xhc3NlcyA9IHsKLQkJJ0J1dHRvbic6IF90cmlzdGF0ZSwKLQkJJ1JhZGlvYnV0dG9uJzogX3RyaXN0YXRlLAotCQknQ2hlY2tidXR0b24nOiBfdHJpc3RhdGUsCi0JCSdFbnRyeSc6IF9iaXN0YXRlLAotCQknVGV4dCc6IF9iaXN0YXRlLAotCQknTWVudWJ1dHRvbic6IF90cmlzdGF0ZSwKLQkJJ1NsaWRlcic6IF9iaXN0YXRlLAotCQl9CisgICAgIyBDbGFzc2VzIHRoYXQgKG1heSkgZGlmZmVyIHBlciB3aWRnZXQgdHlwZQorICAgIF90cmlzdGF0ZSA9IHsnU3RhdGUnOiAoTk9STUFMLCBBQ1RJVkUsIERJU0FCTEVEKX0KKyAgICBfYmlzdGF0ZSA9IHsnU3RhdGUnOiAoTk9STUFMLCBESVNBQkxFRCl9CisgICAgYWRkY2xhc3NlcyA9IHsKKyAgICAgICAgICAgICdCdXR0b24nOiBfdHJpc3RhdGUsCisgICAgICAgICAgICAnUmFkaW9idXR0b24nOiBfdHJpc3RhdGUsCisgICAgICAgICAgICAnQ2hlY2tidXR0b24nOiBfdHJpc3RhdGUsCisgICAgICAgICAgICAnRW50cnknOiBfYmlzdGF0ZSwKKyAgICAgICAgICAgICdUZXh0JzogX2Jpc3RhdGUsCisgICAgICAgICAgICAnTWVudWJ1dHRvbic6IF90cmlzdGF0ZSwKKyAgICAgICAgICAgICdTbGlkZXInOiBfYmlzdGF0ZSwKKyAgICAgICAgICAgIH0KIAogY2xhc3MgUmVtb3RlV2lkZ2V0RGlhbG9nKFdpZGdldERpYWxvZyk6CiAKLQlkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBhcHAsIHdpZGdldCk6Ci0JCXNlbGYuYXBwID0gYXBwCi0JCXNlbGYud2lkZ2V0ID0gd2lkZ2V0Ci0JCXNlbGYua2xhc3MgPSBtYXN0ZXIuc2VuZChzZWxmLmFwcCwKLQkJCQkJICd3aW5mbycsCi0JCQkJCSAnY2xhc3MnLAotCQkJCQkgc2VsZi53aWRnZXQpCi0JCURpYWxvZy5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgYXBwLCB3aWRnZXQpOgorICAgICAgICBzZWxmLmFwcCA9IGFwcAorICAgICAgICBzZWxmLndpZGdldCA9IHdpZGdldAorICAgICAgICBzZWxmLmtsYXNzID0gbWFzdGVyLnNlbmQoc2VsZi5hcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2luZm8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2lkZ2V0KQorICAgICAgICBEaWFsb2cuX19pbml0X18oc2VsZiwgbWFzdGVyKQogCi0JZGVmIHJlZnJlc2goc2VsZik6Ci0JCXRyeToKLQkJCWl0ZW1zID0gc2VsZi5tYXN0ZXIudGsuc3BsaXRsaXN0KAotCQkJCXNlbGYubWFzdGVyLnNlbmQoc2VsZi5hcHAsCi0JCQkJCQkgc2VsZi53aWRnZXQsCi0JCQkJCQkgJ2NvbmZpZycpKQotCQlleGNlcHQgVGNsRXJyb3IsIG1zZzoKLQkJCXByaW50IG1zZwotCQkJcmV0dXJuCi0JCWRpY3QgPSB7fQotCQlmb3IgaXRlbSBpbiBpdGVtczoKLQkJCXdvcmRzID0gc2VsZi5tYXN0ZXIudGsuc3BsaXRsaXN0KGl0ZW0pCi0JCQlrZXkgPSB3b3Jkc1swXVsxOl0KLQkJCXZhbHVlID0gKGtleSwpICsgd29yZHNbMTpdCi0JCQlkaWN0W2tleV0gPSB2YWx1ZQotCQlzZWxmLmNvbmZpZ3VyYXRpb24gPSBkaWN0Ci0JCXNlbGYudXBkYXRlKCkKLQkJc2VsZi5jdXJyZW50WycuY2xhc3MnXSA9IHNlbGYua2xhc3MKLQkJc2VsZi5jdXJyZW50WycubmFtZSddID0gc2VsZi53aWRnZXQKKyAgICBkZWYgcmVmcmVzaChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaXRlbXMgPSBzZWxmLm1hc3Rlci50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICAgICAgICAgIHNlbGYubWFzdGVyLnNlbmQoc2VsZi5hcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZycpKQorICAgICAgICBleGNlcHQgVGNsRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHByaW50IG1zZworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGRpY3QgPSB7fQorICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgICAgIHdvcmRzID0gc2VsZi5tYXN0ZXIudGsuc3BsaXRsaXN0KGl0ZW0pCisgICAgICAgICAgICBrZXkgPSB3b3Jkc1swXVsxOl0KKyAgICAgICAgICAgIHZhbHVlID0gKGtleSwpICsgd29yZHNbMTpdCisgICAgICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZQorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24gPSBkaWN0CisgICAgICAgIHNlbGYudXBkYXRlKCkKKyAgICAgICAgc2VsZi5jdXJyZW50WycuY2xhc3MnXSA9IHNlbGYua2xhc3MKKyAgICAgICAgc2VsZi5jdXJyZW50WycubmFtZSddID0gc2VsZi53aWRnZXQKIAotCWNsYXNzIHJlbW90ZXdpZGdldG9wdGlvbjogIyBNaXgtaW4gY2xhc3MKLQkJZGVmIHNldChzZWxmLCBlPU5vbmUpOgotCQkJc2VsZi5jdXJyZW50ID0gc2VsZi52YXIuZ2V0KCkKLQkJCXRyeToKLQkJCQlzZWxmLmRpYWxvZy5tYXN0ZXIuc2VuZCgKLQkJCQkJc2VsZi5kaWFsb2cuYXBwLAotCQkJCQlzZWxmLmRpYWxvZy53aWRnZXQsCi0JCQkJCSdjb25maWcnLAotCQkJCQknLScrc2VsZi5vcHRpb24sCi0JCQkJCXNlbGYuY3VycmVudCkKLQkJCWV4Y2VwdCBUY2xFcnJvciwgbXNnOgotCQkJCXByaW50IG1zZwotCQkJCXNlbGYucmVmcmVzaCgpCisgICAgY2xhc3MgcmVtb3Rld2lkZ2V0b3B0aW9uOiAjIE1peC1pbiBjbGFzcworICAgICAgICBkZWYgc2V0KHNlbGYsIGU9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnQgPSBzZWxmLnZhci5nZXQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZGlhbG9nLm1hc3Rlci5zZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaWFsb2cuYXBwLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaWFsb2cud2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZycsCisgICAgICAgICAgICAgICAgICAgICAgICAnLScrc2VsZi5vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnQpCisgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgICAgICAgICBzZWxmLnJlZnJlc2goKQogCi0JY2xhc3MgYm9vbGVhbm9wdGlvbihyZW1vdGV3aWRnZXRvcHRpb24sIEJvb2xlYW5PcHRpb24pOiBwYXNzCi0JY2xhc3MgZW51bW9wdGlvbihyZW1vdGV3aWRnZXRvcHRpb24sIEVudW1PcHRpb24pOiBwYXNzCi0JY2xhc3Mgc3RyaW5nb3B0aW9uKHJlbW90ZXdpZGdldG9wdGlvbiwgU3RyaW5nT3B0aW9uKTogcGFzcwotCWNsYXNzIHJlYWRvbmx5b3B0aW9uKHJlbW90ZXdpZGdldG9wdGlvbiwgUmVhZG9ubHlPcHRpb24pOiBwYXNzCisgICAgY2xhc3MgYm9vbGVhbm9wdGlvbihyZW1vdGV3aWRnZXRvcHRpb24sIEJvb2xlYW5PcHRpb24pOiBwYXNzCisgICAgY2xhc3MgZW51bW9wdGlvbihyZW1vdGV3aWRnZXRvcHRpb24sIEVudW1PcHRpb24pOiBwYXNzCisgICAgY2xhc3Mgc3RyaW5nb3B0aW9uKHJlbW90ZXdpZGdldG9wdGlvbiwgU3RyaW5nT3B0aW9uKTogcGFzcworICAgIGNsYXNzIHJlYWRvbmx5b3B0aW9uKHJlbW90ZXdpZGdldG9wdGlvbiwgUmVhZG9ubHlPcHRpb24pOiBwYXNzCiAKIGRlZiB0ZXN0KCk6Ci0JaW1wb3J0IHN5cwotCXJvb3QgPSBUaygpCi0Jcm9vdC5taW5zaXplKDEsIDEpCi0JaWYgc3lzLmFyZ3ZbMTpdOgotCQlyZW1vdGV0ZXN0KHJvb3QsIHN5cy5hcmd2WzFdKQotCWVsc2U6Ci0JCWZyYW1lID0gRnJhbWUocm9vdCwgbmFtZT0nZnJhbWUnKQotCQlmcmFtZS5wYWNrKGV4cGFuZD0xLCBmaWxsPUJPVEgpCi0JCWJ1dHRvbiA9IEJ1dHRvbihmcmFtZSwgbmFtZT0nYnV0dG9uJywgdGV4dD0nYnV0dG9uJykKLQkJYnV0dG9uLnBhY2soZXhwYW5kPTEpCi0JCWNhbnZhcyA9IENhbnZhcyhmcmFtZSwgbmFtZT0nY2FudmFzJykKLQkJY2FudmFzLnBhY2soKQotCQlmcGQgPSBQYWNrRGlhbG9nKGZyYW1lKQotCQlmd2QgPSBXaWRnZXREaWFsb2coZnJhbWUpCi0JCWJwZCA9IFBhY2tEaWFsb2coYnV0dG9uKQotCQlid2QgPSBXaWRnZXREaWFsb2coYnV0dG9uKQotCQljcGQgPSBQYWNrRGlhbG9nKGNhbnZhcykKLQkJY3dkID0gV2lkZ2V0RGlhbG9nKGNhbnZhcykKLQlyb290Lm1haW5sb29wKCkKKyAgICBpbXBvcnQgc3lzCisgICAgcm9vdCA9IFRrKCkKKyAgICByb290Lm1pbnNpemUoMSwgMSkKKyAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgIHJlbW90ZXRlc3Qocm9vdCwgc3lzLmFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgICAgZnJhbWUgPSBGcmFtZShyb290LCBuYW1lPSdmcmFtZScpCisgICAgICAgIGZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICAgICAgYnV0dG9uID0gQnV0dG9uKGZyYW1lLCBuYW1lPSdidXR0b24nLCB0ZXh0PSdidXR0b24nKQorICAgICAgICBidXR0b24ucGFjayhleHBhbmQ9MSkKKyAgICAgICAgY2FudmFzID0gQ2FudmFzKGZyYW1lLCBuYW1lPSdjYW52YXMnKQorICAgICAgICBjYW52YXMucGFjaygpCisgICAgICAgIGZwZCA9IFBhY2tEaWFsb2coZnJhbWUpCisgICAgICAgIGZ3ZCA9IFdpZGdldERpYWxvZyhmcmFtZSkKKyAgICAgICAgYnBkID0gUGFja0RpYWxvZyhidXR0b24pCisgICAgICAgIGJ3ZCA9IFdpZGdldERpYWxvZyhidXR0b24pCisgICAgICAgIGNwZCA9IFBhY2tEaWFsb2coY2FudmFzKQorICAgICAgICBjd2QgPSBXaWRnZXREaWFsb2coY2FudmFzKQorICAgIHJvb3QubWFpbmxvb3AoKQogCiBkZWYgcmVtb3RldGVzdChyb290LCBhcHApOgotCWZyb20gbGlzdHRyZWUgaW1wb3J0IGxpc3R0cmVlCi0JbGlzdCA9IGxpc3R0cmVlKHJvb3QsIGFwcCkKLQlsaXN0LmJpbmQoJzxBbnktRG91YmxlLTE+Jywgb3BlbmRpYWxvZ3MpCi0JbGlzdC5hcHAgPSBhcHAJCQkjIFBhc3MgaXQgb24gdG8gaGFuZGxlcgorICAgIGZyb20gbGlzdHRyZWUgaW1wb3J0IGxpc3R0cmVlCisgICAgbGlzdCA9IGxpc3R0cmVlKHJvb3QsIGFwcCkKKyAgICBsaXN0LmJpbmQoJzxBbnktRG91YmxlLTE+Jywgb3BlbmRpYWxvZ3MpCisgICAgbGlzdC5hcHAgPSBhcHAgICAgICAgICAgICAgICAgICAjIFBhc3MgaXQgb24gdG8gaGFuZGxlcgogCiBkZWYgb3BlbmRpYWxvZ3MoZSk6Ci0JaW1wb3J0IHN0cmluZwotCWxpc3QgPSBlLndpZGdldAotCXNlbCA9IGxpc3QuY3Vyc2VsZWN0aW9uKCkKLQlmb3IgaSBpbiBzZWw6Ci0JCWl0ZW0gPSBsaXN0LmdldChpKQotCQl3aWRnZXQgPSBzdHJpbmcuc3BsaXQoaXRlbSlbMF0KLQkJUmVtb3RlV2lkZ2V0RGlhbG9nKGxpc3QsIGxpc3QuYXBwLCB3aWRnZXQpCi0JCWlmIHdpZGdldCA9PSAnLic6IGNvbnRpbnVlCi0JCXRyeToKLQkJCVJlbW90ZVBhY2tEaWFsb2cobGlzdCwgbGlzdC5hcHAsIHdpZGdldCkKLQkJZXhjZXB0IFRjbEVycm9yLCBtc2c6Ci0JCQlwcmludCBtc2cKKyAgICBpbXBvcnQgc3RyaW5nCisgICAgbGlzdCA9IGUud2lkZ2V0CisgICAgc2VsID0gbGlzdC5jdXJzZWxlY3Rpb24oKQorICAgIGZvciBpIGluIHNlbDoKKyAgICAgICAgaXRlbSA9IGxpc3QuZ2V0KGkpCisgICAgICAgIHdpZGdldCA9IHN0cmluZy5zcGxpdChpdGVtKVswXQorICAgICAgICBSZW1vdGVXaWRnZXREaWFsb2cobGlzdCwgbGlzdC5hcHAsIHdpZGdldCkKKyAgICAgICAgaWYgd2lkZ2V0ID09ICcuJzogY29udGludWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgUmVtb3RlUGFja0RpYWxvZyhsaXN0LCBsaXN0LmFwcCwgd2lkZ2V0KQorICAgICAgICBleGNlcHQgVGNsRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHByaW50IG1zZwogCiB0ZXN0KCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9NYW5QYWdlLnB5IGIvRGVtby90a2ludGVyL2d1aWRvL01hblBhZ2UucHkKaW5kZXggY2NkMjFiNC4uN2Q2ZmUwMCAxMDA3NTUKLS0tIGEvRGVtby90a2ludGVyL2d1aWRvL01hblBhZ2UucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL01hblBhZ2UucHkKQEAgLTEyLDE3MyArMTIsMTczIEBACiAjIFhYWCBSZWNvZ25pemluZyBmb290ZXJzIGlzIHN5c3RlbSBkZXBlbmRlbnQKICMgKFRoaXMgb25lIHdvcmtzIGZvciBJUklYIDUuMiBhbmQgU29sYXJpcyAyLjIpCiBmb290ZXJwcm9nID0gcmVnZXguY29tcGlsZSgKLQknXiAgICAgUGFnZSBbMS05XVswLTldKlsgXHRdK1x8Xi4qTGFzdCBjaGFuZ2U6LipbMS05XVswLTldKlxuJykKKyAgICAgICAgJ14gICAgIFBhZ2UgWzEtOV1bMC05XSpbIFx0XStcfF4uKkxhc3QgY2hhbmdlOi4qWzEtOV1bMC05XSpcbicpCiBlbXB0eXByb2cgPSByZWdleC5jb21waWxlKCdeWyBcdF0qXG4nKQogdWxwcm9nID0gcmVnZXguY29tcGlsZSgnXlsgXHRdKltYdiFfXVtYdiFfIFx0XSpcbicpCiAKICMgQmFzaWMgTWFuIFBhZ2UgY2xhc3MgLS0gZG9lcyBub3QgZGlzYWJsZSBlZGl0aW5nCiBjbGFzcyBFZGl0YWJsZU1hblBhZ2UoU2Nyb2xsZWRUZXh0KToKIAotCSMgSW5pdGlhbGl6ZSBpbnN0YW5jZQotCWRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKipjbmYpOgotCQkjIEluaXRpYWxpemUgYmFzZSBjbGFzcwotCQlhcHBseShTY3JvbGxlZFRleHQuX19pbml0X18sIChzZWxmLCBtYXN0ZXIpLCBjbmYpCisgICAgIyBJbml0aWFsaXplIGluc3RhbmNlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmNuZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSBiYXNlIGNsYXNzCisgICAgICAgIGFwcGx5KFNjcm9sbGVkVGV4dC5fX2luaXRfXywgKHNlbGYsIG1hc3RlciksIGNuZikKIAotCQkjIERlZmluZSB0YWdzIGZvciBmb3JtYXR0aW5nIHN0eWxlcwotCQlzZWxmLnRhZ19jb25maWcoJ1gnLCB1bmRlcmxpbmU9MSkKLQkJc2VsZi50YWdfY29uZmlnKCchJywgZm9udD1CT0xERk9OVCkKLQkJc2VsZi50YWdfY29uZmlnKCdfJywgZm9udD1JVEFMSUNGT05UKQorICAgICAgICAjIERlZmluZSB0YWdzIGZvciBmb3JtYXR0aW5nIHN0eWxlcworICAgICAgICBzZWxmLnRhZ19jb25maWcoJ1gnLCB1bmRlcmxpbmU9MSkKKyAgICAgICAgc2VsZi50YWdfY29uZmlnKCchJywgZm9udD1CT0xERk9OVCkKKyAgICAgICAgc2VsZi50YWdfY29uZmlnKCdfJywgZm9udD1JVEFMSUNGT05UKQogCi0JCSMgU2V0IHN0YXRlIHRvIGlkbGUKLQkJc2VsZi5mcCA9IE5vbmUKLQkJc2VsZi5saW5lbm8gPSAwCisgICAgICAgICMgU2V0IHN0YXRlIHRvIGlkbGUKKyAgICAgICAgc2VsZi5mcCA9IE5vbmUKKyAgICAgICAgc2VsZi5saW5lbm8gPSAwCiAKLQkjIFRlc3Qgd2hldGhlciB3ZSBhcmUgYnVzeSBwYXJzaW5nIGEgZmlsZQotCWRlZiBidXN5KHNlbGYpOgotCQlyZXR1cm4gc2VsZi5mcCAhPSBOb25lCisgICAgIyBUZXN0IHdoZXRoZXIgd2UgYXJlIGJ1c3kgcGFyc2luZyBhIGZpbGUKKyAgICBkZWYgYnVzeShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZnAgIT0gTm9uZQogCi0JIyBFbnN1cmUgd2UncmUgbm90IGJ1c3kKLQlkZWYga2lsbChzZWxmKToKLQkJaWYgc2VsZi5idXN5KCk6Ci0JCQlzZWxmLl9lbmRwYXJzZXIoKQorICAgICMgRW5zdXJlIHdlJ3JlIG5vdCBidXN5CisgICAgZGVmIGtpbGwoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnVzeSgpOgorICAgICAgICAgICAgc2VsZi5fZW5kcGFyc2VyKCkKIAotCSMgUGFyc2UgYSBmaWxlLCBpbiB0aGUgYmFja2dyb3VuZAotCWRlZiBhc3luY3BhcnNlZmlsZShzZWxmLCBmcCk6Ci0JCXNlbGYuX3N0YXJ0cGFyc2VyKGZwKQotCQlzZWxmLnRrLmNyZWF0ZWZpbGVoYW5kbGVyKGZwLCBfdGtpbnRlci5SRUFEQUJMRSwKLQkJCQkJICBzZWxmLl9maWxlaGFuZGxlcikKKyAgICAjIFBhcnNlIGEgZmlsZSwgaW4gdGhlIGJhY2tncm91bmQKKyAgICBkZWYgYXN5bmNwYXJzZWZpbGUoc2VsZiwgZnApOgorICAgICAgICBzZWxmLl9zdGFydHBhcnNlcihmcCkKKyAgICAgICAgc2VsZi50ay5jcmVhdGVmaWxlaGFuZGxlcihmcCwgX3RraW50ZXIuUkVBREFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZWhhbmRsZXIpCiAKLQlwYXJzZWZpbGUgPSBhc3luY3BhcnNlZmlsZQkjIEFsaWFzCisgICAgcGFyc2VmaWxlID0gYXN5bmNwYXJzZWZpbGUgICAgICAjIEFsaWFzCiAKLQkjIEkvTyBoYW5kbGVyIHVzZWQgYnkgYmFja2dyb3VuZCBwYXJzaW5nCi0JZGVmIF9maWxlaGFuZGxlcihzZWxmLCBmcCwgbWFzayk6Ci0JCW5leHRsaW5lID0gc2VsZi5mcC5yZWFkbGluZSgpCi0JCWlmIG5vdCBuZXh0bGluZToKLQkJCXNlbGYuX2VuZHBhcnNlcigpCi0JCQlyZXR1cm4KLQkJc2VsZi5fcGFyc2VsaW5lKG5leHRsaW5lKQorICAgICMgSS9PIGhhbmRsZXIgdXNlZCBieSBiYWNrZ3JvdW5kIHBhcnNpbmcKKyAgICBkZWYgX2ZpbGVoYW5kbGVyKHNlbGYsIGZwLCBtYXNrKToKKyAgICAgICAgbmV4dGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IG5leHRsaW5lOgorICAgICAgICAgICAgc2VsZi5fZW5kcGFyc2VyKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9wYXJzZWxpbmUobmV4dGxpbmUpCiAKLQkjIFBhcnNlIGEgZmlsZSwgbm93IChjYW5ub3QgYmUgYWJvcnRlZCkKLQlkZWYgc3luY3BhcnNlZmlsZShzZWxmLCBmcCk6Ci0JCWZyb20gc2VsZWN0IGltcG9ydCBzZWxlY3QKLQkJZGVmIGF2YWlsKGZwPWZwLCB0b3V0PTAuMCwgc2VsZWN0PXNlbGVjdCk6Ci0JCQlyZXR1cm4gc2VsZWN0KFtmcF0sIFtdLCBbXSwgdG91dClbMF0KLQkJaGVpZ2h0ID0gc2VsZi5nZXRpbnQoc2VsZlsnaGVpZ2h0J10pCi0JCXNlbGYuX3N0YXJ0cGFyc2VyKGZwKQotCQl3aGlsZSAxOgotCQkJbmV4dGxpbmUgPSBmcC5yZWFkbGluZSgpCi0JCQlpZiBub3QgbmV4dGxpbmU6Ci0JCQkJYnJlYWsKLQkJCXNlbGYuX3BhcnNlbGluZShuZXh0bGluZSkKLQkJc2VsZi5fZW5kcGFyc2VyKCkKKyAgICAjIFBhcnNlIGEgZmlsZSwgbm93IChjYW5ub3QgYmUgYWJvcnRlZCkKKyAgICBkZWYgc3luY3BhcnNlZmlsZShzZWxmLCBmcCk6CisgICAgICAgIGZyb20gc2VsZWN0IGltcG9ydCBzZWxlY3QKKyAgICAgICAgZGVmIGF2YWlsKGZwPWZwLCB0b3V0PTAuMCwgc2VsZWN0PXNlbGVjdCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZWN0KFtmcF0sIFtdLCBbXSwgdG91dClbMF0KKyAgICAgICAgaGVpZ2h0ID0gc2VsZi5nZXRpbnQoc2VsZlsnaGVpZ2h0J10pCisgICAgICAgIHNlbGYuX3N0YXJ0cGFyc2VyKGZwKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbmV4dGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbmV4dGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlbGluZShuZXh0bGluZSkKKyAgICAgICAgc2VsZi5fZW5kcGFyc2VyKCkKIAotCSMgSW5pdGlhbGl6ZSBwYXJzaW5nIGZyb20gYSBwYXJ0aWN1bGFyIGZpbGUgLS0gbXVzdCBub3QgYmUgYnVzeQotCWRlZiBfc3RhcnRwYXJzZXIoc2VsZiwgZnApOgotCQlpZiBzZWxmLmJ1c3koKToKLQkJCXJhaXNlIFJ1bnRpbWVFcnJvciwgJ3N0YXJ0cGFyc2VyOiBzdGlsbCBidXN5JwotCQlmcC5maWxlbm8oKQkJIyBUZXN0IGZvciBmaWxlLW5lc3MKLQkJc2VsZi5mcCA9IGZwCi0JCXNlbGYubGluZW5vID0gMAotCQlzZWxmLm9rID0gMAotCQlzZWxmLmVtcHR5ID0gMAotCQlzZWxmLmJ1ZmZlciA9IE5vbmUKLQkJc2F2ZXN0YXRlID0gc2VsZlsnc3RhdGUnXQotCQlzZWxmWydzdGF0ZSddID0gTk9STUFMCi0JCXNlbGYuZGVsZXRlKCcxLjAnLCBFTkQpCi0JCXNlbGZbJ3N0YXRlJ10gPSBzYXZlc3RhdGUKKyAgICAjIEluaXRpYWxpemUgcGFyc2luZyBmcm9tIGEgcGFydGljdWxhciBmaWxlIC0tIG11c3Qgbm90IGJlIGJ1c3kKKyAgICBkZWYgX3N0YXJ0cGFyc2VyKHNlbGYsIGZwKToKKyAgICAgICAgaWYgc2VsZi5idXN5KCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICdzdGFydHBhcnNlcjogc3RpbGwgYnVzeScKKyAgICAgICAgZnAuZmlsZW5vKCkgICAgICAgICAgICAgIyBUZXN0IGZvciBmaWxlLW5lc3MKKyAgICAgICAgc2VsZi5mcCA9IGZwCisgICAgICAgIHNlbGYubGluZW5vID0gMAorICAgICAgICBzZWxmLm9rID0gMAorICAgICAgICBzZWxmLmVtcHR5ID0gMAorICAgICAgICBzZWxmLmJ1ZmZlciA9IE5vbmUKKyAgICAgICAgc2F2ZXN0YXRlID0gc2VsZlsnc3RhdGUnXQorICAgICAgICBzZWxmWydzdGF0ZSddID0gTk9STUFMCisgICAgICAgIHNlbGYuZGVsZXRlKCcxLjAnLCBFTkQpCisgICAgICAgIHNlbGZbJ3N0YXRlJ10gPSBzYXZlc3RhdGUKIAotCSMgRW5kIHBhcnNpbmcgLS0gbXVzdCBiZSBidXN5LCBuZWVkIG5vdCBiZSBhdCBFT0YKLQlkZWYgX2VuZHBhcnNlcihzZWxmKToKLQkJaWYgbm90IHNlbGYuYnVzeSgpOgotCQkJcmFpc2UgUnVudGltZUVycm9yLCAnZW5kcGFyc2VyOiBub3QgYnVzeScKLQkJaWYgc2VsZi5idWZmZXI6Ci0JCQlzZWxmLl9wYXJzZWxpbmUoJycpCi0JCXRyeToKLQkJCXNlbGYudGsuZGVsZXRlZmlsZWhhbmRsZXIoc2VsZi5mcCkKLQkJZXhjZXB0IFRjbEVycm9yLCBtc2c6Ci0JCQlwYXNzCi0JCXNlbGYuZnAuY2xvc2UoKQotCQlzZWxmLmZwID0gTm9uZQotCQlkZWwgc2VsZi5vaywgc2VsZi5lbXB0eSwgc2VsZi5idWZmZXIKKyAgICAjIEVuZCBwYXJzaW5nIC0tIG11c3QgYmUgYnVzeSwgbmVlZCBub3QgYmUgYXQgRU9GCisgICAgZGVmIF9lbmRwYXJzZXIoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmJ1c3koKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ2VuZHBhcnNlcjogbm90IGJ1c3knCisgICAgICAgIGlmIHNlbGYuYnVmZmVyOgorICAgICAgICAgICAgc2VsZi5fcGFyc2VsaW5lKCcnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRrLmRlbGV0ZWZpbGVoYW5kbGVyKHNlbGYuZnApCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvciwgbXNnOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mcCA9IE5vbmUKKyAgICAgICAgZGVsIHNlbGYub2ssIHNlbGYuZW1wdHksIHNlbGYuYnVmZmVyCiAKLQkjIFBhcnNlIGEgc2luZ2xlIGxpbmUKLQlkZWYgX3BhcnNlbGluZShzZWxmLCBuZXh0bGluZSk6Ci0JCWlmIG5vdCBzZWxmLmJ1ZmZlcjoKLQkJCSMgU2F2ZSB0aGlzIGxpbmUgLS0gd2UgbmVlZCBvbmUgbGluZSByZWFkLWFoZWFkCi0JCQlzZWxmLmJ1ZmZlciA9IG5leHRsaW5lCi0JCQlyZXR1cm4KLQkJaWYgZW1wdHlwcm9nLm1hdGNoKHNlbGYuYnVmZmVyKSA+PSAwOgotCQkJIyBCdWZmZXJlZCBsaW5lIHdhcyBlbXB0eSAtLSBzZXQgYSBmbGFnCi0JCQlzZWxmLmVtcHR5ID0gMQotCQkJc2VsZi5idWZmZXIgPSBuZXh0bGluZQotCQkJcmV0dXJuCi0JCXRleHRsaW5lID0gc2VsZi5idWZmZXIKLQkJaWYgdWxwcm9nLm1hdGNoKG5leHRsaW5lKSA+PSAwOgotCQkJIyBOZXh0IGxpbmUgaXMgcHJvcGVydGllcyBmb3IgYnVmZmVyZWQgbGluZQotCQkJcHJvcGxpbmUgPSBuZXh0bGluZQotCQkJc2VsZi5idWZmZXIgPSBOb25lCi0JCWVsc2U6Ci0JCQkjIE5leHQgbGluZSBpcyByZWFkLWFoZWFkCi0JCQlwcm9wbGluZSA9IE5vbmUKLQkJCXNlbGYuYnVmZmVyID0gbmV4dGxpbmUKLQkJaWYgbm90IHNlbGYub2s6Ci0JCQkjIEZpcnN0IG5vbiBibGFuayBsaW5lIGFmdGVyIGZvb3RlciBtdXN0IGJlIGhlYWRlcgotCQkJIyAtLSBza2lwIHRoYXQgdG9vCi0JCQlzZWxmLm9rID0gMQotCQkJc2VsZi5lbXB0eSA9IDAKLQkJCXJldHVybgotCQlpZiBmb290ZXJwcm9nLm1hdGNoKHRleHRsaW5lKSA+PSAwOgotCQkJIyBGb290ZXIgLS0gc3RhcnQgc2tpcHBpbmcgdW50aWwgbmV4dCBub24tYmxhbmsgbGluZQotCQkJc2VsZi5vayA9IDAKLQkJCXNlbGYuZW1wdHkgPSAwCi0JCQlyZXR1cm4KLQkJc2F2ZXN0YXRlID0gc2VsZlsnc3RhdGUnXQotCQlzZWxmWydzdGF0ZSddID0gTk9STUFMCi0JCWlmIFRrVmVyc2lvbiA+PSA0LjA6Ci0JCQlzZWxmLm1hcmtfc2V0KCdpbnNlcnQnLCAnZW5kLTFjJykKLQkJZWxzZToKLQkJCXNlbGYubWFya19zZXQoJ2luc2VydCcsIEVORCkKLQkJaWYgc2VsZi5lbXB0eToKLQkJCSMgT25lIG9yIG1vcmUgcHJldmlvdXMgbGluZXMgd2VyZSBlbXB0eQotCQkJIyAtLSBpbnNlcnQgb25lIGJsYW5rIGxpbmUgaW4gdGhlIHRleHQKLQkJCXNlbGYuX2luc2VydF9wcm9wKCdcbicpCi0JCQlzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQotCQkJc2VsZi5lbXB0eSA9IDAKLQkJaWYgbm90IHByb3BsaW5lOgotCQkJIyBObyBwcm9wZXJ0aWVzCi0JCQlzZWxmLl9pbnNlcnRfcHJvcCh0ZXh0bGluZSkKLQkJZWxzZToKLQkJCSMgU2VhcmNoIGZvciBwcm9wZXJ0aWVzCi0JCQlwID0gJycKLQkJCWogPSAwCi0JCQlmb3IgaSBpbiByYW5nZShtaW4obGVuKHByb3BsaW5lKSwgbGVuKHRleHRsaW5lKSkpOgotCQkJCWlmIHByb3BsaW5lW2ldICE9IHA6Ci0JCQkJCWlmIGogPCBpOgotCQkJCQkgICAgc2VsZi5faW5zZXJ0X3Byb3AodGV4dGxpbmVbajppXSwgcCkKLQkJCQkJICAgIGogPSBpCi0JCQkJCXAgPSBwcm9wbGluZVtpXQotCQkJc2VsZi5faW5zZXJ0X3Byb3AodGV4dGxpbmVbajpdKQotCQlzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQotCQlzZWxmWydzdGF0ZSddID0gc2F2ZXN0YXRlCisgICAgIyBQYXJzZSBhIHNpbmdsZSBsaW5lCisgICAgZGVmIF9wYXJzZWxpbmUoc2VsZiwgbmV4dGxpbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5idWZmZXI6CisgICAgICAgICAgICAjIFNhdmUgdGhpcyBsaW5lIC0tIHdlIG5lZWQgb25lIGxpbmUgcmVhZC1haGVhZAorICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBuZXh0bGluZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGVtcHR5cHJvZy5tYXRjaChzZWxmLmJ1ZmZlcikgPj0gMDoKKyAgICAgICAgICAgICMgQnVmZmVyZWQgbGluZSB3YXMgZW1wdHkgLS0gc2V0IGEgZmxhZworICAgICAgICAgICAgc2VsZi5lbXB0eSA9IDEKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gbmV4dGxpbmUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0ZXh0bGluZSA9IHNlbGYuYnVmZmVyCisgICAgICAgIGlmIHVscHJvZy5tYXRjaChuZXh0bGluZSkgPj0gMDoKKyAgICAgICAgICAgICMgTmV4dCBsaW5lIGlzIHByb3BlcnRpZXMgZm9yIGJ1ZmZlcmVkIGxpbmUKKyAgICAgICAgICAgIHByb3BsaW5lID0gbmV4dGxpbmUKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBOZXh0IGxpbmUgaXMgcmVhZC1haGVhZAorICAgICAgICAgICAgcHJvcGxpbmUgPSBOb25lCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IG5leHRsaW5lCisgICAgICAgIGlmIG5vdCBzZWxmLm9rOgorICAgICAgICAgICAgIyBGaXJzdCBub24gYmxhbmsgbGluZSBhZnRlciBmb290ZXIgbXVzdCBiZSBoZWFkZXIKKyAgICAgICAgICAgICMgLS0gc2tpcCB0aGF0IHRvbworICAgICAgICAgICAgc2VsZi5vayA9IDEKKyAgICAgICAgICAgIHNlbGYuZW1wdHkgPSAwCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgZm9vdGVycHJvZy5tYXRjaCh0ZXh0bGluZSkgPj0gMDoKKyAgICAgICAgICAgICMgRm9vdGVyIC0tIHN0YXJ0IHNraXBwaW5nIHVudGlsIG5leHQgbm9uLWJsYW5rIGxpbmUKKyAgICAgICAgICAgIHNlbGYub2sgPSAwCisgICAgICAgICAgICBzZWxmLmVtcHR5ID0gMAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNhdmVzdGF0ZSA9IHNlbGZbJ3N0YXRlJ10KKyAgICAgICAgc2VsZlsnc3RhdGUnXSA9IE5PUk1BTAorICAgICAgICBpZiBUa1ZlcnNpb24gPj0gNC4wOgorICAgICAgICAgICAgc2VsZi5tYXJrX3NldCgnaW5zZXJ0JywgJ2VuZC0xYycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1hcmtfc2V0KCdpbnNlcnQnLCBFTkQpCisgICAgICAgIGlmIHNlbGYuZW1wdHk6CisgICAgICAgICAgICAjIE9uZSBvciBtb3JlIHByZXZpb3VzIGxpbmVzIHdlcmUgZW1wdHkKKyAgICAgICAgICAgICMgLS0gaW5zZXJ0IG9uZSBibGFuayBsaW5lIGluIHRoZSB0ZXh0CisgICAgICAgICAgICBzZWxmLl9pbnNlcnRfcHJvcCgnXG4nKQorICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIDEKKyAgICAgICAgICAgIHNlbGYuZW1wdHkgPSAwCisgICAgICAgIGlmIG5vdCBwcm9wbGluZToKKyAgICAgICAgICAgICMgTm8gcHJvcGVydGllcworICAgICAgICAgICAgc2VsZi5faW5zZXJ0X3Byb3AodGV4dGxpbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFNlYXJjaCBmb3IgcHJvcGVydGllcworICAgICAgICAgICAgcCA9ICcnCisgICAgICAgICAgICBqID0gMAorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobWluKGxlbihwcm9wbGluZSksIGxlbih0ZXh0bGluZSkpKToKKyAgICAgICAgICAgICAgICBpZiBwcm9wbGluZVtpXSAhPSBwOgorICAgICAgICAgICAgICAgICAgICBpZiBqIDwgaToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luc2VydF9wcm9wKHRleHRsaW5lW2o6aV0sIHApCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gaQorICAgICAgICAgICAgICAgICAgICBwID0gcHJvcGxpbmVbaV0KKyAgICAgICAgICAgIHNlbGYuX2luc2VydF9wcm9wKHRleHRsaW5lW2o6XSkKKyAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIDEKKyAgICAgICAgc2VsZlsnc3RhdGUnXSA9IHNhdmVzdGF0ZQogCi0JIyBJbnNlcnQgYSBzdHJpbmcgYXQgdGhlIGVuZCwgd2l0aCBhdCBtb3N0IG9uZSBwcm9wZXJ0eSAodGFnKQotCWRlZiBfaW5zZXJ0X3Byb3Aoc2VsZiwgc3RyLCBwcm9wID0gJyAnKToKLQkJaGVyZSA9IHNlbGYuaW5kZXgoQXRJbnNlcnQoKSkKLQkJc2VsZi5pbnNlcnQoQXRJbnNlcnQoKSwgc3RyKQotCQlpZiBUa1ZlcnNpb24gPD0gNC4wOgotCQkJdGFncyA9IHNlbGYudGFnX25hbWVzKGhlcmUpCi0JCQlmb3IgdGFnIGluIHRhZ3M6Ci0JCQkJc2VsZi50YWdfcmVtb3ZlKHRhZywgaGVyZSwgQXRJbnNlcnQoKSkKLQkJaWYgcHJvcCAhPSAnICc6Ci0JCQlzZWxmLnRhZ19hZGQocHJvcCwgaGVyZSwgQXRJbnNlcnQoKSkKKyAgICAjIEluc2VydCBhIHN0cmluZyBhdCB0aGUgZW5kLCB3aXRoIGF0IG1vc3Qgb25lIHByb3BlcnR5ICh0YWcpCisgICAgZGVmIF9pbnNlcnRfcHJvcChzZWxmLCBzdHIsIHByb3AgPSAnICcpOgorICAgICAgICBoZXJlID0gc2VsZi5pbmRleChBdEluc2VydCgpKQorICAgICAgICBzZWxmLmluc2VydChBdEluc2VydCgpLCBzdHIpCisgICAgICAgIGlmIFRrVmVyc2lvbiA8PSA0LjA6CisgICAgICAgICAgICB0YWdzID0gc2VsZi50YWdfbmFtZXMoaGVyZSkKKyAgICAgICAgICAgIGZvciB0YWcgaW4gdGFnczoKKyAgICAgICAgICAgICAgICBzZWxmLnRhZ19yZW1vdmUodGFnLCBoZXJlLCBBdEluc2VydCgpKQorICAgICAgICBpZiBwcm9wICE9ICcgJzoKKyAgICAgICAgICAgIHNlbGYudGFnX2FkZChwcm9wLCBoZXJlLCBBdEluc2VydCgpKQogCiAjIFJlYWRvbmx5IE1hbiBQYWdlIGNsYXNzIC0tIGRpc2FibGVzIGVkaXRpbmcsIG90aGVyd2lzZSB0aGUgc2FtZQogY2xhc3MgUmVhZG9ubHlNYW5QYWdlKEVkaXRhYmxlTWFuUGFnZSk6CiAKLQkjIEluaXRpYWxpemUgaW5zdGFuY2UKLQlkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqY25mKToKLQkJY25mWydzdGF0ZSddID0gRElTQUJMRUQKLQkJYXBwbHkoRWRpdGFibGVNYW5QYWdlLl9faW5pdF9fLCAoc2VsZiwgbWFzdGVyKSwgY25mKQorICAgICMgSW5pdGlhbGl6ZSBpbnN0YW5jZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKipjbmYpOgorICAgICAgICBjbmZbJ3N0YXRlJ10gPSBESVNBQkxFRAorICAgICAgICBhcHBseShFZGl0YWJsZU1hblBhZ2UuX19pbml0X18sIChzZWxmLCBtYXN0ZXIpLCBjbmYpCiAKICMgQWxpYXMKIE1hblBhZ2UgPSBSZWFkb25seU1hblBhZ2UKQEAgLTE4NywzNCArMTg3LDM0IEBACiAjIHVzYWdlOiBNYW5QYWdlIFttYW5wYWdlXTsgb3IgTWFuUGFnZSBbLWZdIGZpbGUKICMgLWYgbWVhbnMgdGhhdCB0aGUgZmlsZSBpcyBucm9mZiAtbWFuIG91dHB1dCBydW4gdGhyb3VnaCB1bCAtaQogZGVmIHRlc3QoKToKLQlpbXBvcnQgb3MKLQlpbXBvcnQgc3lzCi0JIyBYWFggVGhpcyBkaXJlY3RvcnkgbWF5IGJlIGRpZmZlcmVudCBvbiB5b3VyIHN5c3RlbQotCU1BTkRJUiA9ICcvdXNyL2xvY2FsL21hbi9tYW5uJwotCURFRkFVTFRQQUdFID0gJ1RjbCcKLQlmb3JtYXR0ZWQgPSAwCi0JaWYgc3lzLmFyZ3ZbMTpdIGFuZCBzeXMuYXJndlsxXSA9PSAnLWYnOgotCQlmb3JtYXR0ZWQgPSAxCi0JCWRlbCBzeXMuYXJndlsxXQotCWlmIHN5cy5hcmd2WzE6XToKLQkJbmFtZSA9IHN5cy5hcmd2WzFdCi0JZWxzZToKLQkJbmFtZSA9IERFRkFVTFRQQUdFCi0JaWYgbm90IGZvcm1hdHRlZDoKLQkJaWYgbmFtZVstMjotMV0gIT0gJy4nOgotCQkJbmFtZSA9IG5hbWUgKyAnLm4nCi0JCW5hbWUgPSBvcy5wYXRoLmpvaW4oTUFORElSLCBuYW1lKQotCXJvb3QgPSBUaygpCi0Jcm9vdC5taW5zaXplKDEsIDEpCi0JbWFucGFnZSA9IE1hblBhZ2Uocm9vdCwgcmVsaWVmPVNVTktFTiwgYm9yZGVyd2lkdGg9MikKLQltYW5wYWdlLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKLQlpZiBmb3JtYXR0ZWQ6Ci0JCWZwID0gb3BlbihuYW1lLCAncicpCi0JZWxzZToKLQkJZnAgPSBvcy5wb3BlbignbnJvZmYgLW1hbiAlcyB8IHVsIC1pJyAlIG5hbWUsICdyJykKLQltYW5wYWdlLnBhcnNlZmlsZShmcCkKLQlyb290Lm1haW5sb29wKCkKKyAgICBpbXBvcnQgb3MKKyAgICBpbXBvcnQgc3lzCisgICAgIyBYWFggVGhpcyBkaXJlY3RvcnkgbWF5IGJlIGRpZmZlcmVudCBvbiB5b3VyIHN5c3RlbQorICAgIE1BTkRJUiA9ICcvdXNyL2xvY2FsL21hbi9tYW5uJworICAgIERFRkFVTFRQQUdFID0gJ1RjbCcKKyAgICBmb3JtYXR0ZWQgPSAwCisgICAgaWYgc3lzLmFyZ3ZbMTpdIGFuZCBzeXMuYXJndlsxXSA9PSAnLWYnOgorICAgICAgICBmb3JtYXR0ZWQgPSAxCisgICAgICAgIGRlbCBzeXMuYXJndlsxXQorICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgbmFtZSA9IHN5cy5hcmd2WzFdCisgICAgZWxzZToKKyAgICAgICAgbmFtZSA9IERFRkFVTFRQQUdFCisgICAgaWYgbm90IGZvcm1hdHRlZDoKKyAgICAgICAgaWYgbmFtZVstMjotMV0gIT0gJy4nOgorICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnLm4nCisgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4oTUFORElSLCBuYW1lKQorICAgIHJvb3QgPSBUaygpCisgICAgcm9vdC5taW5zaXplKDEsIDEpCisgICAgbWFucGFnZSA9IE1hblBhZ2Uocm9vdCwgcmVsaWVmPVNVTktFTiwgYm9yZGVyd2lkdGg9MikKKyAgICBtYW5wYWdlLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICBpZiBmb3JtYXR0ZWQ6CisgICAgICAgIGZwID0gb3BlbihuYW1lLCAncicpCisgICAgZWxzZToKKyAgICAgICAgZnAgPSBvcy5wb3BlbignbnJvZmYgLW1hbiAlcyB8IHVsIC1pJyAlIG5hbWUsICdyJykKKyAgICBtYW5wYWdlLnBhcnNlZmlsZShmcCkKKyAgICByb290Lm1haW5sb29wKCkKIAogIyBSdW4gdGhlIHRlc3QgcHJvZ3JhbSB3aGVuIGNhbGxlZCBhcyBhIHNjcmlwdAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQl0ZXN0KCkKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9NaW1lVmlld2VyLnB5IGIvRGVtby90a2ludGVyL2d1aWRvL01pbWVWaWV3ZXIucHkKaW5kZXggMmI5ODU3OS4uNzQ5NDQyNSAxMDA3NTUKLS0tIGEvRGVtby90a2ludGVyL2d1aWRvL01pbWVWaWV3ZXIucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL01pbWVWaWV3ZXIucHkKQEAgLTksMTM1ICs5LDEzNSBAQAogZnJvbSBTY3JvbGxlZFRleHQgaW1wb3J0IFNjcm9sbGVkVGV4dAogCiBjbGFzcyBNaW1lVmlld2VyOgotCWRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtc2cpOgotCQlzZWxmLnRpdGxlID0gdGl0bGUKLQkJc2VsZi5tc2cgPSBtc2cKLQkJc2VsZi5mcmFtZSA9IEZyYW1lKHBhcmVudCwgeydyZWxpZWYnOiAncmFpc2VkJywgJ2JkJzogMn0pCi0JCXNlbGYuZnJhbWUucGFja2luZyA9IHsnZXhwYW5kJzogMCwgJ2ZpbGwnOiAnYm90aCd9Ci0JCXNlbGYuYnV0dG9uID0gQ2hlY2tidXR0b24oc2VsZi5mcmFtZSwKLQkJCQkgICAgIHsndGV4dCc6IHRpdGxlLAotCQkJCSAgICAgICdjb21tYW5kJzogc2VsZi50b2dnbGV9KQotCQlzZWxmLmJ1dHRvbi5wYWNrKHsnYW5jaG9yJzogJ3cnfSkKLQkJaGVhZGVydGV4dCA9IG1zZy5nZXRoZWFkZXJ0ZXh0KAotCQkJbGFtYmRhIHg6IHggIT0gJ3JlY2VpdmVkJyBhbmQgeFs6NV0gIT0gJ3g0MDAtJykKLQkJaGVpZ2h0ID0gY291bnRsaW5lcyhoZWFkZXJ0ZXh0LCA0KQotCQlpZiBoZWlnaHQ6Ci0JCQlzZWxmLmh0ZXh0ID0gU2Nyb2xsZWRUZXh0KHNlbGYuZnJhbWUsCi0JCQkJCSAgeydoZWlnaHQnOiBoZWlnaHQsCi0JCQkJCSAgICd3aWR0aCc6IDgwLAotCQkJCQkgICAnd3JhcCc6ICdub25lJywKLQkJCQkJICAgJ3JlbGllZic6ICdyYWlzZWQnLAotCQkJCQkgICAnYmQnOiAyfSkKLQkJCXNlbGYuaHRleHQucGFja2luZyA9IHsnZXhwYW5kJzogMSwgJ2ZpbGwnOiAnYm90aCcsCi0JCQkJCSAgICAgICdhZnRlcic6IHNlbGYuYnV0dG9ufQotCQkJc2VsZi5odGV4dC5pbnNlcnQoJ2VuZCcsIGhlYWRlcnRleHQpCi0JCWVsc2U6Ci0JCQlzZWxmLmh0ZXh0ID0gRnJhbWUoc2VsZi5mcmFtZSwKLQkJCQkJICAgeydyZWxpZWYnOiAncmFpc2VkJywgJ2JkJzogMn0pCi0JCQlzZWxmLmh0ZXh0LnBhY2tpbmcgPSB7J3NpZGUnOiAndG9wJywKLQkJCQkJICAgICAgJ2lwYWR5JzogMiwKLQkJCQkJICAgICAgJ2ZpbGwnOiAneCcsCi0JCQkJCSAgICAgICdhZnRlcic6IHNlbGYuYnV0dG9ufQotCQlib2R5ID0gbXNnLmdldGJvZHkoKQotCQlpZiB0eXBlKGJvZHkpID09IFN0cmluZ1R5cGU6Ci0JCQlzZWxmLnBhZCA9IE5vbmUKLQkJCWhlaWdodCA9IGNvdW50bGluZXMoYm9keSwgMTApCi0JCQlpZiBoZWlnaHQ6Ci0JCQkJc2VsZi5idGV4dCA9IFNjcm9sbGVkVGV4dChzZWxmLmZyYW1lLAotCQkJCQkJICB7J2hlaWdodCc6IGhlaWdodCwKLQkJCQkJCSAgICd3aWR0aCc6IDgwLAotCQkJCQkJICAgJ3dyYXAnOiAnbm9uZScsCi0JCQkJCQkgICAncmVsaWVmJzogJ3JhaXNlZCcsCi0JCQkJCQkgICAnYmQnOiAyfSkKLQkJCQlzZWxmLmJ0ZXh0LnBhY2tpbmcgPSB7J2V4cGFuZCc6IDEsCi0JCQkJCQkgICAgICAnZmlsbCc6ICdib3RoJ30KLQkJCQlzZWxmLmJ0ZXh0Lmluc2VydCgnZW5kJywgYm9keSkKLQkJCWVsc2U6Ci0JCQkJc2VsZi5idGV4dCA9IE5vbmUKLQkJCXNlbGYucGFydHMgPSBOb25lCi0JCWVsc2U6Ci0JCQlzZWxmLnBhZCA9IEZyYW1lKHNlbGYuZnJhbWUsCi0JCQkJCSB7J3JlbGllZic6ICdmbGF0JywgJ2JkJzogMn0pCi0JCQlzZWxmLnBhZC5wYWNraW5nID0geydzaWRlJzogJ2xlZnQnLCAnaXBhZHgnOiAxMCwKLQkJCQkJICAgICdmaWxsJzogJ3knLCAnYWZ0ZXInOiBzZWxmLmh0ZXh0fQotCQkJc2VsZi5wYXJ0cyA9IFtdCi0JCQlmb3IgaSBpbiByYW5nZShsZW4oYm9keSkpOgotCQkJCXAgPSBNaW1lVmlld2VyKHNlbGYuZnJhbWUsCi0JCQkJCSAgICAgICAnJXMuJWQnICUgKHRpdGxlLCBpKzEpLAotCQkJCQkgICAgICAgYm9keVtpXSkKLQkJCQlzZWxmLnBhcnRzLmFwcGVuZChwKQotCQkJc2VsZi5idGV4dCA9IE5vbmUKLQkJc2VsZi5jb2xsYXBzZWQgPSAxCi0JZGVmIHBhY2soc2VsZik6Ci0JCXNlbGYuZnJhbWUucGFjayhzZWxmLmZyYW1lLnBhY2tpbmcpCi0JZGVmIGRlc3Ryb3koc2VsZik6Ci0JCXNlbGYuZnJhbWUuZGVzdHJveSgpCi0JZGVmIHNob3coc2VsZik6Ci0JCWlmIHNlbGYuY29sbGFwc2VkOgotCQkJc2VsZi5idXR0b24uaW52b2tlKCkKLQlkZWYgdG9nZ2xlKHNlbGYpOgotCQlpZiBzZWxmLmNvbGxhcHNlZDoKLQkJCXNlbGYuZXhwbG9kZSgpCi0JCWVsc2U6Ci0JCQlzZWxmLmNvbGxhcHNlKCkKLQlkZWYgY29sbGFwc2Uoc2VsZik6Ci0JCXNlbGYuY29sbGFwc2VkID0gMQotCQlmb3IgY29tcCBpbiBzZWxmLmh0ZXh0LCBzZWxmLmJ0ZXh0LCBzZWxmLnBhZDoKLQkJCWlmIGNvbXA6Ci0JCQkJY29tcC5mb3JnZXQoKQotCQlpZiBzZWxmLnBhcnRzOgotCQkJZm9yIHBhcnQgaW4gc2VsZi5wYXJ0czoKLQkJCQlwYXJ0LmZyYW1lLmZvcmdldCgpCi0JCXNlbGYuZnJhbWUucGFjayh7J2V4cGFuZCc6IDB9KQotCWRlZiBleHBsb2RlKHNlbGYpOgotCQlzZWxmLmNvbGxhcHNlZCA9IDAKLQkJZm9yIGNvbXAgaW4gc2VsZi5odGV4dCwgc2VsZi5idGV4dCwgc2VsZi5wYWQ6Ci0JCQlpZiBjb21wOiBjb21wLnBhY2soY29tcC5wYWNraW5nKQotCQlpZiBzZWxmLnBhcnRzOgotCQkJZm9yIHBhcnQgaW4gc2VsZi5wYXJ0czoKLQkJCQlwYXJ0LnBhY2soKQotCQlzZWxmLmZyYW1lLnBhY2soeydleHBhbmQnOiAxfSkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgbXNnKToKKyAgICAgICAgc2VsZi50aXRsZSA9IHRpdGxlCisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgICAgIHNlbGYuZnJhbWUgPSBGcmFtZShwYXJlbnQsIHsncmVsaWVmJzogJ3JhaXNlZCcsICdiZCc6IDJ9KQorICAgICAgICBzZWxmLmZyYW1lLnBhY2tpbmcgPSB7J2V4cGFuZCc6IDAsICdmaWxsJzogJ2JvdGgnfQorICAgICAgICBzZWxmLmJ1dHRvbiA9IENoZWNrYnV0dG9uKHNlbGYuZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndGV4dCc6IHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbW1hbmQnOiBzZWxmLnRvZ2dsZX0pCisgICAgICAgIHNlbGYuYnV0dG9uLnBhY2soeydhbmNob3InOiAndyd9KQorICAgICAgICBoZWFkZXJ0ZXh0ID0gbXNnLmdldGhlYWRlcnRleHQoCisgICAgICAgICAgICAgICAgbGFtYmRhIHg6IHggIT0gJ3JlY2VpdmVkJyBhbmQgeFs6NV0gIT0gJ3g0MDAtJykKKyAgICAgICAgaGVpZ2h0ID0gY291bnRsaW5lcyhoZWFkZXJ0ZXh0LCA0KQorICAgICAgICBpZiBoZWlnaHQ6CisgICAgICAgICAgICBzZWxmLmh0ZXh0ID0gU2Nyb2xsZWRUZXh0KHNlbGYuZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2hlaWdodCc6IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiA4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd3JhcCc6ICdub25lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVsaWVmJzogJ3JhaXNlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JkJzogMn0pCisgICAgICAgICAgICBzZWxmLmh0ZXh0LnBhY2tpbmcgPSB7J2V4cGFuZCc6IDEsICdmaWxsJzogJ2JvdGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlcic6IHNlbGYuYnV0dG9ufQorICAgICAgICAgICAgc2VsZi5odGV4dC5pbnNlcnQoJ2VuZCcsIGhlYWRlcnRleHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmh0ZXh0ID0gRnJhbWUoc2VsZi5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3JlbGllZic6ICdyYWlzZWQnLCAnYmQnOiAyfSkKKyAgICAgICAgICAgIHNlbGYuaHRleHQucGFja2luZyA9IHsnc2lkZSc6ICd0b3AnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcGFkeSc6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGwnOiAneCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FmdGVyJzogc2VsZi5idXR0b259CisgICAgICAgIGJvZHkgPSBtc2cuZ2V0Ym9keSgpCisgICAgICAgIGlmIHR5cGUoYm9keSkgPT0gU3RyaW5nVHlwZToKKyAgICAgICAgICAgIHNlbGYucGFkID0gTm9uZQorICAgICAgICAgICAgaGVpZ2h0ID0gY291bnRsaW5lcyhib2R5LCAxMCkKKyAgICAgICAgICAgIGlmIGhlaWdodDoKKyAgICAgICAgICAgICAgICBzZWxmLmJ0ZXh0ID0gU2Nyb2xsZWRUZXh0KHNlbGYuZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydoZWlnaHQnOiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCc6IDgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd3JhcCc6ICdub25lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbGllZic6ICdyYWlzZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmQnOiAyfSkKKyAgICAgICAgICAgICAgICBzZWxmLmJ0ZXh0LnBhY2tpbmcgPSB7J2V4cGFuZCc6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxsJzogJ2JvdGgnfQorICAgICAgICAgICAgICAgIHNlbGYuYnRleHQuaW5zZXJ0KCdlbmQnLCBib2R5KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmJ0ZXh0ID0gTm9uZQorICAgICAgICAgICAgc2VsZi5wYXJ0cyA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucGFkID0gRnJhbWUoc2VsZi5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydyZWxpZWYnOiAnZmxhdCcsICdiZCc6IDJ9KQorICAgICAgICAgICAgc2VsZi5wYWQucGFja2luZyA9IHsnc2lkZSc6ICdsZWZ0JywgJ2lwYWR4JzogMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxsJzogJ3knLCAnYWZ0ZXInOiBzZWxmLmh0ZXh0fQorICAgICAgICAgICAgc2VsZi5wYXJ0cyA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYm9keSkpOgorICAgICAgICAgICAgICAgIHAgPSBNaW1lVmlld2VyKHNlbGYuZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzLiVkJyAlICh0aXRsZSwgaSsxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5W2ldKQorICAgICAgICAgICAgICAgIHNlbGYucGFydHMuYXBwZW5kKHApCisgICAgICAgICAgICBzZWxmLmJ0ZXh0ID0gTm9uZQorICAgICAgICBzZWxmLmNvbGxhcHNlZCA9IDEKKyAgICBkZWYgcGFjayhzZWxmKToKKyAgICAgICAgc2VsZi5mcmFtZS5wYWNrKHNlbGYuZnJhbWUucGFja2luZykKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgc2VsZi5mcmFtZS5kZXN0cm95KCkKKyAgICBkZWYgc2hvdyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jb2xsYXBzZWQ6CisgICAgICAgICAgICBzZWxmLmJ1dHRvbi5pbnZva2UoKQorICAgIGRlZiB0b2dnbGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY29sbGFwc2VkOgorICAgICAgICAgICAgc2VsZi5leHBsb2RlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY29sbGFwc2UoKQorICAgIGRlZiBjb2xsYXBzZShzZWxmKToKKyAgICAgICAgc2VsZi5jb2xsYXBzZWQgPSAxCisgICAgICAgIGZvciBjb21wIGluIHNlbGYuaHRleHQsIHNlbGYuYnRleHQsIHNlbGYucGFkOgorICAgICAgICAgICAgaWYgY29tcDoKKyAgICAgICAgICAgICAgICBjb21wLmZvcmdldCgpCisgICAgICAgIGlmIHNlbGYucGFydHM6CisgICAgICAgICAgICBmb3IgcGFydCBpbiBzZWxmLnBhcnRzOgorICAgICAgICAgICAgICAgIHBhcnQuZnJhbWUuZm9yZ2V0KCkKKyAgICAgICAgc2VsZi5mcmFtZS5wYWNrKHsnZXhwYW5kJzogMH0pCisgICAgZGVmIGV4cGxvZGUoc2VsZik6CisgICAgICAgIHNlbGYuY29sbGFwc2VkID0gMAorICAgICAgICBmb3IgY29tcCBpbiBzZWxmLmh0ZXh0LCBzZWxmLmJ0ZXh0LCBzZWxmLnBhZDoKKyAgICAgICAgICAgIGlmIGNvbXA6IGNvbXAucGFjayhjb21wLnBhY2tpbmcpCisgICAgICAgIGlmIHNlbGYucGFydHM6CisgICAgICAgICAgICBmb3IgcGFydCBpbiBzZWxmLnBhcnRzOgorICAgICAgICAgICAgICAgIHBhcnQucGFjaygpCisgICAgICAgIHNlbGYuZnJhbWUucGFjayh7J2V4cGFuZCc6IDF9KQogCiBkZWYgY291bnRsaW5lcyhzdHIsIGxpbWl0KToKLQlpID0gMAotCW4gPSAwCi0Jd2hpbGUgIG4gPCBsaW1pdDoKLQkJaSA9IHN0cmluZy5maW5kKHN0ciwgJ1xuJywgaSkKLQkJaWYgaSA8IDA6IGJyZWFrCi0JCW4gPSBuKzEKLQkJaSA9IGkrMQotCXJldHVybiBuCisgICAgaSA9IDAKKyAgICBuID0gMAorICAgIHdoaWxlICBuIDwgbGltaXQ6CisgICAgICAgIGkgPSBzdHJpbmcuZmluZChzdHIsICdcbicsIGkpCisgICAgICAgIGlmIGkgPCAwOiBicmVhaworICAgICAgICBuID0gbisxCisgICAgICAgIGkgPSBpKzEKKyAgICByZXR1cm4gbgogCiBkZWYgbWFpbigpOgotCWltcG9ydCBzeXMKLQlpbXBvcnQgZ2V0b3B0Ci0JaW1wb3J0IG1obGliCi0Jb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnJykKLQlmb3IgbywgYSBpbiBvcHRzOgotCQlwYXNzCi0JbWVzc2FnZSA9IE5vbmUKLQlmb2xkZXIgPSAnaW5ib3gnCi0JZm9yIGFyZyBpbiBhcmdzOgotCQlpZiBhcmdbOjFdID09ICcrJzoKLQkJCWZvbGRlciA9IGFyZ1sxOl0KLQkJZWxzZToKLQkJCW1lc3NhZ2UgPSBzdHJpbmcuYXRvaShhcmcpCisgICAgaW1wb3J0IHN5cworICAgIGltcG9ydCBnZXRvcHQKKyAgICBpbXBvcnQgbWhsaWIKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICcnKQorICAgIGZvciBvLCBhIGluIG9wdHM6CisgICAgICAgIHBhc3MKKyAgICBtZXNzYWdlID0gTm9uZQorICAgIGZvbGRlciA9ICdpbmJveCcKKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIGlmIGFyZ1s6MV0gPT0gJysnOgorICAgICAgICAgICAgZm9sZGVyID0gYXJnWzE6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWVzc2FnZSA9IHN0cmluZy5hdG9pKGFyZykKIAotCW1oID0gbWhsaWIuTUgoKQotCWYgPSBtaC5vcGVuZm9sZGVyKGZvbGRlcikKLQlpZiBub3QgbWVzc2FnZToKLQkJbWVzc2FnZSA9IGYuZ2V0Y3VycmVudCgpCi0JbSA9IGYub3Blbm1lc3NhZ2UobWVzc2FnZSkKKyAgICBtaCA9IG1obGliLk1IKCkKKyAgICBmID0gbWgub3BlbmZvbGRlcihmb2xkZXIpCisgICAgaWYgbm90IG1lc3NhZ2U6CisgICAgICAgIG1lc3NhZ2UgPSBmLmdldGN1cnJlbnQoKQorICAgIG0gPSBmLm9wZW5tZXNzYWdlKG1lc3NhZ2UpCiAKLQlyb290ID0gVGsoKQotCXRrID0gcm9vdC50aworICAgIHJvb3QgPSBUaygpCisgICAgdGsgPSByb290LnRrCiAKLQl0b3AgPSBNaW1lVmlld2VyKHJvb3QsICcrJXMvJWQnICUgKGZvbGRlciwgbWVzc2FnZSksIG0pCi0JdG9wLnBhY2soKQotCXRvcC5zaG93KCkKKyAgICB0b3AgPSBNaW1lVmlld2VyKHJvb3QsICcrJXMvJWQnICUgKGZvbGRlciwgbWVzc2FnZSksIG0pCisgICAgdG9wLnBhY2soKQorICAgIHRvcC5zaG93KCkKIAotCXJvb3QubWluc2l6ZSgxLCAxKQorICAgIHJvb3QubWluc2l6ZSgxLCAxKQogCi0JdGsubWFpbmxvb3AoKQorICAgIHRrLm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzogbWFpbigpCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvZ3VpZG8vU2hlbGxXaW5kb3cucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vU2hlbGxXaW5kb3cucHkKaW5kZXggOThmZTMwZi4uNjA5MTAxYiAxMDA3NTUKLS0tIGEvRGVtby90a2ludGVyL2d1aWRvL1NoZWxsV2luZG93LnB5CisrKyBiL0RlbW8vdGtpbnRlci9ndWlkby9TaGVsbFdpbmRvdy5weQpAQCAtMTAsMTQyICsxMCwxNDIgQEAKIAogY2xhc3MgU2hlbGxXaW5kb3coU2Nyb2xsZWRUZXh0KToKIAotCWRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgc2hlbGw9Tm9uZSwgKipjbmYpOgotCQlpZiBub3Qgc2hlbGw6Ci0JCQl0cnk6Ci0JCQkJc2hlbGwgPSBvcy5lbnZpcm9uWydTSEVMTCddCi0JCQlleGNlcHQgS2V5RXJyb3I6Ci0JCQkJc2hlbGwgPSAnL2Jpbi9zaCcKLQkJCXNoZWxsID0gc2hlbGwgKyAnIC1pJwotCQlhcmdzID0gc3RyaW5nLnNwbGl0KHNoZWxsKQotCQlzaGVsbCA9IGFyZ3NbMF0KKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHNoZWxsPU5vbmUsICoqY25mKToKKyAgICAgICAgaWYgbm90IHNoZWxsOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNoZWxsID0gb3MuZW52aXJvblsnU0hFTEwnXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHNoZWxsID0gJy9iaW4vc2gnCisgICAgICAgICAgICBzaGVsbCA9IHNoZWxsICsgJyAtaScKKyAgICAgICAgYXJncyA9IHN0cmluZy5zcGxpdChzaGVsbCkKKyAgICAgICAgc2hlbGwgPSBhcmdzWzBdCiAKLQkJYXBwbHkoU2Nyb2xsZWRUZXh0Ll9faW5pdF9fLCAoc2VsZiwgbWFzdGVyKSwgY25mKQotCQlzZWxmLnBvcyA9ICcxLjAnCi0JCXNlbGYuYmluZCgnPFJldHVybj4nLCBzZWxmLmlucHV0aGFuZGxlcikKLQkJc2VsZi5iaW5kKCc8Q29udHJvbC1jPicsIHNlbGYuc2lnaW50KQotCQlzZWxmLmJpbmQoJzxDb250cm9sLXQ+Jywgc2VsZi5zaWd0ZXJtKQotCQlzZWxmLmJpbmQoJzxDb250cm9sLWs+Jywgc2VsZi5zaWdraWxsKQotCQlzZWxmLmJpbmQoJzxDb250cm9sLWQ+Jywgc2VsZi5zZW5kZW9mKQorICAgICAgICBhcHBseShTY3JvbGxlZFRleHQuX19pbml0X18sIChzZWxmLCBtYXN0ZXIpLCBjbmYpCisgICAgICAgIHNlbGYucG9zID0gJzEuMCcKKyAgICAgICAgc2VsZi5iaW5kKCc8UmV0dXJuPicsIHNlbGYuaW5wdXRoYW5kbGVyKQorICAgICAgICBzZWxmLmJpbmQoJzxDb250cm9sLWM+Jywgc2VsZi5zaWdpbnQpCisgICAgICAgIHNlbGYuYmluZCgnPENvbnRyb2wtdD4nLCBzZWxmLnNpZ3Rlcm0pCisgICAgICAgIHNlbGYuYmluZCgnPENvbnRyb2wtaz4nLCBzZWxmLnNpZ2tpbGwpCisgICAgICAgIHNlbGYuYmluZCgnPENvbnRyb2wtZD4nLCBzZWxmLnNlbmRlb2YpCiAKLQkJc2VsZi5waWQsIHNlbGYuZnJvbWNoaWxkLCBzZWxmLnRvY2hpbGQgPSBzcGF3bihzaGVsbCwgYXJncykKLQkJc2VsZi50ay5jcmVhdGVmaWxlaGFuZGxlcihzZWxmLmZyb21jaGlsZCwgUkVBREFCTEUsCi0JCQkJCSAgc2VsZi5vdXRwdXRoYW5kbGVyKQorICAgICAgICBzZWxmLnBpZCwgc2VsZi5mcm9tY2hpbGQsIHNlbGYudG9jaGlsZCA9IHNwYXduKHNoZWxsLCBhcmdzKQorICAgICAgICBzZWxmLnRrLmNyZWF0ZWZpbGVoYW5kbGVyKHNlbGYuZnJvbWNoaWxkLCBSRUFEQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dGhhbmRsZXIpCiAKLQlkZWYgb3V0cHV0aGFuZGxlcihzZWxmLCBmaWxlLCBtYXNrKToKLQkJZGF0YSA9IG9zLnJlYWQoZmlsZSwgQlVGU0laRSkKLQkJaWYgbm90IGRhdGE6Ci0JCQlzZWxmLnRrLmRlbGV0ZWZpbGVoYW5kbGVyKGZpbGUpCi0JCQlwaWQsIHN0cyA9IG9zLndhaXRwaWQoc2VsZi5waWQsIDApCi0JCQlwcmludCAncGlkJywgcGlkLCAnc3RhdHVzJywgc3RzCi0JCQlzZWxmLnBpZCA9IE5vbmUKLQkJCWRldGFpbCA9IHN0cz4+OAotCQkJY2F1c2UgPSBzdHMgJiAweGZmCi0JCQlpZiBjYXVzZSA9PSAwOgotCQkJCW1zZyA9ICJleGl0IHN0YXR1cyAlZCIgJSBkZXRhaWwKLQkJCWVsc2U6Ci0JCQkJbXNnID0gImtpbGxlZCBieSBzaWduYWwgJWQiICUgKGNhdXNlICYgMHg3ZikKLQkJCQlpZiBjYXVzZSAmIDB4ODA6Ci0JCQkJCW1zZyA9IG1zZyArICIgLS0gY29yZSBkdW1wZWQiCi0JCQlEaWFsb2coc2VsZi5tYXN0ZXIsCi0JCQkgICAgICAgdGV4dD1tc2csCi0JCQkgICAgICAgdGl0bGU9IkV4aXQgc3RhdHVzIiwKLQkJCSAgICAgICBiaXRtYXA9J3dhcm5pbmcnLAotCQkJICAgICAgIGRlZmF1bHQ9MCwKLQkJCSAgICAgICBzdHJpbmdzPSgnT0snLCkpCi0JCQlyZXR1cm4KLQkJc2VsZi5pbnNlcnQoRU5ELCBkYXRhKQotCQlzZWxmLnBvcyA9IHNlbGYuaW5kZXgoImVuZCAtIDEgY2hhciIpCi0JCXNlbGYueXZpZXdfcGlja3BsYWNlKEVORCkKKyAgICBkZWYgb3V0cHV0aGFuZGxlcihzZWxmLCBmaWxlLCBtYXNrKToKKyAgICAgICAgZGF0YSA9IG9zLnJlYWQoZmlsZSwgQlVGU0laRSkKKyAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICBzZWxmLnRrLmRlbGV0ZWZpbGVoYW5kbGVyKGZpbGUpCisgICAgICAgICAgICBwaWQsIHN0cyA9IG9zLndhaXRwaWQoc2VsZi5waWQsIDApCisgICAgICAgICAgICBwcmludCAncGlkJywgcGlkLCAnc3RhdHVzJywgc3RzCisgICAgICAgICAgICBzZWxmLnBpZCA9IE5vbmUKKyAgICAgICAgICAgIGRldGFpbCA9IHN0cz4+OAorICAgICAgICAgICAgY2F1c2UgPSBzdHMgJiAweGZmCisgICAgICAgICAgICBpZiBjYXVzZSA9PSAwOgorICAgICAgICAgICAgICAgIG1zZyA9ICJleGl0IHN0YXR1cyAlZCIgJSBkZXRhaWwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbXNnID0gImtpbGxlZCBieSBzaWduYWwgJWQiICUgKGNhdXNlICYgMHg3ZikKKyAgICAgICAgICAgICAgICBpZiBjYXVzZSAmIDB4ODA6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IG1zZyArICIgLS0gY29yZSBkdW1wZWQiCisgICAgICAgICAgICBEaWFsb2coc2VsZi5tYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgdGV4dD1tc2csCisgICAgICAgICAgICAgICAgICAgdGl0bGU9IkV4aXQgc3RhdHVzIiwKKyAgICAgICAgICAgICAgICAgICBiaXRtYXA9J3dhcm5pbmcnLAorICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MCwKKyAgICAgICAgICAgICAgICAgICBzdHJpbmdzPSgnT0snLCkpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5pbnNlcnQoRU5ELCBkYXRhKQorICAgICAgICBzZWxmLnBvcyA9IHNlbGYuaW5kZXgoImVuZCAtIDEgY2hhciIpCisgICAgICAgIHNlbGYueXZpZXdfcGlja3BsYWNlKEVORCkKIAotCWRlZiBpbnB1dGhhbmRsZXIoc2VsZiwgKmFyZ3MpOgotCQlpZiBub3Qgc2VsZi5waWQ6Ci0JCQlzZWxmLm5vX3Byb2Nlc3MoKQotCQkJcmV0dXJuICJicmVhayIKLQkJc2VsZi5pbnNlcnQoRU5ELCAiXG4iKQotCQlsaW5lID0gc2VsZi5nZXQoc2VsZi5wb3MsICJlbmQgLSAxIGNoYXIiKQotCQlzZWxmLnBvcyA9IHNlbGYuaW5kZXgoRU5EKQotCQlvcy53cml0ZShzZWxmLnRvY2hpbGQsIGxpbmUpCi0JCXJldHVybiAiYnJlYWsiCisgICAgZGVmIGlucHV0aGFuZGxlcihzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnBpZDoKKyAgICAgICAgICAgIHNlbGYubm9fcHJvY2VzcygpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICBzZWxmLmluc2VydChFTkQsICJcbiIpCisgICAgICAgIGxpbmUgPSBzZWxmLmdldChzZWxmLnBvcywgImVuZCAtIDEgY2hhciIpCisgICAgICAgIHNlbGYucG9zID0gc2VsZi5pbmRleChFTkQpCisgICAgICAgIG9zLndyaXRlKHNlbGYudG9jaGlsZCwgbGluZSkKKyAgICAgICAgcmV0dXJuICJicmVhayIKIAotCWRlZiBzZW5kZW9mKHNlbGYsICphcmdzKToKLQkJaWYgbm90IHNlbGYucGlkOgotCQkJc2VsZi5ub19wcm9jZXNzKCkKLQkJCXJldHVybiAiYnJlYWsiCi0JCW9zLmNsb3NlKHNlbGYudG9jaGlsZCkKLQkJcmV0dXJuICJicmVhayIKKyAgICBkZWYgc2VuZGVvZihzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnBpZDoKKyAgICAgICAgICAgIHNlbGYubm9fcHJvY2VzcygpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICBvcy5jbG9zZShzZWxmLnRvY2hpbGQpCisgICAgICAgIHJldHVybiAiYnJlYWsiCiAKLQlkZWYgc2VuZHNpZyhzZWxmLCBzaWcpOgotCQlpZiBub3Qgc2VsZi5waWQ6Ci0JCQlzZWxmLm5vX3Byb2Nlc3MoKQotCQkJcmV0dXJuICJicmVhayIKLQkJb3Mua2lsbChzZWxmLnBpZCwgc2lnKQotCQlyZXR1cm4gImJyZWFrIgorICAgIGRlZiBzZW5kc2lnKHNlbGYsIHNpZyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnBpZDoKKyAgICAgICAgICAgIHNlbGYubm9fcHJvY2VzcygpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICBvcy5raWxsKHNlbGYucGlkLCBzaWcpCisgICAgICAgIHJldHVybiAiYnJlYWsiCiAKLQlkZWYgc2lnaW50KHNlbGYsICphcmdzKToKLQkJcmV0dXJuIHNlbGYuc2VuZHNpZyhzaWduYWwuU0lHSU5UKQorICAgIGRlZiBzaWdpbnQoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5zZW5kc2lnKHNpZ25hbC5TSUdJTlQpCiAKLQlkZWYgc2lncXVpdChzZWxmLCAqYXJncyk6Ci0JCXJldHVybiBzZWxmLnNlbmRzaWcoc2lnbmFsLlNJR1FVSVQpCisgICAgZGVmIHNpZ3F1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5zZW5kc2lnKHNpZ25hbC5TSUdRVUlUKQogCi0JZGVmIHNpZ3Rlcm0oc2VsZiwgKmFyZ3MpOgotCQlyZXR1cm4gc2VsZi5zZW5kc2lnKHNpZ25hbC5TSUdURVJNKQorICAgIGRlZiBzaWd0ZXJtKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VuZHNpZyhzaWduYWwuU0lHVEVSTSkKIAotCWRlZiBzaWdraWxsKHNlbGYsICphcmdzKToKLQkJcmV0dXJuIHNlbGYuc2VuZHNpZyhzaWduYWwuU0lHS0lMTCkKKyAgICBkZWYgc2lna2lsbChzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLnNlbmRzaWcoc2lnbmFsLlNJR0tJTEwpCiAKLQlkZWYgbm9fcHJvY2VzcyhzZWxmKToKLQkJRGlhbG9nKHNlbGYubWFzdGVyLAotCQkgICAgICAgdGV4dD0iTm8gYWN0aXZlIHByb2Nlc3MiLAotCQkgICAgICAgdGl0bGU9Ik5vIHByb2Nlc3MiLAotCQkgICAgICAgYml0bWFwPSdlcnJvcicsCi0JCSAgICAgICBkZWZhdWx0PTAsCi0JCSAgICAgICBzdHJpbmdzPSgnT0snLCkpCisgICAgZGVmIG5vX3Byb2Nlc3Moc2VsZik6CisgICAgICAgIERpYWxvZyhzZWxmLm1hc3RlciwKKyAgICAgICAgICAgICAgIHRleHQ9Ik5vIGFjdGl2ZSBwcm9jZXNzIiwKKyAgICAgICAgICAgICAgIHRpdGxlPSJObyBwcm9jZXNzIiwKKyAgICAgICAgICAgICAgIGJpdG1hcD0nZXJyb3InLAorICAgICAgICAgICAgICAgZGVmYXVsdD0wLAorICAgICAgICAgICAgICAgc3RyaW5ncz0oJ09LJywpKQogCi1NQVhGRCA9IDEwMAkjIE1heCBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyAob3MuZ2V0ZHRhYmxlc2l6ZSgpPz8/KQorTUFYRkQgPSAxMDAgICAgICMgTWF4IG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIChvcy5nZXRkdGFibGVzaXplKCk/Pz8pCiAKIGRlZiBzcGF3bihwcm9nLCBhcmdzKToKLQlwMmNyZWFkLCBwMmN3cml0ZSA9IG9zLnBpcGUoKQotCWMycHJlYWQsIGMycHdyaXRlID0gb3MucGlwZSgpCi0JcGlkID0gb3MuZm9yaygpCi0JaWYgcGlkID09IDA6Ci0JCSMgQ2hpbGQKLQkJZm9yIGkgaW4gMCwgMSwgMjoKLQkJICAgIHRyeToKLQkJCW9zLmNsb3NlKGkpCi0JCSAgICBleGNlcHQgb3MuZXJyb3I6Ci0JCQlwYXNzCi0JCWlmIG9zLmR1cChwMmNyZWFkKSA8PiAwOgotCQkJc3lzLnN0ZGVyci53cml0ZSgncG9wZW4yOiBiYWQgcmVhZCBkdXBcbicpCi0JCWlmIG9zLmR1cChjMnB3cml0ZSkgPD4gMToKLQkJCXN5cy5zdGRlcnIud3JpdGUoJ3BvcGVuMjogYmFkIHdyaXRlIGR1cFxuJykKLQkJaWYgb3MuZHVwKGMycHdyaXRlKSA8PiAyOgotCQkJc3lzLnN0ZGVyci53cml0ZSgncG9wZW4yOiBiYWQgd3JpdGUgZHVwXG4nKQotCQlmb3IgaSBpbiByYW5nZSgzLCBNQVhGRCk6Ci0JCQl0cnk6Ci0JCQkJb3MuY2xvc2UoaSkKLQkJCWV4Y2VwdDoKLQkJCQlwYXNzCi0JCXRyeToKLQkJCW9zLmV4ZWN2cChwcm9nLCBhcmdzKQotCQlmaW5hbGx5OgotCQkJc3lzLnN0ZGVyci53cml0ZSgnZXhlY3ZwIGZhaWxlZFxuJykKLQkJCW9zLl9leGl0KDEpCi0Jb3MuY2xvc2UocDJjcmVhZCkKLQlvcy5jbG9zZShjMnB3cml0ZSkKLQlyZXR1cm4gcGlkLCBjMnByZWFkLCBwMmN3cml0ZQorICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gb3MucGlwZSgpCisgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBvcy5waXBlKCkKKyAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgIyBDaGlsZAorICAgICAgICBmb3IgaSBpbiAwLCAxLCAyOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLmNsb3NlKGkpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBvcy5kdXAocDJjcmVhZCkgPD4gMDoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ3BvcGVuMjogYmFkIHJlYWQgZHVwXG4nKQorICAgICAgICBpZiBvcy5kdXAoYzJwd3JpdGUpIDw+IDE6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdwb3BlbjI6IGJhZCB3cml0ZSBkdXBcbicpCisgICAgICAgIGlmIG9zLmR1cChjMnB3cml0ZSkgPD4gMjoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ3BvcGVuMjogYmFkIHdyaXRlIGR1cFxuJykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMywgTUFYRkQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLmNsb3NlKGkpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5leGVjdnAocHJvZywgYXJncykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ2V4ZWN2cCBmYWlsZWRcbicpCisgICAgICAgICAgICBvcy5fZXhpdCgxKQorICAgIG9zLmNsb3NlKHAyY3JlYWQpCisgICAgb3MuY2xvc2UoYzJwd3JpdGUpCisgICAgcmV0dXJuIHBpZCwgYzJwcmVhZCwgcDJjd3JpdGUKIAogZGVmIHRlc3QoKToKLQlzaGVsbCA9IHN0cmluZy5qb2luKHN5cy5hcmd2WzE6XSkKLQlyb290ID0gVGsoKQotCXJvb3QubWluc2l6ZSgxLCAxKQotCWlmIHNoZWxsOgotCSAgICB3ID0gU2hlbGxXaW5kb3cocm9vdCwgc2hlbGw9c2hlbGwpCi0JZWxzZToKLQkgICAgdyA9IFNoZWxsV2luZG93KHJvb3QpCi0Jdy5wYWNrKGV4cGFuZD0xLCBmaWxsPUJPVEgpCi0Jdy5mb2N1c19zZXQoKQotCXcudGsubWFpbmxvb3AoKQorICAgIHNoZWxsID0gc3RyaW5nLmpvaW4oc3lzLmFyZ3ZbMTpdKQorICAgIHJvb3QgPSBUaygpCisgICAgcm9vdC5taW5zaXplKDEsIDEpCisgICAgaWYgc2hlbGw6CisgICAgICAgIHcgPSBTaGVsbFdpbmRvdyhyb290LCBzaGVsbD1zaGVsbCkKKyAgICBlbHNlOgorICAgICAgICB3ID0gU2hlbGxXaW5kb3cocm9vdCkKKyAgICB3LnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICB3LmZvY3VzX3NldCgpCisgICAgdy50ay5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JdGVzdCgpCisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvZ3VpZG8vY2FudmFzZXZlbnRzLnB5IGIvRGVtby90a2ludGVyL2d1aWRvL2NhbnZhc2V2ZW50cy5weQppbmRleCA2MGY0MDk2Li43NGVkNzZmIDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvZ3VpZG8vY2FudmFzZXZlbnRzLnB5CisrKyBiL0RlbW8vdGtpbnRlci9ndWlkby9jYW52YXNldmVudHMucHkKQEAgLTksNyArOSw3IEBACiAKIGNsYXNzIEdyb3VwKEdyb3VwKToKICAgICBkZWYgYmluZChzZWxmLCBzZXF1ZW5jZT1Ob25lLCBjb21tYW5kPU5vbmUpOgotCXJldHVybiBzZWxmLmNhbnZhcy50YWdfYmluZChzZWxmLmlkLCBzZXF1ZW5jZSwgY29tbWFuZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FudmFzLnRhZ19iaW5kKHNlbGYuaWQsIHNlcXVlbmNlLCBjb21tYW5kKQogCiBjbGFzcyBPYmplY3Q6CiAKQEAgLTMzLDQ1ICszMyw0NSBAQAogICAgICIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbnZhcywgeD0wLCB5PTAsIGZpbGw9J3JlZCcsIHRleHQ9J29iamVjdCcpOgotCXNlbGYuY2FudmFzID0gY2FudmFzCi0Jc2VsZi54ID0geAotCXNlbGYueSA9IHkKLQlzZWxmLnBpbGUgPSBOb25lCi0Jc2VsZi5ncm91cCA9IEdyb3VwKHNlbGYuY2FudmFzKQotCXNlbGYuY3JlYXRlaXRlbXMoZmlsbCwgdGV4dCkKKyAgICAgICAgc2VsZi5jYW52YXMgPSBjYW52YXMKKyAgICAgICAgc2VsZi54ID0geAorICAgICAgICBzZWxmLnkgPSB5CisgICAgICAgIHNlbGYucGlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5ncm91cCA9IEdyb3VwKHNlbGYuY2FudmFzKQorICAgICAgICBzZWxmLmNyZWF0ZWl0ZW1zKGZpbGwsIHRleHQpCiAKICAgICBkZWYgX19zdHJfXyhzZWxmKToKLQlyZXR1cm4gc3RyKHNlbGYuZ3JvdXApCisgICAgICAgIHJldHVybiBzdHIoc2VsZi5ncm91cCkKIAogICAgIGRlZiBjcmVhdGVpdGVtcyhzZWxmLCBmaWxsLCB0ZXh0KToKLQlzZWxmLl9fb3ZhbCA9IE92YWwoc2VsZi5jYW52YXMsCi0JCQkgICBzZWxmLngtMjAsIHNlbGYueS0xMCwgc2VsZi54KzIwLCBzZWxmLnkrMTAsCi0JCQkgICBmaWxsPWZpbGwsIHdpZHRoPTMpCi0Jc2VsZi5ncm91cC5hZGR0YWdfd2l0aHRhZyhzZWxmLl9fb3ZhbCkKLQlzZWxmLl9fdGV4dCA9IENhbnZhc1RleHQoc2VsZi5jYW52YXMsCi0JCQkgICBzZWxmLngsIHNlbGYueSwgdGV4dD10ZXh0KQotCXNlbGYuZ3JvdXAuYWRkdGFnX3dpdGh0YWcoc2VsZi5fX3RleHQpCisgICAgICAgIHNlbGYuX19vdmFsID0gT3ZhbChzZWxmLmNhbnZhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYueC0yMCwgc2VsZi55LTEwLCBzZWxmLngrMjAsIHNlbGYueSsxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9ZmlsbCwgd2lkdGg9MykKKyAgICAgICAgc2VsZi5ncm91cC5hZGR0YWdfd2l0aHRhZyhzZWxmLl9fb3ZhbCkKKyAgICAgICAgc2VsZi5fX3RleHQgPSBDYW52YXNUZXh0KHNlbGYuY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi54LCBzZWxmLnksIHRleHQ9dGV4dCkKKyAgICAgICAgc2VsZi5ncm91cC5hZGR0YWdfd2l0aHRhZyhzZWxmLl9fdGV4dCkKIAogICAgIGRlZiBtb3ZlYnkoc2VsZiwgZHgsIGR5KToKLQlpZiBkeCA9PSBkeSA9PSAwOgotCSAgICByZXR1cm4KLQlzZWxmLmdyb3VwLm1vdmUoZHgsIGR5KQotCXNlbGYueCA9IHNlbGYueCArIGR4Ci0Jc2VsZi55ID0gc2VsZi55ICsgZHkKKyAgICAgICAgaWYgZHggPT0gZHkgPT0gMDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmdyb3VwLm1vdmUoZHgsIGR5KQorICAgICAgICBzZWxmLnggPSBzZWxmLnggKyBkeAorICAgICAgICBzZWxmLnkgPSBzZWxmLnkgKyBkeQogCiAgICAgZGVmIG1vdmV0byhzZWxmLCB4LCB5KToKLQlzZWxmLm1vdmVieSh4IC0gc2VsZi54LCB5IC0gc2VsZi55KQorICAgICAgICBzZWxmLm1vdmVieSh4IC0gc2VsZi54LCB5IC0gc2VsZi55KQogCiAgICAgZGVmIHRyYW5zZmVyKHNlbGYsIHBpbGUpOgotCWlmIHNlbGYucGlsZToKLQkgICAgc2VsZi5waWxlLmRlbGV0ZShzZWxmKQotCSAgICBzZWxmLnBpbGUgPSBOb25lCi0Jc2VsZi5waWxlID0gcGlsZQotCWlmIHNlbGYucGlsZToKLQkgICAgc2VsZi5waWxlLmFkZChzZWxmKQorICAgICAgICBpZiBzZWxmLnBpbGU6CisgICAgICAgICAgICBzZWxmLnBpbGUuZGVsZXRlKHNlbGYpCisgICAgICAgICAgICBzZWxmLnBpbGUgPSBOb25lCisgICAgICAgIHNlbGYucGlsZSA9IHBpbGUKKyAgICAgICAgaWYgc2VsZi5waWxlOgorICAgICAgICAgICAgc2VsZi5waWxlLmFkZChzZWxmKQogCiAgICAgZGVmIHRrcmFpc2Uoc2VsZik6Ci0Jc2VsZi5ncm91cC50a3JhaXNlKCkKKyAgICAgICAgc2VsZi5ncm91cC50a3JhaXNlKCkKIAogCiBjbGFzcyBCb3R0b20oT2JqZWN0KToKQEAgLTc5LDEwICs3OSwxMCBAQAogICAgICIiIkFuIG9iamVjdCB0byBzZXJ2ZSBhcyB0aGUgYm90dG9tIG9mIGEgcGlsZS4iIiIKIAogICAgIGRlZiBjcmVhdGVpdGVtcyhzZWxmLCAqYXJncyk6Ci0Jc2VsZi5fX292YWwgPSBPdmFsKHNlbGYuY2FudmFzLAotCQkJICAgc2VsZi54LTIwLCBzZWxmLnktMTAsIHNlbGYueCsyMCwgc2VsZi55KzEwLAotCQkJICAgZmlsbD0nZ3JheScsIG91dGxpbmU9JycpCi0Jc2VsZi5ncm91cC5hZGR0YWdfd2l0aHRhZyhzZWxmLl9fb3ZhbCkKKyAgICAgICAgc2VsZi5fX292YWwgPSBPdmFsKHNlbGYuY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi54LTIwLCBzZWxmLnktMTAsIHNlbGYueCsyMCwgc2VsZi55KzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0nZ3JheScsIG91dGxpbmU9JycpCisgICAgICAgIHNlbGYuZ3JvdXAuYWRkdGFnX3dpdGh0YWcoc2VsZi5fX292YWwpCiAKIAogY2xhc3MgUGlsZToKQEAgLTkwLDg2ICs5MCw4NiBAQAogICAgICIiIkEgZ3JvdXAgb2YgZ3JhcGhpY2FsIG9iamVjdHMuIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgY2FudmFzLCB4LCB5LCB0YWc9Tm9uZSk6Ci0Jc2VsZi5jYW52YXMgPSBjYW52YXMKLQlzZWxmLnggPSB4Ci0Jc2VsZi55ID0geQotCXNlbGYub2JqZWN0cyA9IFtdCi0Jc2VsZi5ib3R0b20gPSBCb3R0b20oc2VsZi5jYW52YXMsIHNlbGYueCwgc2VsZi55KQotCXNlbGYuZ3JvdXAgPSBHcm91cChzZWxmLmNhbnZhcywgdGFnPXRhZykKLQlzZWxmLmdyb3VwLmFkZHRhZ193aXRodGFnKHNlbGYuYm90dG9tLmdyb3VwKQotCXNlbGYuYmluZGhhbmRsZXJzKCkKKyAgICAgICAgc2VsZi5jYW52YXMgPSBjYW52YXMKKyAgICAgICAgc2VsZi54ID0geAorICAgICAgICBzZWxmLnkgPSB5CisgICAgICAgIHNlbGYub2JqZWN0cyA9IFtdCisgICAgICAgIHNlbGYuYm90dG9tID0gQm90dG9tKHNlbGYuY2FudmFzLCBzZWxmLngsIHNlbGYueSkKKyAgICAgICAgc2VsZi5ncm91cCA9IEdyb3VwKHNlbGYuY2FudmFzLCB0YWc9dGFnKQorICAgICAgICBzZWxmLmdyb3VwLmFkZHRhZ193aXRodGFnKHNlbGYuYm90dG9tLmdyb3VwKQorICAgICAgICBzZWxmLmJpbmRoYW5kbGVycygpCiAKICAgICBkZWYgYmluZGhhbmRsZXJzKHNlbGYpOgotCXNlbGYuZ3JvdXAuYmluZCgnPDE+Jywgc2VsZi5jbGlja2hhbmRsZXIpCi0gCXNlbGYuZ3JvdXAuYmluZCgnPERvdWJsZS0xPicsIHNlbGYuZG91YmxlY2xpY2toYW5kbGVyKQorICAgICAgICBzZWxmLmdyb3VwLmJpbmQoJzwxPicsIHNlbGYuY2xpY2toYW5kbGVyKQorICAgICAgICBzZWxmLmdyb3VwLmJpbmQoJzxEb3VibGUtMT4nLCBzZWxmLmRvdWJsZWNsaWNraGFuZGxlcikKIAogICAgIGRlZiBhZGQoc2VsZiwgb2JqZWN0KToKLQlzZWxmLm9iamVjdHMuYXBwZW5kKG9iamVjdCkKLQlzZWxmLmdyb3VwLmFkZHRhZ193aXRodGFnKG9iamVjdC5ncm91cCkKLQlzZWxmLnBvc2l0aW9uKG9iamVjdCkKKyAgICAgICAgc2VsZi5vYmplY3RzLmFwcGVuZChvYmplY3QpCisgICAgICAgIHNlbGYuZ3JvdXAuYWRkdGFnX3dpdGh0YWcob2JqZWN0Lmdyb3VwKQorICAgICAgICBzZWxmLnBvc2l0aW9uKG9iamVjdCkKIAogICAgIGRlZiBkZWxldGUoc2VsZiwgb2JqZWN0KToKLQlvYmplY3QuZ3JvdXAuZHRhZyhzZWxmLmdyb3VwKQotCXNlbGYub2JqZWN0cy5yZW1vdmUob2JqZWN0KQorICAgICAgICBvYmplY3QuZ3JvdXAuZHRhZyhzZWxmLmdyb3VwKQorICAgICAgICBzZWxmLm9iamVjdHMucmVtb3ZlKG9iamVjdCkKIAogICAgIGRlZiBwb3NpdGlvbihzZWxmLCBvYmplY3QpOgotCW9iamVjdC50a3JhaXNlKCkKLQlpID0gc2VsZi5vYmplY3RzLmluZGV4KG9iamVjdCkKLQlvYmplY3QubW92ZXRvKHNlbGYueCArIGkqNCwgc2VsZi55ICsgaSo4KQorICAgICAgICBvYmplY3QudGtyYWlzZSgpCisgICAgICAgIGkgPSBzZWxmLm9iamVjdHMuaW5kZXgob2JqZWN0KQorICAgICAgICBvYmplY3QubW92ZXRvKHNlbGYueCArIGkqNCwgc2VsZi55ICsgaSo4KQogCiAgICAgZGVmIGNsaWNraGFuZGxlcihzZWxmLCBldmVudCk6Ci0JcGFzcworICAgICAgICBwYXNzCiAKICAgICBkZWYgZG91YmxlY2xpY2toYW5kbGVyKHNlbGYsIGV2ZW50KToKLQlwYXNzCisgICAgICAgIHBhc3MKIAogCiBjbGFzcyBNb3ZpbmdQaWxlKFBpbGUpOgogCiAgICAgZGVmIGJpbmRoYW5kbGVycyhzZWxmKToKLQlQaWxlLmJpbmRoYW5kbGVycyhzZWxmKQotCXNlbGYuZ3JvdXAuYmluZCgnPEIxLU1vdGlvbj4nLCBzZWxmLm1vdGlvbmhhbmRsZXIpCi0Jc2VsZi5ncm91cC5iaW5kKCc8QnV0dG9uUmVsZWFzZS0xPicsIHNlbGYucmVsZWFzZWhhbmRsZXIpCisgICAgICAgIFBpbGUuYmluZGhhbmRsZXJzKHNlbGYpCisgICAgICAgIHNlbGYuZ3JvdXAuYmluZCgnPEIxLU1vdGlvbj4nLCBzZWxmLm1vdGlvbmhhbmRsZXIpCisgICAgICAgIHNlbGYuZ3JvdXAuYmluZCgnPEJ1dHRvblJlbGVhc2UtMT4nLCBzZWxmLnJlbGVhc2VoYW5kbGVyKQogCiAgICAgbW92ZXRoaXMgPSBOb25lCiAKICAgICBkZWYgY2xpY2toYW5kbGVyKHNlbGYsIGV2ZW50KToKLQl0YWdzID0gc2VsZi5jYW52YXMuZ2V0dGFncygnY3VycmVudCcpCi0JZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYub2JqZWN0cykpOgotCSAgICBvID0gc2VsZi5vYmplY3RzW2ldCi0JICAgIGlmIG8uZ3JvdXAudGFnIGluIHRhZ3M6Ci0JCWJyZWFrCi0JZWxzZToKLQkgICAgc2VsZi5tb3ZldGhpcyA9IE5vbmUKLQkgICAgcmV0dXJuCi0Jc2VsZi5tb3ZldGhpcyA9IHNlbGYub2JqZWN0c1tpOl0KLQlmb3IgbyBpbiBzZWxmLm1vdmV0aGlzOgotCSAgICBvLnRrcmFpc2UoKQotCXNlbGYubGFzdHggPSBldmVudC54Ci0Jc2VsZi5sYXN0eSA9IGV2ZW50LnkKKyAgICAgICAgdGFncyA9IHNlbGYuY2FudmFzLmdldHRhZ3MoJ2N1cnJlbnQnKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5vYmplY3RzKSk6CisgICAgICAgICAgICBvID0gc2VsZi5vYmplY3RzW2ldCisgICAgICAgICAgICBpZiBvLmdyb3VwLnRhZyBpbiB0YWdzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1vdmV0aGlzID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYubW92ZXRoaXMgPSBzZWxmLm9iamVjdHNbaTpdCisgICAgICAgIGZvciBvIGluIHNlbGYubW92ZXRoaXM6CisgICAgICAgICAgICBvLnRrcmFpc2UoKQorICAgICAgICBzZWxmLmxhc3R4ID0gZXZlbnQueAorICAgICAgICBzZWxmLmxhc3R5ID0gZXZlbnQueQogCiAgICAgZG91YmxlY2xpY2toYW5kbGVyID0gY2xpY2toYW5kbGVyCiAKICAgICBkZWYgbW90aW9uaGFuZGxlcihzZWxmLCBldmVudCk6Ci0JaWYgbm90IHNlbGYubW92ZXRoaXM6Ci0JICAgIHJldHVybgotCWR4ID0gZXZlbnQueCAtIHNlbGYubGFzdHgKLQlkeSA9IGV2ZW50LnkgLSBzZWxmLmxhc3R5Ci0Jc2VsZi5sYXN0eCA9IGV2ZW50LngKLQlzZWxmLmxhc3R5ID0gZXZlbnQueQotCWZvciBvIGluIHNlbGYubW92ZXRoaXM6Ci0JICAgIG8ubW92ZWJ5KGR4LCBkeSkKKyAgICAgICAgaWYgbm90IHNlbGYubW92ZXRoaXM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZHggPSBldmVudC54IC0gc2VsZi5sYXN0eAorICAgICAgICBkeSA9IGV2ZW50LnkgLSBzZWxmLmxhc3R5CisgICAgICAgIHNlbGYubGFzdHggPSBldmVudC54CisgICAgICAgIHNlbGYubGFzdHkgPSBldmVudC55CisgICAgICAgIGZvciBvIGluIHNlbGYubW92ZXRoaXM6CisgICAgICAgICAgICBvLm1vdmVieShkeCwgZHkpCiAKICAgICBkZWYgcmVsZWFzZWhhbmRsZXIoc2VsZiwgZXZlbnQpOgotCW9iamVjdHMgPSBzZWxmLm1vdmV0aGlzCi0JaWYgbm90IG9iamVjdHM6Ci0JICAgIHJldHVybgotCXNlbGYubW92ZXRoaXMgPSBOb25lCi0Jc2VsZi5maW5pc2htb3ZlKG9iamVjdHMpCisgICAgICAgIG9iamVjdHMgPSBzZWxmLm1vdmV0aGlzCisgICAgICAgIGlmIG5vdCBvYmplY3RzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYubW92ZXRoaXMgPSBOb25lCisgICAgICAgIHNlbGYuZmluaXNobW92ZShvYmplY3RzKQogCiAgICAgZGVmIGZpbmlzaG1vdmUoc2VsZiwgb2JqZWN0cyk6Ci0JZm9yIG8gaW4gb2JqZWN0czoKLQkgICAgc2VsZi5wb3NpdGlvbihvKQorICAgICAgICBmb3IgbyBpbiBvYmplY3RzOgorICAgICAgICAgICAgc2VsZi5wb3NpdGlvbihvKQogCiAKIGNsYXNzIFBpbGUxKE1vdmluZ1BpbGUpOgpAQCAtMTc5LDI5ICsxNzksMjkgQEAKICAgICB0YWcgPSAncDEnCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZGVtbyk6Ci0Jc2VsZi5kZW1vID0gZGVtbwotCU1vdmluZ1BpbGUuX19pbml0X18oc2VsZiwgc2VsZi5kZW1vLmNhbnZhcywgc2VsZi54LCBzZWxmLnksIHNlbGYudGFnKQorICAgICAgICBzZWxmLmRlbW8gPSBkZW1vCisgICAgICAgIE1vdmluZ1BpbGUuX19pbml0X18oc2VsZiwgc2VsZi5kZW1vLmNhbnZhcywgc2VsZi54LCBzZWxmLnksIHNlbGYudGFnKQogCiAgICAgZGVmIGRvdWJsZWNsaWNraGFuZGxlcihzZWxmLCBldmVudCk6Ci0JdHJ5OgotCSAgICBvID0gc2VsZi5vYmplY3RzWy0xXQotCWV4Y2VwdCBJbmRleEVycm9yOgotCSAgICByZXR1cm4KLQlvLnRyYW5zZmVyKHNlbGYub3RoZXIoKSkKLQlNb3ZpbmdQaWxlLmRvdWJsZWNsaWNraGFuZGxlcihzZWxmLCBldmVudCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbyA9IHNlbGYub2JqZWN0c1stMV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgby50cmFuc2ZlcihzZWxmLm90aGVyKCkpCisgICAgICAgIE1vdmluZ1BpbGUuZG91YmxlY2xpY2toYW5kbGVyKHNlbGYsIGV2ZW50KQogCiAgICAgZGVmIG90aGVyKHNlbGYpOgotCXJldHVybiBzZWxmLmRlbW8ucDIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGVtby5wMgogCiAgICAgZGVmIGZpbmlzaG1vdmUoc2VsZiwgb2JqZWN0cyk6Ci0JbyA9IG9iamVjdHNbMF0KLQlwID0gc2VsZi5vdGhlcigpCi0JeCwgeSA9IG8ueCwgby55Ci0JaWYgKHgtcC54KSoqMiArICh5LXAueSkqKjIgPCAoeC1zZWxmLngpKioyICsgKHktc2VsZi55KSoqMjoKLQkgICAgZm9yIG8gaW4gb2JqZWN0czoKLQkJby50cmFuc2ZlcihwKQotCWVsc2U6Ci0JICAgIE1vdmluZ1BpbGUuZmluaXNobW92ZShzZWxmLCBvYmplY3RzKQorICAgICAgICBvID0gb2JqZWN0c1swXQorICAgICAgICBwID0gc2VsZi5vdGhlcigpCisgICAgICAgIHgsIHkgPSBvLngsIG8ueQorICAgICAgICBpZiAoeC1wLngpKioyICsgKHktcC55KSoqMiA8ICh4LXNlbGYueCkqKjIgKyAoeS1zZWxmLnkpKioyOgorICAgICAgICAgICAgZm9yIG8gaW4gb2JqZWN0czoKKyAgICAgICAgICAgICAgICBvLnRyYW5zZmVyKHApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBNb3ZpbmdQaWxlLmZpbmlzaG1vdmUoc2VsZiwgb2JqZWN0cykKIAogY2xhc3MgUGlsZTIoUGlsZTEpOgogCkBAIC0yMTAsMjYgKzIxMCwyNiBAQAogICAgIHRhZyA9ICdwMicKIAogICAgIGRlZiBvdGhlcihzZWxmKToKLQlyZXR1cm4gc2VsZi5kZW1vLnAxCisgICAgICAgIHJldHVybiBzZWxmLmRlbW8ucDEKIAogCiBjbGFzcyBEZW1vOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcik6Ci0Jc2VsZi5tYXN0ZXIgPSBtYXN0ZXIKLQlzZWxmLmNhbnZhcyA9IENhbnZhcyhtYXN0ZXIsCi0JCQkgICAgIHdpZHRoPTIwMCwgaGVpZ2h0PTIwMCwKLQkJCSAgICAgYmFja2dyb3VuZD0neWVsbG93JywKLQkJCSAgICAgcmVsaWVmPVNVTktFTiwgYm9yZGVyd2lkdGg9MikKLQlzZWxmLmNhbnZhcy5wYWNrKGV4cGFuZD0xLCBmaWxsPUJPVEgpCi0Jc2VsZi5wMSA9IFBpbGUxKHNlbGYpCi0Jc2VsZi5wMiA9IFBpbGUyKHNlbGYpCi0JbzEgPSBPYmplY3Qoc2VsZi5jYW52YXMsIGZpbGw9J3JlZCcsIHRleHQ9J28xJykKLQlvMiA9IE9iamVjdChzZWxmLmNhbnZhcywgZmlsbD0nZ3JlZW4nLCB0ZXh0PSdvMicpCi0JbzMgPSBPYmplY3Qoc2VsZi5jYW52YXMsIGZpbGw9J2xpZ2h0IGJsdWUnLCB0ZXh0PSdvMycpCi0JbzEudHJhbnNmZXIoc2VsZi5wMSkKLQlvMi50cmFuc2ZlcihzZWxmLnAxKQotCW8zLnRyYW5zZmVyKHNlbGYucDIpCisgICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyCisgICAgICAgIHNlbGYuY2FudmFzID0gQ2FudmFzKG1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MjAwLCBoZWlnaHQ9MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kPSd5ZWxsb3cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZWY9U1VOS0VOLCBib3JkZXJ3aWR0aD0yKQorICAgICAgICBzZWxmLmNhbnZhcy5wYWNrKGV4cGFuZD0xLCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYucDEgPSBQaWxlMShzZWxmKQorICAgICAgICBzZWxmLnAyID0gUGlsZTIoc2VsZikKKyAgICAgICAgbzEgPSBPYmplY3Qoc2VsZi5jYW52YXMsIGZpbGw9J3JlZCcsIHRleHQ9J28xJykKKyAgICAgICAgbzIgPSBPYmplY3Qoc2VsZi5jYW52YXMsIGZpbGw9J2dyZWVuJywgdGV4dD0nbzInKQorICAgICAgICBvMyA9IE9iamVjdChzZWxmLmNhbnZhcywgZmlsbD0nbGlnaHQgYmx1ZScsIHRleHQ9J28zJykKKyAgICAgICAgbzEudHJhbnNmZXIoc2VsZi5wMSkKKyAgICAgICAgbzIudHJhbnNmZXIoc2VsZi5wMSkKKyAgICAgICAgbzMudHJhbnNmZXIoc2VsZi5wMikKIAogCiAjIE1haW4gZnVuY3Rpb24sIHJ1biB3aGVuIGludm9rZWQgYXMgYSBzdGFuZC1hbG9uZSBQeXRob24gcHJvZ3JhbS4KZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9kaWFsb2cucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vZGlhbG9nLnB5CmluZGV4IDFmNzk0YWUuLjUwZDg0YjkgMTAwNzU1Ci0tLSBhL0RlbW8vdGtpbnRlci9ndWlkby9kaWFsb2cucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL2RpYWxvZy5weQpAQCAtMjUsMTEgKzI1LDExIEBACiAgICAgIyAyLiBGaWxsIHRoZSB0b3AgcGFydCB3aXRoIHRoZSBiaXRtYXAgYW5kIG1lc3NhZ2UuCiAKICAgICBtc2cgPSBNZXNzYWdlKHRvcCwgd2lkdGg9JzNpJywgdGV4dD10ZXh0LAotCQkgIGZvbnQ9Jy1BZG9iZS1UaW1lcy1NZWRpdW0tUi1Ob3JtYWwtKi0xODAtKicpCisgICAgICAgICAgICAgICAgICBmb250PSctQWRvYmUtVGltZXMtTWVkaXVtLVItTm9ybWFsLSotMTgwLSonKQogICAgIG1zZy5wYWNrKHNpZGU9UklHSFQsIGV4cGFuZD0xLCBmaWxsPUJPVEgsIHBhZHg9JzNtJywgcGFkeT0nM20nKQogICAgIGlmIGJpdG1hcDoKLQlibSA9IExhYmVsKHRvcCwgYml0bWFwPWJpdG1hcCkKLQlibS5wYWNrKHNpZGU9TEVGVCwgcGFkeD0nM20nLCBwYWR5PSczbScpCisgICAgICAgIGJtID0gTGFiZWwodG9wLCBiaXRtYXA9Yml0bWFwKQorICAgICAgICBibS5wYWNrKHNpZGU9TEVGVCwgcGFkeD0nM20nLCBwYWR5PSczbScpCiAKICAgICAjIDMuIENyZWF0ZSBhIHJvdyBvZiBidXR0b25zIGF0IHRoZSBib3R0b20gb2YgdGhlIGRpYWxvZy4KIApAQCAtMzcsMjcgKzM3LDI3IEBACiAgICAgYnV0dG9ucyA9IFtdCiAgICAgaSA9IDAKICAgICBmb3IgYnV0IGluIGFyZ3M6Ci0JYiA9IEJ1dHRvbihib3QsIHRleHQ9YnV0LCBjb21tYW5kPWxhbWJkYSB2PXZhcixpPWk6IHYuc2V0KGkpKQotCWJ1dHRvbnMuYXBwZW5kKGIpCi0JaWYgaSA9PSBkZWZhdWx0OgotCSAgICBiZCA9IEZyYW1lKGJvdCwgcmVsaWVmPVNVTktFTiwgYm9yZGVyd2lkdGg9MSkKLQkgICAgYmQucGFjayhzaWRlPUxFRlQsIGV4cGFuZD0xLCBwYWR4PSczbScsIHBhZHk9JzJtJykKLQkgICAgYi5saWZ0KCkKLQkgICAgYi5wYWNrIChpbl89YmQsIHNpZGU9TEVGVCwKLQkJICAgIHBhZHg9JzJtJywgcGFkeT0nMm0nLCBpcGFkeD0nMm0nLCBpcGFkeT0nMW0nKQotCWVsc2U6Ci0JICAgIGIucGFjayAoc2lkZT1MRUZULCBleHBhbmQ9MSwKLQkJICAgIHBhZHg9JzNtJywgcGFkeT0nM20nLCBpcGFkeD0nMm0nLCBpcGFkeT0nMW0nKQotCWkgPSBpKzEKKyAgICAgICAgYiA9IEJ1dHRvbihib3QsIHRleHQ9YnV0LCBjb21tYW5kPWxhbWJkYSB2PXZhcixpPWk6IHYuc2V0KGkpKQorICAgICAgICBidXR0b25zLmFwcGVuZChiKQorICAgICAgICBpZiBpID09IGRlZmF1bHQ6CisgICAgICAgICAgICBiZCA9IEZyYW1lKGJvdCwgcmVsaWVmPVNVTktFTiwgYm9yZGVyd2lkdGg9MSkKKyAgICAgICAgICAgIGJkLnBhY2soc2lkZT1MRUZULCBleHBhbmQ9MSwgcGFkeD0nM20nLCBwYWR5PScybScpCisgICAgICAgICAgICBiLmxpZnQoKQorICAgICAgICAgICAgYi5wYWNrIChpbl89YmQsIHNpZGU9TEVGVCwKKyAgICAgICAgICAgICAgICAgICAgcGFkeD0nMm0nLCBwYWR5PScybScsIGlwYWR4PScybScsIGlwYWR5PScxbScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiLnBhY2sgKHNpZGU9TEVGVCwgZXhwYW5kPTEsCisgICAgICAgICAgICAgICAgICAgIHBhZHg9JzNtJywgcGFkeT0nM20nLCBpcGFkeD0nMm0nLCBpcGFkeT0nMW0nKQorICAgICAgICBpID0gaSsxCiAKICAgICAjIDQuIFNldCB1cCBhIGJpbmRpbmcgZm9yIDxSZXR1cm4+LCBpZiB0aGVyZSdzIGEgZGVmYXVsdCwKICAgICAjIHNldCBhIGdyYWIsIGFuZCBjbGFpbSB0aGUgZm9jdXMgdG9vLgogCiAgICAgaWYgZGVmYXVsdCA+PSAwOgotCXcuYmluZCgnPFJldHVybj4nLAotCSAgICAgICBsYW1iZGEgZSwgYj1idXR0b25zW2RlZmF1bHRdLCB2PXZhciwgaT1kZWZhdWx0OgotCSAgICAgICAoYi5mbGFzaCgpLAotCQl2LnNldChpKSkpCisgICAgICAgIHcuYmluZCgnPFJldHVybj4nLAorICAgICAgICAgICAgICAgbGFtYmRhIGUsIGI9YnV0dG9uc1tkZWZhdWx0XSwgdj12YXIsIGk9ZGVmYXVsdDoKKyAgICAgICAgICAgICAgIChiLmZsYXNoKCksCisgICAgICAgICAgICAgICAgdi5zZXQoaSkpKQogCiAgICAgb2xkRm9jdXMgPSB3LmZvY3VzX2dldCgpCiAgICAgdy5ncmFiX3NldCgpCkBAIC03NSwyMyArNzUsMjMgQEAKIAogZGVmIGdvKCk6CiAgICAgaSA9IGRpYWxvZyhtYWluV2lkZ2V0LAotCSAgICAgICAnTm90IFJlc3BvbmRpbmcnLAotCSAgICAgICAiVGhlIGZpbGUgc2VydmVyIGlzbid0IHJlc3BvbmRpbmcgcmlnaHQgbm93OyAiCi0JICAgICAgICJJJ2xsIGtlZXAgdHJ5aW5nLiIsCi0JICAgICAgICcnLAotCSAgICAgICAtMSwKLQkgICAgICAgJ09LJykKKyAgICAgICAgICAgICAgICdOb3QgUmVzcG9uZGluZycsCisgICAgICAgICAgICAgICAiVGhlIGZpbGUgc2VydmVyIGlzbid0IHJlc3BvbmRpbmcgcmlnaHQgbm93OyAiCisgICAgICAgICAgICAgICAiSSdsbCBrZWVwIHRyeWluZy4iLAorICAgICAgICAgICAgICAgJycsCisgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICdPSycpCiAgICAgcHJpbnQgJ3ByZXNzZWQgYnV0dG9uJywgaQogICAgIGkgPSBkaWFsb2cobWFpbldpZGdldCwKLQkgICAgICAgJ0ZpbGUgTW9kaWZpZWQnLAotCSAgICAgICAnRmlsZSAidGNsLmgiIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlICcKLQkgICAgICAgJ3RoZSBsYXN0IHRpbWUgaXQgd2FzIHNhdmVkLiAnCi0JICAgICAgICdEbyB5b3Ugd2FudCB0byBzYXZlIGl0IGJlZm9yZSBleGl0aW5nIHRoZSBhcHBsaWNhdGlvbj8nLAotCSAgICAgICAnd2FybmluZycsCi0JICAgICAgIDAsCi0JICAgICAgICdTYXZlIEZpbGUnLAotCSAgICAgICAnRGlzY2FyZCBDaGFuZ2VzJywKLQkgICAgICAgJ1JldHVybiBUbyBFZGl0b3InKQorICAgICAgICAgICAgICAgJ0ZpbGUgTW9kaWZpZWQnLAorICAgICAgICAgICAgICAgJ0ZpbGUgInRjbC5oIiBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSAnCisgICAgICAgICAgICAgICAndGhlIGxhc3QgdGltZSBpdCB3YXMgc2F2ZWQuICcKKyAgICAgICAgICAgICAgICdEbyB5b3Ugd2FudCB0byBzYXZlIGl0IGJlZm9yZSBleGl0aW5nIHRoZSBhcHBsaWNhdGlvbj8nLAorICAgICAgICAgICAgICAgJ3dhcm5pbmcnLAorICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICdTYXZlIEZpbGUnLAorICAgICAgICAgICAgICAgJ0Rpc2NhcmQgQ2hhbmdlcycsCisgICAgICAgICAgICAgICAnUmV0dXJuIFRvIEVkaXRvcicpCiAgICAgcHJpbnQgJ3ByZXNzZWQgYnV0dG9uJywgaQogCiBkZWYgdGVzdCgpOgpkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL2d1aWRvL2VsZWN0cm9ucy5weSBiL0RlbW8vdGtpbnRlci9ndWlkby9lbGVjdHJvbnMucHkKaW5kZXggOTdkYWQyZDcuLmZkYzU1OGYgMTAwNzU1Ci0tLSBhL0RlbW8vdGtpbnRlci9ndWlkby9lbGVjdHJvbnMucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL2VsZWN0cm9ucy5weQpAQCAtMSw2ICsxLDYgQEAKICMhIC91c3IvYmluL2VudiBweXRob24KIAotIyBTaW11bGF0ZSAiZWxlY3Ryb25zIiBtaWdyYXRpbmcgYWNyb3NzIHRoZSBzY3JlZW4uICAKKyMgU2ltdWxhdGUgImVsZWN0cm9ucyIgbWlncmF0aW5nIGFjcm9zcyB0aGUgc2NyZWVuLgogIyBBbiBvcHRpb25hbCBiaXRtYXAgZmlsZSBpbiBjYW4gYmUgaW4gdGhlIGJhY2tncm91bmQuCiAjCiAjIFVzYWdlOiBlbGVjdHJvbnMgW24gW2JpdG1hcGZpbGVdXQpAQCAtMTgsNzQgKzE4LDc0IEBACiAjIFRoZSBncmFwaGljYWwgaW50ZXJmYWNlCiBjbGFzcyBFbGVjdHJvbnM6CiAKLQkjIENyZWF0ZSBvdXIgb2JqZWN0cwotCWRlZiBfX2luaXRfXyhzZWxmLCBuLCBiaXRtYXAgPSBOb25lKToKLQkJc2VsZi5uID0gbgotCQlzZWxmLnRrID0gdGsgPSBUaygpCi0JCXNlbGYuY2FudmFzID0gYyA9IENhbnZhcyh0aykKLQkJYy5wYWNrKCkKLQkJd2lkdGgsIGhlaWdodCA9IHRrLmdldGludChjWyd3aWR0aCddKSwgdGsuZ2V0aW50KGNbJ2hlaWdodCddKQorICAgICMgQ3JlYXRlIG91ciBvYmplY3RzCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG4sIGJpdG1hcCA9IE5vbmUpOgorICAgICAgICBzZWxmLm4gPSBuCisgICAgICAgIHNlbGYudGsgPSB0ayA9IFRrKCkKKyAgICAgICAgc2VsZi5jYW52YXMgPSBjID0gQ2FudmFzKHRrKQorICAgICAgICBjLnBhY2soKQorICAgICAgICB3aWR0aCwgaGVpZ2h0ID0gdGsuZ2V0aW50KGNbJ3dpZHRoJ10pLCB0ay5nZXRpbnQoY1snaGVpZ2h0J10pCiAKLQkJIyBBZGQgYmFja2dyb3VuZCBiaXRtYXAKLQkJaWYgYml0bWFwOgotCQkJc2VsZi5iaXRtYXAgPSBjLmNyZWF0ZV9iaXRtYXAod2lkdGgvMiwgaGVpZ2h0LzIsCi0JCQkJCQkgICAgICBiaXRtYXA9Yml0bWFwLAotCQkJCQkJICAgICAgZm9yZWdyb3VuZD0nYmx1ZScpCisgICAgICAgICMgQWRkIGJhY2tncm91bmQgYml0bWFwCisgICAgICAgIGlmIGJpdG1hcDoKKyAgICAgICAgICAgIHNlbGYuYml0bWFwID0gYy5jcmVhdGVfYml0bWFwKHdpZHRoLzIsIGhlaWdodC8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwPWJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVncm91bmQ9J2JsdWUnKQogCi0JCXNlbGYucGllY2VzID0gW10KLQkJeDEsIHkxLCB4MiwgeTIgPSAxMCw3MCwxNCw3NAotCQlmb3IgaSBpbiByYW5nZShuKToKLQkJCXAgPSBjLmNyZWF0ZV9vdmFsKHgxLCB5MSwgeDIsIHkyLCBmaWxsPSdyZWQnKQotCQkJc2VsZi5waWVjZXMuYXBwZW5kKHApCi0JCQl5MSwgeTIgPSB5MSArMiwgeTIgKyAyCi0JCXNlbGYudGsudXBkYXRlKCkKKyAgICAgICAgc2VsZi5waWVjZXMgPSBbXQorICAgICAgICB4MSwgeTEsIHgyLCB5MiA9IDEwLDcwLDE0LDc0CisgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgcCA9IGMuY3JlYXRlX292YWwoeDEsIHkxLCB4MiwgeTIsIGZpbGw9J3JlZCcpCisgICAgICAgICAgICBzZWxmLnBpZWNlcy5hcHBlbmQocCkKKyAgICAgICAgICAgIHkxLCB5MiA9IHkxICsyLCB5MiArIDIKKyAgICAgICAgc2VsZi50ay51cGRhdGUoKQogCi0JZGVmIHJhbmRvbV9tb3ZlKHNlbGYsIG4pOgotCQljID0gc2VsZi5jYW52YXMKLQkJZm9yIHAgaW4gc2VsZi5waWVjZXM6Ci0JCQl4ID0gcmFuZG9tLmNob2ljZShyYW5nZSgtMiw0KSkKLQkJCXkgPSByYW5kb20uY2hvaWNlKHJhbmdlKC0zLDQpKQotCQkJYy5tb3ZlKHAsIHgsIHkpCi0JCXNlbGYudGsudXBkYXRlKCkKKyAgICBkZWYgcmFuZG9tX21vdmUoc2VsZiwgbik6CisgICAgICAgIGMgPSBzZWxmLmNhbnZhcworICAgICAgICBmb3IgcCBpbiBzZWxmLnBpZWNlczoKKyAgICAgICAgICAgIHggPSByYW5kb20uY2hvaWNlKHJhbmdlKC0yLDQpKQorICAgICAgICAgICAgeSA9IHJhbmRvbS5jaG9pY2UocmFuZ2UoLTMsNCkpCisgICAgICAgICAgICBjLm1vdmUocCwgeCwgeSkKKyAgICAgICAgc2VsZi50ay51cGRhdGUoKQogCi0JIyBSdW4gLS0gYWxsb3cgNTAwIG1vdmVtZW5zCi0JZGVmIHJ1bihzZWxmKToKLQkJdHJ5OgotCQkJZm9yIGkgaW4gcmFuZ2UoNTAwKToKLQkJCQlzZWxmLnJhbmRvbV9tb3ZlKHNlbGYubikKLQkJZXhjZXB0IFRjbEVycm9yOgotCQkJdHJ5OgotCQkJCXNlbGYudGsuZGVzdHJveSgpCi0JCQlleGNlcHQgVGNsRXJyb3I6Ci0JCQkJcGFzcworICAgICMgUnVuIC0tIGFsbG93IDUwMCBtb3ZlbWVucworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUwMCk6CisgICAgICAgICAgICAgICAgc2VsZi5yYW5kb21fbW92ZShzZWxmLm4pCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnRrLmRlc3Ryb3koKQorICAgICAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKIAogCiAjIE1haW4gcHJvZ3JhbQogZGVmIG1haW4oKToKLQlpbXBvcnQgc3lzLCBzdHJpbmcKKyAgICBpbXBvcnQgc3lzLCBzdHJpbmcKIAotCSMgRmlyc3QgYXJndW1lbnQgaXMgbnVtYmVyIG9mIGVsZWN0cm9ucywgZGVmYXVsdCAzMAotCWlmIHN5cy5hcmd2WzE6XToKLQkJbiA9IHN0cmluZy5hdG9pKHN5cy5hcmd2WzFdKQotCWVsc2U6Ci0JCW4gPSAzMAorICAgICMgRmlyc3QgYXJndW1lbnQgaXMgbnVtYmVyIG9mIGVsZWN0cm9ucywgZGVmYXVsdCAzMAorICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgbiA9IHN0cmluZy5hdG9pKHN5cy5hcmd2WzFdKQorICAgIGVsc2U6CisgICAgICAgIG4gPSAzMAogCi0JIyBTZWNvbmQgYXJndW1lbnQgaXMgYml0bWFwIGZpbGUsIGRlZmF1bHQgbm9uZQotCWlmIHN5cy5hcmd2WzI6XToKLQkJYml0bWFwID0gc3lzLmFyZ3ZbMl0KLQkJIyBSZXZlcnNlIG1lYW5pbmcgb2YgbGVhZGluZyAnQCcgY29tcGFyZWQgdG8gVGsKLQkJaWYgYml0bWFwWzBdID09ICdAJzogYml0bWFwID0gYml0bWFwWzE6XQotCQllbHNlOiBiaXRtYXAgPSAnQCcgKyBiaXRtYXAKLQllbHNlOgotCQliaXRtYXAgPSBOb25lCisgICAgIyBTZWNvbmQgYXJndW1lbnQgaXMgYml0bWFwIGZpbGUsIGRlZmF1bHQgbm9uZQorICAgIGlmIHN5cy5hcmd2WzI6XToKKyAgICAgICAgYml0bWFwID0gc3lzLmFyZ3ZbMl0KKyAgICAgICAgIyBSZXZlcnNlIG1lYW5pbmcgb2YgbGVhZGluZyAnQCcgY29tcGFyZWQgdG8gVGsKKyAgICAgICAgaWYgYml0bWFwWzBdID09ICdAJzogYml0bWFwID0gYml0bWFwWzE6XQorICAgICAgICBlbHNlOiBiaXRtYXAgPSAnQCcgKyBiaXRtYXAKKyAgICBlbHNlOgorICAgICAgICBiaXRtYXAgPSBOb25lCiAKLQkjIENyZWF0ZSB0aGUgZ3JhcGhpY2FsIG9iamVjdHMuLi4KLQloID0gRWxlY3Ryb25zKG4sIGJpdG1hcCkKKyAgICAjIENyZWF0ZSB0aGUgZ3JhcGhpY2FsIG9iamVjdHMuLi4KKyAgICBoID0gRWxlY3Ryb25zKG4sIGJpdG1hcCkKIAotCSMgLi4uYW5kIHJ1biEKLQloLnJ1bigpCisgICAgIyAuLi5hbmQgcnVuIQorICAgIGgucnVuKCkKIAogCiAjIENhbGwgbWFpbiB3aGVuIHJ1biBhcyBzY3JpcHQKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvZ3VpZG8vaGFub2kucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vaGFub2kucHkKaW5kZXggOWU1NjZjNC4uMDc4YzI0NiAxMDA3NTUKLS0tIGEvRGVtby90a2ludGVyL2d1aWRvL2hhbm9pLnB5CisrKyBiL0RlbW8vdGtpbnRlci9ndWlkby9oYW5vaS5weQpAQCAtMTYsMTM5ICsxNiwxMzkgQEAKICMgQmFzaWMgVG93ZXJzLW9mLUhhbm9pIGFsZ29yaXRobTogbW92ZSBuIHBpZWNlcyBmcm9tIGEgdG8gYiwgdXNpbmcgYwogIyBhcyB0ZW1wb3JhcnkuICBGb3IgZWFjaCBtb3ZlLCBjYWxsIHJlcG9ydCgpCiBkZWYgaGFub2kobiwgYSwgYiwgYywgcmVwb3J0KToKLQlpZiBuIDw9IDA6IHJldHVybgotCWhhbm9pKG4tMSwgYSwgYywgYiwgcmVwb3J0KQotCXJlcG9ydChuLCBhLCBiKQotCWhhbm9pKG4tMSwgYywgYiwgYSwgcmVwb3J0KQorICAgIGlmIG4gPD0gMDogcmV0dXJuCisgICAgaGFub2kobi0xLCBhLCBjLCBiLCByZXBvcnQpCisgICAgcmVwb3J0KG4sIGEsIGIpCisgICAgaGFub2kobi0xLCBjLCBiLCBhLCByZXBvcnQpCiAKIAogIyBUaGUgZ3JhcGhpY2FsIGludGVyZmFjZQogY2xhc3MgVGtoYW5vaToKIAotCSMgQ3JlYXRlIG91ciBvYmplY3RzCi0JZGVmIF9faW5pdF9fKHNlbGYsIG4sIGJpdG1hcCA9IE5vbmUpOgotCQlzZWxmLm4gPSBuCi0JCXNlbGYudGsgPSB0ayA9IFRrKCkKLQkJc2VsZi5jYW52YXMgPSBjID0gQ2FudmFzKHRrKQotCQljLnBhY2soKQotCQl3aWR0aCwgaGVpZ2h0ID0gdGsuZ2V0aW50KGNbJ3dpZHRoJ10pLCB0ay5nZXRpbnQoY1snaGVpZ2h0J10pCisgICAgIyBDcmVhdGUgb3VyIG9iamVjdHMKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbiwgYml0bWFwID0gTm9uZSk6CisgICAgICAgIHNlbGYubiA9IG4KKyAgICAgICAgc2VsZi50ayA9IHRrID0gVGsoKQorICAgICAgICBzZWxmLmNhbnZhcyA9IGMgPSBDYW52YXModGspCisgICAgICAgIGMucGFjaygpCisgICAgICAgIHdpZHRoLCBoZWlnaHQgPSB0ay5nZXRpbnQoY1snd2lkdGgnXSksIHRrLmdldGludChjWydoZWlnaHQnXSkKIAotCQkjIEFkZCBiYWNrZ3JvdW5kIGJpdG1hcAotCQlpZiBiaXRtYXA6Ci0JCQlzZWxmLmJpdG1hcCA9IGMuY3JlYXRlX2JpdG1hcCh3aWR0aC8yLCBoZWlnaHQvMiwKLQkJCQkJCSAgICAgIGJpdG1hcD1iaXRtYXAsCi0JCQkJCQkgICAgICBmb3JlZ3JvdW5kPSdibHVlJykKKyAgICAgICAgIyBBZGQgYmFja2dyb3VuZCBiaXRtYXAKKyAgICAgICAgaWYgYml0bWFwOgorICAgICAgICAgICAgc2VsZi5iaXRtYXAgPSBjLmNyZWF0ZV9iaXRtYXAod2lkdGgvMiwgaGVpZ2h0LzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXA9Yml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWdyb3VuZD0nYmx1ZScpCiAKLQkJIyBHZW5lcmF0ZSBwZWdzCi0JCXBlZ3dpZHRoID0gMTAKLQkJcGVnaGVpZ2h0ID0gaGVpZ2h0LzIKLQkJcGVnZGlzdCA9IHdpZHRoLzMKLQkJeDEsIHkxID0gKHBlZ2Rpc3QtcGVnd2lkdGgpLzIsIGhlaWdodCoxLzMKLQkJeDIsIHkyID0geDErcGVnd2lkdGgsIHkxK3BlZ2hlaWdodAotCQlzZWxmLnBlZ3MgPSBbXQotCQlwID0gYy5jcmVhdGVfcmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyLCBmaWxsPSdibGFjaycpCi0JCXNlbGYucGVncy5hcHBlbmQocCkKLQkJeDEsIHgyID0geDErcGVnZGlzdCwgeDIrcGVnZGlzdAotCQlwID0gYy5jcmVhdGVfcmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyLCBmaWxsPSdibGFjaycpCi0JCXNlbGYucGVncy5hcHBlbmQocCkKLQkJeDEsIHgyID0geDErcGVnZGlzdCwgeDIrcGVnZGlzdAotCQlwID0gYy5jcmVhdGVfcmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyLCBmaWxsPSdibGFjaycpCi0JCXNlbGYucGVncy5hcHBlbmQocCkKLQkJc2VsZi50ay51cGRhdGUoKQorICAgICAgICAjIEdlbmVyYXRlIHBlZ3MKKyAgICAgICAgcGVnd2lkdGggPSAxMAorICAgICAgICBwZWdoZWlnaHQgPSBoZWlnaHQvMgorICAgICAgICBwZWdkaXN0ID0gd2lkdGgvMworICAgICAgICB4MSwgeTEgPSAocGVnZGlzdC1wZWd3aWR0aCkvMiwgaGVpZ2h0KjEvMworICAgICAgICB4MiwgeTIgPSB4MStwZWd3aWR0aCwgeTErcGVnaGVpZ2h0CisgICAgICAgIHNlbGYucGVncyA9IFtdCisgICAgICAgIHAgPSBjLmNyZWF0ZV9yZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIsIGZpbGw9J2JsYWNrJykKKyAgICAgICAgc2VsZi5wZWdzLmFwcGVuZChwKQorICAgICAgICB4MSwgeDIgPSB4MStwZWdkaXN0LCB4MitwZWdkaXN0CisgICAgICAgIHAgPSBjLmNyZWF0ZV9yZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIsIGZpbGw9J2JsYWNrJykKKyAgICAgICAgc2VsZi5wZWdzLmFwcGVuZChwKQorICAgICAgICB4MSwgeDIgPSB4MStwZWdkaXN0LCB4MitwZWdkaXN0CisgICAgICAgIHAgPSBjLmNyZWF0ZV9yZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIsIGZpbGw9J2JsYWNrJykKKyAgICAgICAgc2VsZi5wZWdzLmFwcGVuZChwKQorICAgICAgICBzZWxmLnRrLnVwZGF0ZSgpCiAKLQkJIyBHZW5lcmF0ZSBwaWVjZXMKLQkJcGllY2VoZWlnaHQgPSBwZWdoZWlnaHQvMTYKLQkJbWF4cGllY2V3aWR0aCA9IHBlZ2Rpc3QqMi8zCi0JCW1pbnBpZWNld2lkdGggPSAyKnBlZ3dpZHRoCi0JCXNlbGYucGVnc3RhdGUgPSBbW10sIFtdLCBbXV0KLQkJc2VsZi5waWVjZXMgPSB7fQotCQl4MSwgeTEgPSAocGVnZGlzdC1tYXhwaWVjZXdpZHRoKS8yLCB5Mi1waWVjZWhlaWdodC0yCi0JCXgyLCB5MiA9IHgxK21heHBpZWNld2lkdGgsIHkxK3BpZWNlaGVpZ2h0Ci0JCWR4ID0gKG1heHBpZWNld2lkdGgtbWlucGllY2V3aWR0aCkgLyAoMiptYXgoMSwgbi0xKSkKLQkJZm9yIGkgaW4gcmFuZ2UobiwgMCwgLTEpOgotCQkJcCA9IGMuY3JlYXRlX3JlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MiwgZmlsbD0ncmVkJykKLQkJCXNlbGYucGllY2VzW2ldID0gcAotCQkJc2VsZi5wZWdzdGF0ZVswXS5hcHBlbmQoaSkKLQkJCXgxLCB4MiA9IHgxICsgZHgsIHgyLWR4Ci0JCQl5MSwgeTIgPSB5MSAtIHBpZWNlaGVpZ2h0LTIsIHkyLXBpZWNlaGVpZ2h0LTIKLQkJCXNlbGYudGsudXBkYXRlKCkKLQkJCXNlbGYudGsuYWZ0ZXIoMjUpCisgICAgICAgICMgR2VuZXJhdGUgcGllY2VzCisgICAgICAgIHBpZWNlaGVpZ2h0ID0gcGVnaGVpZ2h0LzE2CisgICAgICAgIG1heHBpZWNld2lkdGggPSBwZWdkaXN0KjIvMworICAgICAgICBtaW5waWVjZXdpZHRoID0gMipwZWd3aWR0aAorICAgICAgICBzZWxmLnBlZ3N0YXRlID0gW1tdLCBbXSwgW11dCisgICAgICAgIHNlbGYucGllY2VzID0ge30KKyAgICAgICAgeDEsIHkxID0gKHBlZ2Rpc3QtbWF4cGllY2V3aWR0aCkvMiwgeTItcGllY2VoZWlnaHQtMgorICAgICAgICB4MiwgeTIgPSB4MSttYXhwaWVjZXdpZHRoLCB5MStwaWVjZWhlaWdodAorICAgICAgICBkeCA9IChtYXhwaWVjZXdpZHRoLW1pbnBpZWNld2lkdGgpIC8gKDIqbWF4KDEsIG4tMSkpCisgICAgICAgIGZvciBpIGluIHJhbmdlKG4sIDAsIC0xKToKKyAgICAgICAgICAgIHAgPSBjLmNyZWF0ZV9yZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIsIGZpbGw9J3JlZCcpCisgICAgICAgICAgICBzZWxmLnBpZWNlc1tpXSA9IHAKKyAgICAgICAgICAgIHNlbGYucGVnc3RhdGVbMF0uYXBwZW5kKGkpCisgICAgICAgICAgICB4MSwgeDIgPSB4MSArIGR4LCB4Mi1keAorICAgICAgICAgICAgeTEsIHkyID0geTEgLSBwaWVjZWhlaWdodC0yLCB5Mi1waWVjZWhlaWdodC0yCisgICAgICAgICAgICBzZWxmLnRrLnVwZGF0ZSgpCisgICAgICAgICAgICBzZWxmLnRrLmFmdGVyKDI1KQogCi0JIyBSdW4gLS0gbmV2ZXIgcmV0dXJucwotCWRlZiBydW4oc2VsZik6Ci0JCXdoaWxlIDE6Ci0JCQloYW5vaShzZWxmLm4sIDAsIDEsIDIsIHNlbGYucmVwb3J0KQotCQkJaGFub2koc2VsZi5uLCAxLCAyLCAwLCBzZWxmLnJlcG9ydCkKLQkJCWhhbm9pKHNlbGYubiwgMiwgMCwgMSwgc2VsZi5yZXBvcnQpCi0JCQloYW5vaShzZWxmLm4sIDAsIDIsIDEsIHNlbGYucmVwb3J0KQotCQkJaGFub2koc2VsZi5uLCAyLCAxLCAwLCBzZWxmLnJlcG9ydCkKLQkJCWhhbm9pKHNlbGYubiwgMSwgMCwgMiwgc2VsZi5yZXBvcnQpCisgICAgIyBSdW4gLS0gbmV2ZXIgcmV0dXJucworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBoYW5vaShzZWxmLm4sIDAsIDEsIDIsIHNlbGYucmVwb3J0KQorICAgICAgICAgICAgaGFub2koc2VsZi5uLCAxLCAyLCAwLCBzZWxmLnJlcG9ydCkKKyAgICAgICAgICAgIGhhbm9pKHNlbGYubiwgMiwgMCwgMSwgc2VsZi5yZXBvcnQpCisgICAgICAgICAgICBoYW5vaShzZWxmLm4sIDAsIDIsIDEsIHNlbGYucmVwb3J0KQorICAgICAgICAgICAgaGFub2koc2VsZi5uLCAyLCAxLCAwLCBzZWxmLnJlcG9ydCkKKyAgICAgICAgICAgIGhhbm9pKHNlbGYubiwgMSwgMCwgMiwgc2VsZi5yZXBvcnQpCiAKLQkjIFJlcG9ydGluZyBjYWxsYmFjayBmb3IgdGhlIGFjdHVhbCBoYW5vaSBmdW5jdGlvbgotCWRlZiByZXBvcnQoc2VsZiwgaSwgYSwgYik6Ci0JCWlmIHNlbGYucGVnc3RhdGVbYV1bLTFdICE9IGk6IHJhaXNlIFJ1bnRpbWVFcnJvciAjIEFzc2VydGlvbgotCQlkZWwgc2VsZi5wZWdzdGF0ZVthXVstMV0KLQkJcCA9IHNlbGYucGllY2VzW2ldCi0JCWMgPSBzZWxmLmNhbnZhcworICAgICMgUmVwb3J0aW5nIGNhbGxiYWNrIGZvciB0aGUgYWN0dWFsIGhhbm9pIGZ1bmN0aW9uCisgICAgZGVmIHJlcG9ydChzZWxmLCBpLCBhLCBiKToKKyAgICAgICAgaWYgc2VsZi5wZWdzdGF0ZVthXVstMV0gIT0gaTogcmFpc2UgUnVudGltZUVycm9yICMgQXNzZXJ0aW9uCisgICAgICAgIGRlbCBzZWxmLnBlZ3N0YXRlW2FdWy0xXQorICAgICAgICBwID0gc2VsZi5waWVjZXNbaV0KKyAgICAgICAgYyA9IHNlbGYuY2FudmFzCiAKLQkJIyBMaWZ0IHRoZSBwaWVjZSBhYm92ZSBwZWcgYQotCQlheDEsIGF5MSwgYXgyLCBheTIgPSBjLmJib3goc2VsZi5wZWdzW2FdKQotCQl3aGlsZSAxOgotCQkJeDEsIHkxLCB4MiwgeTIgPSBjLmJib3gocCkKLQkJCWlmIHkyIDwgYXkxOiBicmVhawotCQkJYy5tb3ZlKHAsIDAsIC0xKQotCQkJc2VsZi50ay51cGRhdGUoKQorICAgICAgICAjIExpZnQgdGhlIHBpZWNlIGFib3ZlIHBlZyBhCisgICAgICAgIGF4MSwgYXkxLCBheDIsIGF5MiA9IGMuYmJveChzZWxmLnBlZ3NbYV0pCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiA9IGMuYmJveChwKQorICAgICAgICAgICAgaWYgeTIgPCBheTE6IGJyZWFrCisgICAgICAgICAgICBjLm1vdmUocCwgMCwgLTEpCisgICAgICAgICAgICBzZWxmLnRrLnVwZGF0ZSgpCiAKLQkJIyBNb3ZlIGl0IHRvd2FyZHMgcGVnIGIKLQkJYngxLCBieTEsIGJ4MiwgYnkyID0gYy5iYm94KHNlbGYucGVnc1tiXSkKLQkJbmV3Y2VudGVyID0gKGJ4MStieDIpLzIKLQkJd2hpbGUgMToKLQkJCXgxLCB5MSwgeDIsIHkyID0gYy5iYm94KHApCi0JCQljZW50ZXIgPSAoeDEreDIpLzIKLQkJCWlmIGNlbnRlciA9PSBuZXdjZW50ZXI6IGJyZWFrCi0JCQlpZiBjZW50ZXIgPiBuZXdjZW50ZXI6IGMubW92ZShwLCAtMSwgMCkKLQkJCWVsc2U6IGMubW92ZShwLCAxLCAwKQotCQkJc2VsZi50ay51cGRhdGUoKQorICAgICAgICAjIE1vdmUgaXQgdG93YXJkcyBwZWcgYgorICAgICAgICBieDEsIGJ5MSwgYngyLCBieTIgPSBjLmJib3goc2VsZi5wZWdzW2JdKQorICAgICAgICBuZXdjZW50ZXIgPSAoYngxK2J4MikvMgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIgPSBjLmJib3gocCkKKyAgICAgICAgICAgIGNlbnRlciA9ICh4MSt4MikvMgorICAgICAgICAgICAgaWYgY2VudGVyID09IG5ld2NlbnRlcjogYnJlYWsKKyAgICAgICAgICAgIGlmIGNlbnRlciA+IG5ld2NlbnRlcjogYy5tb3ZlKHAsIC0xLCAwKQorICAgICAgICAgICAgZWxzZTogYy5tb3ZlKHAsIDEsIDApCisgICAgICAgICAgICBzZWxmLnRrLnVwZGF0ZSgpCiAKLQkJIyBNb3ZlIGl0IGRvd24gb24gdG9wIG9mIHRoZSBwcmV2aW91cyBwaWVjZQotCQlwaWVjZWhlaWdodCA9IHkyLXkxCi0JCW5ld2JvdHRvbSA9IGJ5MiAtIHBpZWNlaGVpZ2h0KmxlbihzZWxmLnBlZ3N0YXRlW2JdKSAtIDIKLQkJd2hpbGUgMToKLQkJCXgxLCB5MSwgeDIsIHkyID0gYy5iYm94KHApCi0JCQlpZiB5MiA+PSBuZXdib3R0b206IGJyZWFrCi0JCQljLm1vdmUocCwgMCwgMSkKLQkJCXNlbGYudGsudXBkYXRlKCkKKyAgICAgICAgIyBNb3ZlIGl0IGRvd24gb24gdG9wIG9mIHRoZSBwcmV2aW91cyBwaWVjZQorICAgICAgICBwaWVjZWhlaWdodCA9IHkyLXkxCisgICAgICAgIG5ld2JvdHRvbSA9IGJ5MiAtIHBpZWNlaGVpZ2h0KmxlbihzZWxmLnBlZ3N0YXRlW2JdKSAtIDIKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyID0gYy5iYm94KHApCisgICAgICAgICAgICBpZiB5MiA+PSBuZXdib3R0b206IGJyZWFrCisgICAgICAgICAgICBjLm1vdmUocCwgMCwgMSkKKyAgICAgICAgICAgIHNlbGYudGsudXBkYXRlKCkKIAotCQkjIFVwZGF0ZSBwZWcgc3RhdGUKLQkJc2VsZi5wZWdzdGF0ZVtiXS5hcHBlbmQoaSkKKyAgICAgICAgIyBVcGRhdGUgcGVnIHN0YXRlCisgICAgICAgIHNlbGYucGVnc3RhdGVbYl0uYXBwZW5kKGkpCiAKIAogIyBNYWluIHByb2dyYW0KIGRlZiBtYWluKCk6Ci0JaW1wb3J0IHN5cywgc3RyaW5nCisgICAgaW1wb3J0IHN5cywgc3RyaW5nCiAKLQkjIEZpcnN0IGFyZ3VtZW50IGlzIG51bWJlciBvZiBwZWdzLCBkZWZhdWx0IDQKLQlpZiBzeXMuYXJndlsxOl06Ci0JCW4gPSBzdHJpbmcuYXRvaShzeXMuYXJndlsxXSkKLQllbHNlOgotCQluID0gNAorICAgICMgRmlyc3QgYXJndW1lbnQgaXMgbnVtYmVyIG9mIHBlZ3MsIGRlZmF1bHQgNAorICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgbiA9IHN0cmluZy5hdG9pKHN5cy5hcmd2WzFdKQorICAgIGVsc2U6CisgICAgICAgIG4gPSA0CiAKLQkjIFNlY29uZCBhcmd1bWVudCBpcyBiaXRtYXAgZmlsZSwgZGVmYXVsdCBub25lCi0JaWYgc3lzLmFyZ3ZbMjpdOgotCQliaXRtYXAgPSBzeXMuYXJndlsyXQotCQkjIFJldmVyc2UgbWVhbmluZyBvZiBsZWFkaW5nICdAJyBjb21wYXJlZCB0byBUawotCQlpZiBiaXRtYXBbMF0gPT0gJ0AnOiBiaXRtYXAgPSBiaXRtYXBbMTpdCi0JCWVsc2U6IGJpdG1hcCA9ICdAJyArIGJpdG1hcAotCWVsc2U6Ci0JCWJpdG1hcCA9IE5vbmUKKyAgICAjIFNlY29uZCBhcmd1bWVudCBpcyBiaXRtYXAgZmlsZSwgZGVmYXVsdCBub25lCisgICAgaWYgc3lzLmFyZ3ZbMjpdOgorICAgICAgICBiaXRtYXAgPSBzeXMuYXJndlsyXQorICAgICAgICAjIFJldmVyc2UgbWVhbmluZyBvZiBsZWFkaW5nICdAJyBjb21wYXJlZCB0byBUaworICAgICAgICBpZiBiaXRtYXBbMF0gPT0gJ0AnOiBiaXRtYXAgPSBiaXRtYXBbMTpdCisgICAgICAgIGVsc2U6IGJpdG1hcCA9ICdAJyArIGJpdG1hcAorICAgIGVsc2U6CisgICAgICAgIGJpdG1hcCA9IE5vbmUKIAotCSMgQ3JlYXRlIHRoZSBncmFwaGljYWwgb2JqZWN0cy4uLgotCWggPSBUa2hhbm9pKG4sIGJpdG1hcCkKKyAgICAjIENyZWF0ZSB0aGUgZ3JhcGhpY2FsIG9iamVjdHMuLi4KKyAgICBoID0gVGtoYW5vaShuLCBiaXRtYXApCiAKLQkjIC4uLmFuZCBydW4hCi0JaC5ydW4oKQorICAgICMgLi4uYW5kIHJ1biEKKyAgICBoLnJ1bigpCiAKIAogIyBDYWxsIG1haW4gd2hlbiBydW4gYXMgc2NyaXB0CiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL2d1aWRvL2hlbGxvLnB5IGIvRGVtby90a2ludGVyL2d1aWRvL2hlbGxvLnB5CmluZGV4IDIzNzIwNGYuLjM1OGE3ZWMgMTAwNzU1Ci0tLSBhL0RlbW8vdGtpbnRlci9ndWlkby9oZWxsby5weQorKysgYi9EZW1vL3RraW50ZXIvZ3VpZG8vaGVsbG8ucHkKQEAgLTQsMTQgKzQsMTQgQEAKIGZyb20gVGtpbnRlciBpbXBvcnQgKgogCiBkZWYgbWFpbigpOgotCXJvb3QgPSBUaygpCi0JYnV0dG9uID0gQnV0dG9uKHJvb3QpCi0JYnV0dG9uWyd0ZXh0J10gPSAnSGVsbG8sIHdvcmxkJwotCWJ1dHRvblsnY29tbWFuZCddID0gcXVpdF9jYWxsYmFjawkjIFNlZSBiZWxvdwotCWJ1dHRvbi5wYWNrKCkKLQlyb290Lm1haW5sb29wKCkKKyAgICByb290ID0gVGsoKQorICAgIGJ1dHRvbiA9IEJ1dHRvbihyb290KQorICAgIGJ1dHRvblsndGV4dCddID0gJ0hlbGxvLCB3b3JsZCcKKyAgICBidXR0b25bJ2NvbW1hbmQnXSA9IHF1aXRfY2FsbGJhY2sgICAgICAgIyBTZWUgYmVsb3cKKyAgICBidXR0b24ucGFjaygpCisgICAgcm9vdC5tYWlubG9vcCgpCiAKIGRlZiBxdWl0X2NhbGxiYWNrKCk6Ci0Jc3lzLmV4aXQoMCkKKyAgICBzeXMuZXhpdCgwKQogCiBtYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9raWxsLnB5IGIvRGVtby90a2ludGVyL2d1aWRvL2tpbGwucHkKaW5kZXggNTc3YWY4Yi4uZTdkZjI2MSAxMDA3NTUKLS0tIGEvRGVtby90a2ludGVyL2d1aWRvL2tpbGwucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL2tpbGwucHkKQEAgLTgsOTIgKzgsOTEgQEAKIGltcG9ydCBvcwogCiBjbGFzcyBCYXJCdXR0b24oTWVudWJ1dHRvbik6Ci0JZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmNuZik6Ci0JCWFwcGx5KE1lbnVidXR0b24uX19pbml0X18sIChzZWxmLCBtYXN0ZXIpLCBjbmYpCi0JCXNlbGYucGFjayhzaWRlPUxFRlQpCi0JCXNlbGYubWVudSA9IE1lbnUoc2VsZiwgbmFtZT0nbWVudScpCi0JCXNlbGZbJ21lbnUnXSA9IHNlbGYubWVudQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKipjbmYpOgorICAgICAgICBhcHBseShNZW51YnV0dG9uLl9faW5pdF9fLCAoc2VsZiwgbWFzdGVyKSwgY25mKQorICAgICAgICBzZWxmLnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLm1lbnUgPSBNZW51KHNlbGYsIG5hbWU9J21lbnUnKQorICAgICAgICBzZWxmWydtZW51J10gPSBzZWxmLm1lbnUKIAogY2xhc3MgS2lsbChGcmFtZSk6Ci0JIyBMaXN0IG9mIChuYW1lLCBvcHRpb24sIHBpZF9jb2x1bW4pCi0JZm9ybWF0X2xpc3QgPSBbKCdEZWZhdWx0JywgJycsIDApLAotCQkgICAgICAgKCdMb25nJywgJy1sJywgMiksCi0JCSAgICAgICAoJ1VzZXInLCAnLXUnLCAxKSwKLQkJICAgICAgICgnSm9icycsICctaicsIDEpLAotCQkgICAgICAgKCdTaWduYWwnLCAnLXMnLCAxKSwKLQkJICAgICAgICgnTWVtb3J5JywgJy1tJywgMCksCi0JCSAgICAgICAoJ1ZNJywgJy12JywgMCksCi0JCSAgICAgICAoJ0hleCcsICctWCcsIDApXQotCWRlZiBraWxsKHNlbGYsIHNlbGVjdGVkKToKLQkJYyA9IHNlbGYuZm9ybWF0X2xpc3Rbc2VsZi5mb3JtYXQuZ2V0KCldWzJdCi0JCXBpZCA9IHNwbGl0KHNlbGVjdGVkKVtjXQotCQlvcy5zeXN0ZW0oJ2tpbGwgLTkgJyArIHBpZCkKLQkJc2VsZi5kb191cGRhdGUoKQotCWRlZiBkb191cGRhdGUoc2VsZik6Ci0JCW5hbWUsIG9wdGlvbiwgY29sdW1uID0gc2VsZi5mb3JtYXRfbGlzdFtzZWxmLmZvcm1hdC5nZXQoKV0KLQkJcyA9IGNvbW1hbmRzLmdldG91dHB1dCgncHMgLXcgJyArIG9wdGlvbikKLQkJbGlzdCA9IHNwbGl0ZmllbGRzKHMsICdcbicpCi0JCXNlbGYuaGVhZGVyLnNldChsaXN0WzBdKQotCQlkZWwgbGlzdFswXQotCQl5ID0gc2VsZi5mcmFtZS52c2Nyb2xsLmdldCgpWzBdCi0JCXNlbGYuZnJhbWUubGlzdC5kZWxldGUoMCwgQXRFbmQoKSkKLQkJZm9yIGxpbmUgaW4gbGlzdDoKLQkJCXNlbGYuZnJhbWUubGlzdC5pbnNlcnQoMCwgbGluZSkKLQkJc2VsZi5mcmFtZS5saXN0Lnl2aWV3KGludCh5KSkKLQlkZWYgZG9fbW90aW9uKHNlbGYsIGUpOgotCQllLndpZGdldC5zZWxlY3RfY2xlYXIoMCwgRU5EKQotCQllLndpZGdldC5zZWxlY3Rfc2V0KGUud2lkZ2V0Lm5lYXJlc3QoZS55KSkKLQlkZWYgZG9fbGVhdmUoc2VsZiwgZSk6Ci0JCWUud2lkZ2V0LnNlbGVjdF9jbGVhcigwLCBFTkQpCi0JZGVmIGRvXzEoc2VsZiwgZSk6Ci0JCXNlbGYua2lsbChlLndpZGdldC5nZXQoZS53aWRnZXQubmVhcmVzdChlLnkpKSkKLQlkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqY25mKToKLQkJRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmYpCi0JCXNlbGYucGFjayhleHBhbmQ9MSwgZmlsbD1CT1RIKQotCQlzZWxmLmJhciA9IEZyYW1lKHNlbGYsIG5hbWU9J2JhcicsIHJlbGllZj1SQUlTRUQsCi0JCQkJIGJvcmRlcndpZHRoPTIpCi0JCXNlbGYuYmFyLnBhY2soZmlsbD1YKQotCQlzZWxmLmJhci5maWxlID0gQmFyQnV0dG9uKHNlbGYuYmFyLCB0ZXh0PSdGaWxlJykKLQkJc2VsZi5iYXIuZmlsZS5tZW51LmFkZF9jb21tYW5kKAotCQkJbGFiZWw9J1F1aXQnLCBjb21tYW5kPXNlbGYucXVpdCkKLQkJc2VsZi5iYXIudmlldyA9IEJhckJ1dHRvbihzZWxmLmJhciwgdGV4dD0nVmlldycpCi0JCXNlbGYuZm9ybWF0ID0gSW50VmFyKHNlbGYpCi0JCXNlbGYuZm9ybWF0LnNldCgyKQotCQlmb3IgbnVtIGluIHJhbmdlKGxlbihzZWxmLmZvcm1hdF9saXN0KSk6Ci0JCQlzZWxmLmJhci52aWV3Lm1lbnUuYWRkX3JhZGlvYnV0dG9uKAotCQkJCWxhYmVsPXNlbGYuZm9ybWF0X2xpc3RbbnVtXVswXSwgCi0JCQkJY29tbWFuZD1zZWxmLmRvX3VwZGF0ZSwKLQkJCQl2YXJpYWJsZT1zZWxmLmZvcm1hdCwKLQkJCQl2YWx1ZT1udW0pCi0JCSNzZWxmLmJhci52aWV3Lm1lbnUuYWRkX3NlcGFyYXRvcigpCi0JCSNYWFggLi4uCi0JCXNlbGYuYmFyLnRrX21lbnVCYXIoc2VsZi5iYXIuZmlsZSwgc2VsZi5iYXIudmlldykKLQkJc2VsZi5mcmFtZSA9IEZyYW1lKHNlbGYsIHJlbGllZj1SQUlTRUQsIGJvcmRlcndpZHRoPTIpCi0JCXNlbGYuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD1CT1RIKQotCQlzZWxmLmhlYWRlciA9IFN0cmluZ1ZhcihzZWxmKQotCQlzZWxmLmZyYW1lLmxhYmVsID0gTGFiZWwoc2VsZi5mcmFtZSwgcmVsaWVmPUZMQVQsIGFuY2hvcj1OVywKLQkJCQkJIGJvcmRlcndpZHRoPTAsCi0JCQkJCSB0ZXh0dmFyaWFibGU9c2VsZi5oZWFkZXIpCi0JCXNlbGYuZnJhbWUubGFiZWwucGFjayhmaWxsPVgpCi0JCXNlbGYuZnJhbWUudnNjcm9sbCA9IFNjcm9sbGJhcihzZWxmLmZyYW1lLCBvcmllbnQ9VkVSVElDQUwpCi0JCXNlbGYuZnJhbWUubGlzdCA9IExpc3Rib3goc2VsZi5mcmFtZSwgcmVsaWVmPVNVTktFTiwKLQkJCQkJICBzZWxlY3RiYWNrZ3JvdW5kPScjZWVkNWI3JywKLQkJCQkJICBzZWxlY3Rib3JkZXJ3aWR0aD0wLAotCQkJCQkgIHlzY3JvbGw9c2VsZi5mcmFtZS52c2Nyb2xsLnNldCkKLQkJc2VsZi5mcmFtZS52c2Nyb2xsWydjb21tYW5kJ10gPSBzZWxmLmZyYW1lLmxpc3QueXZpZXcKLQkJc2VsZi5mcmFtZS52c2Nyb2xsLnBhY2soc2lkZT1SSUdIVCwgZmlsbD1ZKQotCQlzZWxmLmZyYW1lLmxpc3QucGFjayhleHBhbmQ9MSwgZmlsbD1CT1RIKQotCQlzZWxmLnVwZGF0ZSA9IEJ1dHRvbihzZWxmLCB0ZXh0PSJVcGRhdGUiLAotCQkJCSAgICAgY29tbWFuZD1zZWxmLmRvX3VwZGF0ZSkKLQkJc2VsZi51cGRhdGUucGFjayhleHBhbmQ9MSwgZmlsbD1YKQotCQlzZWxmLmZyYW1lLmxpc3QuYmluZCgnPE1vdGlvbj4nLCBzZWxmLmRvX21vdGlvbikKLQkJc2VsZi5mcmFtZS5saXN0LmJpbmQoJzxMZWF2ZT4nLCBzZWxmLmRvX2xlYXZlKQotCQlzZWxmLmZyYW1lLmxpc3QuYmluZCgnPDE+Jywgc2VsZi5kb18xKQotCQlzZWxmLmRvX3VwZGF0ZSgpCisgICAgIyBMaXN0IG9mIChuYW1lLCBvcHRpb24sIHBpZF9jb2x1bW4pCisgICAgZm9ybWF0X2xpc3QgPSBbKCdEZWZhdWx0JywgJycsIDApLAorICAgICAgICAgICAgICAgICAgICgnTG9uZycsICctbCcsIDIpLAorICAgICAgICAgICAgICAgICAgICgnVXNlcicsICctdScsIDEpLAorICAgICAgICAgICAgICAgICAgICgnSm9icycsICctaicsIDEpLAorICAgICAgICAgICAgICAgICAgICgnU2lnbmFsJywgJy1zJywgMSksCisgICAgICAgICAgICAgICAgICAgKCdNZW1vcnknLCAnLW0nLCAwKSwKKyAgICAgICAgICAgICAgICAgICAoJ1ZNJywgJy12JywgMCksCisgICAgICAgICAgICAgICAgICAgKCdIZXgnLCAnLVgnLCAwKV0KKyAgICBkZWYga2lsbChzZWxmLCBzZWxlY3RlZCk6CisgICAgICAgIGMgPSBzZWxmLmZvcm1hdF9saXN0W3NlbGYuZm9ybWF0LmdldCgpXVsyXQorICAgICAgICBwaWQgPSBzcGxpdChzZWxlY3RlZClbY10KKyAgICAgICAgb3Muc3lzdGVtKCdraWxsIC05ICcgKyBwaWQpCisgICAgICAgIHNlbGYuZG9fdXBkYXRlKCkKKyAgICBkZWYgZG9fdXBkYXRlKHNlbGYpOgorICAgICAgICBuYW1lLCBvcHRpb24sIGNvbHVtbiA9IHNlbGYuZm9ybWF0X2xpc3Rbc2VsZi5mb3JtYXQuZ2V0KCldCisgICAgICAgIHMgPSBjb21tYW5kcy5nZXRvdXRwdXQoJ3BzIC13ICcgKyBvcHRpb24pCisgICAgICAgIGxpc3QgPSBzcGxpdGZpZWxkcyhzLCAnXG4nKQorICAgICAgICBzZWxmLmhlYWRlci5zZXQobGlzdFswXSkKKyAgICAgICAgZGVsIGxpc3RbMF0KKyAgICAgICAgeSA9IHNlbGYuZnJhbWUudnNjcm9sbC5nZXQoKVswXQorICAgICAgICBzZWxmLmZyYW1lLmxpc3QuZGVsZXRlKDAsIEF0RW5kKCkpCisgICAgICAgIGZvciBsaW5lIGluIGxpc3Q6CisgICAgICAgICAgICBzZWxmLmZyYW1lLmxpc3QuaW5zZXJ0KDAsIGxpbmUpCisgICAgICAgIHNlbGYuZnJhbWUubGlzdC55dmlldyhpbnQoeSkpCisgICAgZGVmIGRvX21vdGlvbihzZWxmLCBlKToKKyAgICAgICAgZS53aWRnZXQuc2VsZWN0X2NsZWFyKDAsIEVORCkKKyAgICAgICAgZS53aWRnZXQuc2VsZWN0X3NldChlLndpZGdldC5uZWFyZXN0KGUueSkpCisgICAgZGVmIGRvX2xlYXZlKHNlbGYsIGUpOgorICAgICAgICBlLndpZGdldC5zZWxlY3RfY2xlYXIoMCwgRU5EKQorICAgIGRlZiBkb18xKHNlbGYsIGUpOgorICAgICAgICBzZWxmLmtpbGwoZS53aWRnZXQuZ2V0KGUud2lkZ2V0Lm5lYXJlc3QoZS55KSkpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmNuZik6CisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mKQorICAgICAgICBzZWxmLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5iYXIgPSBGcmFtZShzZWxmLCBuYW1lPSdiYXInLCByZWxpZWY9UkFJU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcndpZHRoPTIpCisgICAgICAgIHNlbGYuYmFyLnBhY2soZmlsbD1YKQorICAgICAgICBzZWxmLmJhci5maWxlID0gQmFyQnV0dG9uKHNlbGYuYmFyLCB0ZXh0PSdGaWxlJykKKyAgICAgICAgc2VsZi5iYXIuZmlsZS5tZW51LmFkZF9jb21tYW5kKAorICAgICAgICAgICAgICAgIGxhYmVsPSdRdWl0JywgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuYmFyLnZpZXcgPSBCYXJCdXR0b24oc2VsZi5iYXIsIHRleHQ9J1ZpZXcnKQorICAgICAgICBzZWxmLmZvcm1hdCA9IEludFZhcihzZWxmKQorICAgICAgICBzZWxmLmZvcm1hdC5zZXQoMikKKyAgICAgICAgZm9yIG51bSBpbiByYW5nZShsZW4oc2VsZi5mb3JtYXRfbGlzdCkpOgorICAgICAgICAgICAgc2VsZi5iYXIudmlldy5tZW51LmFkZF9yYWRpb2J1dHRvbigKKyAgICAgICAgICAgICAgICAgICAgbGFiZWw9c2VsZi5mb3JtYXRfbGlzdFtudW1dWzBdLAorICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuZG9fdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9bnVtKQorICAgICAgICAjc2VsZi5iYXIudmlldy5tZW51LmFkZF9zZXBhcmF0b3IoKQorICAgICAgICAjWFhYIC4uLgorICAgICAgICBzZWxmLmJhci50a19tZW51QmFyKHNlbGYuYmFyLmZpbGUsIHNlbGYuYmFyLnZpZXcpCisgICAgICAgIHNlbGYuZnJhbWUgPSBGcmFtZShzZWxmLCByZWxpZWY9UkFJU0VELCBib3JkZXJ3aWR0aD0yKQorICAgICAgICBzZWxmLmZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5oZWFkZXIgPSBTdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5mcmFtZS5sYWJlbCA9IExhYmVsKHNlbGYuZnJhbWUsIHJlbGllZj1GTEFULCBhbmNob3I9TlcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aD0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHZhcmlhYmxlPXNlbGYuaGVhZGVyKQorICAgICAgICBzZWxmLmZyYW1lLmxhYmVsLnBhY2soZmlsbD1YKQorICAgICAgICBzZWxmLmZyYW1lLnZzY3JvbGwgPSBTY3JvbGxiYXIoc2VsZi5mcmFtZSwgb3JpZW50PVZFUlRJQ0FMKQorICAgICAgICBzZWxmLmZyYW1lLmxpc3QgPSBMaXN0Ym94KHNlbGYuZnJhbWUsIHJlbGllZj1TVU5LRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YmFja2dyb3VuZD0nI2VlZDViNycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Ym9yZGVyd2lkdGg9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c2Nyb2xsPXNlbGYuZnJhbWUudnNjcm9sbC5zZXQpCisgICAgICAgIHNlbGYuZnJhbWUudnNjcm9sbFsnY29tbWFuZCddID0gc2VsZi5mcmFtZS5saXN0Lnl2aWV3CisgICAgICAgIHNlbGYuZnJhbWUudnNjcm9sbC5wYWNrKHNpZGU9UklHSFQsIGZpbGw9WSkKKyAgICAgICAgc2VsZi5mcmFtZS5saXN0LnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi51cGRhdGUgPSBCdXR0b24oc2VsZiwgdGV4dD0iVXBkYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLmRvX3VwZGF0ZSkKKyAgICAgICAgc2VsZi51cGRhdGUucGFjayhleHBhbmQ9MSwgZmlsbD1YKQorICAgICAgICBzZWxmLmZyYW1lLmxpc3QuYmluZCgnPE1vdGlvbj4nLCBzZWxmLmRvX21vdGlvbikKKyAgICAgICAgc2VsZi5mcmFtZS5saXN0LmJpbmQoJzxMZWF2ZT4nLCBzZWxmLmRvX2xlYXZlKQorICAgICAgICBzZWxmLmZyYW1lLmxpc3QuYmluZCgnPDE+Jywgc2VsZi5kb18xKQorICAgICAgICBzZWxmLmRvX3VwZGF0ZSgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0Ja2lsbCA9IEtpbGwoTm9uZSwgYm9yZGVyd2lkdGg9NSkKLQlraWxsLndpbmZvX3RvcGxldmVsKCkudGl0bGUoJ1RraW50ZXIgUHJvY2VzcyBLaWxsZXInKQotCWtpbGwud2luZm9fdG9wbGV2ZWwoKS5taW5zaXplKDEsIDEpCi0Ja2lsbC5tYWlubG9vcCgpCi0KKyAgICBraWxsID0gS2lsbChOb25lLCBib3JkZXJ3aWR0aD01KQorICAgIGtpbGwud2luZm9fdG9wbGV2ZWwoKS50aXRsZSgnVGtpbnRlciBQcm9jZXNzIEtpbGxlcicpCisgICAga2lsbC53aW5mb190b3BsZXZlbCgpLm1pbnNpemUoMSwgMSkKKyAgICBraWxsLm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9saXN0dHJlZS5weSBiL0RlbW8vdGtpbnRlci9ndWlkby9saXN0dHJlZS5weQppbmRleCA1MjNmMjA5Li5kMjhjZTQ5IDEwMDc1NQotLS0gYS9EZW1vL3RraW50ZXIvZ3VpZG8vbGlzdHRyZWUucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL2xpc3R0cmVlLnB5CkBAIC02LDMyICs2LDMyIEBACiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIAogZGVmIGxpc3R0cmVlKG1hc3RlciwgYXBwKToKLQlsaXN0ID0gTGlzdGJveChtYXN0ZXIsIG5hbWU9J2xpc3QnKQotCWxpc3QucGFjayhleHBhbmQ9MSwgZmlsbD1CT1RIKQotCWxpc3Rub2RlcyhsaXN0LCBhcHAsICcuJywgMCkKLQlyZXR1cm4gbGlzdAorICAgIGxpc3QgPSBMaXN0Ym94KG1hc3RlciwgbmFtZT0nbGlzdCcpCisgICAgbGlzdC5wYWNrKGV4cGFuZD0xLCBmaWxsPUJPVEgpCisgICAgbGlzdG5vZGVzKGxpc3QsIGFwcCwgJy4nLCAwKQorICAgIHJldHVybiBsaXN0CiAKIGRlZiBsaXN0bm9kZXMobGlzdCwgYXBwLCB3aWRnZXQsIGxldmVsKToKLQlrbGFzcyA9IGxpc3Quc2VuZChhcHAsICd3aW5mbycsICdjbGFzcycsIHdpZGdldCkKLSMjCWkgPSBzdHJpbmcucmluZGV4KHdpZGdldCwgJy4nKQotIyMJbGlzdC5pbnNlcnQoRU5ELCAnJXMlcyAoJXMpJyAlICgobGV2ZWwtMSkqJy4gICAnLCB3aWRnZXRbaTpdLCBrbGFzcykpCi0JbGlzdC5pbnNlcnQoRU5ELCAnJXMgKCVzKScgJSAod2lkZ2V0LCBrbGFzcykpCi0JY2hpbGRyZW4gPSBsaXN0LnRrLnNwbGl0bGlzdCgKLQkJbGlzdC5zZW5kKGFwcCwgJ3dpbmZvJywgJ2NoaWxkcmVuJywgd2lkZ2V0KSkKLQlmb3IgYyBpbiBjaGlsZHJlbjoKLQkJbGlzdG5vZGVzKGxpc3QsIGFwcCwgYywgbGV2ZWwrMSkKKyAgICBrbGFzcyA9IGxpc3Quc2VuZChhcHAsICd3aW5mbycsICdjbGFzcycsIHdpZGdldCkKKyMjICAgICAgaSA9IHN0cmluZy5yaW5kZXgod2lkZ2V0LCAnLicpCisjIyAgICAgIGxpc3QuaW5zZXJ0KEVORCwgJyVzJXMgKCVzKScgJSAoKGxldmVsLTEpKicuICAgJywgd2lkZ2V0W2k6XSwga2xhc3MpKQorICAgIGxpc3QuaW5zZXJ0KEVORCwgJyVzICglcyknICUgKHdpZGdldCwga2xhc3MpKQorICAgIGNoaWxkcmVuID0gbGlzdC50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBsaXN0LnNlbmQoYXBwLCAnd2luZm8nLCAnY2hpbGRyZW4nLCB3aWRnZXQpKQorICAgIGZvciBjIGluIGNoaWxkcmVuOgorICAgICAgICBsaXN0bm9kZXMobGlzdCwgYXBwLCBjLCBsZXZlbCsxKQogCiBkZWYgbWFpbigpOgotCWlmIG5vdCBzeXMuYXJndlsxOl06Ci0JCXN5cy5zdGRlcnIud3JpdGUoJ1VzYWdlOiBsaXN0dHJlZSBhcHBuYW1lXG4nKQotCQlzeXMuZXhpdCgyKQotCWFwcCA9IHN5cy5hcmd2WzFdCi0JdGsgPSBUaygpCi0JdGsubWluc2l6ZSgxLCAxKQotCWYgPSBGcmFtZSh0aywgbmFtZT0nZicpCi0JZi5wYWNrKGV4cGFuZD0xLCBmaWxsPUJPVEgpCi0JbGlzdCA9IGxpc3R0cmVlKGYsIGFwcCkKLQl0ay5tYWlubG9vcCgpCisgICAgaWYgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnVXNhZ2U6IGxpc3R0cmVlIGFwcG5hbWVcbicpCisgICAgICAgIHN5cy5leGl0KDIpCisgICAgYXBwID0gc3lzLmFyZ3ZbMV0KKyAgICB0ayA9IFRrKCkKKyAgICB0ay5taW5zaXplKDEsIDEpCisgICAgZiA9IEZyYW1lKHRrLCBuYW1lPSdmJykKKyAgICBmLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICBsaXN0ID0gbGlzdHRyZWUoZiwgYXBwKQorICAgIHRrLm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9tYm94LnB5IGIvRGVtby90a2ludGVyL2d1aWRvL21ib3gucHkKaW5kZXggNmQ3YTQxMC4uOWIxNmY2YiAxMDA3NTUKLS0tIGEvRGVtby90a2ludGVyL2d1aWRvL21ib3gucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL21ib3gucHkKQEAgLTE2LDI3MCArMTYsMjcwIEBACiBtYWlsYm94ID0gb3MuZW52aXJvblsnSE9NRSddICsgJy9NYWlsJwogCiBkZWYgbWFpbigpOgotCWdsb2JhbCByb290LCB0aywgdG9wLCBtaWQsIGJvdAotCWdsb2JhbCBmb2xkZXJib3gsIGZvbGRlcm1lbnUsIHNjYW5ib3gsIHNjYW5tZW51LCB2aWV3ZXIKLQlnbG9iYWwgZm9sZGVyLCBzZXEKLQlnbG9iYWwgbWgsIG1oZgorICAgIGdsb2JhbCByb290LCB0aywgdG9wLCBtaWQsIGJvdAorICAgIGdsb2JhbCBmb2xkZXJib3gsIGZvbGRlcm1lbnUsIHNjYW5ib3gsIHNjYW5tZW51LCB2aWV3ZXIKKyAgICBnbG9iYWwgZm9sZGVyLCBzZXEKKyAgICBnbG9iYWwgbWgsIG1oZgogCi0JIyBQYXJzZSBjb21tYW5kIGxpbmUgb3B0aW9ucworICAgICMgUGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKIAotCWZvbGRlciA9ICdpbmJveCcKLQlzZXEgPSAnYWxsJwotCXRyeToKLQkJb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnJykKLQlleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6Ci0JCXByaW50IG1zZwotCQlzeXMuZXhpdCgyKQotCWZvciBhcmcgaW4gYXJnczoKLQkJaWYgYXJnWzoxXSA9PSAnKyc6Ci0JCQlmb2xkZXIgPSBhcmdbMTpdCi0JCWVsc2U6Ci0JCQlzZXEgPSBhcmcKKyAgICBmb2xkZXIgPSAnaW5ib3gnCisgICAgc2VxID0gJ2FsbCcKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJycpCisgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOgorICAgICAgICBwcmludCBtc2cKKyAgICAgICAgc3lzLmV4aXQoMikKKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIGlmIGFyZ1s6MV0gPT0gJysnOgorICAgICAgICAgICAgZm9sZGVyID0gYXJnWzE6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VxID0gYXJnCiAKLQkjIEluaXRpYWxpemUgTUgKKyAgICAjIEluaXRpYWxpemUgTUgKIAotCW1oID0gbWhsaWIuTUgoKQotCW1oZiA9IG1oLm9wZW5mb2xkZXIoZm9sZGVyKQorICAgIG1oID0gbWhsaWIuTUgoKQorICAgIG1oZiA9IG1oLm9wZW5mb2xkZXIoZm9sZGVyKQogCi0JIyBCdWlsZCB3aWRnZXQgaGllcmFyY2h5CisgICAgIyBCdWlsZCB3aWRnZXQgaGllcmFyY2h5CiAKLQlyb290ID0gVGsoKQotCXRrID0gcm9vdC50aworICAgIHJvb3QgPSBUaygpCisgICAgdGsgPSByb290LnRrCiAKLQl0b3AgPSBGcmFtZShyb290KQotCXRvcC5wYWNrKHsnZXhwYW5kJzogMSwgJ2ZpbGwnOiAnYm90aCd9KQorICAgIHRvcCA9IEZyYW1lKHJvb3QpCisgICAgdG9wLnBhY2soeydleHBhbmQnOiAxLCAnZmlsbCc6ICdib3RoJ30pCiAKLQkjIEJ1aWxkIHJpZ2h0IHBhcnQ6IGZvbGRlciBsaXN0CisgICAgIyBCdWlsZCByaWdodCBwYXJ0OiBmb2xkZXIgbGlzdAogCi0JcmlnaHQgPSBGcmFtZSh0b3ApCi0JcmlnaHQucGFjayh7J2ZpbGwnOiAneScsICdzaWRlJzogJ3JpZ2h0J30pCisgICAgcmlnaHQgPSBGcmFtZSh0b3ApCisgICAgcmlnaHQucGFjayh7J2ZpbGwnOiAneScsICdzaWRlJzogJ3JpZ2h0J30pCiAKLQlmb2xkZXJiYXIgPSBTY3JvbGxiYXIocmlnaHQsIHsncmVsaWVmJzogJ3N1bmtlbicsICdiZCc6IDJ9KQotCWZvbGRlcmJhci5wYWNrKHsnZmlsbCc6ICd5JywgJ3NpZGUnOiAncmlnaHQnfSkKKyAgICBmb2xkZXJiYXIgPSBTY3JvbGxiYXIocmlnaHQsIHsncmVsaWVmJzogJ3N1bmtlbicsICdiZCc6IDJ9KQorICAgIGZvbGRlcmJhci5wYWNrKHsnZmlsbCc6ICd5JywgJ3NpZGUnOiAncmlnaHQnfSkKIAotCWZvbGRlcmJveCA9IExpc3Rib3gocmlnaHQsIHsnZXhwb3J0c2VsZWN0aW9uJzogMH0pCi0JZm9sZGVyYm94LnBhY2soeydleHBhbmQnOiAxLCAnZmlsbCc6ICdib3RoJywgJ3NpZGUnOiAnbGVmdCd9KQorICAgIGZvbGRlcmJveCA9IExpc3Rib3gocmlnaHQsIHsnZXhwb3J0c2VsZWN0aW9uJzogMH0pCisgICAgZm9sZGVyYm94LnBhY2soeydleHBhbmQnOiAxLCAnZmlsbCc6ICdib3RoJywgJ3NpZGUnOiAnbGVmdCd9KQogCi0JZm9sZGVybWVudSA9IE1lbnUocm9vdCkKLQlmb2xkZXJtZW51LmFkZCgnY29tbWFuZCcsCi0JCSAgICAgICB7J2xhYmVsJzogJ09wZW4gRm9sZGVyJywKLQkJCSdjb21tYW5kJzogb3Blbl9mb2xkZXJ9KQotCWZvbGRlcm1lbnUuYWRkKCdzZXBhcmF0b3InKQotCWZvbGRlcm1lbnUuYWRkKCdjb21tYW5kJywKLQkJICAgICAgIHsnbGFiZWwnOiAnUXVpdCcsCi0JCQknY29tbWFuZCc6ICdleGl0J30pCi0JZm9sZGVybWVudS5iaW5kKCc8QnV0dG9uUmVsZWFzZS0zPicsIGZvbGRlcl91bnBvc3QpCisgICAgZm9sZGVybWVudSA9IE1lbnUocm9vdCkKKyAgICBmb2xkZXJtZW51LmFkZCgnY29tbWFuZCcsCisgICAgICAgICAgICAgICAgICAgeydsYWJlbCc6ICdPcGVuIEZvbGRlcicsCisgICAgICAgICAgICAgICAgICAgICdjb21tYW5kJzogb3Blbl9mb2xkZXJ9KQorICAgIGZvbGRlcm1lbnUuYWRkKCdzZXBhcmF0b3InKQorICAgIGZvbGRlcm1lbnUuYWRkKCdjb21tYW5kJywKKyAgICAgICAgICAgICAgICAgICB7J2xhYmVsJzogJ1F1aXQnLAorICAgICAgICAgICAgICAgICAgICAnY29tbWFuZCc6ICdleGl0J30pCisgICAgZm9sZGVybWVudS5iaW5kKCc8QnV0dG9uUmVsZWFzZS0zPicsIGZvbGRlcl91bnBvc3QpCiAKLQlmb2xkZXJib3hbJ3lzY3JvbGxjb21tYW5kJ10gPSAoZm9sZGVyYmFyLCAnc2V0JykKLQlmb2xkZXJiYXJbJ2NvbW1hbmQnXSA9IChmb2xkZXJib3gsICd5dmlldycpCi0JZm9sZGVyYm94LmJpbmQoJzxEb3VibGUtMT4nLCBvcGVuX2ZvbGRlciwgMSkKLQlmb2xkZXJib3guYmluZCgnPDM+JywgZm9sZGVyX3Bvc3QpCisgICAgZm9sZGVyYm94Wyd5c2Nyb2xsY29tbWFuZCddID0gKGZvbGRlcmJhciwgJ3NldCcpCisgICAgZm9sZGVyYmFyWydjb21tYW5kJ10gPSAoZm9sZGVyYm94LCAneXZpZXcnKQorICAgIGZvbGRlcmJveC5iaW5kKCc8RG91YmxlLTE+Jywgb3Blbl9mb2xkZXIsIDEpCisgICAgZm9sZGVyYm94LmJpbmQoJzwzPicsIGZvbGRlcl9wb3N0KQogCi0JIyBCdWlsZCBsZWZ0IHBhcnQ6IHNjYW4gbGlzdAorICAgICMgQnVpbGQgbGVmdCBwYXJ0OiBzY2FuIGxpc3QKIAotCWxlZnQgPSBGcmFtZSh0b3ApCi0JbGVmdC5wYWNrKHsnZXhwYW5kJzogMSwgJ2ZpbGwnOiAnYm90aCcsICdzaWRlJzogJ2xlZnQnfSkKKyAgICBsZWZ0ID0gRnJhbWUodG9wKQorICAgIGxlZnQucGFjayh7J2V4cGFuZCc6IDEsICdmaWxsJzogJ2JvdGgnLCAnc2lkZSc6ICdsZWZ0J30pCiAKLQlzY2FuYmFyID0gU2Nyb2xsYmFyKGxlZnQsIHsncmVsaWVmJzogJ3N1bmtlbicsICdiZCc6IDJ9KQotCXNjYW5iYXIucGFjayh7J2ZpbGwnOiAneScsICdzaWRlJzogJ3JpZ2h0J30pCisgICAgc2NhbmJhciA9IFNjcm9sbGJhcihsZWZ0LCB7J3JlbGllZic6ICdzdW5rZW4nLCAnYmQnOiAyfSkKKyAgICBzY2FuYmFyLnBhY2soeydmaWxsJzogJ3knLCAnc2lkZSc6ICdyaWdodCd9KQogCi0Jc2NhbmJveCA9IExpc3Rib3gobGVmdCwgeydmb250JzogJ2ZpeGVkJ30pCi0Jc2NhbmJveC5wYWNrKHsnZXhwYW5kJzogMSwgJ2ZpbGwnOiAnYm90aCcsICdzaWRlJzogJ2xlZnQnfSkKKyAgICBzY2FuYm94ID0gTGlzdGJveChsZWZ0LCB7J2ZvbnQnOiAnZml4ZWQnfSkKKyAgICBzY2FuYm94LnBhY2soeydleHBhbmQnOiAxLCAnZmlsbCc6ICdib3RoJywgJ3NpZGUnOiAnbGVmdCd9KQogCi0Jc2Nhbm1lbnUgPSBNZW51KHJvb3QpCi0Jc2Nhbm1lbnUuYWRkKCdjb21tYW5kJywKLQkJICAgICB7J2xhYmVsJzogJ09wZW4gTWVzc2FnZScsCi0JCSAgICAgICdjb21tYW5kJzogb3Blbl9tZXNzYWdlfSkKLQlzY2FubWVudS5hZGQoJ2NvbW1hbmQnLAotCQkgICAgIHsnbGFiZWwnOiAnUmVtb3ZlIE1lc3NhZ2UnLAotCQkgICAgICAnY29tbWFuZCc6IHJlbW92ZV9tZXNzYWdlfSkKLQlzY2FubWVudS5hZGQoJ2NvbW1hbmQnLAotCQkgICAgIHsnbGFiZWwnOiAnUmVmaWxlIE1lc3NhZ2UnLAotCQkgICAgICAnY29tbWFuZCc6IHJlZmlsZV9tZXNzYWdlfSkKLQlzY2FubWVudS5hZGQoJ3NlcGFyYXRvcicpCi0Jc2Nhbm1lbnUuYWRkKCdjb21tYW5kJywKLQkJICAgICB7J2xhYmVsJzogJ1F1aXQnLAotCQkgICAgICAnY29tbWFuZCc6ICdleGl0J30pCi0Jc2Nhbm1lbnUuYmluZCgnPEJ1dHRvblJlbGVhc2UtMz4nLCBzY2FuX3VucG9zdCkKKyAgICBzY2FubWVudSA9IE1lbnUocm9vdCkKKyAgICBzY2FubWVudS5hZGQoJ2NvbW1hbmQnLAorICAgICAgICAgICAgICAgICB7J2xhYmVsJzogJ09wZW4gTWVzc2FnZScsCisgICAgICAgICAgICAgICAgICAnY29tbWFuZCc6IG9wZW5fbWVzc2FnZX0pCisgICAgc2Nhbm1lbnUuYWRkKCdjb21tYW5kJywKKyAgICAgICAgICAgICAgICAgeydsYWJlbCc6ICdSZW1vdmUgTWVzc2FnZScsCisgICAgICAgICAgICAgICAgICAnY29tbWFuZCc6IHJlbW92ZV9tZXNzYWdlfSkKKyAgICBzY2FubWVudS5hZGQoJ2NvbW1hbmQnLAorICAgICAgICAgICAgICAgICB7J2xhYmVsJzogJ1JlZmlsZSBNZXNzYWdlJywKKyAgICAgICAgICAgICAgICAgICdjb21tYW5kJzogcmVmaWxlX21lc3NhZ2V9KQorICAgIHNjYW5tZW51LmFkZCgnc2VwYXJhdG9yJykKKyAgICBzY2FubWVudS5hZGQoJ2NvbW1hbmQnLAorICAgICAgICAgICAgICAgICB7J2xhYmVsJzogJ1F1aXQnLAorICAgICAgICAgICAgICAgICAgJ2NvbW1hbmQnOiAnZXhpdCd9KQorICAgIHNjYW5tZW51LmJpbmQoJzxCdXR0b25SZWxlYXNlLTM+Jywgc2Nhbl91bnBvc3QpCiAKLQlzY2FuYm94Wyd5c2Nyb2xsY29tbWFuZCddID0gKHNjYW5iYXIsICdzZXQnKQotCXNjYW5iYXJbJ2NvbW1hbmQnXSA9IChzY2FuYm94LCAneXZpZXcnKQotCXNjYW5ib3guYmluZCgnPERvdWJsZS0xPicsIG9wZW5fbWVzc2FnZSkKLQlzY2FuYm94LmJpbmQoJzwzPicsIHNjYW5fcG9zdCkKKyAgICBzY2FuYm94Wyd5c2Nyb2xsY29tbWFuZCddID0gKHNjYW5iYXIsICdzZXQnKQorICAgIHNjYW5iYXJbJ2NvbW1hbmQnXSA9IChzY2FuYm94LCAneXZpZXcnKQorICAgIHNjYW5ib3guYmluZCgnPERvdWJsZS0xPicsIG9wZW5fbWVzc2FnZSkKKyAgICBzY2FuYm94LmJpbmQoJzwzPicsIHNjYW5fcG9zdCkKIAotCSMgU2VwYXJhdG9yIGJldHdlZW4gbWlkZGxlIGFuZCBib3R0b20gcGFydAorICAgICMgU2VwYXJhdG9yIGJldHdlZW4gbWlkZGxlIGFuZCBib3R0b20gcGFydAogCi0JcnVsZTIgPSBGcmFtZShyb290LCB7J2JnJzogJ2JsYWNrJ30pCi0JcnVsZTIucGFjayh7J2ZpbGwnOiAneCd9KQorICAgIHJ1bGUyID0gRnJhbWUocm9vdCwgeydiZyc6ICdibGFjayd9KQorICAgIHJ1bGUyLnBhY2soeydmaWxsJzogJ3gnfSkKIAotCSMgQnVpbGQgYm90dG9tIHBhcnQ6IGN1cnJlbnQgbWVzc2FnZQorICAgICMgQnVpbGQgYm90dG9tIHBhcnQ6IGN1cnJlbnQgbWVzc2FnZQogCi0JYm90ID0gRnJhbWUocm9vdCkKLQlib3QucGFjayh7J2V4cGFuZCc6IDEsICdmaWxsJzogJ2JvdGgnfSkKLQkjCi0Jdmlld2VyID0gTm9uZQorICAgIGJvdCA9IEZyYW1lKHJvb3QpCisgICAgYm90LnBhY2soeydleHBhbmQnOiAxLCAnZmlsbCc6ICdib3RoJ30pCisgICAgIworICAgIHZpZXdlciA9IE5vbmUKIAotCSMgV2luZG93IG1hbmFnZXIgY29tbWFuZHMKKyAgICAjIFdpbmRvdyBtYW5hZ2VyIGNvbW1hbmRzCiAKLQlyb290Lm1pbnNpemUoODAwLCAxKSAjIE1ha2Ugd2luZG93IHJlc2l6YWJsZQorICAgIHJvb3QubWluc2l6ZSg4MDAsIDEpICMgTWFrZSB3aW5kb3cgcmVzaXphYmxlCiAKLQkjIEZpbGwgZm9sZGVyYm94IHdpdGggdGV4dAorICAgICMgRmlsbCBmb2xkZXJib3ggd2l0aCB0ZXh0CiAKLQlzZXRmb2xkZXJzKCkKKyAgICBzZXRmb2xkZXJzKCkKIAotCSMgRmlsbCBzY2FuYm94IHdpdGggdGV4dAorICAgICMgRmlsbCBzY2FuYm94IHdpdGggdGV4dAogCi0JcmVzY2FuKCkKKyAgICByZXNjYW4oKQogCi0JIyBFbnRlciBtYWlubG9vcAorICAgICMgRW50ZXIgbWFpbmxvb3AKIAotCXJvb3QubWFpbmxvb3AoKQorICAgIHJvb3QubWFpbmxvb3AoKQogCiBkZWYgZm9sZGVyX3Bvc3QoZSk6Ci0JeCwgeSA9IGUueF9yb290LCBlLnlfcm9vdAotCWZvbGRlcm1lbnUucG9zdCh4IC0gMTAsIHkgLSAxMCkKLQlmb2xkZXJtZW51LmdyYWJfc2V0KCkKKyAgICB4LCB5ID0gZS54X3Jvb3QsIGUueV9yb290CisgICAgZm9sZGVybWVudS5wb3N0KHggLSAxMCwgeSAtIDEwKQorICAgIGZvbGRlcm1lbnUuZ3JhYl9zZXQoKQogCiBkZWYgZm9sZGVyX3VucG9zdChlKToKLQl0ay5jYWxsKCd1cGRhdGUnLCAnaWRsZXRhc2tzJykKLQlmb2xkZXJtZW51LmdyYWJfcmVsZWFzZSgpCi0JZm9sZGVybWVudS51bnBvc3QoKQotCWZvbGRlcm1lbnUuaW52b2tlKCdhY3RpdmUnKQorICAgIHRrLmNhbGwoJ3VwZGF0ZScsICdpZGxldGFza3MnKQorICAgIGZvbGRlcm1lbnUuZ3JhYl9yZWxlYXNlKCkKKyAgICBmb2xkZXJtZW51LnVucG9zdCgpCisgICAgZm9sZGVybWVudS5pbnZva2UoJ2FjdGl2ZScpCiAKIGRlZiBzY2FuX3Bvc3QoZSk6Ci0JeCwgeSA9IGUueF9yb290LCBlLnlfcm9vdAotCXNjYW5tZW51LnBvc3QoeCAtIDEwLCB5IC0gMTApCi0Jc2Nhbm1lbnUuZ3JhYl9zZXQoKQorICAgIHgsIHkgPSBlLnhfcm9vdCwgZS55X3Jvb3QKKyAgICBzY2FubWVudS5wb3N0KHggLSAxMCwgeSAtIDEwKQorICAgIHNjYW5tZW51LmdyYWJfc2V0KCkKIAogZGVmIHNjYW5fdW5wb3N0KGUpOgotCXRrLmNhbGwoJ3VwZGF0ZScsICdpZGxldGFza3MnKQotCXNjYW5tZW51LmdyYWJfcmVsZWFzZSgpCi0Jc2Nhbm1lbnUudW5wb3N0KCkKLQlzY2FubWVudS5pbnZva2UoJ2FjdGl2ZScpCisgICAgdGsuY2FsbCgndXBkYXRlJywgJ2lkbGV0YXNrcycpCisgICAgc2Nhbm1lbnUuZ3JhYl9yZWxlYXNlKCkKKyAgICBzY2FubWVudS51bnBvc3QoKQorICAgIHNjYW5tZW51Lmludm9rZSgnYWN0aXZlJykKIAogc2NhbnBhcnNlciA9IHJlZ2V4LmNvbXBpbGUoJ14gKlwoWzAtOV0rXCknKQogCiBkZWYgb3Blbl9mb2xkZXIoZT1Ob25lKToKLQlnbG9iYWwgZm9sZGVyLCBtaGYKLQlzZWwgPSBmb2xkZXJib3guY3Vyc2VsZWN0aW9uKCkKLQlpZiBsZW4oc2VsKSAhPSAxOgotCQlpZiBsZW4oc2VsKSA+IDE6Ci0JCQltc2cgPSAiUGxlYXNlIG9wZW4gb25lIGZvbGRlciBhdCBhIHRpbWUiCi0JCWVsc2U6Ci0JCQltc2cgPSAiUGxlYXNlIHNlbGVjdCBhIGZvbGRlciB0byBvcGVuIgotCQlkaWFsb2cocm9vdCwgIkNhbid0IE9wZW4gRm9sZGVyIiwgbXNnLCAiIiwgMCwgIk9LIikKLQkJcmV0dXJuCi0JaSA9IHNlbFswXQotCWZvbGRlciA9IGZvbGRlcmJveC5nZXQoaSkKLQltaGYgPSBtaC5vcGVuZm9sZGVyKGZvbGRlcikKLQlyZXNjYW4oKQorICAgIGdsb2JhbCBmb2xkZXIsIG1oZgorICAgIHNlbCA9IGZvbGRlcmJveC5jdXJzZWxlY3Rpb24oKQorICAgIGlmIGxlbihzZWwpICE9IDE6CisgICAgICAgIGlmIGxlbihzZWwpID4gMToKKyAgICAgICAgICAgIG1zZyA9ICJQbGVhc2Ugb3BlbiBvbmUgZm9sZGVyIGF0IGEgdGltZSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyA9ICJQbGVhc2Ugc2VsZWN0IGEgZm9sZGVyIHRvIG9wZW4iCisgICAgICAgIGRpYWxvZyhyb290LCAiQ2FuJ3QgT3BlbiBGb2xkZXIiLCBtc2csICIiLCAwLCAiT0siKQorICAgICAgICByZXR1cm4KKyAgICBpID0gc2VsWzBdCisgICAgZm9sZGVyID0gZm9sZGVyYm94LmdldChpKQorICAgIG1oZiA9IG1oLm9wZW5mb2xkZXIoZm9sZGVyKQorICAgIHJlc2NhbigpCiAKIGRlZiBvcGVuX21lc3NhZ2UoZT1Ob25lKToKLQlnbG9iYWwgdmlld2VyCi0Jc2VsID0gc2NhbmJveC5jdXJzZWxlY3Rpb24oKQotCWlmIGxlbihzZWwpICE9IDE6Ci0JCWlmIGxlbihzZWwpID4gMToKLQkJCW1zZyA9ICJQbGVhc2Ugb3BlbiBvbmUgbWVzc2FnZSBhdCBhIHRpbWUiCi0JCWVsc2U6Ci0JCQltc2cgPSAiUGxlYXNlIHNlbGVjdCBhIG1lc3NhZ2UgdG8gb3BlbiIKLQkJZGlhbG9nKHJvb3QsICJDYW4ndCBPcGVuIE1lc3NhZ2UiLCBtc2csICIiLCAwLCAiT0siKQotCQlyZXR1cm4KLQljdXJzb3IgPSBzY2FuYm94WydjdXJzb3InXQotCXNjYW5ib3hbJ2N1cnNvciddID0gJ3dhdGNoJwotCXRrLmNhbGwoJ3VwZGF0ZScsICdpZGxldGFza3MnKQotCWkgPSBzZWxbMF0KLQlsaW5lID0gc2NhbmJveC5nZXQoaSkKLQlpZiBzY2FucGFyc2VyLm1hdGNoKGxpbmUpID49IDA6Ci0JCW51bSA9IHN0cmluZy5hdG9pKHNjYW5wYXJzZXIuZ3JvdXAoMSkpCi0JCW0gPSBtaGYub3Blbm1lc3NhZ2UobnVtKQotCQlpZiB2aWV3ZXI6IHZpZXdlci5kZXN0cm95KCkKLQkJZnJvbSBNaW1lVmlld2VyIGltcG9ydCBNaW1lVmlld2VyCi0JCXZpZXdlciA9IE1pbWVWaWV3ZXIoYm90LCAnKyVzLyVkJyAlIChmb2xkZXIsIG51bSksIG0pCi0JCXZpZXdlci5wYWNrKCkKLQkJdmlld2VyLnNob3coKQotCXNjYW5ib3hbJ2N1cnNvciddID0gY3Vyc29yCisgICAgZ2xvYmFsIHZpZXdlcgorICAgIHNlbCA9IHNjYW5ib3guY3Vyc2VsZWN0aW9uKCkKKyAgICBpZiBsZW4oc2VsKSAhPSAxOgorICAgICAgICBpZiBsZW4oc2VsKSA+IDE6CisgICAgICAgICAgICBtc2cgPSAiUGxlYXNlIG9wZW4gb25lIG1lc3NhZ2UgYXQgYSB0aW1lIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXNnID0gIlBsZWFzZSBzZWxlY3QgYSBtZXNzYWdlIHRvIG9wZW4iCisgICAgICAgIGRpYWxvZyhyb290LCAiQ2FuJ3QgT3BlbiBNZXNzYWdlIiwgbXNnLCAiIiwgMCwgIk9LIikKKyAgICAgICAgcmV0dXJuCisgICAgY3Vyc29yID0gc2NhbmJveFsnY3Vyc29yJ10KKyAgICBzY2FuYm94WydjdXJzb3InXSA9ICd3YXRjaCcKKyAgICB0ay5jYWxsKCd1cGRhdGUnLCAnaWRsZXRhc2tzJykKKyAgICBpID0gc2VsWzBdCisgICAgbGluZSA9IHNjYW5ib3guZ2V0KGkpCisgICAgaWYgc2NhbnBhcnNlci5tYXRjaChsaW5lKSA+PSAwOgorICAgICAgICBudW0gPSBzdHJpbmcuYXRvaShzY2FucGFyc2VyLmdyb3VwKDEpKQorICAgICAgICBtID0gbWhmLm9wZW5tZXNzYWdlKG51bSkKKyAgICAgICAgaWYgdmlld2VyOiB2aWV3ZXIuZGVzdHJveSgpCisgICAgICAgIGZyb20gTWltZVZpZXdlciBpbXBvcnQgTWltZVZpZXdlcgorICAgICAgICB2aWV3ZXIgPSBNaW1lVmlld2VyKGJvdCwgJyslcy8lZCcgJSAoZm9sZGVyLCBudW0pLCBtKQorICAgICAgICB2aWV3ZXIucGFjaygpCisgICAgICAgIHZpZXdlci5zaG93KCkKKyAgICBzY2FuYm94WydjdXJzb3InXSA9IGN1cnNvcgogCiBkZWYgaW50ZXJlc3RpbmdoZWFkZXIoaGVhZGVyKToKLQlyZXR1cm4gaGVhZGVyICE9ICdyZWNlaXZlZCcKKyAgICByZXR1cm4gaGVhZGVyICE9ICdyZWNlaXZlZCcKIAogZGVmIHJlbW92ZV9tZXNzYWdlKGU9Tm9uZSk6Ci0JaXRvcCA9IHNjYW5ib3gubmVhcmVzdCgwKQotCXNlbCA9IHNjYW5ib3guY3Vyc2VsZWN0aW9uKCkKLQlpZiBub3Qgc2VsOgotCQlkaWFsb2cocm9vdCwgIk5vIE1lc3NhZ2UgVG8gUmVtb3ZlIiwKLQkJICAgICAgICJQbGVhc2Ugc2VsZWN0IGEgbWVzc2FnZSB0byByZW1vdmUiLCAiIiwgMCwgIk9LIikKLQkJcmV0dXJuCi0JdG9kbyA9IFtdCi0JZm9yIGkgaW4gc2VsOgotCQlsaW5lID0gc2NhbmJveC5nZXQoaSkKLQkJaWYgc2NhbnBhcnNlci5tYXRjaChsaW5lKSA+PSAwOgotCQkJdG9kby5hcHBlbmQoc3RyaW5nLmF0b2koc2NhbnBhcnNlci5ncm91cCgxKSkpCi0JbWhmLnJlbW92ZW1lc3NhZ2VzKHRvZG8pCi0JcmVzY2FuKCkKLQlmaXhmb2N1cyhtaW4odG9kbyksIGl0b3ApCisgICAgaXRvcCA9IHNjYW5ib3gubmVhcmVzdCgwKQorICAgIHNlbCA9IHNjYW5ib3guY3Vyc2VsZWN0aW9uKCkKKyAgICBpZiBub3Qgc2VsOgorICAgICAgICBkaWFsb2cocm9vdCwgIk5vIE1lc3NhZ2UgVG8gUmVtb3ZlIiwKKyAgICAgICAgICAgICAgICJQbGVhc2Ugc2VsZWN0IGEgbWVzc2FnZSB0byByZW1vdmUiLCAiIiwgMCwgIk9LIikKKyAgICAgICAgcmV0dXJuCisgICAgdG9kbyA9IFtdCisgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICBsaW5lID0gc2NhbmJveC5nZXQoaSkKKyAgICAgICAgaWYgc2NhbnBhcnNlci5tYXRjaChsaW5lKSA+PSAwOgorICAgICAgICAgICAgdG9kby5hcHBlbmQoc3RyaW5nLmF0b2koc2NhbnBhcnNlci5ncm91cCgxKSkpCisgICAgbWhmLnJlbW92ZW1lc3NhZ2VzKHRvZG8pCisgICAgcmVzY2FuKCkKKyAgICBmaXhmb2N1cyhtaW4odG9kbyksIGl0b3ApCiAKIGxhc3RyZWZpbGUgPSAnJwogdG9mb2xkZXIgPSBOb25lCiBkZWYgcmVmaWxlX21lc3NhZ2UoZT1Ob25lKToKLQlnbG9iYWwgbGFzdHJlZmlsZSwgdG9mb2xkZXIKLQlpdG9wID0gc2NhbmJveC5uZWFyZXN0KDApCi0Jc2VsID0gc2NhbmJveC5jdXJzZWxlY3Rpb24oKQotCWlmIG5vdCBzZWw6Ci0JCWRpYWxvZyhyb290LCAiTm8gTWVzc2FnZSBUbyBSZWZpbGUiLAotCQkgICAgICAgIlBsZWFzZSBzZWxlY3QgYSBtZXNzYWdlIHRvIHJlZmlsZSIsICIiLCAwLCAiT0siKQotCQlyZXR1cm4KLQlmb2xkZXJzZWwgPSBmb2xkZXJib3guY3Vyc2VsZWN0aW9uKCkKLQlpZiBsZW4oZm9sZGVyc2VsKSAhPSAxOgotCQlpZiBub3QgZm9sZGVyc2VsOgotCQkJbXNnID0gIlBsZWFzZSBzZWxlY3QgYSBmb2xkZXIgdG8gcmVmaWxlIHRvIgotCQllbHNlOgotCQkJbXNnID0gIlBsZWFzZSBzZWxlY3QgZXhhY3RseSBvbmUgZm9sZGVyIHRvIHJlZmlsZSB0byIKLQkJZGlhbG9nKHJvb3QsICJObyBGb2xkZXIgVG8gUmVmaWxlIiwgbXNnLCAiIiwgMCwgIk9LIikKLQkJcmV0dXJuCi0JcmVmaWxldG8gPSBmb2xkZXJib3guZ2V0KGZvbGRlcnNlbFswXSkKLQl0b2RvID0gW10KLQlmb3IgaSBpbiBzZWw6Ci0JCWxpbmUgPSBzY2FuYm94LmdldChpKQotCQlpZiBzY2FucGFyc2VyLm1hdGNoKGxpbmUpID49IDA6Ci0JCQl0b2RvLmFwcGVuZChzdHJpbmcuYXRvaShzY2FucGFyc2VyLmdyb3VwKDEpKSkKLQlpZiBsYXN0cmVmaWxlICE9IHJlZmlsZXRvIG9yIG5vdCB0b2ZvbGRlcjoKLQkJbGFzdHJlZmlsZSA9IHJlZmlsZXRvCi0JCXRvZm9sZGVyID0gTm9uZQotCQl0b2ZvbGRlciA9IG1oLm9wZW5mb2xkZXIobGFzdHJlZmlsZSkKLQltaGYucmVmaWxlbWVzc2FnZXModG9kbywgdG9mb2xkZXIpCi0JcmVzY2FuKCkKLQlmaXhmb2N1cyhtaW4odG9kbyksIGl0b3ApCisgICAgZ2xvYmFsIGxhc3RyZWZpbGUsIHRvZm9sZGVyCisgICAgaXRvcCA9IHNjYW5ib3gubmVhcmVzdCgwKQorICAgIHNlbCA9IHNjYW5ib3guY3Vyc2VsZWN0aW9uKCkKKyAgICBpZiBub3Qgc2VsOgorICAgICAgICBkaWFsb2cocm9vdCwgIk5vIE1lc3NhZ2UgVG8gUmVmaWxlIiwKKyAgICAgICAgICAgICAgICJQbGVhc2Ugc2VsZWN0IGEgbWVzc2FnZSB0byByZWZpbGUiLCAiIiwgMCwgIk9LIikKKyAgICAgICAgcmV0dXJuCisgICAgZm9sZGVyc2VsID0gZm9sZGVyYm94LmN1cnNlbGVjdGlvbigpCisgICAgaWYgbGVuKGZvbGRlcnNlbCkgIT0gMToKKyAgICAgICAgaWYgbm90IGZvbGRlcnNlbDoKKyAgICAgICAgICAgIG1zZyA9ICJQbGVhc2Ugc2VsZWN0IGEgZm9sZGVyIHRvIHJlZmlsZSB0byIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyA9ICJQbGVhc2Ugc2VsZWN0IGV4YWN0bHkgb25lIGZvbGRlciB0byByZWZpbGUgdG8iCisgICAgICAgIGRpYWxvZyhyb290LCAiTm8gRm9sZGVyIFRvIFJlZmlsZSIsIG1zZywgIiIsIDAsICJPSyIpCisgICAgICAgIHJldHVybgorICAgIHJlZmlsZXRvID0gZm9sZGVyYm94LmdldChmb2xkZXJzZWxbMF0pCisgICAgdG9kbyA9IFtdCisgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICBsaW5lID0gc2NhbmJveC5nZXQoaSkKKyAgICAgICAgaWYgc2NhbnBhcnNlci5tYXRjaChsaW5lKSA+PSAwOgorICAgICAgICAgICAgdG9kby5hcHBlbmQoc3RyaW5nLmF0b2koc2NhbnBhcnNlci5ncm91cCgxKSkpCisgICAgaWYgbGFzdHJlZmlsZSAhPSByZWZpbGV0byBvciBub3QgdG9mb2xkZXI6CisgICAgICAgIGxhc3RyZWZpbGUgPSByZWZpbGV0bworICAgICAgICB0b2ZvbGRlciA9IE5vbmUKKyAgICAgICAgdG9mb2xkZXIgPSBtaC5vcGVuZm9sZGVyKGxhc3RyZWZpbGUpCisgICAgbWhmLnJlZmlsZW1lc3NhZ2VzKHRvZG8sIHRvZm9sZGVyKQorICAgIHJlc2NhbigpCisgICAgZml4Zm9jdXMobWluKHRvZG8pLCBpdG9wKQogCiBkZWYgZml4Zm9jdXMobmVhciwgaXRvcCk6Ci0JbiA9IHNjYW5ib3guc2l6ZSgpCi0JZm9yIGkgaW4gcmFuZ2Uobik6Ci0JCWxpbmUgPSBzY2FuYm94LmdldChyZXByKGkpKQotCQlpZiBzY2FucGFyc2VyLm1hdGNoKGxpbmUpID49IDA6Ci0JCQludW0gPSBzdHJpbmcuYXRvaShzY2FucGFyc2VyLmdyb3VwKDEpKQotCQkJaWYgbnVtID49IG5lYXI6Ci0JCQkJYnJlYWsKLQllbHNlOgotCQlpID0gJ2VuZCcKLQlzY2FuYm94LnNlbGVjdF9mcm9tKGkpCi0Jc2NhbmJveC55dmlldyhpdG9wKQorICAgIG4gPSBzY2FuYm94LnNpemUoKQorICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICBsaW5lID0gc2NhbmJveC5nZXQocmVwcihpKSkKKyAgICAgICAgaWYgc2NhbnBhcnNlci5tYXRjaChsaW5lKSA+PSAwOgorICAgICAgICAgICAgbnVtID0gc3RyaW5nLmF0b2koc2NhbnBhcnNlci5ncm91cCgxKSkKKyAgICAgICAgICAgIGlmIG51bSA+PSBuZWFyOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgaSA9ICdlbmQnCisgICAgc2NhbmJveC5zZWxlY3RfZnJvbShpKQorICAgIHNjYW5ib3gueXZpZXcoaXRvcCkKIAogZGVmIHNldGZvbGRlcnMoKToKLQlmb2xkZXJib3guZGVsZXRlKDAsICdlbmQnKQotCWZvciBmbiBpbiBtaC5saXN0YWxsZm9sZGVycygpOgotCQlmb2xkZXJib3guaW5zZXJ0KCdlbmQnLCBmbikKKyAgICBmb2xkZXJib3guZGVsZXRlKDAsICdlbmQnKQorICAgIGZvciBmbiBpbiBtaC5saXN0YWxsZm9sZGVycygpOgorICAgICAgICBmb2xkZXJib3guaW5zZXJ0KCdlbmQnLCBmbikKIAogZGVmIHJlc2NhbigpOgotCWdsb2JhbCB2aWV3ZXIKLQlpZiB2aWV3ZXI6Ci0JCXZpZXdlci5kZXN0cm95KCkKLQkJdmlld2VyID0gTm9uZQotCXNjYW5ib3guZGVsZXRlKDAsICdlbmQnKQotCWZvciBsaW5lIGluIHNjYW5mb2xkZXIoZm9sZGVyLCBzZXEpOgotCQlzY2FuYm94Lmluc2VydCgnZW5kJywgbGluZSkKKyAgICBnbG9iYWwgdmlld2VyCisgICAgaWYgdmlld2VyOgorICAgICAgICB2aWV3ZXIuZGVzdHJveSgpCisgICAgICAgIHZpZXdlciA9IE5vbmUKKyAgICBzY2FuYm94LmRlbGV0ZSgwLCAnZW5kJykKKyAgICBmb3IgbGluZSBpbiBzY2FuZm9sZGVyKGZvbGRlciwgc2VxKToKKyAgICAgICAgc2NhbmJveC5pbnNlcnQoJ2VuZCcsIGxpbmUpCiAKIGRlZiBzY2FuZm9sZGVyKGZvbGRlciA9ICdpbmJveCcsIHNlcXVlbmNlID0gJ2FsbCcpOgotCXJldHVybiBtYXAoCi0JCWxhbWJkYSBsaW5lOiBsaW5lWzotMV0sCi0JCW9zLnBvcGVuKCdzY2FuICslcyAlcycgJSAoZm9sZGVyLCBzZXF1ZW5jZSksICdyJykucmVhZGxpbmVzKCkpCisgICAgcmV0dXJuIG1hcCgKKyAgICAgICAgICAgIGxhbWJkYSBsaW5lOiBsaW5lWzotMV0sCisgICAgICAgICAgICBvcy5wb3Blbignc2NhbiArJXMgJXMnICUgKGZvbGRlciwgc2VxdWVuY2UpLCAncicpLnJlYWRsaW5lcygpKQogCiBtYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9uZXdtZW51YmFyZGVtby5weSBiL0RlbW8vdGtpbnRlci9ndWlkby9uZXdtZW51YmFyZGVtby5weQppbmRleCBjYWZiZjYzLi41N2JmMTNjIDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvZ3VpZG8vbmV3bWVudWJhcmRlbW8ucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL25ld21lbnViYXJkZW1vLnB5CkBAIC03LDM1ICs3LDM1IEBACiBjbGFzcyBBcHA6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyKToKLQlzZWxmLm1hc3RlciA9IG1hc3RlcgorICAgICAgICBzZWxmLm1hc3RlciA9IG1hc3RlcgogCi0Jc2VsZi5tZW51YmFyID0gTWVudShzZWxmLm1hc3RlcikKKyAgICAgICAgc2VsZi5tZW51YmFyID0gTWVudShzZWxmLm1hc3RlcikKIAotIAlzZWxmLmZpbGVtZW51ID0gTWVudShzZWxmLm1lbnViYXIpCi0JCi0gCXNlbGYuZmlsZW1lbnUuYWRkX2NvbW1hbmQobGFiZWw9Ik5ldyIpCi0gCXNlbGYuZmlsZW1lbnUuYWRkX2NvbW1hbmQobGFiZWw9Ik9wZW4uLi4iKQotIAlzZWxmLmZpbGVtZW51LmFkZF9jb21tYW5kKGxhYmVsPSJDbG9zZSIpCi0gCXNlbGYuZmlsZW1lbnUuYWRkX3NlcGFyYXRvcigpCi0gCXNlbGYuZmlsZW1lbnUuYWRkX2NvbW1hbmQobGFiZWw9IlF1aXQiLCBjb21tYW5kPXNlbGYubWFzdGVyLnF1aXQpCisgICAgICAgIHNlbGYuZmlsZW1lbnUgPSBNZW51KHNlbGYubWVudWJhcikKIAotCXNlbGYuZWRpdG1lbnUgPSBNZW51KHNlbGYubWVudWJhcikKKyAgICAgICAgc2VsZi5maWxlbWVudS5hZGRfY29tbWFuZChsYWJlbD0iTmV3IikKKyAgICAgICAgc2VsZi5maWxlbWVudS5hZGRfY29tbWFuZChsYWJlbD0iT3Blbi4uLiIpCisgICAgICAgIHNlbGYuZmlsZW1lbnUuYWRkX2NvbW1hbmQobGFiZWw9IkNsb3NlIikKKyAgICAgICAgc2VsZi5maWxlbWVudS5hZGRfc2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi5maWxlbWVudS5hZGRfY29tbWFuZChsYWJlbD0iUXVpdCIsIGNvbW1hbmQ9c2VsZi5tYXN0ZXIucXVpdCkKIAotIAlzZWxmLmVkaXRtZW51LmFkZF9jb21tYW5kKGxhYmVsPSJDdXQiKQotIAlzZWxmLmVkaXRtZW51LmFkZF9jb21tYW5kKGxhYmVsPSJDb3B5IikKLSAJc2VsZi5lZGl0bWVudS5hZGRfY29tbWFuZChsYWJlbD0iUGFzdGUiKQorICAgICAgICBzZWxmLmVkaXRtZW51ID0gTWVudShzZWxmLm1lbnViYXIpCisKKyAgICAgICAgc2VsZi5lZGl0bWVudS5hZGRfY29tbWFuZChsYWJlbD0iQ3V0IikKKyAgICAgICAgc2VsZi5lZGl0bWVudS5hZGRfY29tbWFuZChsYWJlbD0iQ29weSIpCisgICAgICAgIHNlbGYuZWRpdG1lbnUuYWRkX2NvbW1hbmQobGFiZWw9IlBhc3RlIikKIAogICAgICAgICBzZWxmLmhlbHBtZW51ID0gTWVudShzZWxmLm1lbnViYXIsIG5hbWU9J2hlbHAnKQogCiAgICAgICAgIHNlbGYuaGVscG1lbnUuYWRkX2NvbW1hbmQobGFiZWw9IkFib3V0Li4uIikKIAotCXNlbGYubWVudWJhci5hZGRfY2FzY2FkZShsYWJlbD0iRmlsZSIsIG1lbnU9c2VsZi5maWxlbWVudSkKLQlzZWxmLm1lbnViYXIuYWRkX2Nhc2NhZGUobGFiZWw9IkVkaXQiLCBtZW51PXNlbGYuZWRpdG1lbnUpCi0Jc2VsZi5tZW51YmFyLmFkZF9jYXNjYWRlKGxhYmVsPSJIZWxwIiwgbWVudT1zZWxmLmhlbHBtZW51KQorICAgICAgICBzZWxmLm1lbnViYXIuYWRkX2Nhc2NhZGUobGFiZWw9IkZpbGUiLCBtZW51PXNlbGYuZmlsZW1lbnUpCisgICAgICAgIHNlbGYubWVudWJhci5hZGRfY2FzY2FkZShsYWJlbD0iRWRpdCIsIG1lbnU9c2VsZi5lZGl0bWVudSkKKyAgICAgICAgc2VsZi5tZW51YmFyLmFkZF9jYXNjYWRlKGxhYmVsPSJIZWxwIiwgbWVudT1zZWxmLmhlbHBtZW51KQogCi0Jc2VsZi50b3AgPSBUb3BsZXZlbChtZW51PXNlbGYubWVudWJhcikKKyAgICAgICAgc2VsZi50b3AgPSBUb3BsZXZlbChtZW51PXNlbGYubWVudWJhcikKIAotCSMgUmVzdCBvZiBhcHAgZ29lcyBoZXJlLi4uCisgICAgICAgICMgUmVzdCBvZiBhcHAgZ29lcyBoZXJlLi4uCiAKIGRlZiBtYWluKCk6CiAgICAgcm9vdCA9IFRrKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9wYWludC5weSBiL0RlbW8vdGtpbnRlci9ndWlkby9wYWludC5weQppbmRleCA3NDNkNTAwLi5kNDZlMjBiIDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvZ3VpZG8vcGFpbnQucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL3BhaW50LnB5CkBAIC0xMiwxMiArMTIsMTIgQEAKIAogICBBbGwgdGhpcyBkb2VzIGlzIHB1dCB1cCBhIGNhbnZhcyBhbmQgZHJhdyBhIHNtb290aCBibGFjayBsaW5lCiB3aGVuZXZlciB5b3UgaGF2ZSB0aGUgbW91c2UgYnV0dG9uIGRvd24sIGJ1dCBob3BlZnVsbHkgaXQgd2lsbAotYmUgZW5vdWdoIHRvIHN0YXJ0IHdpdGguLiBJdCB3b3VsZCBiZSBlYXN5IGVub3VnaCB0byBhZGQgc29tZSAKK2JlIGVub3VnaCB0byBzdGFydCB3aXRoLi4gSXQgd291bGQgYmUgZWFzeSBlbm91Z2ggdG8gYWRkIHNvbWUKIG9wdGlvbnMgbGlrZSBvdGhlciBzaGFwZXMgb3IgY29sb3JzLi4uCiAKLQkJCQkJCXlvdXJzLAotCQkJCQkJZGF2ZSBtaXRjaGVsbAotCQkJCQkJZGF2ZW1AbWFnbmV0LmNvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXZlIG1pdGNoZWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXZlbUBtYWduZXQuY29tCiAiIiIKIAogZnJvbSBUa2ludGVyIGltcG9ydCAqCkBAIC0yOCwzMyArMjgsMzMgQEAKIHhvbGQsIHlvbGQgPSBOb25lLCBOb25lCiAKIGRlZiBtYWluKCk6Ci0gIHJvb3QgPSBUaygpCi0gIGRyYXdpbmdfYXJlYSA9IENhbnZhcyhyb290KQotICBkcmF3aW5nX2FyZWEucGFjaygpCi0gIGRyYXdpbmdfYXJlYS5iaW5kKCI8TW90aW9uPiIsIG1vdGlvbikKLSAgZHJhd2luZ19hcmVhLmJpbmQoIjxCdXR0b25QcmVzcy0xPiIsIGIxZG93bikKLSAgZHJhd2luZ19hcmVhLmJpbmQoIjxCdXR0b25SZWxlYXNlLTE+IiwgYjF1cCkKLSAgcm9vdC5tYWlubG9vcCgpCisgICAgcm9vdCA9IFRrKCkKKyAgICBkcmF3aW5nX2FyZWEgPSBDYW52YXMocm9vdCkKKyAgICBkcmF3aW5nX2FyZWEucGFjaygpCisgICAgZHJhd2luZ19hcmVhLmJpbmQoIjxNb3Rpb24+IiwgbW90aW9uKQorICAgIGRyYXdpbmdfYXJlYS5iaW5kKCI8QnV0dG9uUHJlc3MtMT4iLCBiMWRvd24pCisgICAgZHJhd2luZ19hcmVhLmJpbmQoIjxCdXR0b25SZWxlYXNlLTE+IiwgYjF1cCkKKyAgICByb290Lm1haW5sb29wKCkKIAogZGVmIGIxZG93bihldmVudCk6Ci0gIGdsb2JhbCBiMQotICBiMSA9ICJkb3duIgkJIyB5b3Ugb25seSB3YW50IHRvIGRyYXcgd2hlbiB0aGUgYnV0dG9uIGlzIGRvd24KLQkJCSMgYmVjYXVzZSAiTW90aW9uIiBldmVudHMgaGFwcGVuIC1hbGwgdGhlIHRpbWUtCisgICAgZ2xvYmFsIGIxCisgICAgYjEgPSAiZG93biIgICAgICAgICAgICMgeW91IG9ubHkgd2FudCB0byBkcmF3IHdoZW4gdGhlIGJ1dHRvbiBpcyBkb3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSAiTW90aW9uIiBldmVudHMgaGFwcGVuIC1hbGwgdGhlIHRpbWUtCiAKIGRlZiBiMXVwKGV2ZW50KToKLSAgZ2xvYmFsIGIxLCB4b2xkLCB5b2xkCi0gIGIxID0gInVwIgotICB4b2xkID0gTm9uZQkJIyByZXNldCB0aGUgbGluZSB3aGVuIHlvdSBsZXQgZ28gb2YgdGhlIGJ1dHRvbgotICB5b2xkID0gTm9uZQorICAgIGdsb2JhbCBiMSwgeG9sZCwgeW9sZAorICAgIGIxID0gInVwIgorICAgIHhvbGQgPSBOb25lICAgICAgICAgICAjIHJlc2V0IHRoZSBsaW5lIHdoZW4geW91IGxldCBnbyBvZiB0aGUgYnV0dG9uCisgICAgeW9sZCA9IE5vbmUKIAogZGVmIG1vdGlvbihldmVudCk6Ci0gIGlmIGIxID09ICJkb3duIjoKLSAgICBnbG9iYWwgeG9sZCwgeW9sZAotICAgIGlmIHhvbGQgIT0gTm9uZSBhbmQgeW9sZCAhPSBOb25lOgotICAgICAgZXZlbnQud2lkZ2V0LmNyZWF0ZV9saW5lKHhvbGQseW9sZCxldmVudC54LGV2ZW50Lnksc21vb3RoPVRSVUUpCi0JCQkjIGhlcmUncyB3aGVyZSB5b3UgZHJhdyBpdC4gc21vb3RoLiBuZWF0LgotICAgIHhvbGQgPSBldmVudC54Ci0gICAgeW9sZCA9IGV2ZW50LnkKKyAgICBpZiBiMSA9PSAiZG93biI6CisgICAgICAgIGdsb2JhbCB4b2xkLCB5b2xkCisgICAgICAgIGlmIHhvbGQgIT0gTm9uZSBhbmQgeW9sZCAhPSBOb25lOgorICAgICAgICAgICAgZXZlbnQud2lkZ2V0LmNyZWF0ZV9saW5lKHhvbGQseW9sZCxldmVudC54LGV2ZW50Lnksc21vb3RoPVRSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgaGVyZSdzIHdoZXJlIHlvdSBkcmF3IGl0LiBzbW9vdGguIG5lYXQuCisgICAgICAgIHhvbGQgPSBldmVudC54CisgICAgICAgIHlvbGQgPSBldmVudC55CiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIG1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL2d1aWRvL3JtdC5weSBiL0RlbW8vdGtpbnRlci9ndWlkby9ybXQucHkKaW5kZXggNmU5YTgyOC4uNDQwNjUwYyAxMDA3NTUKLS0tIGEvRGVtby90a2ludGVyL2d1aWRvL3JtdC5weQorKysgYi9EZW1vL3RraW50ZXIvZ3VpZG8vcm10LnB5CkBAIC0yOCw3ICsyOCw3IEBACiBzLnBhY2soc2lkZT1SSUdIVCwgZmlsbD1ZKQogdCA9IFRleHQoZiwgcmVsaWVmPVJBSVNFRCwgYm9yZGVyd2lkdGg9MiwgeXNjcm9sbGNvbW1hbmQ9cy5zZXQsIHNldGdyaWQ9MSkKIHQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCwgZXhwYW5kPTEpCi10LnRhZ19jb25maWcoJ2JvbGQnLCBmb250PSctQWRvYmUtQ291cmllci1Cb2xkLVItTm9ybWFsLSotMTIwLSonKSAKK3QudGFnX2NvbmZpZygnYm9sZCcsIGZvbnQ9Jy1BZG9iZS1Db3VyaWVyLUJvbGQtUi1Ob3JtYWwtKi0xMjAtKicpCiBzWydjb21tYW5kJ10gPSB0Lnl2aWV3CiAKIHJvb3QudGl0bGUoJ1RrIFJlbW90ZSBDb250cm9sbGVyJykKQEAgLTQyLDcgKzQyLDcgQEAKIGZpbGVbJ21lbnUnXSA9IGZpbGVfbQogZmlsZV9tX2FwcHMgPSBNZW51KGZpbGVfbSwgdGVhcm9mZj0wKQogZmlsZV9tLmFkZF9jYXNjYWRlKGxhYmVsPSdTZWxlY3QgQXBwbGljYXRpb24nLCB1bmRlcmxpbmU9MCwKLQkJICAgbWVudT1maWxlX21fYXBwcykKKyAgICAgICAgICAgICAgICAgICBtZW51PWZpbGVfbV9hcHBzKQogZmlsZV9tLmFkZF9jb21tYW5kKGxhYmVsPSdRdWl0JywgdW5kZXJsaW5lPTAsIGNvbW1hbmQ9c3lzLmV4aXQpCiAKICMgMy4gQ3JlYXRlIGJpbmRpbmdzIGZvciB0ZXh0IHdpZGdldCB0byBhbGxvdyBjb21tYW5kcyB0byBiZQpAQCAtNTEsNDYgKzUxLDQ2IEBACiAjIGluc2VydGlvbiBwb2ludCkuCiAKIGRlZiBzaW5nbGUxKGUpOgotCXggPSBlLngKLQl5ID0gZS55Ci0JdC5zZXR2YXIoJ3RrX3ByaXYoc2VsZWN0TW9kZSknLCAnY2hhcicpCi0JdC5tYXJrX3NldCgnYW5jaG9yJywgQXQoeCwgeSkpCi0JIyBTaG91bGQgZm9jdXMgVworICAgIHggPSBlLngKKyAgICB5ID0gZS55CisgICAgdC5zZXR2YXIoJ3RrX3ByaXYoc2VsZWN0TW9kZSknLCAnY2hhcicpCisgICAgdC5tYXJrX3NldCgnYW5jaG9yJywgQXQoeCwgeSkpCisgICAgIyBTaG91bGQgZm9jdXMgVwogdC5iaW5kKCc8MT4nLCBzaW5nbGUxKQogCiBkZWYgZG91YmxlMShlKToKLQl4ID0gZS54Ci0JeSA9IGUueQotCXQuc2V0dmFyKCd0a19wcml2KHNlbGVjdE1vZGUpJywgJ3dvcmQnKQotCXQudGtfdGV4dFNlbGVjdFRvKEF0KHgsIHkpKQorICAgIHggPSBlLngKKyAgICB5ID0gZS55CisgICAgdC5zZXR2YXIoJ3RrX3ByaXYoc2VsZWN0TW9kZSknLCAnd29yZCcpCisgICAgdC50a190ZXh0U2VsZWN0VG8oQXQoeCwgeSkpCiB0LmJpbmQoJzxEb3VibGUtMT4nLCBkb3VibGUxKQogCiBkZWYgdHJpcGxlMShlKToKLQl4ID0gZS54Ci0JeSA9IGUueQotCXQuc2V0dmFyKCd0a19wcml2KHNlbGVjdE1vZGUpJywgJ2xpbmUnKQotCXQudGtfdGV4dFNlbGVjdFRvKEF0KHgsIHkpKQorICAgIHggPSBlLngKKyAgICB5ID0gZS55CisgICAgdC5zZXR2YXIoJ3RrX3ByaXYoc2VsZWN0TW9kZSknLCAnbGluZScpCisgICAgdC50a190ZXh0U2VsZWN0VG8oQXQoeCwgeSkpCiB0LmJpbmQoJzxUcmlwbGUtMT4nLCB0cmlwbGUxKQogCiBkZWYgcmV0dXJua2V5KGUpOgotCXQuaW5zZXJ0KEF0SW5zZXJ0KCksICdcbicpCi0JaW52b2tlKCkKKyAgICB0Lmluc2VydChBdEluc2VydCgpLCAnXG4nKQorICAgIGludm9rZSgpCiB0LmJpbmQoJzxSZXR1cm4+JywgcmV0dXJua2V5KQogCiBkZWYgY29udHJvbHYoZSk6Ci0JdC5pbnNlcnQoQXRJbnNlcnQoKSwgdC5zZWxlY3Rpb25fZ2V0KCkpCi0JdC55dmlld19waWNrcGxhY2UoQXRJbnNlcnQoKSkKLQlpZiB0LmluZGV4KEF0SW5zZXJ0KCkpWy0yOl0gPT0gJy4wJzoKLQkJaW52b2tlKCkKKyAgICB0Lmluc2VydChBdEluc2VydCgpLCB0LnNlbGVjdGlvbl9nZXQoKSkKKyAgICB0Lnl2aWV3X3BpY2twbGFjZShBdEluc2VydCgpKQorICAgIGlmIHQuaW5kZXgoQXRJbnNlcnQoKSlbLTI6XSA9PSAnLjAnOgorICAgICAgICBpbnZva2UoKQogdC5iaW5kKCc8Q29udHJvbC12PicsIGNvbnRyb2x2KQogCiAjIDQuIFByb2NlZHVyZSB0byBiYWNrc3BhY2Ugb3ZlciBvbmUgY2hhcmFjdGVyLCBhcyBsb25nIGFzCiAjIHRoZSBjaGFyYWN0ZXIgaXNuJ3QgcGFydCBvZiB0aGUgcHJvbXB0LgogCiBkZWYgYmFja3NwYWNlKGUpOgotCWlmIHQuaW5kZXgoJ3Byb21wdEVuZCcpICE9IHQuaW5kZXgoJ2luc2VydCAtIDEgY2hhcicpOgotCQl0LmRlbGV0ZSgnaW5zZXJ0IC0gMSBjaGFyJywgQXRJbnNlcnQoKSkKLQkJdC55dmlld19waWNrcGxhY2UoQXRJbnNlcnQoKSkKKyAgICBpZiB0LmluZGV4KCdwcm9tcHRFbmQnKSAhPSB0LmluZGV4KCdpbnNlcnQgLSAxIGNoYXInKToKKyAgICAgICAgdC5kZWxldGUoJ2luc2VydCAtIDEgY2hhcicsIEF0SW5zZXJ0KCkpCisgICAgICAgIHQueXZpZXdfcGlja3BsYWNlKEF0SW5zZXJ0KCkpCiB0LmJpbmQoJzxCYWNrU3BhY2U+JywgYmFja3NwYWNlKQogdC5iaW5kKCc8Q29udHJvbC1oPicsIGJhY2tzcGFjZSkKIHQuYmluZCgnPERlbGV0ZT4nLCBiYWNrc3BhY2UpCkBAIC0xMDMsNDkgKzEwMyw0OSBAQAogIyBhIG5ldyBwcm9tcHQuCiAKIGRlZiBpbnZva2UoKToKLQljbWQgPSB0LmdldCgncHJvbXB0RW5kICsgMSBjaGFyJywgQXRJbnNlcnQoKSkKLQlpZiB0LmdldGJvb2xlYW4odGsuY2FsbCgnaW5mbycsICdjb21wbGV0ZScsIGNtZCkpOiAjIFhYWAotCQlpZiBhcHAgPT0gcm9vdC53aW5mb19uYW1lKCk6Ci0JCQltc2cgPSB0ay5jYWxsKCdldmFsJywgY21kKSAjIFhYWAotCQllbHNlOgotCQkJbXNnID0gdC5zZW5kKGFwcCwgY21kKQotCQlpZiBtc2c6Ci0JCQl0Lmluc2VydChBdEluc2VydCgpLCBtc2cgKyAnXG4nKQotCQlwcm9tcHQoKQotCXQueXZpZXdfcGlja3BsYWNlKEF0SW5zZXJ0KCkpCisgICAgY21kID0gdC5nZXQoJ3Byb21wdEVuZCArIDEgY2hhcicsIEF0SW5zZXJ0KCkpCisgICAgaWYgdC5nZXRib29sZWFuKHRrLmNhbGwoJ2luZm8nLCAnY29tcGxldGUnLCBjbWQpKTogIyBYWFgKKyAgICAgICAgaWYgYXBwID09IHJvb3Qud2luZm9fbmFtZSgpOgorICAgICAgICAgICAgbXNnID0gdGsuY2FsbCgnZXZhbCcsIGNtZCkgIyBYWFgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyA9IHQuc2VuZChhcHAsIGNtZCkKKyAgICAgICAgaWYgbXNnOgorICAgICAgICAgICAgdC5pbnNlcnQoQXRJbnNlcnQoKSwgbXNnICsgJ1xuJykKKyAgICAgICAgcHJvbXB0KCkKKyAgICB0Lnl2aWV3X3BpY2twbGFjZShBdEluc2VydCgpKQogCiBkZWYgcHJvbXB0KCk6Ci0JdC5pbnNlcnQoQXRJbnNlcnQoKSwgYXBwICsgJzogJykKLQl0Lm1hcmtfc2V0KCdwcm9tcHRFbmQnLCAnaW5zZXJ0IC0gMSBjaGFyJykKLQl0LnRhZ19hZGQoJ2JvbGQnLCAnaW5zZXJ0IGxpbmVzdGFydCcsICdwcm9tcHRFbmQnKQorICAgIHQuaW5zZXJ0KEF0SW5zZXJ0KCksIGFwcCArICc6ICcpCisgICAgdC5tYXJrX3NldCgncHJvbXB0RW5kJywgJ2luc2VydCAtIDEgY2hhcicpCisgICAgdC50YWdfYWRkKCdib2xkJywgJ2luc2VydCBsaW5lc3RhcnQnLCAncHJvbXB0RW5kJykKIAogIyA2LiBQcm9jZWR1cmUgdG8gc2VsZWN0IGEgbmV3IGFwcGxpY2F0aW9uLiAgQWxzbyBjaGFuZ2VzCiAjIHRoZSBwcm9tcHQgb24gdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lIHRvIHJlZmxlY3QgdGhlIG5ldwogIyBuYW1lLgogCiBkZWYgbmV3QXBwKGFwcE5hbWUpOgotCWdsb2JhbCBhcHAKLQlhcHAgPSBhcHBOYW1lCi0JdC5kZWxldGUoJ3Byb21wdEVuZCBsaW5lc3RhcnQnLCAncHJvbXB0RW5kJykKLQl0Lmluc2VydCgncHJvbXB0RW5kJywgYXBwTmFtZSArICc6JykKLQl0LnRhZ19hZGQoJ2JvbGQnLCAncHJvbXB0RW5kIGxpbmVzdGFydCcsICdwcm9tcHRFbmQnKQorICAgIGdsb2JhbCBhcHAKKyAgICBhcHAgPSBhcHBOYW1lCisgICAgdC5kZWxldGUoJ3Byb21wdEVuZCBsaW5lc3RhcnQnLCAncHJvbXB0RW5kJykKKyAgICB0Lmluc2VydCgncHJvbXB0RW5kJywgYXBwTmFtZSArICc6JykKKyAgICB0LnRhZ19hZGQoJ2JvbGQnLCAncHJvbXB0RW5kIGxpbmVzdGFydCcsICdwcm9tcHRFbmQnKQogCiBkZWYgZmlsbEFwcHNNZW51KCk6Ci0JZmlsZV9tX2FwcHMuYWRkKCdjb21tYW5kJykKLQlmaWxlX21fYXBwcy5kZWxldGUoMCwgJ2xhc3QnKQotCW5hbWVzID0gcm9vdC53aW5mb19pbnRlcnBzKCkKLQluYW1lcyA9IG1hcChOb25lLCBuYW1lcykgIyBjb252ZXJ0IHR1cGxlIHRvIGxpc3QKLQluYW1lcy5zb3J0KCkKLQlmb3IgbmFtZSBpbiBuYW1lczoKLQkJdHJ5OgotCQkJcm9vdC5zZW5kKG5hbWUsICd3aW5mbyBuYW1lIC4nKQotCQlleGNlcHQgVGNsRXJyb3I6Ci0JCQkjIElub3BlcmF0aXZlIHdpbmRvdyAtLSBpZ25vcmUgaXQKLQkJCXBhc3MKLQkJZWxzZToKLQkJCWZpbGVfbV9hcHBzLmFkZF9jb21tYW5kKAotCQkJICAgIGxhYmVsPW5hbWUsCi0JCQkgICAgY29tbWFuZD1sYW1iZGEgbmFtZT1uYW1lOiBuZXdBcHAobmFtZSkpCisgICAgZmlsZV9tX2FwcHMuYWRkKCdjb21tYW5kJykKKyAgICBmaWxlX21fYXBwcy5kZWxldGUoMCwgJ2xhc3QnKQorICAgIG5hbWVzID0gcm9vdC53aW5mb19pbnRlcnBzKCkKKyAgICBuYW1lcyA9IG1hcChOb25lLCBuYW1lcykgIyBjb252ZXJ0IHR1cGxlIHRvIGxpc3QKKyAgICBuYW1lcy5zb3J0KCkKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcm9vdC5zZW5kKG5hbWUsICd3aW5mbyBuYW1lIC4nKQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAjIElub3BlcmF0aXZlIHdpbmRvdyAtLSBpZ25vcmUgaXQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbGVfbV9hcHBzLmFkZF9jb21tYW5kKAorICAgICAgICAgICAgICAgIGxhYmVsPW5hbWUsCisgICAgICAgICAgICAgICAgY29tbWFuZD1sYW1iZGEgbmFtZT1uYW1lOiBuZXdBcHAobmFtZSkpCiAKIGZpbGVfbV9hcHBzWydwb3N0Y29tbWFuZCddID0gZmlsbEFwcHNNZW51CiBtQmFyLnRrX21lbnVCYXIoZmlsZSkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9zb2xpdGFpcmUucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vc29saXRhaXJlLnB5CmluZGV4IGEyMDVhZmQuLjUwYThiMjYgMTAwNzU1Ci0tLSBhL0RlbW8vdGtpbnRlci9ndWlkby9zb2xpdGFpcmUucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL3NvbGl0YWlyZS5weQpAQCAtMTEsNyArMTEsNyBAQAogLSBObyBrZXlib2FyZCBzaG9ydGN1dHMuCiAtIExlc3MgZmFuY3kgYW5pbWF0aW9uIHdoZW4geW91IHdpbi4KIC0gVGhlIGRldGVybWluYXRpb24gb2Ygd2hpY2ggc3RhY2sgeW91IGRyYWcgdG8gaXMgbW9yZSByZWxheGVkLgotICAKKwogQXBvbG9neToKIAogSSdtIG5vdCBtdWNoIG9mIGEgY2FyZCBwbGF5ZXIsIHNvIG15IHRlcm1pbm9sb2d5IGluIHRoZXNlIGNvbW1lbnRzIG1heQpAQCAtMzUsNyArMzUsNyBAQAogCiBjbGFzcyBHcm91cChHcm91cCk6CiAgICAgZGVmIGJpbmQoc2VsZiwgc2VxdWVuY2U9Tm9uZSwgY29tbWFuZD1Ob25lKToKLQlyZXR1cm4gc2VsZi5jYW52YXMudGFnX2JpbmQoc2VsZi5pZCwgc2VxdWVuY2UsIGNvbW1hbmQpCisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy50YWdfYmluZChzZWxmLmlkLCBzZXF1ZW5jZSwgY29tbWFuZCkKIAogCiAjIENvbnN0YW50cyBkZXRlcm1pbmluZyB0aGUgc2l6ZSBhbmQgbGF5LW91dCBvZiBjYXJkcyBhbmQgc3RhY2tzLiAgV2UKQEAgLTEzNSw3ICsxMzUsNyBAQAogCiAgICAgU2VtaS1wdWJsaWMgcmVhZC1vbmx5IGluc3RhbmNlIHZhcmlhYmxlcyAoWFhYIHNob3VsZCBiZSBtYWRlCiAgICAgcHJpdmF0ZSk6Ci0gICAgCisKICAgICBncm91cCAtLSB0aGUgQ2FudmFzLkdyb3VwIHJlcHJlc2VudGluZyB0aGUgY2FyZAogICAgIHgsIHkgLS0gdGhlIHBvc2l0aW9uIG9mIHRoZSBjYXJkJ3MgdG9wIGxlZnQgY29ybmVyCiAKQEAgLTE1MCw2OCArMTUwLDY4IEBACiAgICAgIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgc3VpdCwgdmFsdWUsIGNhbnZhcyk6Ci0JIiIiQ2FyZCBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIiIiQ2FyZCBjb25zdHJ1Y3Rvci4KIAotCUFyZ3VtZW50cyBhcmUgdGhlIGNhcmQncyBzdWl0IGFuZCB2YWx1ZSwgYW5kIHRoZSBjYW52YXMgd2lkZ2V0LgorICAgICAgICBBcmd1bWVudHMgYXJlIHRoZSBjYXJkJ3Mgc3VpdCBhbmQgdmFsdWUsIGFuZCB0aGUgY2FudmFzIHdpZGdldC4KIAotCVRoZSBjYXJkIGlzIGNyZWF0ZWQgYXQgcG9zaXRpb24gKDAsIDApLCB3aXRoIGl0cyBmYWNlIGRvd24KLQkoYWRkaW5nIGl0IHRvIGEgc3RhY2sgd2lsbCBwb3NpdGlvbiBpdCBhY2NvcmRpbmcgdG8gdGhhdAotCXN0YWNrJ3MgcnVsZXMpLgorICAgICAgICBUaGUgY2FyZCBpcyBjcmVhdGVkIGF0IHBvc2l0aW9uICgwLCAwKSwgd2l0aCBpdHMgZmFjZSBkb3duCisgICAgICAgIChhZGRpbmcgaXQgdG8gYSBzdGFjayB3aWxsIHBvc2l0aW9uIGl0IGFjY29yZGluZyB0byB0aGF0CisgICAgICAgIHN0YWNrJ3MgcnVsZXMpLgogCi0JIiIiCi0Jc2VsZi5zdWl0ID0gc3VpdAotCXNlbGYudmFsdWUgPSB2YWx1ZQotCXNlbGYuY29sb3IgPSBDT0xPUltzdWl0XQotCXNlbGYuZmFjZV9zaG93biA9IDAKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3VpdCA9IHN1aXQKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYuY29sb3IgPSBDT0xPUltzdWl0XQorICAgICAgICBzZWxmLmZhY2Vfc2hvd24gPSAwCiAKLQlzZWxmLnggPSBzZWxmLnkgPSAwCi0Jc2VsZi5ncm91cCA9IEdyb3VwKGNhbnZhcykKKyAgICAgICAgc2VsZi54ID0gc2VsZi55ID0gMAorICAgICAgICBzZWxmLmdyb3VwID0gR3JvdXAoY2FudmFzKQogCi0JdGV4dCA9ICIlcyAgJXMiICUgKFZBTE5BTUVTW3ZhbHVlXSwgc3VpdCkKLQlzZWxmLl9fdGV4dCA9IENhbnZhc1RleHQoY2FudmFzLCBDQVJEV0lEVEgvMiwgMCwKLQkJCSAgICAgICBhbmNob3I9TiwgZmlsbD1zZWxmLmNvbG9yLCB0ZXh0PXRleHQpCi0Jc2VsZi5ncm91cC5hZGR0YWdfd2l0aHRhZyhzZWxmLl9fdGV4dCkKKyAgICAgICAgdGV4dCA9ICIlcyAgJXMiICUgKFZBTE5BTUVTW3ZhbHVlXSwgc3VpdCkKKyAgICAgICAgc2VsZi5fX3RleHQgPSBDYW52YXNUZXh0KGNhbnZhcywgQ0FSRFdJRFRILzIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yPU4sIGZpbGw9c2VsZi5jb2xvciwgdGV4dD10ZXh0KQorICAgICAgICBzZWxmLmdyb3VwLmFkZHRhZ193aXRodGFnKHNlbGYuX190ZXh0KQogCi0Jc2VsZi5fX3JlY3QgPSBSZWN0YW5nbGUoY2FudmFzLCAwLCAwLCBDQVJEV0lEVEgsIENBUkRIRUlHSFQsCi0JCQkgICAgICBvdXRsaW5lPSdibGFjaycsIGZpbGw9J3doaXRlJykKLQlzZWxmLmdyb3VwLmFkZHRhZ193aXRodGFnKHNlbGYuX19yZWN0KQorICAgICAgICBzZWxmLl9fcmVjdCA9IFJlY3RhbmdsZShjYW52YXMsIDAsIDAsIENBUkRXSURUSCwgQ0FSREhFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU9J2JsYWNrJywgZmlsbD0nd2hpdGUnKQorICAgICAgICBzZWxmLmdyb3VwLmFkZHRhZ193aXRodGFnKHNlbGYuX19yZWN0KQogCi0Jc2VsZi5fX2JhY2sgPSBSZWN0YW5nbGUoY2FudmFzLCBNQVJHSU4sIE1BUkdJTiwKLQkJCSAgICAgIENBUkRXSURUSC1NQVJHSU4sIENBUkRIRUlHSFQtTUFSR0lOLAotCQkJICAgICAgb3V0bGluZT0nYmxhY2snLCBmaWxsPSdibHVlJykKLQlzZWxmLmdyb3VwLmFkZHRhZ193aXRodGFnKHNlbGYuX19iYWNrKQorICAgICAgICBzZWxmLl9fYmFjayA9IFJlY3RhbmdsZShjYW52YXMsIE1BUkdJTiwgTUFSR0lOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FSRFdJRFRILU1BUkdJTiwgQ0FSREhFSUdIVC1NQVJHSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPSdibGFjaycsIGZpbGw9J2JsdWUnKQorICAgICAgICBzZWxmLmdyb3VwLmFkZHRhZ193aXRodGFnKHNlbGYuX19iYWNrKQogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotCSIiIlJldHVybiBhIHN0cmluZyBmb3IgZGVidWcgcHJpbnQgc3RhdGVtZW50cy4iIiIKLQlyZXR1cm4gIkNhcmQoJXIsICVyKSIgJSAoc2VsZi5zdWl0LCBzZWxmLnZhbHVlKQorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgZm9yIGRlYnVnIHByaW50IHN0YXRlbWVudHMuIiIiCisgICAgICAgIHJldHVybiAiQ2FyZCglciwgJXIpIiAlIChzZWxmLnN1aXQsIHNlbGYudmFsdWUpCiAKICAgICBkZWYgbW92ZXRvKHNlbGYsIHgsIHkpOgotCSIiIk1vdmUgdGhlIGNhcmQgdG8gYWJzb2x1dGUgcG9zaXRpb24gKHgsIHkpLiIiIgotCXNlbGYubW92ZWJ5KHggLSBzZWxmLngsIHkgLSBzZWxmLnkpCisgICAgICAgICIiIk1vdmUgdGhlIGNhcmQgdG8gYWJzb2x1dGUgcG9zaXRpb24gKHgsIHkpLiIiIgorICAgICAgICBzZWxmLm1vdmVieSh4IC0gc2VsZi54LCB5IC0gc2VsZi55KQogCiAgICAgZGVmIG1vdmVieShzZWxmLCBkeCwgZHkpOgotCSIiIk1vdmUgdGhlIGNhcmQgYnkgKGR4LCBkeSkuIiIiCi0Jc2VsZi54ID0gc2VsZi54ICsgZHgKLQlzZWxmLnkgPSBzZWxmLnkgKyBkeQotCXNlbGYuZ3JvdXAubW92ZShkeCwgZHkpCisgICAgICAgICIiIk1vdmUgdGhlIGNhcmQgYnkgKGR4LCBkeSkuIiIiCisgICAgICAgIHNlbGYueCA9IHNlbGYueCArIGR4CisgICAgICAgIHNlbGYueSA9IHNlbGYueSArIGR5CisgICAgICAgIHNlbGYuZ3JvdXAubW92ZShkeCwgZHkpCiAKICAgICBkZWYgdGtyYWlzZShzZWxmKToKLQkiIiJSYWlzZSB0aGUgY2FyZCBhYm92ZSBhbGwgb3RoZXIgb2JqZWN0cyBpbiBpdHMgY2FudmFzLiIiIgotCXNlbGYuZ3JvdXAudGtyYWlzZSgpCisgICAgICAgICIiIlJhaXNlIHRoZSBjYXJkIGFib3ZlIGFsbCBvdGhlciBvYmplY3RzIGluIGl0cyBjYW52YXMuIiIiCisgICAgICAgIHNlbGYuZ3JvdXAudGtyYWlzZSgpCiAKICAgICBkZWYgc2hvd2ZhY2Uoc2VsZik6Ci0JIiIiVHVybiB0aGUgY2FyZCdzIGZhY2UgdXAuIiIiCi0Jc2VsZi50a3JhaXNlKCkKLQlzZWxmLl9fcmVjdC50a3JhaXNlKCkKLQlzZWxmLl9fdGV4dC50a3JhaXNlKCkKLQlzZWxmLmZhY2Vfc2hvd24gPSAxCisgICAgICAgICIiIlR1cm4gdGhlIGNhcmQncyBmYWNlIHVwLiIiIgorICAgICAgICBzZWxmLnRrcmFpc2UoKQorICAgICAgICBzZWxmLl9fcmVjdC50a3JhaXNlKCkKKyAgICAgICAgc2VsZi5fX3RleHQudGtyYWlzZSgpCisgICAgICAgIHNlbGYuZmFjZV9zaG93biA9IDEKIAogICAgIGRlZiBzaG93YmFjayhzZWxmKToKLQkiIiJUdXJuIHRoZSBjYXJkJ3MgZmFjZSBkb3duLiIiIgotCXNlbGYudGtyYWlzZSgpCi0Jc2VsZi5fX3JlY3QudGtyYWlzZSgpCi0Jc2VsZi5fX2JhY2sudGtyYWlzZSgpCi0Jc2VsZi5mYWNlX3Nob3duID0gMAorICAgICAgICAiIiJUdXJuIHRoZSBjYXJkJ3MgZmFjZSBkb3duLiIiIgorICAgICAgICBzZWxmLnRrcmFpc2UoKQorICAgICAgICBzZWxmLl9fcmVjdC50a3JhaXNlKCkKKyAgICAgICAgc2VsZi5fX2JhY2sudGtyYWlzZSgpCisgICAgICAgIHNlbGYuZmFjZV9zaG93biA9IDAKIAogCiBjbGFzcyBTdGFjazoKQEAgLTI0MCw3ICsyNDAsNyBAQAogCiAgICAgICAgIFRoZSBkZWZhdWx0IHVzZXIgKHNpbmdsZSkgY2xpY2sgaGFuZGxlciBzaG93cyB0aGUgdG9wIGNhcmQKICAgICAgICAgZmFjZSB1cC4gIFRoZSBkZWZhdWx0IHVzZXIgZG91YmxlIGNsaWNrIGhhbmRsZXIgY2FsbHMgdGhlIHVzZXIKLQlzaW5nbGUgY2xpY2sgaGFuZGxlci4KKyAgICAgICAgc2luZ2xlIGNsaWNrIGhhbmRsZXIuCiAKICAgICB1c2VybW92ZWhhbmRsZXIoY2FyZHMpIC0tIGNhbGxlZCB0byBjb21wbGV0ZSBhIHN1YnBpbGUgbW92ZQogCkBAIC0yNTUsMTMzICsyNTUsMTMzIEBACiAgICAgICAgIFRoZSBkZWZhdWx0IGV2ZW50IGhhbmRsZXJzIHR1cm4gdGhlIHRvcCBjYXJkIG9mIHRoZSBzdGFjayB3aXRoCiAgICAgICAgIGl0cyBmYWNlIHVwIG9uIGEgKHNpbmdsZSBvciBkb3VibGUpIGNsaWNrLCBhbmQgYWxzbyBzdXBwb3J0CiAgICAgICAgIG1vdmluZyBhIHN1YnBpbGUgYXJvdW5kLgotICAgIAorCiAgICAgc3RhcnRtb3ZpbmcoZXZlbnQpIC0tIGJlZ2luIGEgbW92ZSBvcGVyYXRpb24KICAgICBmaW5pc2htb3ZpbmcoKSAtLSBmaW5pc2ggYSBtb3ZlIG9wZXJhdGlvbgogCiAgICAgIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSwgZ2FtZT1Ob25lKToKLQkiIiJTdGFjayBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIiIiU3RhY2sgY29uc3RydWN0b3IuCiAKLQlBcmd1bWVudHMgYXJlIHRoZSBzdGFjaydzIG5vbWluYWwgeCBhbmQgeSBwb3NpdGlvbiAodGhlIHRvcAotCWxlZnQgY29ybmVyIG9mIHRoZSBmaXJzdCBjYXJkIHBsYWNlZCBpbiB0aGUgc3RhY2spLCBhbmQgdGhlCi0JZ2FtZSBvYmplY3QgKHdoaWNoIGlzIHVzZWQgdG8gZ2V0IHRoZSBjYW52YXM7IHN1YmNsYXNzZXMgdXNlCi0JdGhlIGdhbWUgb2JqZWN0IHRvIGZpbmQgb3RoZXIgc3RhY2tzKS4KKyAgICAgICAgQXJndW1lbnRzIGFyZSB0aGUgc3RhY2sncyBub21pbmFsIHggYW5kIHkgcG9zaXRpb24gKHRoZSB0b3AKKyAgICAgICAgbGVmdCBjb3JuZXIgb2YgdGhlIGZpcnN0IGNhcmQgcGxhY2VkIGluIHRoZSBzdGFjayksIGFuZCB0aGUKKyAgICAgICAgZ2FtZSBvYmplY3QgKHdoaWNoIGlzIHVzZWQgdG8gZ2V0IHRoZSBjYW52YXM7IHN1YmNsYXNzZXMgdXNlCisgICAgICAgIHRoZSBnYW1lIG9iamVjdCB0byBmaW5kIG90aGVyIHN0YWNrcykuCiAKLQkiIiIKLQlzZWxmLnggPSB4Ci0Jc2VsZi55ID0geQotCXNlbGYuZ2FtZSA9IGdhbWUKLQlzZWxmLmNhcmRzID0gW10KLQlzZWxmLmdyb3VwID0gR3JvdXAoc2VsZi5nYW1lLmNhbnZhcykKLQlzZWxmLmdyb3VwLmJpbmQoJzwxPicsIHNlbGYuY2xpY2toYW5kbGVyKQotIAlzZWxmLmdyb3VwLmJpbmQoJzxEb3VibGUtMT4nLCBzZWxmLmRvdWJsZWNsaWNraGFuZGxlcikKLQlzZWxmLmdyb3VwLmJpbmQoJzxCMS1Nb3Rpb24+Jywgc2VsZi5tb3Rpb25oYW5kbGVyKQotCXNlbGYuZ3JvdXAuYmluZCgnPEJ1dHRvblJlbGVhc2UtMT4nLCBzZWxmLnJlbGVhc2VoYW5kbGVyKQotCXNlbGYubWFrZWJvdHRvbSgpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnggPSB4CisgICAgICAgIHNlbGYueSA9IHkKKyAgICAgICAgc2VsZi5nYW1lID0gZ2FtZQorICAgICAgICBzZWxmLmNhcmRzID0gW10KKyAgICAgICAgc2VsZi5ncm91cCA9IEdyb3VwKHNlbGYuZ2FtZS5jYW52YXMpCisgICAgICAgIHNlbGYuZ3JvdXAuYmluZCgnPDE+Jywgc2VsZi5jbGlja2hhbmRsZXIpCisgICAgICAgIHNlbGYuZ3JvdXAuYmluZCgnPERvdWJsZS0xPicsIHNlbGYuZG91YmxlY2xpY2toYW5kbGVyKQorICAgICAgICBzZWxmLmdyb3VwLmJpbmQoJzxCMS1Nb3Rpb24+Jywgc2VsZi5tb3Rpb25oYW5kbGVyKQorICAgICAgICBzZWxmLmdyb3VwLmJpbmQoJzxCdXR0b25SZWxlYXNlLTE+Jywgc2VsZi5yZWxlYXNlaGFuZGxlcikKKyAgICAgICAgc2VsZi5tYWtlYm90dG9tKCkKIAogICAgIGRlZiBtYWtlYm90dG9tKHNlbGYpOgotCXBhc3MKKyAgICAgICAgcGFzcwogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotCSIiIlJldHVybiBhIHN0cmluZyBmb3IgZGVidWcgcHJpbnQgc3RhdGVtZW50cy4iIiIKLQlyZXR1cm4gIiVzKCVkLCAlZCkiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLngsIHNlbGYueSkKKyAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIGZvciBkZWJ1ZyBwcmludCBzdGF0ZW1lbnRzLiIiIgorICAgICAgICByZXR1cm4gIiVzKCVkLCAlZCkiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLngsIHNlbGYueSkKIAogICAgICMgUHVibGljIG1ldGhvZHMKIAogICAgIGRlZiBhZGQoc2VsZiwgY2FyZCk6Ci0Jc2VsZi5jYXJkcy5hcHBlbmQoY2FyZCkKLQljYXJkLnRrcmFpc2UoKQotCXNlbGYucG9zaXRpb24oY2FyZCkKLQlzZWxmLmdyb3VwLmFkZHRhZ193aXRodGFnKGNhcmQuZ3JvdXApCisgICAgICAgIHNlbGYuY2FyZHMuYXBwZW5kKGNhcmQpCisgICAgICAgIGNhcmQudGtyYWlzZSgpCisgICAgICAgIHNlbGYucG9zaXRpb24oY2FyZCkKKyAgICAgICAgc2VsZi5ncm91cC5hZGR0YWdfd2l0aHRhZyhjYXJkLmdyb3VwKQogCiAgICAgZGVmIGRlbGV0ZShzZWxmLCBjYXJkKToKLQlzZWxmLmNhcmRzLnJlbW92ZShjYXJkKQotCWNhcmQuZ3JvdXAuZHRhZyhzZWxmLmdyb3VwKQorICAgICAgICBzZWxmLmNhcmRzLnJlbW92ZShjYXJkKQorICAgICAgICBjYXJkLmdyb3VwLmR0YWcoc2VsZi5ncm91cCkKIAogICAgIGRlZiBzaG93dG9wKHNlbGYpOgotCWlmIHNlbGYuY2FyZHM6Ci0JICAgIHNlbGYuY2FyZHNbLTFdLnNob3dmYWNlKCkKKyAgICAgICAgaWYgc2VsZi5jYXJkczoKKyAgICAgICAgICAgIHNlbGYuY2FyZHNbLTFdLnNob3dmYWNlKCkKIAogICAgIGRlZiBkZWFsKHNlbGYpOgotCWlmIG5vdCBzZWxmLmNhcmRzOgotCSAgICByZXR1cm4gTm9uZQotCWNhcmQgPSBzZWxmLmNhcmRzWy0xXQotCXNlbGYuZGVsZXRlKGNhcmQpCi0JcmV0dXJuIGNhcmQKKyAgICAgICAgaWYgbm90IHNlbGYuY2FyZHM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBjYXJkID0gc2VsZi5jYXJkc1stMV0KKyAgICAgICAgc2VsZi5kZWxldGUoY2FyZCkKKyAgICAgICAgcmV0dXJuIGNhcmQKIAogICAgICMgU3ViY2xhc3Mgb3ZlcnJpZGFibGUgbWV0aG9kcwogCiAgICAgZGVmIHBvc2l0aW9uKHNlbGYsIGNhcmQpOgotCWNhcmQubW92ZXRvKHNlbGYueCwgc2VsZi55KQorICAgICAgICBjYXJkLm1vdmV0byhzZWxmLngsIHNlbGYueSkKIAogICAgIGRlZiB1c2VyY2xpY2toYW5kbGVyKHNlbGYpOgotCXNlbGYuc2hvd3RvcCgpCisgICAgICAgIHNlbGYuc2hvd3RvcCgpCiAKICAgICBkZWYgdXNlcmRvdWJsZWNsaWNraGFuZGxlcihzZWxmKToKLQlzZWxmLnVzZXJjbGlja2hhbmRsZXIoKQorICAgICAgICBzZWxmLnVzZXJjbGlja2hhbmRsZXIoKQogCiAgICAgZGVmIHVzZXJtb3ZlaGFuZGxlcihzZWxmLCBjYXJkcyk6Ci0JZm9yIGNhcmQgaW4gY2FyZHM6Ci0JICAgIHNlbGYucG9zaXRpb24oY2FyZCkKKyAgICAgICAgZm9yIGNhcmQgaW4gY2FyZHM6CisgICAgICAgICAgICBzZWxmLnBvc2l0aW9uKGNhcmQpCiAKICAgICAjIEV2ZW50IGhhbmRsZXJzCiAKICAgICBkZWYgY2xpY2toYW5kbGVyKHNlbGYsIGV2ZW50KToKLQlzZWxmLmZpbmlzaG1vdmluZygpCQkjIEluIGNhc2Ugd2UgbG9zdCBhbiBldmVudAotCXNlbGYudXNlcmNsaWNraGFuZGxlcigpCi0Jc2VsZi5zdGFydG1vdmluZyhldmVudCkKKyAgICAgICAgc2VsZi5maW5pc2htb3ZpbmcoKSAgICAgICAgICAgICAjIEluIGNhc2Ugd2UgbG9zdCBhbiBldmVudAorICAgICAgICBzZWxmLnVzZXJjbGlja2hhbmRsZXIoKQorICAgICAgICBzZWxmLnN0YXJ0bW92aW5nKGV2ZW50KQogCiAgICAgZGVmIG1vdGlvbmhhbmRsZXIoc2VsZiwgZXZlbnQpOgotCXNlbGYua2VlcG1vdmluZyhldmVudCkKKyAgICAgICAgc2VsZi5rZWVwbW92aW5nKGV2ZW50KQogCiAgICAgZGVmIHJlbGVhc2VoYW5kbGVyKHNlbGYsIGV2ZW50KToKLQlzZWxmLmtlZXBtb3ZpbmcoZXZlbnQpCi0Jc2VsZi5maW5pc2htb3ZpbmcoKQorICAgICAgICBzZWxmLmtlZXBtb3ZpbmcoZXZlbnQpCisgICAgICAgIHNlbGYuZmluaXNobW92aW5nKCkKIAogICAgIGRlZiBkb3VibGVjbGlja2hhbmRsZXIoc2VsZiwgZXZlbnQpOgotCXNlbGYuZmluaXNobW92aW5nKCkJCSMgSW4gY2FzZSB3ZSBsb3N0IGFuIGV2ZW50Ci0Jc2VsZi51c2VyZG91YmxlY2xpY2toYW5kbGVyKCkKLQlzZWxmLnN0YXJ0bW92aW5nKGV2ZW50KQorICAgICAgICBzZWxmLmZpbmlzaG1vdmluZygpICAgICAgICAgICAgICMgSW4gY2FzZSB3ZSBsb3N0IGFuIGV2ZW50CisgICAgICAgIHNlbGYudXNlcmRvdWJsZWNsaWNraGFuZGxlcigpCisgICAgICAgIHNlbGYuc3RhcnRtb3ZpbmcoZXZlbnQpCiAKICAgICAjIE1vdmUgaW50ZXJuYWxzCiAKICAgICBtb3ZpbmcgPSBOb25lCiAKICAgICBkZWYgc3RhcnRtb3Zpbmcoc2VsZiwgZXZlbnQpOgotCXNlbGYubW92aW5nID0gTm9uZQotCXRhZ3MgPSBzZWxmLmdhbWUuY2FudmFzLmdldHRhZ3MoJ2N1cnJlbnQnKQotCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLmNhcmRzKSk6Ci0JICAgIGNhcmQgPSBzZWxmLmNhcmRzW2ldCi0JICAgIGlmIGNhcmQuZ3JvdXAudGFnIGluIHRhZ3M6Ci0JCWJyZWFrCi0JZWxzZToKLQkgICAgcmV0dXJuCi0JaWYgbm90IGNhcmQuZmFjZV9zaG93bjoKLQkgICAgcmV0dXJuCi0Jc2VsZi5tb3ZpbmcgPSBzZWxmLmNhcmRzW2k6XQotCXNlbGYubGFzdHggPSBldmVudC54Ci0Jc2VsZi5sYXN0eSA9IGV2ZW50LnkKLQlmb3IgY2FyZCBpbiBzZWxmLm1vdmluZzoKLQkgICAgY2FyZC50a3JhaXNlKCkKKyAgICAgICAgc2VsZi5tb3ZpbmcgPSBOb25lCisgICAgICAgIHRhZ3MgPSBzZWxmLmdhbWUuY2FudmFzLmdldHRhZ3MoJ2N1cnJlbnQnKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5jYXJkcykpOgorICAgICAgICAgICAgY2FyZCA9IHNlbGYuY2FyZHNbaV0KKyAgICAgICAgICAgIGlmIGNhcmQuZ3JvdXAudGFnIGluIHRhZ3M6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgY2FyZC5mYWNlX3Nob3duOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYubW92aW5nID0gc2VsZi5jYXJkc1tpOl0KKyAgICAgICAgc2VsZi5sYXN0eCA9IGV2ZW50LngKKyAgICAgICAgc2VsZi5sYXN0eSA9IGV2ZW50LnkKKyAgICAgICAgZm9yIGNhcmQgaW4gc2VsZi5tb3Zpbmc6CisgICAgICAgICAgICBjYXJkLnRrcmFpc2UoKQogCiAgICAgZGVmIGtlZXBtb3Zpbmcoc2VsZiwgZXZlbnQpOgotCWlmIG5vdCBzZWxmLm1vdmluZzoKLQkgICAgcmV0dXJuCi0JZHggPSBldmVudC54IC0gc2VsZi5sYXN0eAotCWR5ID0gZXZlbnQueSAtIHNlbGYubGFzdHkKLQlzZWxmLmxhc3R4ID0gZXZlbnQueAotCXNlbGYubGFzdHkgPSBldmVudC55Ci0JaWYgZHggb3IgZHk6Ci0JICAgIGZvciBjYXJkIGluIHNlbGYubW92aW5nOgotCQljYXJkLm1vdmVieShkeCwgZHkpCisgICAgICAgIGlmIG5vdCBzZWxmLm1vdmluZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBkeCA9IGV2ZW50LnggLSBzZWxmLmxhc3R4CisgICAgICAgIGR5ID0gZXZlbnQueSAtIHNlbGYubGFzdHkKKyAgICAgICAgc2VsZi5sYXN0eCA9IGV2ZW50LngKKyAgICAgICAgc2VsZi5sYXN0eSA9IGV2ZW50LnkKKyAgICAgICAgaWYgZHggb3IgZHk6CisgICAgICAgICAgICBmb3IgY2FyZCBpbiBzZWxmLm1vdmluZzoKKyAgICAgICAgICAgICAgICBjYXJkLm1vdmVieShkeCwgZHkpCiAKICAgICBkZWYgZmluaXNobW92aW5nKHNlbGYpOgotCWNhcmRzID0gc2VsZi5tb3ZpbmcKLQlzZWxmLm1vdmluZyA9IE5vbmUKLQlpZiBjYXJkczoKLQkgICAgc2VsZi51c2VybW92ZWhhbmRsZXIoY2FyZHMpCisgICAgICAgIGNhcmRzID0gc2VsZi5tb3ZpbmcKKyAgICAgICAgc2VsZi5tb3ZpbmcgPSBOb25lCisgICAgICAgIGlmIGNhcmRzOgorICAgICAgICAgICAgc2VsZi51c2VybW92ZWhhbmRsZXIoY2FyZHMpCiAKIAogY2xhc3MgRGVjayhTdGFjayk6CkBAIC00MDAsMzcgKzQwMCwzNyBAQAogICAgICIiIgogCiAgICAgZGVmIG1ha2Vib3R0b20oc2VsZik6Ci0JYm90dG9tID0gUmVjdGFuZ2xlKHNlbGYuZ2FtZS5jYW52YXMsCi0JCQkgICBzZWxmLngsIHNlbGYueSwKLQkJCSAgIHNlbGYueCtDQVJEV0lEVEgsIHNlbGYueStDQVJESEVJR0hULAotCQkJICAgb3V0bGluZT0nYmxhY2snLCBmaWxsPUJBQ0tHUk9VTkQpCi0gCXNlbGYuZ3JvdXAuYWRkdGFnX3dpdGh0YWcoYm90dG9tKQorICAgICAgICBib3R0b20gPSBSZWN0YW5nbGUoc2VsZi5nYW1lLmNhbnZhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYueCwgc2VsZi55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi54K0NBUkRXSURUSCwgc2VsZi55K0NBUkRIRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPSdibGFjaycsIGZpbGw9QkFDS0dST1VORCkKKyAgICAgICAgc2VsZi5ncm91cC5hZGR0YWdfd2l0aHRhZyhib3R0b20pCiAKICAgICBkZWYgZmlsbChzZWxmKToKLQlmb3Igc3VpdCBpbiBBTExTVUlUUzoKLQkgICAgZm9yIHZhbHVlIGluIEFMTFZBTFVFUzoKLQkJc2VsZi5hZGQoQ2FyZChzdWl0LCB2YWx1ZSwgc2VsZi5nYW1lLmNhbnZhcykpCisgICAgICAgIGZvciBzdWl0IGluIEFMTFNVSVRTOgorICAgICAgICAgICAgZm9yIHZhbHVlIGluIEFMTFZBTFVFUzoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZChDYXJkKHN1aXQsIHZhbHVlLCBzZWxmLmdhbWUuY2FudmFzKSkKIAogICAgIGRlZiBzaHVmZmxlKHNlbGYpOgotCW4gPSBsZW4oc2VsZi5jYXJkcykKLQluZXdjYXJkcyA9IFtdCi0JZm9yIGkgaW4gcmFuZHBlcm0obik6Ci0JICAgIG5ld2NhcmRzLmFwcGVuZChzZWxmLmNhcmRzW2ldKQotCXNlbGYuY2FyZHMgPSBuZXdjYXJkcworICAgICAgICBuID0gbGVuKHNlbGYuY2FyZHMpCisgICAgICAgIG5ld2NhcmRzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZHBlcm0obik6CisgICAgICAgICAgICBuZXdjYXJkcy5hcHBlbmQoc2VsZi5jYXJkc1tpXSkKKyAgICAgICAgc2VsZi5jYXJkcyA9IG5ld2NhcmRzCiAKICAgICBkZWYgdXNlcmNsaWNraGFuZGxlcihzZWxmKToKLQlvcGVuZGVjayA9IHNlbGYuZ2FtZS5vcGVuZGVjawotCWNhcmQgPSBzZWxmLmRlYWwoKQotCWlmIG5vdCBjYXJkOgotCSAgICB3aGlsZSAxOgotCQljYXJkID0gb3BlbmRlY2suZGVhbCgpCi0JCWlmIG5vdCBjYXJkOgotCQkgICAgYnJlYWsKLQkJc2VsZi5hZGQoY2FyZCkKLQkJY2FyZC5zaG93YmFjaygpCi0JZWxzZToKLQkgICAgc2VsZi5nYW1lLm9wZW5kZWNrLmFkZChjYXJkKQotCSAgICBjYXJkLnNob3dmYWNlKCkKKyAgICAgICAgb3BlbmRlY2sgPSBzZWxmLmdhbWUub3BlbmRlY2sKKyAgICAgICAgY2FyZCA9IHNlbGYuZGVhbCgpCisgICAgICAgIGlmIG5vdCBjYXJkOgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBjYXJkID0gb3BlbmRlY2suZGVhbCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGNhcmQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc2VsZi5hZGQoY2FyZCkKKyAgICAgICAgICAgICAgICBjYXJkLnNob3diYWNrKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZ2FtZS5vcGVuZGVjay5hZGQoY2FyZCkKKyAgICAgICAgICAgIGNhcmQuc2hvd2ZhY2UoKQogCiAKIGRlZiByYW5kcGVybShuKToKQEAgLTQzOCwxOTEgKzQzOCwxOTEgQEAKICAgICByID0gcmFuZ2UobikKICAgICB4ID0gW10KICAgICB3aGlsZSByOgotCWkgPSByYW5kb20uY2hvaWNlKHIpCi0JeC5hcHBlbmQoaSkKLQlyLnJlbW92ZShpKQorICAgICAgICBpID0gcmFuZG9tLmNob2ljZShyKQorICAgICAgICB4LmFwcGVuZChpKQorICAgICAgICByLnJlbW92ZShpKQogICAgIHJldHVybiB4CiAKIAogY2xhc3MgT3BlblN0YWNrKFN0YWNrKToKIAogICAgIGRlZiBhY2NlcHRhYmxlKHNlbGYsIGNhcmRzKToKLQlyZXR1cm4gMAorICAgICAgICByZXR1cm4gMAogCiAgICAgZGVmIHVzZXJtb3ZlaGFuZGxlcihzZWxmLCBjYXJkcyk6Ci0JY2FyZCA9IGNhcmRzWzBdCi0Jc3RhY2sgPSBzZWxmLmdhbWUuY2xvc2VzdHN0YWNrKGNhcmQpCi0JaWYgbm90IHN0YWNrIG9yIHN0YWNrIGlzIHNlbGYgb3Igbm90IHN0YWNrLmFjY2VwdGFibGUoY2FyZHMpOgotCSAgICBTdGFjay51c2VybW92ZWhhbmRsZXIoc2VsZiwgY2FyZHMpCi0JZWxzZToKLQkgICAgZm9yIGNhcmQgaW4gY2FyZHM6Ci0JCXNlbGYuZGVsZXRlKGNhcmQpCi0JCXN0YWNrLmFkZChjYXJkKQotCSAgICBzZWxmLmdhbWUud2luY2hlY2soKQorICAgICAgICBjYXJkID0gY2FyZHNbMF0KKyAgICAgICAgc3RhY2sgPSBzZWxmLmdhbWUuY2xvc2VzdHN0YWNrKGNhcmQpCisgICAgICAgIGlmIG5vdCBzdGFjayBvciBzdGFjayBpcyBzZWxmIG9yIG5vdCBzdGFjay5hY2NlcHRhYmxlKGNhcmRzKToKKyAgICAgICAgICAgIFN0YWNrLnVzZXJtb3ZlaGFuZGxlcihzZWxmLCBjYXJkcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBjYXJkIGluIGNhcmRzOgorICAgICAgICAgICAgICAgIHNlbGYuZGVsZXRlKGNhcmQpCisgICAgICAgICAgICAgICAgc3RhY2suYWRkKGNhcmQpCisgICAgICAgICAgICBzZWxmLmdhbWUud2luY2hlY2soKQogCiAgICAgZGVmIHVzZXJkb3VibGVjbGlja2hhbmRsZXIoc2VsZik6Ci0JaWYgbm90IHNlbGYuY2FyZHM6Ci0JICAgIHJldHVybgotCWNhcmQgPSBzZWxmLmNhcmRzWy0xXQotCWlmIG5vdCBjYXJkLmZhY2Vfc2hvd246Ci0JICAgIHNlbGYudXNlcmNsaWNraGFuZGxlcigpCi0JICAgIHJldHVybgotCWZvciBzIGluIHNlbGYuZ2FtZS5zdWl0czoKLQkgICAgaWYgcy5hY2NlcHRhYmxlKFtjYXJkXSk6Ci0JCXNlbGYuZGVsZXRlKGNhcmQpCi0JCXMuYWRkKGNhcmQpCi0JCXNlbGYuZ2FtZS53aW5jaGVjaygpCi0JCWJyZWFrCisgICAgICAgIGlmIG5vdCBzZWxmLmNhcmRzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNhcmQgPSBzZWxmLmNhcmRzWy0xXQorICAgICAgICBpZiBub3QgY2FyZC5mYWNlX3Nob3duOgorICAgICAgICAgICAgc2VsZi51c2VyY2xpY2toYW5kbGVyKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3IgcyBpbiBzZWxmLmdhbWUuc3VpdHM6CisgICAgICAgICAgICBpZiBzLmFjY2VwdGFibGUoW2NhcmRdKToKKyAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZShjYXJkKQorICAgICAgICAgICAgICAgIHMuYWRkKGNhcmQpCisgICAgICAgICAgICAgICAgc2VsZi5nYW1lLndpbmNoZWNrKCkKKyAgICAgICAgICAgICAgICBicmVhawogCiAKIGNsYXNzIFN1aXRTdGFjayhPcGVuU3RhY2spOgogCiAgICAgZGVmIG1ha2Vib3R0b20oc2VsZik6Ci0JYm90dG9tID0gUmVjdGFuZ2xlKHNlbGYuZ2FtZS5jYW52YXMsCi0JCQkgICBzZWxmLngsIHNlbGYueSwKLQkJCSAgIHNlbGYueCtDQVJEV0lEVEgsIHNlbGYueStDQVJESEVJR0hULAotCQkJICAgb3V0bGluZT0nYmxhY2snLCBmaWxsPScnKQorICAgICAgICBib3R0b20gPSBSZWN0YW5nbGUoc2VsZi5nYW1lLmNhbnZhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYueCwgc2VsZi55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi54K0NBUkRXSURUSCwgc2VsZi55K0NBUkRIRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPSdibGFjaycsIGZpbGw9JycpCiAKICAgICBkZWYgdXNlcmNsaWNraGFuZGxlcihzZWxmKToKLQlwYXNzCisgICAgICAgIHBhc3MKIAogICAgIGRlZiB1c2VyZG91YmxlY2xpY2toYW5kbGVyKHNlbGYpOgotCXBhc3MKKyAgICAgICAgcGFzcwogCiAgICAgZGVmIGFjY2VwdGFibGUoc2VsZiwgY2FyZHMpOgotCWlmIGxlbihjYXJkcykgIT0gMToKLQkgICAgcmV0dXJuIDAKLQljYXJkID0gY2FyZHNbMF0KLQlpZiBub3Qgc2VsZi5jYXJkczoKLQkgICAgcmV0dXJuIGNhcmQudmFsdWUgPT0gQUNFCi0JdG9wY2FyZCA9IHNlbGYuY2FyZHNbLTFdCi0JcmV0dXJuIGNhcmQuc3VpdCA9PSB0b3BjYXJkLnN1aXQgYW5kIGNhcmQudmFsdWUgPT0gdG9wY2FyZC52YWx1ZSArIDEKKyAgICAgICAgaWYgbGVuKGNhcmRzKSAhPSAxOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgY2FyZCA9IGNhcmRzWzBdCisgICAgICAgIGlmIG5vdCBzZWxmLmNhcmRzOgorICAgICAgICAgICAgcmV0dXJuIGNhcmQudmFsdWUgPT0gQUNFCisgICAgICAgIHRvcGNhcmQgPSBzZWxmLmNhcmRzWy0xXQorICAgICAgICByZXR1cm4gY2FyZC5zdWl0ID09IHRvcGNhcmQuc3VpdCBhbmQgY2FyZC52YWx1ZSA9PSB0b3BjYXJkLnZhbHVlICsgMQogCiAKIGNsYXNzIFJvd1N0YWNrKE9wZW5TdGFjayk6CiAKICAgICBkZWYgYWNjZXB0YWJsZShzZWxmLCBjYXJkcyk6Ci0JY2FyZCA9IGNhcmRzWzBdCi0JaWYgbm90IHNlbGYuY2FyZHM6Ci0JICAgIHJldHVybiBjYXJkLnZhbHVlID09IEtJTkcKLQl0b3BjYXJkID0gc2VsZi5jYXJkc1stMV0KLQlpZiBub3QgdG9wY2FyZC5mYWNlX3Nob3duOgotCSAgICByZXR1cm4gMAotCXJldHVybiBjYXJkLmNvbG9yICE9IHRvcGNhcmQuY29sb3IgYW5kIGNhcmQudmFsdWUgPT0gdG9wY2FyZC52YWx1ZSAtIDEKKyAgICAgICAgY2FyZCA9IGNhcmRzWzBdCisgICAgICAgIGlmIG5vdCBzZWxmLmNhcmRzOgorICAgICAgICAgICAgcmV0dXJuIGNhcmQudmFsdWUgPT0gS0lORworICAgICAgICB0b3BjYXJkID0gc2VsZi5jYXJkc1stMV0KKyAgICAgICAgaWYgbm90IHRvcGNhcmQuZmFjZV9zaG93bjoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiBjYXJkLmNvbG9yICE9IHRvcGNhcmQuY29sb3IgYW5kIGNhcmQudmFsdWUgPT0gdG9wY2FyZC52YWx1ZSAtIDEKIAogICAgIGRlZiBwb3NpdGlvbihzZWxmLCBjYXJkKToKLQl5ID0gc2VsZi55Ci0JZm9yIGMgaW4gc2VsZi5jYXJkczoKLQkgICAgaWYgYyA9PSBjYXJkOgotCQlicmVhawotCSAgICBpZiBjLmZhY2Vfc2hvd246Ci0JCXkgPSB5ICsgMipNQVJHSU4KLQkgICAgZWxzZToKLQkJeSA9IHkgKyBPRkZTRVQKLQljYXJkLm1vdmV0byhzZWxmLngsIHkpCisgICAgICAgIHkgPSBzZWxmLnkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5jYXJkczoKKyAgICAgICAgICAgIGlmIGMgPT0gY2FyZDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgYy5mYWNlX3Nob3duOgorICAgICAgICAgICAgICAgIHkgPSB5ICsgMipNQVJHSU4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeSA9IHkgKyBPRkZTRVQKKyAgICAgICAgY2FyZC5tb3ZldG8oc2VsZi54LCB5KQogCiAKIGNsYXNzIFNvbGl0YWlyZToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIpOgotCXNlbGYubWFzdGVyID0gbWFzdGVyCisgICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyCiAKLQlzZWxmLmNhbnZhcyA9IENhbnZhcyhzZWxmLm1hc3RlciwKLQkJCSAgICAgYmFja2dyb3VuZD1CQUNLR1JPVU5ELAotCQkJICAgICBoaWdobGlnaHR0aGlja25lc3M9MCwKLQkJCSAgICAgd2lkdGg9TlJPV1MqWFNQQUNJTkcsCi0JCQkgICAgIGhlaWdodD0zKllTUEFDSU5HICsgMjAgKyBNQVJHSU4pCi0Jc2VsZi5jYW52YXMucGFjayhmaWxsPUJPVEgsIGV4cGFuZD1UUlVFKQorICAgICAgICBzZWxmLmNhbnZhcyA9IENhbnZhcyhzZWxmLm1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZD1CQUNLR1JPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHR0aGlja25lc3M9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9TlJPV1MqWFNQQUNJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD0zKllTUEFDSU5HICsgMjAgKyBNQVJHSU4pCisgICAgICAgIHNlbGYuY2FudmFzLnBhY2soZmlsbD1CT1RILCBleHBhbmQ9VFJVRSkKIAotCXNlbGYuZGVhbGJ1dHRvbiA9IEJ1dHRvbihzZWxmLmNhbnZhcywKLQkJCQkgdGV4dD0iRGVhbCIsCi0JCQkJIGhpZ2hsaWdodHRoaWNrbmVzcz0wLAotCQkJCSBiYWNrZ3JvdW5kPUJBQ0tHUk9VTkQsCi0JCQkJIGFjdGl2ZWJhY2tncm91bmQ9ImdyZWVuIiwKLQkJCQkgY29tbWFuZD1zZWxmLmRlYWwpCi0JV2luZG93KHNlbGYuY2FudmFzLCBNQVJHSU4sIDMqWVNQQUNJTkcgKyAyMCwKLQkgICAgICAgd2luZG93PXNlbGYuZGVhbGJ1dHRvbiwgYW5jaG9yPVNXKQorICAgICAgICBzZWxmLmRlYWxidXR0b24gPSBCdXR0b24oc2VsZi5jYW52YXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJEZWFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodHRoaWNrbmVzcz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZD1CQUNLR1JPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlYmFja2dyb3VuZD0iZ3JlZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLmRlYWwpCisgICAgICAgIFdpbmRvdyhzZWxmLmNhbnZhcywgTUFSR0lOLCAzKllTUEFDSU5HICsgMjAsCisgICAgICAgICAgICAgICB3aW5kb3c9c2VsZi5kZWFsYnV0dG9uLCBhbmNob3I9U1cpCiAKLQl4ID0gTUFSR0lOCi0JeSA9IE1BUkdJTgorICAgICAgICB4ID0gTUFSR0lOCisgICAgICAgIHkgPSBNQVJHSU4KIAotCXNlbGYuZGVjayA9IERlY2soeCwgeSwgc2VsZikKKyAgICAgICAgc2VsZi5kZWNrID0gRGVjayh4LCB5LCBzZWxmKQogCi0JeCA9IHggKyBYU1BBQ0lORwotCXNlbGYub3BlbmRlY2sgPSBPcGVuU3RhY2soeCwgeSwgc2VsZikKLQkKLQl4ID0geCArIFhTUEFDSU5HCi0Jc2VsZi5zdWl0cyA9IFtdCi0JZm9yIGkgaW4gcmFuZ2UoTlNVSVRTKToKLQkgICAgeCA9IHggKyBYU1BBQ0lORwotCSAgICBzZWxmLnN1aXRzLmFwcGVuZChTdWl0U3RhY2soeCwgeSwgc2VsZikpCisgICAgICAgIHggPSB4ICsgWFNQQUNJTkcKKyAgICAgICAgc2VsZi5vcGVuZGVjayA9IE9wZW5TdGFjayh4LCB5LCBzZWxmKQogCi0JeCA9IE1BUkdJTgotCXkgPSB5ICsgWVNQQUNJTkcKKyAgICAgICAgeCA9IHggKyBYU1BBQ0lORworICAgICAgICBzZWxmLnN1aXRzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTlNVSVRTKToKKyAgICAgICAgICAgIHggPSB4ICsgWFNQQUNJTkcKKyAgICAgICAgICAgIHNlbGYuc3VpdHMuYXBwZW5kKFN1aXRTdGFjayh4LCB5LCBzZWxmKSkKIAotCXNlbGYucm93cyA9IFtdCi0JZm9yIGkgaW4gcmFuZ2UoTlJPV1MpOgotCSAgICBzZWxmLnJvd3MuYXBwZW5kKFJvd1N0YWNrKHgsIHksIHNlbGYpKQotCSAgICB4ID0geCArIFhTUEFDSU5HCisgICAgICAgIHggPSBNQVJHSU4KKyAgICAgICAgeSA9IHkgKyBZU1BBQ0lORwogCi0Jc2VsZi5vcGVuc3RhY2tzID0gW3NlbGYub3BlbmRlY2tdICsgc2VsZi5zdWl0cyArIHNlbGYucm93cwotCQotCXNlbGYuZGVjay5maWxsKCkKLQlzZWxmLmRlYWwoKQorICAgICAgICBzZWxmLnJvd3MgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShOUk9XUyk6CisgICAgICAgICAgICBzZWxmLnJvd3MuYXBwZW5kKFJvd1N0YWNrKHgsIHksIHNlbGYpKQorICAgICAgICAgICAgeCA9IHggKyBYU1BBQ0lORworCisgICAgICAgIHNlbGYub3BlbnN0YWNrcyA9IFtzZWxmLm9wZW5kZWNrXSArIHNlbGYuc3VpdHMgKyBzZWxmLnJvd3MKKworICAgICAgICBzZWxmLmRlY2suZmlsbCgpCisgICAgICAgIHNlbGYuZGVhbCgpCiAKICAgICBkZWYgd2luY2hlY2soc2VsZik6Ci0JZm9yIHMgaW4gc2VsZi5zdWl0czoKLQkgICAgaWYgbGVuKHMuY2FyZHMpICE9IE5WQUxVRVM6Ci0JCXJldHVybgotCXNlbGYud2luKCkKLQlzZWxmLmRlYWwoKQorICAgICAgICBmb3IgcyBpbiBzZWxmLnN1aXRzOgorICAgICAgICAgICAgaWYgbGVuKHMuY2FyZHMpICE9IE5WQUxVRVM6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYud2luKCkKKyAgICAgICAgc2VsZi5kZWFsKCkKIAogICAgIGRlZiB3aW4oc2VsZik6Ci0JIiIiU3R1cGlkIGFuaW1hdGlvbiB3aGVuIHlvdSB3aW4uIiIiCi0JY2FyZHMgPSBbXQotCWZvciBzIGluIHNlbGYub3BlbnN0YWNrczoKLQkgICAgY2FyZHMgPSBjYXJkcyArIHMuY2FyZHMKLQl3aGlsZSBjYXJkczoKLQkgICAgY2FyZCA9IHJhbmRvbS5jaG9pY2UoY2FyZHMpCi0JICAgIGNhcmRzLnJlbW92ZShjYXJkKQotCSAgICBzZWxmLmFuaW1hdGVkbW92ZXRvKGNhcmQsIHNlbGYuZGVjaykKKyAgICAgICAgIiIiU3R1cGlkIGFuaW1hdGlvbiB3aGVuIHlvdSB3aW4uIiIiCisgICAgICAgIGNhcmRzID0gW10KKyAgICAgICAgZm9yIHMgaW4gc2VsZi5vcGVuc3RhY2tzOgorICAgICAgICAgICAgY2FyZHMgPSBjYXJkcyArIHMuY2FyZHMKKyAgICAgICAgd2hpbGUgY2FyZHM6CisgICAgICAgICAgICBjYXJkID0gcmFuZG9tLmNob2ljZShjYXJkcykKKyAgICAgICAgICAgIGNhcmRzLnJlbW92ZShjYXJkKQorICAgICAgICAgICAgc2VsZi5hbmltYXRlZG1vdmV0byhjYXJkLCBzZWxmLmRlY2spCiAKICAgICBkZWYgYW5pbWF0ZWRtb3ZldG8oc2VsZiwgY2FyZCwgZGVzdCk6Ci0JZm9yIGkgaW4gcmFuZ2UoMTAsIDAsIC0xKToKLQkgICAgZHgsIGR5ID0gKGRlc3QueC1jYXJkLngpL2ksIChkZXN0LnktY2FyZC55KS9pCi0JICAgIGNhcmQubW92ZWJ5KGR4LCBkeSkKLQkgICAgc2VsZi5tYXN0ZXIudXBkYXRlX2lkbGV0YXNrcygpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwLCAwLCAtMSk6CisgICAgICAgICAgICBkeCwgZHkgPSAoZGVzdC54LWNhcmQueCkvaSwgKGRlc3QueS1jYXJkLnkpL2kKKyAgICAgICAgICAgIGNhcmQubW92ZWJ5KGR4LCBkeSkKKyAgICAgICAgICAgIHNlbGYubWFzdGVyLnVwZGF0ZV9pZGxldGFza3MoKQogCiAgICAgZGVmIGNsb3Nlc3RzdGFjayhzZWxmLCBjYXJkKToKLQljbG9zZXN0ID0gTm9uZQotCWNkaXN0ID0gOTk5OTk5OTk5Ci0JIyBTaW5jZSB3ZSBvbmx5IGNvbXBhcmUgZGlzdGFuY2VzLAotCSMgd2UgZG9uJ3QgYm90aGVyIHRvIHRha2UgdGhlIHNxdWFyZSByb290LgotCWZvciBzdGFjayBpbiBzZWxmLm9wZW5zdGFja3M6Ci0JICAgIGRpc3QgPSAoc3RhY2sueCAtIGNhcmQueCkqKjIgKyAoc3RhY2sueSAtIGNhcmQueSkqKjIKLQkgICAgaWYgZGlzdCA8IGNkaXN0OgotCQljbG9zZXN0ID0gc3RhY2sKLQkJY2Rpc3QgPSBkaXN0Ci0JcmV0dXJuIGNsb3Nlc3QKKyAgICAgICAgY2xvc2VzdCA9IE5vbmUKKyAgICAgICAgY2Rpc3QgPSA5OTk5OTk5OTkKKyAgICAgICAgIyBTaW5jZSB3ZSBvbmx5IGNvbXBhcmUgZGlzdGFuY2VzLAorICAgICAgICAjIHdlIGRvbid0IGJvdGhlciB0byB0YWtlIHRoZSBzcXVhcmUgcm9vdC4KKyAgICAgICAgZm9yIHN0YWNrIGluIHNlbGYub3BlbnN0YWNrczoKKyAgICAgICAgICAgIGRpc3QgPSAoc3RhY2sueCAtIGNhcmQueCkqKjIgKyAoc3RhY2sueSAtIGNhcmQueSkqKjIKKyAgICAgICAgICAgIGlmIGRpc3QgPCBjZGlzdDoKKyAgICAgICAgICAgICAgICBjbG9zZXN0ID0gc3RhY2sKKyAgICAgICAgICAgICAgICBjZGlzdCA9IGRpc3QKKyAgICAgICAgcmV0dXJuIGNsb3Nlc3QKIAogICAgIGRlZiBkZWFsKHNlbGYpOgotCXNlbGYucmVzZXQoKQotCXNlbGYuZGVjay5zaHVmZmxlKCkKLQlmb3IgaSBpbiByYW5nZShOUk9XUyk6Ci0JICAgIGZvciByIGluIHNlbGYucm93c1tpOl06Ci0JCWNhcmQgPSBzZWxmLmRlY2suZGVhbCgpCi0JCXIuYWRkKGNhcmQpCi0JZm9yIHIgaW4gc2VsZi5yb3dzOgotCSAgICByLnNob3d0b3AoKQorICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgc2VsZi5kZWNrLnNodWZmbGUoKQorICAgICAgICBmb3IgaSBpbiByYW5nZShOUk9XUyk6CisgICAgICAgICAgICBmb3IgciBpbiBzZWxmLnJvd3NbaTpdOgorICAgICAgICAgICAgICAgIGNhcmQgPSBzZWxmLmRlY2suZGVhbCgpCisgICAgICAgICAgICAgICAgci5hZGQoY2FyZCkKKyAgICAgICAgZm9yIHIgaW4gc2VsZi5yb3dzOgorICAgICAgICAgICAgci5zaG93dG9wKCkKIAogICAgIGRlZiByZXNldChzZWxmKToKLQlmb3Igc3RhY2sgaW4gc2VsZi5vcGVuc3RhY2tzOgotCSAgICB3aGlsZSAxOgotCQljYXJkID0gc3RhY2suZGVhbCgpCi0JCWlmIG5vdCBjYXJkOgotCQkgICAgYnJlYWsKLQkJc2VsZi5kZWNrLmFkZChjYXJkKQotCQljYXJkLnNob3diYWNrKCkKKyAgICAgICAgZm9yIHN0YWNrIGluIHNlbGYub3BlbnN0YWNrczoKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgY2FyZCA9IHN0YWNrLmRlYWwoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjYXJkOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuZGVjay5hZGQoY2FyZCkKKyAgICAgICAgICAgICAgICBjYXJkLnNob3diYWNrKCkKIAogCiAjIE1haW4gZnVuY3Rpb24sIHJ1biB3aGVuIGludm9rZWQgYXMgYSBzdGFuZC1hbG9uZSBQeXRob24gcHJvZ3JhbS4KZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9zb3J0dmlzdS5weSBiL0RlbW8vdGtpbnRlci9ndWlkby9zb3J0dmlzdS5weQppbmRleCA2ZmU0MDAyLi5mMThmMmMxIDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvZ3VpZG8vc29ydHZpc3UucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL3NvcnR2aXN1LnB5CkBAIC0zMiwzMDIgKzMyLDMwMiBAQAogY2xhc3MgQXJyYXk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBkYXRhPU5vbmUpOgotCXNlbGYubWFzdGVyID0gbWFzdGVyCi0Jc2VsZi5mcmFtZSA9IEZyYW1lKHNlbGYubWFzdGVyKQotCXNlbGYuZnJhbWUucGFjayhmaWxsPVgpCi0Jc2VsZi5sYWJlbCA9IExhYmVsKHNlbGYuZnJhbWUpCi0Jc2VsZi5sYWJlbC5wYWNrKCkKLQlzZWxmLmNhbnZhcyA9IENhbnZhcyhzZWxmLmZyYW1lKQotCXNlbGYuY2FudmFzLnBhY2soKQotCXNlbGYucmVwb3J0ID0gTGFiZWwoc2VsZi5mcmFtZSkKLQlzZWxmLnJlcG9ydC5wYWNrKCkKLQlzZWxmLmxlZnQgPSBMaW5lKHNlbGYuY2FudmFzLCAwLCAwLCAwLCAwKQotCXNlbGYucmlnaHQgPSBMaW5lKHNlbGYuY2FudmFzLCAwLCAwLCAwLCAwKQotCXNlbGYucGl2b3QgPSBMaW5lKHNlbGYuY2FudmFzLCAwLCAwLCAwLCAwKQotCXNlbGYuaXRlbXMgPSBbXQotCXNlbGYuc2l6ZSA9IHNlbGYubWF4dmFsdWUgPSAwCi0JaWYgZGF0YToKLQkgICAgc2VsZi5zZXRkYXRhKGRhdGEpCisgICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyCisgICAgICAgIHNlbGYuZnJhbWUgPSBGcmFtZShzZWxmLm1hc3RlcikKKyAgICAgICAgc2VsZi5mcmFtZS5wYWNrKGZpbGw9WCkKKyAgICAgICAgc2VsZi5sYWJlbCA9IExhYmVsKHNlbGYuZnJhbWUpCisgICAgICAgIHNlbGYubGFiZWwucGFjaygpCisgICAgICAgIHNlbGYuY2FudmFzID0gQ2FudmFzKHNlbGYuZnJhbWUpCisgICAgICAgIHNlbGYuY2FudmFzLnBhY2soKQorICAgICAgICBzZWxmLnJlcG9ydCA9IExhYmVsKHNlbGYuZnJhbWUpCisgICAgICAgIHNlbGYucmVwb3J0LnBhY2soKQorICAgICAgICBzZWxmLmxlZnQgPSBMaW5lKHNlbGYuY2FudmFzLCAwLCAwLCAwLCAwKQorICAgICAgICBzZWxmLnJpZ2h0ID0gTGluZShzZWxmLmNhbnZhcywgMCwgMCwgMCwgMCkKKyAgICAgICAgc2VsZi5waXZvdCA9IExpbmUoc2VsZi5jYW52YXMsIDAsIDAsIDAsIDApCisgICAgICAgIHNlbGYuaXRlbXMgPSBbXQorICAgICAgICBzZWxmLnNpemUgPSBzZWxmLm1heHZhbHVlID0gMAorICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgc2VsZi5zZXRkYXRhKGRhdGEpCiAKICAgICBkZWYgc2V0ZGF0YShzZWxmLCBkYXRhKToKLQlvbGRpdGVtcyA9IHNlbGYuaXRlbXMKLQlzZWxmLml0ZW1zID0gW10KLQlmb3IgaXRlbSBpbiBvbGRpdGVtczoKLQkgICAgaXRlbS5kZWxldGUoKQotCXNlbGYuc2l6ZSA9IGxlbihkYXRhKQotCXNlbGYubWF4dmFsdWUgPSBtYXgoZGF0YSkKLQlzZWxmLmNhbnZhcy5jb25maWcod2lkdGg9KHNlbGYuc2l6ZSsxKSpYR1JJRCwKLQkJCSAgIGhlaWdodD0oc2VsZi5tYXh2YWx1ZSsxKSpZR1JJRCkKLQlmb3IgaSBpbiByYW5nZShzZWxmLnNpemUpOgotCSAgICBzZWxmLml0ZW1zLmFwcGVuZChBcnJheUl0ZW0oc2VsZiwgaSwgZGF0YVtpXSkpCi0Jc2VsZi5yZXNldCgiU29ydCBkZW1vLCBzaXplICVkIiAlIHNlbGYuc2l6ZSkKKyAgICAgICAgb2xkaXRlbXMgPSBzZWxmLml0ZW1zCisgICAgICAgIHNlbGYuaXRlbXMgPSBbXQorICAgICAgICBmb3IgaXRlbSBpbiBvbGRpdGVtczoKKyAgICAgICAgICAgIGl0ZW0uZGVsZXRlKCkKKyAgICAgICAgc2VsZi5zaXplID0gbGVuKGRhdGEpCisgICAgICAgIHNlbGYubWF4dmFsdWUgPSBtYXgoZGF0YSkKKyAgICAgICAgc2VsZi5jYW52YXMuY29uZmlnKHdpZHRoPShzZWxmLnNpemUrMSkqWEdSSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9KHNlbGYubWF4dmFsdWUrMSkqWUdSSUQpCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuc2l6ZSk6CisgICAgICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChBcnJheUl0ZW0oc2VsZiwgaSwgZGF0YVtpXSkpCisgICAgICAgIHNlbGYucmVzZXQoIlNvcnQgZGVtbywgc2l6ZSAlZCIgJSBzZWxmLnNpemUpCiAKICAgICBzcGVlZCA9ICJub3JtYWwiCiAKICAgICBkZWYgc2V0c3BlZWQoc2VsZiwgc3BlZWQpOgotCXNlbGYuc3BlZWQgPSBzcGVlZAorICAgICAgICBzZWxmLnNwZWVkID0gc3BlZWQKIAogICAgIGRlZiBkZXN0cm95KHNlbGYpOgotCXNlbGYuZnJhbWUuZGVzdHJveSgpCisgICAgICAgIHNlbGYuZnJhbWUuZGVzdHJveSgpCiAKICAgICBpbl9tYWlubG9vcCA9IDAKICAgICBzdG9wX21haW5sb29wID0gMAogCiAgICAgZGVmIGNhbmNlbChzZWxmKToKLQlzZWxmLnN0b3BfbWFpbmxvb3AgPSAxCi0JaWYgc2VsZi5pbl9tYWlubG9vcDoKLQkgICAgc2VsZi5tYXN0ZXIucXVpdCgpCisgICAgICAgIHNlbGYuc3RvcF9tYWlubG9vcCA9IDEKKyAgICAgICAgaWYgc2VsZi5pbl9tYWlubG9vcDoKKyAgICAgICAgICAgIHNlbGYubWFzdGVyLnF1aXQoKQogCiAgICAgZGVmIHN0ZXAoc2VsZik6Ci0JaWYgc2VsZi5pbl9tYWlubG9vcDoKLQkgICAgc2VsZi5tYXN0ZXIucXVpdCgpCisgICAgICAgIGlmIHNlbGYuaW5fbWFpbmxvb3A6CisgICAgICAgICAgICBzZWxmLm1hc3Rlci5xdWl0KCkKIAotICAgIENhbmNlbGxlZCA9ICJBcnJheS5DYW5jZWxsZWQiCSMgRXhjZXB0aW9uCisgICAgQ2FuY2VsbGVkID0gIkFycmF5LkNhbmNlbGxlZCIgICAgICAgIyBFeGNlcHRpb24KIAogICAgIGRlZiB3YWl0KHNlbGYsIG1zZWNzKToKLQlpZiBzZWxmLnNwZWVkID09ICJmYXN0ZXN0IjoKLQkgICAgbXNlY3MgPSAwCi0JZWxpZiBzZWxmLnNwZWVkID09ICJmYXN0IjoKLQkgICAgbXNlY3MgPSBtc2Vjcy8xMAotCWVsaWYgc2VsZi5zcGVlZCA9PSAic2luZ2xlLXN0ZXAiOgotCSAgICBtc2VjcyA9IDEwMDAwMDAwMDAKLQlpZiBub3Qgc2VsZi5zdG9wX21haW5sb29wOgotCSAgICBzZWxmLm1hc3Rlci51cGRhdGUoKQotCSAgICBpZCA9IHNlbGYubWFzdGVyLmFmdGVyKG1zZWNzLCBzZWxmLm1hc3Rlci5xdWl0KQotCSAgICBzZWxmLmluX21haW5sb29wID0gMQotCSAgICBzZWxmLm1hc3Rlci5tYWlubG9vcCgpCi0JICAgIHNlbGYubWFzdGVyLmFmdGVyX2NhbmNlbChpZCkKLQkgICAgc2VsZi5pbl9tYWlubG9vcCA9IDAKLQlpZiBzZWxmLnN0b3BfbWFpbmxvb3A6Ci0JICAgIHNlbGYuc3RvcF9tYWlubG9vcCA9IDAKLQkgICAgc2VsZi5tZXNzYWdlKCJDYW5jZWxsZWQiKQotCSAgICByYWlzZSBBcnJheS5DYW5jZWxsZWQKKyAgICAgICAgaWYgc2VsZi5zcGVlZCA9PSAiZmFzdGVzdCI6CisgICAgICAgICAgICBtc2VjcyA9IDAKKyAgICAgICAgZWxpZiBzZWxmLnNwZWVkID09ICJmYXN0IjoKKyAgICAgICAgICAgIG1zZWNzID0gbXNlY3MvMTAKKyAgICAgICAgZWxpZiBzZWxmLnNwZWVkID09ICJzaW5nbGUtc3RlcCI6CisgICAgICAgICAgICBtc2VjcyA9IDEwMDAwMDAwMDAKKyAgICAgICAgaWYgbm90IHNlbGYuc3RvcF9tYWlubG9vcDoKKyAgICAgICAgICAgIHNlbGYubWFzdGVyLnVwZGF0ZSgpCisgICAgICAgICAgICBpZCA9IHNlbGYubWFzdGVyLmFmdGVyKG1zZWNzLCBzZWxmLm1hc3Rlci5xdWl0KQorICAgICAgICAgICAgc2VsZi5pbl9tYWlubG9vcCA9IDEKKyAgICAgICAgICAgIHNlbGYubWFzdGVyLm1haW5sb29wKCkKKyAgICAgICAgICAgIHNlbGYubWFzdGVyLmFmdGVyX2NhbmNlbChpZCkKKyAgICAgICAgICAgIHNlbGYuaW5fbWFpbmxvb3AgPSAwCisgICAgICAgIGlmIHNlbGYuc3RvcF9tYWlubG9vcDoKKyAgICAgICAgICAgIHNlbGYuc3RvcF9tYWlubG9vcCA9IDAKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiQ2FuY2VsbGVkIikKKyAgICAgICAgICAgIHJhaXNlIEFycmF5LkNhbmNlbGxlZAogCiAgICAgZGVmIGdldHNpemUoc2VsZik6Ci0JcmV0dXJuIHNlbGYuc2l6ZQorICAgICAgICByZXR1cm4gc2VsZi5zaXplCiAKICAgICBkZWYgc2hvd19wYXJ0aXRpb24oc2VsZiwgZmlyc3QsIGxhc3QpOgotCWZvciBpIGluIHJhbmdlKHNlbGYuc2l6ZSk6Ci0JICAgIGl0ZW0gPSBzZWxmLml0ZW1zW2ldCi0JICAgIGlmIGZpcnN0IDw9IGkgPCBsYXN0OgotCQlpdGVtLml0ZW0uY29uZmlnKGZpbGw9J3JlZCcpCi0JICAgIGVsc2U6Ci0JCWl0ZW0uaXRlbS5jb25maWcoZmlsbD0nb3JhbmdlJykKLQlzZWxmLmhpZGVfbGVmdF9yaWdodF9waXZvdCgpCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuc2l6ZSk6CisgICAgICAgICAgICBpdGVtID0gc2VsZi5pdGVtc1tpXQorICAgICAgICAgICAgaWYgZmlyc3QgPD0gaSA8IGxhc3Q6CisgICAgICAgICAgICAgICAgaXRlbS5pdGVtLmNvbmZpZyhmaWxsPSdyZWQnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpdGVtLml0ZW0uY29uZmlnKGZpbGw9J29yYW5nZScpCisgICAgICAgIHNlbGYuaGlkZV9sZWZ0X3JpZ2h0X3Bpdm90KCkKIAogICAgIGRlZiBoaWRlX3BhcnRpdGlvbihzZWxmKToKLQlmb3IgaSBpbiByYW5nZShzZWxmLnNpemUpOgotCSAgICBpdGVtID0gc2VsZi5pdGVtc1tpXQotCSAgICBpdGVtLml0ZW0uY29uZmlnKGZpbGw9J3JlZCcpCi0Jc2VsZi5oaWRlX2xlZnRfcmlnaHRfcGl2b3QoKQorICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLnNpemUpOgorICAgICAgICAgICAgaXRlbSA9IHNlbGYuaXRlbXNbaV0KKyAgICAgICAgICAgIGl0ZW0uaXRlbS5jb25maWcoZmlsbD0ncmVkJykKKyAgICAgICAgc2VsZi5oaWRlX2xlZnRfcmlnaHRfcGl2b3QoKQogCiAgICAgZGVmIHNob3dfbGVmdChzZWxmLCBsZWZ0KToKLQlpZiBub3QgMCA8PSBsZWZ0IDwgc2VsZi5zaXplOgotCSAgICBzZWxmLmhpZGVfbGVmdCgpCi0JICAgIHJldHVybgotCXgxLCB5MSwgeDIsIHkyID0gc2VsZi5pdGVtc1tsZWZ0XS5wb3NpdGlvbigpCi0jIwl0b3AsIGJvdCA9IEhJUk8KLQlzZWxmLmxlZnQuY29vcmRzKFsoeDEtMiwgMCksICh4MS0yLCA5OTk5KV0pCi0Jc2VsZi5tYXN0ZXIudXBkYXRlKCkKKyAgICAgICAgaWYgbm90IDAgPD0gbGVmdCA8IHNlbGYuc2l6ZToKKyAgICAgICAgICAgIHNlbGYuaGlkZV9sZWZ0KCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB4MSwgeTEsIHgyLCB5MiA9IHNlbGYuaXRlbXNbbGVmdF0ucG9zaXRpb24oKQorIyMgICAgICB0b3AsIGJvdCA9IEhJUk8KKyAgICAgICAgc2VsZi5sZWZ0LmNvb3JkcyhbKHgxLTIsIDApLCAoeDEtMiwgOTk5OSldKQorICAgICAgICBzZWxmLm1hc3Rlci51cGRhdGUoKQogCiAgICAgZGVmIHNob3dfcmlnaHQoc2VsZiwgcmlnaHQpOgotCWlmIG5vdCAwIDw9IHJpZ2h0IDwgc2VsZi5zaXplOgotCSAgICBzZWxmLmhpZGVfcmlnaHQoKQotCSAgICByZXR1cm4KLQl4MSwgeTEsIHgyLCB5MiA9IHNlbGYuaXRlbXNbcmlnaHRdLnBvc2l0aW9uKCkKLQlzZWxmLnJpZ2h0LmNvb3JkcygoKHgyKzIsIDApLCAoeDIrMiwgOTk5OSkpKQotCXNlbGYubWFzdGVyLnVwZGF0ZSgpCisgICAgICAgIGlmIG5vdCAwIDw9IHJpZ2h0IDwgc2VsZi5zaXplOgorICAgICAgICAgICAgc2VsZi5oaWRlX3JpZ2h0KCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB4MSwgeTEsIHgyLCB5MiA9IHNlbGYuaXRlbXNbcmlnaHRdLnBvc2l0aW9uKCkKKyAgICAgICAgc2VsZi5yaWdodC5jb29yZHMoKCh4MisyLCAwKSwgKHgyKzIsIDk5OTkpKSkKKyAgICAgICAgc2VsZi5tYXN0ZXIudXBkYXRlKCkKIAogICAgIGRlZiBoaWRlX2xlZnRfcmlnaHRfcGl2b3Qoc2VsZik6Ci0Jc2VsZi5oaWRlX2xlZnQoKQotCXNlbGYuaGlkZV9yaWdodCgpCi0Jc2VsZi5oaWRlX3Bpdm90KCkKKyAgICAgICAgc2VsZi5oaWRlX2xlZnQoKQorICAgICAgICBzZWxmLmhpZGVfcmlnaHQoKQorICAgICAgICBzZWxmLmhpZGVfcGl2b3QoKQogCiAgICAgZGVmIGhpZGVfbGVmdChzZWxmKToKLQlzZWxmLmxlZnQuY29vcmRzKCgoMCwgMCksICgwLCAwKSkpCisgICAgICAgIHNlbGYubGVmdC5jb29yZHMoKCgwLCAwKSwgKDAsIDApKSkKIAogICAgIGRlZiBoaWRlX3JpZ2h0KHNlbGYpOgotCXNlbGYucmlnaHQuY29vcmRzKCgoMCwgMCksICgwLCAwKSkpCisgICAgICAgIHNlbGYucmlnaHQuY29vcmRzKCgoMCwgMCksICgwLCAwKSkpCiAKICAgICBkZWYgc2hvd19waXZvdChzZWxmLCBwaXZvdCk6Ci0JeDEsIHkxLCB4MiwgeTIgPSBzZWxmLml0ZW1zW3Bpdm90XS5wb3NpdGlvbigpCi0Jc2VsZi5waXZvdC5jb29yZHMoKCgwLCB5MS0yKSwgKDk5OTksIHkxLTIpKSkKKyAgICAgICAgeDEsIHkxLCB4MiwgeTIgPSBzZWxmLml0ZW1zW3Bpdm90XS5wb3NpdGlvbigpCisgICAgICAgIHNlbGYucGl2b3QuY29vcmRzKCgoMCwgeTEtMiksICg5OTk5LCB5MS0yKSkpCiAKICAgICBkZWYgaGlkZV9waXZvdChzZWxmKToKLQlzZWxmLnBpdm90LmNvb3JkcygoKDAsIDApLCAoMCwgMCkpKQorICAgICAgICBzZWxmLnBpdm90LmNvb3JkcygoKDAsIDApLCAoMCwgMCkpKQogCiAgICAgZGVmIHN3YXAoc2VsZiwgaSwgaik6Ci0JaWYgaSA9PSBqOiByZXR1cm4KLQlzZWxmLmNvdW50c3dhcCgpCi0JaXRlbSA9IHNlbGYuaXRlbXNbaV0KLQlvdGhlciA9IHNlbGYuaXRlbXNbal0KLQlzZWxmLml0ZW1zW2ldLCBzZWxmLml0ZW1zW2pdID0gb3RoZXIsIGl0ZW0KLQlpdGVtLnN3YXB3aXRoKG90aGVyKQorICAgICAgICBpZiBpID09IGo6IHJldHVybgorICAgICAgICBzZWxmLmNvdW50c3dhcCgpCisgICAgICAgIGl0ZW0gPSBzZWxmLml0ZW1zW2ldCisgICAgICAgIG90aGVyID0gc2VsZi5pdGVtc1tqXQorICAgICAgICBzZWxmLml0ZW1zW2ldLCBzZWxmLml0ZW1zW2pdID0gb3RoZXIsIGl0ZW0KKyAgICAgICAgaXRlbS5zd2Fwd2l0aChvdGhlcikKIAogICAgIGRlZiBjb21wYXJlKHNlbGYsIGksIGopOgotCXNlbGYuY291bnRjb21wYXJlKCkKLQlpdGVtID0gc2VsZi5pdGVtc1tpXQotCW90aGVyID0gc2VsZi5pdGVtc1tqXQotCXJldHVybiBpdGVtLmNvbXBhcmV0byhvdGhlcikKKyAgICAgICAgc2VsZi5jb3VudGNvbXBhcmUoKQorICAgICAgICBpdGVtID0gc2VsZi5pdGVtc1tpXQorICAgICAgICBvdGhlciA9IHNlbGYuaXRlbXNbal0KKyAgICAgICAgcmV0dXJuIGl0ZW0uY29tcGFyZXRvKG90aGVyKQogCiAgICAgZGVmIHJlc2V0KHNlbGYsIG1zZyk6Ci0Jc2VsZi5uY29tcGFyZXMgPSAwCi0Jc2VsZi5uc3dhcHMgPSAwCi0Jc2VsZi5tZXNzYWdlKG1zZykKLQlzZWxmLnVwZGF0ZXJlcG9ydCgpCi0Jc2VsZi5oaWRlX3BhcnRpdGlvbigpCisgICAgICAgIHNlbGYubmNvbXBhcmVzID0gMAorICAgICAgICBzZWxmLm5zd2FwcyA9IDAKKyAgICAgICAgc2VsZi5tZXNzYWdlKG1zZykKKyAgICAgICAgc2VsZi51cGRhdGVyZXBvcnQoKQorICAgICAgICBzZWxmLmhpZGVfcGFydGl0aW9uKCkKIAogICAgIGRlZiBtZXNzYWdlKHNlbGYsIG1zZyk6Ci0Jc2VsZi5sYWJlbC5jb25maWcodGV4dD1tc2cpCisgICAgICAgIHNlbGYubGFiZWwuY29uZmlnKHRleHQ9bXNnKQogCiAgICAgZGVmIGNvdW50c3dhcChzZWxmKToKLQlzZWxmLm5zd2FwcyA9IHNlbGYubnN3YXBzICsgMQotCXNlbGYudXBkYXRlcmVwb3J0KCkKKyAgICAgICAgc2VsZi5uc3dhcHMgPSBzZWxmLm5zd2FwcyArIDEKKyAgICAgICAgc2VsZi51cGRhdGVyZXBvcnQoKQogCiAgICAgZGVmIGNvdW50Y29tcGFyZShzZWxmKToKLQlzZWxmLm5jb21wYXJlcyA9IHNlbGYubmNvbXBhcmVzICsgMQotCXNlbGYudXBkYXRlcmVwb3J0KCkKKyAgICAgICAgc2VsZi5uY29tcGFyZXMgPSBzZWxmLm5jb21wYXJlcyArIDEKKyAgICAgICAgc2VsZi51cGRhdGVyZXBvcnQoKQogCiAgICAgZGVmIHVwZGF0ZXJlcG9ydChzZWxmKToKLQl0ZXh0ID0gIiVkIGNtcHMsICVkIHN3YXBzIiAlIChzZWxmLm5jb21wYXJlcywgc2VsZi5uc3dhcHMpCi0Jc2VsZi5yZXBvcnQuY29uZmlnKHRleHQ9dGV4dCkKKyAgICAgICAgdGV4dCA9ICIlZCBjbXBzLCAlZCBzd2FwcyIgJSAoc2VsZi5uY29tcGFyZXMsIHNlbGYubnN3YXBzKQorICAgICAgICBzZWxmLnJlcG9ydC5jb25maWcodGV4dD10ZXh0KQogCiAKIGNsYXNzIEFycmF5SXRlbToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcnJheSwgaW5kZXgsIHZhbHVlKToKLQlzZWxmLmFycmF5ID0gYXJyYXkKLQlzZWxmLmluZGV4ID0gaW5kZXgKLQlzZWxmLnZhbHVlID0gdmFsdWUKLQl4MSwgeTEsIHgyLCB5MiA9IHNlbGYucG9zaXRpb24oKQotCXNlbGYuaXRlbSA9IFJlY3RhbmdsZShhcnJheS5jYW52YXMsIHgxLCB5MSwgeDIsIHkyLAotCQkJICAgICAgZmlsbD0ncmVkJywgb3V0bGluZT0nYmxhY2snLCB3aWR0aD0xKQotCXNlbGYuaXRlbS5iaW5kKCc8QnV0dG9uLTE+Jywgc2VsZi5tb3VzZV9kb3duKQotCXNlbGYuaXRlbS5iaW5kKCc8QnV0dG9uMS1Nb3Rpb24+Jywgc2VsZi5tb3VzZV9tb3ZlKQotCXNlbGYuaXRlbS5iaW5kKCc8QnV0dG9uUmVsZWFzZS0xPicsIHNlbGYubW91c2VfdXApCisgICAgICAgIHNlbGYuYXJyYXkgPSBhcnJheQorICAgICAgICBzZWxmLmluZGV4ID0gaW5kZXgKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHgxLCB5MSwgeDIsIHkyID0gc2VsZi5wb3NpdGlvbigpCisgICAgICAgIHNlbGYuaXRlbSA9IFJlY3RhbmdsZShhcnJheS5jYW52YXMsIHgxLCB5MSwgeDIsIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0ncmVkJywgb3V0bGluZT0nYmxhY2snLCB3aWR0aD0xKQorICAgICAgICBzZWxmLml0ZW0uYmluZCgnPEJ1dHRvbi0xPicsIHNlbGYubW91c2VfZG93bikKKyAgICAgICAgc2VsZi5pdGVtLmJpbmQoJzxCdXR0b24xLU1vdGlvbj4nLCBzZWxmLm1vdXNlX21vdmUpCisgICAgICAgIHNlbGYuaXRlbS5iaW5kKCc8QnV0dG9uUmVsZWFzZS0xPicsIHNlbGYubW91c2VfdXApCiAKICAgICBkZWYgZGVsZXRlKHNlbGYpOgotCWl0ZW0gPSBzZWxmLml0ZW0KLQlzZWxmLmFycmF5ID0gTm9uZQotCXNlbGYuaXRlbSA9IE5vbmUKLQlpdGVtLmRlbGV0ZSgpCisgICAgICAgIGl0ZW0gPSBzZWxmLml0ZW0KKyAgICAgICAgc2VsZi5hcnJheSA9IE5vbmUKKyAgICAgICAgc2VsZi5pdGVtID0gTm9uZQorICAgICAgICBpdGVtLmRlbGV0ZSgpCiAKICAgICBkZWYgbW91c2VfZG93bihzZWxmLCBldmVudCk6Ci0Jc2VsZi5sYXN0eCA9IGV2ZW50LngKLQlzZWxmLmxhc3R5ID0gZXZlbnQueQotCXNlbGYub3JpZ3ggPSBldmVudC54Ci0Jc2VsZi5vcmlneSA9IGV2ZW50LnkKLQlzZWxmLml0ZW0udGtyYWlzZSgpCi0gICAgCQorICAgICAgICBzZWxmLmxhc3R4ID0gZXZlbnQueAorICAgICAgICBzZWxmLmxhc3R5ID0gZXZlbnQueQorICAgICAgICBzZWxmLm9yaWd4ID0gZXZlbnQueAorICAgICAgICBzZWxmLm9yaWd5ID0gZXZlbnQueQorICAgICAgICBzZWxmLml0ZW0udGtyYWlzZSgpCisKICAgICBkZWYgbW91c2VfbW92ZShzZWxmLCBldmVudCk6Ci0Jc2VsZi5pdGVtLm1vdmUoZXZlbnQueCAtIHNlbGYubGFzdHgsIGV2ZW50LnkgLSBzZWxmLmxhc3R5KQotCXNlbGYubGFzdHggPSBldmVudC54Ci0Jc2VsZi5sYXN0eSA9IGV2ZW50LnkKKyAgICAgICAgc2VsZi5pdGVtLm1vdmUoZXZlbnQueCAtIHNlbGYubGFzdHgsIGV2ZW50LnkgLSBzZWxmLmxhc3R5KQorICAgICAgICBzZWxmLmxhc3R4ID0gZXZlbnQueAorICAgICAgICBzZWxmLmxhc3R5ID0gZXZlbnQueQogCiAgICAgZGVmIG1vdXNlX3VwKHNlbGYsIGV2ZW50KToKLQlpID0gc2VsZi5uZWFyZXN0aW5kZXgoZXZlbnQueCkKLQlpZiBpID49IHNlbGYuYXJyYXkuZ2V0c2l6ZSgpOgotCSAgICBpID0gc2VsZi5hcnJheS5nZXRzaXplKCkgLSAxCi0JaWYgaSA8IDA6Ci0JICAgIGkgPSAwCi0Jb3RoZXIgPSBzZWxmLmFycmF5Lml0ZW1zW2ldCi0JaGVyZSA9IHNlbGYuaW5kZXgKLQlzZWxmLmFycmF5Lml0ZW1zW2hlcmVdLCBzZWxmLmFycmF5Lml0ZW1zW2ldID0gb3RoZXIsIHNlbGYKLQlzZWxmLmluZGV4ID0gaQotCXgxLCB5MSwgeDIsIHkyID0gc2VsZi5wb3NpdGlvbigpCi0Jc2VsZi5pdGVtLmNvb3JkcygoKHgxLCB5MSksICh4MiwgeTIpKSkKLQlvdGhlci5zZXRpbmRleChoZXJlKQorICAgICAgICBpID0gc2VsZi5uZWFyZXN0aW5kZXgoZXZlbnQueCkKKyAgICAgICAgaWYgaSA+PSBzZWxmLmFycmF5LmdldHNpemUoKToKKyAgICAgICAgICAgIGkgPSBzZWxmLmFycmF5LmdldHNpemUoKSAtIDEKKyAgICAgICAgaWYgaSA8IDA6CisgICAgICAgICAgICBpID0gMAorICAgICAgICBvdGhlciA9IHNlbGYuYXJyYXkuaXRlbXNbaV0KKyAgICAgICAgaGVyZSA9IHNlbGYuaW5kZXgKKyAgICAgICAgc2VsZi5hcnJheS5pdGVtc1toZXJlXSwgc2VsZi5hcnJheS5pdGVtc1tpXSA9IG90aGVyLCBzZWxmCisgICAgICAgIHNlbGYuaW5kZXggPSBpCisgICAgICAgIHgxLCB5MSwgeDIsIHkyID0gc2VsZi5wb3NpdGlvbigpCisgICAgICAgIHNlbGYuaXRlbS5jb29yZHMoKCh4MSwgeTEpLCAoeDIsIHkyKSkpCisgICAgICAgIG90aGVyLnNldGluZGV4KGhlcmUpCiAKICAgICBkZWYgc2V0aW5kZXgoc2VsZiwgaW5kZXgpOgotCW5zdGVwcyA9IHN0ZXBzKHNlbGYuaW5kZXgsIGluZGV4KQotCWlmIG5vdCBuc3RlcHM6IHJldHVybgotCWlmIHNlbGYuYXJyYXkuc3BlZWQgPT0gImZhc3Rlc3QiOgotCSAgICBuc3RlcHMgPSAwCi0Jb2xkcHRzID0gc2VsZi5wb3NpdGlvbigpCi0Jc2VsZi5pbmRleCA9IGluZGV4Ci0JbmV3cHRzID0gc2VsZi5wb3NpdGlvbigpCi0JdHJhamVjdG9yeSA9IGludGVycG9sYXRlKG9sZHB0cywgbmV3cHRzLCBuc3RlcHMpCi0Jc2VsZi5pdGVtLnRrcmFpc2UoKQotCWZvciBwdHMgaW4gdHJhamVjdG9yeToKLQkgICAgc2VsZi5pdGVtLmNvb3JkcygocHRzWzoyXSwgcHRzWzI6XSkpCi0JICAgIHNlbGYuYXJyYXkud2FpdCg1MCkKKyAgICAgICAgbnN0ZXBzID0gc3RlcHMoc2VsZi5pbmRleCwgaW5kZXgpCisgICAgICAgIGlmIG5vdCBuc3RlcHM6IHJldHVybgorICAgICAgICBpZiBzZWxmLmFycmF5LnNwZWVkID09ICJmYXN0ZXN0IjoKKyAgICAgICAgICAgIG5zdGVwcyA9IDAKKyAgICAgICAgb2xkcHRzID0gc2VsZi5wb3NpdGlvbigpCisgICAgICAgIHNlbGYuaW5kZXggPSBpbmRleAorICAgICAgICBuZXdwdHMgPSBzZWxmLnBvc2l0aW9uKCkKKyAgICAgICAgdHJhamVjdG9yeSA9IGludGVycG9sYXRlKG9sZHB0cywgbmV3cHRzLCBuc3RlcHMpCisgICAgICAgIHNlbGYuaXRlbS50a3JhaXNlKCkKKyAgICAgICAgZm9yIHB0cyBpbiB0cmFqZWN0b3J5OgorICAgICAgICAgICAgc2VsZi5pdGVtLmNvb3JkcygocHRzWzoyXSwgcHRzWzI6XSkpCisgICAgICAgICAgICBzZWxmLmFycmF5LndhaXQoNTApCiAKICAgICBkZWYgc3dhcHdpdGgoc2VsZiwgb3RoZXIpOgotCW5zdGVwcyA9IHN0ZXBzKHNlbGYuaW5kZXgsIG90aGVyLmluZGV4KQotCWlmIG5vdCBuc3RlcHM6IHJldHVybgotCWlmIHNlbGYuYXJyYXkuc3BlZWQgPT0gImZhc3Rlc3QiOgotCSAgICBuc3RlcHMgPSAwCi0JbXlvbGRwdHMgPSBzZWxmLnBvc2l0aW9uKCkKLQlvdGhlcm9sZHB0cyA9IG90aGVyLnBvc2l0aW9uKCkKLQlzZWxmLmluZGV4LCBvdGhlci5pbmRleCA9IG90aGVyLmluZGV4LCBzZWxmLmluZGV4Ci0JbXluZXdwdHMgPSBzZWxmLnBvc2l0aW9uKCkKLQlvdGhlcm5ld3B0cyA9IG90aGVyLnBvc2l0aW9uKCkKLQlteWZpbGwgPSBzZWxmLml0ZW1bJ2ZpbGwnXQotCW90aGVyZmlsbCA9IG90aGVyLml0ZW1bJ2ZpbGwnXQotCXNlbGYuaXRlbS5jb25maWcoZmlsbD0nZ3JlZW4nKQotCW90aGVyLml0ZW0uY29uZmlnKGZpbGw9J3llbGxvdycpCi0Jc2VsZi5hcnJheS5tYXN0ZXIudXBkYXRlKCkKLQlpZiBzZWxmLmFycmF5LnNwZWVkID09ICJzaW5nbGUtc3RlcCI6Ci0JICAgIHNlbGYuaXRlbS5jb29yZHMoKG15bmV3cHRzWzoyXSwgbXluZXdwdHNbMjpdKSkKLQkgICAgb3RoZXIuaXRlbS5jb29yZHMoKG90aGVybmV3cHRzWzoyXSwgb3RoZXJuZXdwdHNbMjpdKSkKLQkgICAgc2VsZi5hcnJheS5tYXN0ZXIudXBkYXRlKCkKLQkgICAgc2VsZi5pdGVtLmNvbmZpZyhmaWxsPW15ZmlsbCkKLQkgICAgb3RoZXIuaXRlbS5jb25maWcoZmlsbD1vdGhlcmZpbGwpCi0JICAgIHNlbGYuYXJyYXkud2FpdCgwKQotCSAgICByZXR1cm4KLQlteXRyYWplY3RvcnkgPSBpbnRlcnBvbGF0ZShteW9sZHB0cywgbXluZXdwdHMsIG5zdGVwcykKLQlvdGhlcnRyYWplY3RvcnkgPSBpbnRlcnBvbGF0ZShvdGhlcm9sZHB0cywgb3RoZXJuZXdwdHMsIG5zdGVwcykKLQlpZiBzZWxmLnZhbHVlID4gb3RoZXIudmFsdWU6Ci0JICAgIHNlbGYuaXRlbS50a3JhaXNlKCkKLQkgICAgb3RoZXIuaXRlbS50a3JhaXNlKCkKLQllbHNlOgotCSAgICBvdGhlci5pdGVtLnRrcmFpc2UoKQotCSAgICBzZWxmLml0ZW0udGtyYWlzZSgpCi0JdHJ5OgotCSAgICBmb3IgaSBpbiByYW5nZShsZW4obXl0cmFqZWN0b3J5KSk6Ci0JCW15cHRzID0gbXl0cmFqZWN0b3J5W2ldCi0JCW90aGVycHRzID0gb3RoZXJ0cmFqZWN0b3J5W2ldCi0JCXNlbGYuaXRlbS5jb29yZHMoKG15cHRzWzoyXSwgbXlwdHNbMjpdKSkKLQkJb3RoZXIuaXRlbS5jb29yZHMoKG90aGVycHRzWzoyXSwgb3RoZXJwdHNbMjpdKSkKLQkJc2VsZi5hcnJheS53YWl0KDUwKQotCWZpbmFsbHk6Ci0JICAgIG15cHRzID0gbXl0cmFqZWN0b3J5Wy0xXQotCSAgICBvdGhlcnB0cyA9IG90aGVydHJhamVjdG9yeVstMV0KLQkgICAgc2VsZi5pdGVtLmNvb3JkcygobXlwdHNbOjJdLCBteXB0c1syOl0pKQotCSAgICBvdGhlci5pdGVtLmNvb3Jkcygob3RoZXJwdHNbOjJdLCBvdGhlcnB0c1syOl0pKQotCSAgICBzZWxmLml0ZW0uY29uZmlnKGZpbGw9bXlmaWxsKQotCSAgICBvdGhlci5pdGVtLmNvbmZpZyhmaWxsPW90aGVyZmlsbCkKKyAgICAgICAgbnN0ZXBzID0gc3RlcHMoc2VsZi5pbmRleCwgb3RoZXIuaW5kZXgpCisgICAgICAgIGlmIG5vdCBuc3RlcHM6IHJldHVybgorICAgICAgICBpZiBzZWxmLmFycmF5LnNwZWVkID09ICJmYXN0ZXN0IjoKKyAgICAgICAgICAgIG5zdGVwcyA9IDAKKyAgICAgICAgbXlvbGRwdHMgPSBzZWxmLnBvc2l0aW9uKCkKKyAgICAgICAgb3RoZXJvbGRwdHMgPSBvdGhlci5wb3NpdGlvbigpCisgICAgICAgIHNlbGYuaW5kZXgsIG90aGVyLmluZGV4ID0gb3RoZXIuaW5kZXgsIHNlbGYuaW5kZXgKKyAgICAgICAgbXluZXdwdHMgPSBzZWxmLnBvc2l0aW9uKCkKKyAgICAgICAgb3RoZXJuZXdwdHMgPSBvdGhlci5wb3NpdGlvbigpCisgICAgICAgIG15ZmlsbCA9IHNlbGYuaXRlbVsnZmlsbCddCisgICAgICAgIG90aGVyZmlsbCA9IG90aGVyLml0ZW1bJ2ZpbGwnXQorICAgICAgICBzZWxmLml0ZW0uY29uZmlnKGZpbGw9J2dyZWVuJykKKyAgICAgICAgb3RoZXIuaXRlbS5jb25maWcoZmlsbD0neWVsbG93JykKKyAgICAgICAgc2VsZi5hcnJheS5tYXN0ZXIudXBkYXRlKCkKKyAgICAgICAgaWYgc2VsZi5hcnJheS5zcGVlZCA9PSAic2luZ2xlLXN0ZXAiOgorICAgICAgICAgICAgc2VsZi5pdGVtLmNvb3JkcygobXluZXdwdHNbOjJdLCBteW5ld3B0c1syOl0pKQorICAgICAgICAgICAgb3RoZXIuaXRlbS5jb29yZHMoKG90aGVybmV3cHRzWzoyXSwgb3RoZXJuZXdwdHNbMjpdKSkKKyAgICAgICAgICAgIHNlbGYuYXJyYXkubWFzdGVyLnVwZGF0ZSgpCisgICAgICAgICAgICBzZWxmLml0ZW0uY29uZmlnKGZpbGw9bXlmaWxsKQorICAgICAgICAgICAgb3RoZXIuaXRlbS5jb25maWcoZmlsbD1vdGhlcmZpbGwpCisgICAgICAgICAgICBzZWxmLmFycmF5LndhaXQoMCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBteXRyYWplY3RvcnkgPSBpbnRlcnBvbGF0ZShteW9sZHB0cywgbXluZXdwdHMsIG5zdGVwcykKKyAgICAgICAgb3RoZXJ0cmFqZWN0b3J5ID0gaW50ZXJwb2xhdGUob3RoZXJvbGRwdHMsIG90aGVybmV3cHRzLCBuc3RlcHMpCisgICAgICAgIGlmIHNlbGYudmFsdWUgPiBvdGhlci52YWx1ZToKKyAgICAgICAgICAgIHNlbGYuaXRlbS50a3JhaXNlKCkKKyAgICAgICAgICAgIG90aGVyLml0ZW0udGtyYWlzZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdGhlci5pdGVtLnRrcmFpc2UoKQorICAgICAgICAgICAgc2VsZi5pdGVtLnRrcmFpc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obXl0cmFqZWN0b3J5KSk6CisgICAgICAgICAgICAgICAgbXlwdHMgPSBteXRyYWplY3RvcnlbaV0KKyAgICAgICAgICAgICAgICBvdGhlcnB0cyA9IG90aGVydHJhamVjdG9yeVtpXQorICAgICAgICAgICAgICAgIHNlbGYuaXRlbS5jb29yZHMoKG15cHRzWzoyXSwgbXlwdHNbMjpdKSkKKyAgICAgICAgICAgICAgICBvdGhlci5pdGVtLmNvb3Jkcygob3RoZXJwdHNbOjJdLCBvdGhlcnB0c1syOl0pKQorICAgICAgICAgICAgICAgIHNlbGYuYXJyYXkud2FpdCg1MCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG15cHRzID0gbXl0cmFqZWN0b3J5Wy0xXQorICAgICAgICAgICAgb3RoZXJwdHMgPSBvdGhlcnRyYWplY3RvcnlbLTFdCisgICAgICAgICAgICBzZWxmLml0ZW0uY29vcmRzKChteXB0c1s6Ml0sIG15cHRzWzI6XSkpCisgICAgICAgICAgICBvdGhlci5pdGVtLmNvb3Jkcygob3RoZXJwdHNbOjJdLCBvdGhlcnB0c1syOl0pKQorICAgICAgICAgICAgc2VsZi5pdGVtLmNvbmZpZyhmaWxsPW15ZmlsbCkKKyAgICAgICAgICAgIG90aGVyLml0ZW0uY29uZmlnKGZpbGw9b3RoZXJmaWxsKQogCiAgICAgZGVmIGNvbXBhcmV0byhzZWxmLCBvdGhlcik6Ci0JbXlmaWxsID0gc2VsZi5pdGVtWydmaWxsJ10KLQlvdGhlcmZpbGwgPSBvdGhlci5pdGVtWydmaWxsJ10KLQlvdXRjb21lID0gY21wKHNlbGYudmFsdWUsIG90aGVyLnZhbHVlKQotCWlmIG91dGNvbWUgPCAwOgotCSAgICBteWZsYXNoID0gJ3doaXRlJwotCSAgICBvdGhlcmZsYXNoID0gJ2JsYWNrJwotCWVsaWYgb3V0Y29tZSA+IDA6Ci0JICAgIG15Zmxhc2ggPSAnYmxhY2snCi0JICAgIG90aGVyZmxhc2ggPSAnd2hpdGUnCi0JZWxzZToKLQkgICAgbXlmbGFzaCA9IG90aGVyZmxhc2ggPSAnZ3JleScKLQl0cnk6Ci0JICAgIHNlbGYuaXRlbS5jb25maWcoZmlsbD1teWZsYXNoKQotCSAgICBvdGhlci5pdGVtLmNvbmZpZyhmaWxsPW90aGVyZmxhc2gpCi0JICAgIHNlbGYuYXJyYXkud2FpdCg1MDApCi0JZmluYWxseToKLQkgICAgc2VsZi5pdGVtLmNvbmZpZyhmaWxsPW15ZmlsbCkKLQkgICAgb3RoZXIuaXRlbS5jb25maWcoZmlsbD1vdGhlcmZpbGwpCi0JcmV0dXJuIG91dGNvbWUKKyAgICAgICAgbXlmaWxsID0gc2VsZi5pdGVtWydmaWxsJ10KKyAgICAgICAgb3RoZXJmaWxsID0gb3RoZXIuaXRlbVsnZmlsbCddCisgICAgICAgIG91dGNvbWUgPSBjbXAoc2VsZi52YWx1ZSwgb3RoZXIudmFsdWUpCisgICAgICAgIGlmIG91dGNvbWUgPCAwOgorICAgICAgICAgICAgbXlmbGFzaCA9ICd3aGl0ZScKKyAgICAgICAgICAgIG90aGVyZmxhc2ggPSAnYmxhY2snCisgICAgICAgIGVsaWYgb3V0Y29tZSA+IDA6CisgICAgICAgICAgICBteWZsYXNoID0gJ2JsYWNrJworICAgICAgICAgICAgb3RoZXJmbGFzaCA9ICd3aGl0ZScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG15Zmxhc2ggPSBvdGhlcmZsYXNoID0gJ2dyZXknCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuaXRlbS5jb25maWcoZmlsbD1teWZsYXNoKQorICAgICAgICAgICAgb3RoZXIuaXRlbS5jb25maWcoZmlsbD1vdGhlcmZsYXNoKQorICAgICAgICAgICAgc2VsZi5hcnJheS53YWl0KDUwMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuaXRlbS5jb25maWcoZmlsbD1teWZpbGwpCisgICAgICAgICAgICBvdGhlci5pdGVtLmNvbmZpZyhmaWxsPW90aGVyZmlsbCkKKyAgICAgICAgcmV0dXJuIG91dGNvbWUKIAogICAgIGRlZiBwb3NpdGlvbihzZWxmKToKLQl4MSA9IChzZWxmLmluZGV4KzEpKlhHUklEIC0gV0lEVEgvMgotCXgyID0geDErV0lEVEgKLQl5MiA9IChzZWxmLmFycmF5Lm1heHZhbHVlKzEpKllHUklECi0JeTEgPSB5MiAtIChzZWxmLnZhbHVlKSpZR1JJRAotCXJldHVybiB4MSwgeTEsIHgyLCB5MgorICAgICAgICB4MSA9IChzZWxmLmluZGV4KzEpKlhHUklEIC0gV0lEVEgvMgorICAgICAgICB4MiA9IHgxK1dJRFRICisgICAgICAgIHkyID0gKHNlbGYuYXJyYXkubWF4dmFsdWUrMSkqWUdSSUQKKyAgICAgICAgeTEgPSB5MiAtIChzZWxmLnZhbHVlKSpZR1JJRAorICAgICAgICByZXR1cm4geDEsIHkxLCB4MiwgeTIKIAogICAgIGRlZiBuZWFyZXN0aW5kZXgoc2VsZiwgeCk6Ci0JcmV0dXJuIGludChyb3VuZChmbG9hdCh4KS9YR1JJRCkpIC0gMQorICAgICAgICByZXR1cm4gaW50KHJvdW5kKGZsb2F0KHgpL1hHUklEKSkgLSAxCiAKIAogIyBTdWJyb3V0aW5lcyB0aGF0IGRvbid0IG5lZWQgYW4gb2JqZWN0CkBAIC0zMzUsMjIgKzMzNSwyMiBAQAogZGVmIHN0ZXBzKGhlcmUsIHRoZXJlKToKICAgICBuc3RlcHMgPSBhYnMoaGVyZSAtIHRoZXJlKQogICAgIGlmIG5zdGVwcyA8PSAzOgotCW5zdGVwcyA9IG5zdGVwcyAqIDMKKyAgICAgICAgbnN0ZXBzID0gbnN0ZXBzICogMwogICAgIGVsaWYgbnN0ZXBzIDw9IDU6Ci0JbnN0ZXBzID0gbnN0ZXBzICogMgorICAgICAgICBuc3RlcHMgPSBuc3RlcHMgKiAyCiAgICAgZWxpZiBuc3RlcHMgPiAxMDoKLQluc3RlcHMgPSAxMAorICAgICAgICBuc3RlcHMgPSAxMAogICAgIHJldHVybiBuc3RlcHMKIAogZGVmIGludGVycG9sYXRlKG9sZHB0cywgbmV3cHRzLCBuKToKICAgICBpZiBsZW4ob2xkcHRzKSAhPSBsZW4obmV3cHRzKToKLQlyYWlzZSBWYWx1ZUVycm9yLCAiY2FuJ3QgaW50ZXJwb2xhdGUgYXJyYXlzIG9mIGRpZmZlcmVudCBsZW5ndGgiCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJjYW4ndCBpbnRlcnBvbGF0ZSBhcnJheXMgb2YgZGlmZmVyZW50IGxlbmd0aCIKICAgICBwdHMgPSBbMF0qbGVuKG9sZHB0cykKICAgICByZXMgPSBbdHVwbGUob2xkcHRzKV0KICAgICBmb3IgaSBpbiByYW5nZSgxLCBuKToKLQlmb3IgayBpbiByYW5nZShsZW4ocHRzKSk6Ci0JICAgIHB0c1trXSA9IG9sZHB0c1trXSArIChuZXdwdHNba10gLSBvbGRwdHNba10pKmkvbgotCXJlcy5hcHBlbmQodHVwbGUocHRzKSkKKyAgICAgICAgZm9yIGsgaW4gcmFuZ2UobGVuKHB0cykpOgorICAgICAgICAgICAgcHRzW2tdID0gb2xkcHRzW2tdICsgKG5ld3B0c1trXSAtIG9sZHB0c1trXSkqaS9uCisgICAgICAgIHJlcy5hcHBlbmQodHVwbGUocHRzKSkKICAgICByZXMuYXBwZW5kKHR1cGxlKG5ld3B0cykpCiAgICAgcmV0dXJuIHJlcwogCkBAIC0zNzEsMTEwICszNzEsMTEwIEBACiAgICAgYXJyYXkucmVzZXQoIlJhbmRvbWl6aW5nIikKICAgICBuID0gYXJyYXkuZ2V0c2l6ZSgpCiAgICAgZm9yIGkgaW4gcmFuZ2Uobik6Ci0JaiA9IHJhbmRvbS5yYW5kaW50KDAsIG4tMSkKLQlhcnJheS5zd2FwKGksIGopCisgICAgICAgIGogPSByYW5kb20ucmFuZGludCgwLCBuLTEpCisgICAgICAgIGFycmF5LnN3YXAoaSwgaikKICAgICBhcnJheS5tZXNzYWdlKCJSYW5kb21pemVkIikKIAogZGVmIGluc2VydGlvbnNvcnQoYXJyYXkpOgogICAgIHNpemUgPSBhcnJheS5nZXRzaXplKCkKICAgICBhcnJheS5yZXNldCgiSW5zZXJ0aW9uIHNvcnQiKQogICAgIGZvciBpIGluIHJhbmdlKDEsIHNpemUpOgotCWogPSBpLTEKLQl3aGlsZSBqID49IDA6Ci0JICAgIGlmIGFycmF5LmNvbXBhcmUoaiwgaisxKSA8PSAwOgotCQlicmVhawotCSAgICBhcnJheS5zd2FwKGosIGorMSkKLQkgICAgaiA9IGotMQorICAgICAgICBqID0gaS0xCisgICAgICAgIHdoaWxlIGogPj0gMDoKKyAgICAgICAgICAgIGlmIGFycmF5LmNvbXBhcmUoaiwgaisxKSA8PSAwOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBhcnJheS5zd2FwKGosIGorMSkKKyAgICAgICAgICAgIGogPSBqLTEKICAgICBhcnJheS5tZXNzYWdlKCJTb3J0ZWQiKQogCiBkZWYgc2VsZWN0aW9uc29ydChhcnJheSk6CiAgICAgc2l6ZSA9IGFycmF5LmdldHNpemUoKQogICAgIGFycmF5LnJlc2V0KCJTZWxlY3Rpb24gc29ydCIpCiAgICAgdHJ5OgotCWZvciBpIGluIHJhbmdlKHNpemUpOgotCSAgICBhcnJheS5zaG93X3BhcnRpdGlvbihpLCBzaXplKQotCSAgICBmb3IgaiBpbiByYW5nZShpKzEsIHNpemUpOgotCQlpZiBhcnJheS5jb21wYXJlKGksIGopID4gMDoKLQkJICAgIGFycmF5LnN3YXAoaSwgaikKLQlhcnJheS5tZXNzYWdlKCJTb3J0ZWQiKQorICAgICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKKyAgICAgICAgICAgIGFycmF5LnNob3dfcGFydGl0aW9uKGksIHNpemUpCisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpKzEsIHNpemUpOgorICAgICAgICAgICAgICAgIGlmIGFycmF5LmNvbXBhcmUoaSwgaikgPiAwOgorICAgICAgICAgICAgICAgICAgICBhcnJheS5zd2FwKGksIGopCisgICAgICAgIGFycmF5Lm1lc3NhZ2UoIlNvcnRlZCIpCiAgICAgZmluYWxseToKLQlhcnJheS5oaWRlX3BhcnRpdGlvbigpCisgICAgICAgIGFycmF5LmhpZGVfcGFydGl0aW9uKCkKIAogZGVmIGJ1YmJsZXNvcnQoYXJyYXkpOgogICAgIHNpemUgPSBhcnJheS5nZXRzaXplKCkKICAgICBhcnJheS5yZXNldCgiQnViYmxlIHNvcnQiKQogICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgotCWZvciBqIGluIHJhbmdlKDEsIHNpemUpOgotCSAgICBpZiBhcnJheS5jb21wYXJlKGotMSwgaikgPiAwOgotCQlhcnJheS5zd2FwKGotMSwgaikKKyAgICAgICAgZm9yIGogaW4gcmFuZ2UoMSwgc2l6ZSk6CisgICAgICAgICAgICBpZiBhcnJheS5jb21wYXJlKGotMSwgaikgPiAwOgorICAgICAgICAgICAgICAgIGFycmF5LnN3YXAoai0xLCBqKQogICAgIGFycmF5Lm1lc3NhZ2UoIlNvcnRlZCIpCiAKIGRlZiBxdWlja3NvcnQoYXJyYXkpOgogICAgIHNpemUgPSBhcnJheS5nZXRzaXplKCkKICAgICBhcnJheS5yZXNldCgiUXVpY2tzb3J0IikKICAgICB0cnk6Ci0Jc3RhY2sgPSBbKDAsIHNpemUpXQotCXdoaWxlIHN0YWNrOgotCSAgICBmaXJzdCwgbGFzdCA9IHN0YWNrWy0xXQotCSAgICBkZWwgc3RhY2tbLTFdCi0JICAgIGFycmF5LnNob3dfcGFydGl0aW9uKGZpcnN0LCBsYXN0KQotCSAgICBpZiBsYXN0LWZpcnN0IDwgNToKLQkJYXJyYXkubWVzc2FnZSgiSW5zZXJ0aW9uIHNvcnQiKQotCQlmb3IgaSBpbiByYW5nZShmaXJzdCsxLCBsYXN0KToKLQkJICAgIGogPSBpLTEKLQkJICAgIHdoaWxlIGogPj0gZmlyc3Q6Ci0JCQlpZiBhcnJheS5jb21wYXJlKGosIGorMSkgPD0gMDoKLQkJCSAgICBicmVhawotCQkJYXJyYXkuc3dhcChqLCBqKzEpCi0JCQlqID0gai0xCi0JCWNvbnRpbnVlCi0JICAgIGFycmF5Lm1lc3NhZ2UoIkNob29zaW5nIHBpdm90IikKLQkgICAgaiwgaSwgayA9IGZpcnN0LCAoZmlyc3QrbGFzdCkvMiwgbGFzdC0xCi0JICAgIGlmIGFycmF5LmNvbXBhcmUoaywgaSkgPCAwOgotCQlhcnJheS5zd2FwKGssIGkpCi0JICAgIGlmIGFycmF5LmNvbXBhcmUoaywgaikgPCAwOgotCQlhcnJheS5zd2FwKGssIGopCi0JICAgIGlmIGFycmF5LmNvbXBhcmUoaiwgaSkgPCAwOgotCQlhcnJheS5zd2FwKGosIGkpCi0JICAgIHBpdm90ID0gagotCSAgICBhcnJheS5zaG93X3Bpdm90KHBpdm90KQotCSAgICBhcnJheS5tZXNzYWdlKCJQaXZvdCBhdCBsZWZ0IG9mIHBhcnRpdGlvbiIpCi0JICAgIGFycmF5LndhaXQoMTAwMCkKLQkgICAgbGVmdCA9IGZpcnN0Ci0JICAgIHJpZ2h0ID0gbGFzdAotCSAgICB3aGlsZSAxOgotCQlhcnJheS5tZXNzYWdlKCJTd2VlcCByaWdodCBwb2ludGVyIikKLQkJcmlnaHQgPSByaWdodC0xCi0JCWFycmF5LnNob3dfcmlnaHQocmlnaHQpCi0JCXdoaWxlIHJpZ2h0ID4gZmlyc3QgYW5kIGFycmF5LmNvbXBhcmUocmlnaHQsIHBpdm90KSA+PSAwOgotCQkgICAgcmlnaHQgPSByaWdodC0xCi0JCSAgICBhcnJheS5zaG93X3JpZ2h0KHJpZ2h0KQotCQlhcnJheS5tZXNzYWdlKCJTd2VlcCBsZWZ0IHBvaW50ZXIiKQotCQlsZWZ0ID0gbGVmdCsxCi0JCWFycmF5LnNob3dfbGVmdChsZWZ0KQotCQl3aGlsZSBsZWZ0IDwgbGFzdCBhbmQgYXJyYXkuY29tcGFyZShsZWZ0LCBwaXZvdCkgPD0gMDoKLQkJICAgIGxlZnQgPSBsZWZ0KzEKLQkJICAgIGFycmF5LnNob3dfbGVmdChsZWZ0KQotCQlpZiBsZWZ0ID4gcmlnaHQ6Ci0JCSAgICBhcnJheS5tZXNzYWdlKCJFbmQgb2YgcGFydGl0aW9uIikKLQkJICAgIGJyZWFrCi0JCWFycmF5Lm1lc3NhZ2UoIlN3YXAgaXRlbXMiKQotCQlhcnJheS5zd2FwKGxlZnQsIHJpZ2h0KQotCSAgICBhcnJheS5tZXNzYWdlKCJTd2FwIHBpdm90IGJhY2siKQotCSAgICBhcnJheS5zd2FwKHBpdm90LCByaWdodCkKLQkgICAgbjEgPSByaWdodC1maXJzdAotCSAgICBuMiA9IGxhc3QtbGVmdAotCSAgICBpZiBuMSA+IDE6IHN0YWNrLmFwcGVuZCgoZmlyc3QsIHJpZ2h0KSkKLQkgICAgaWYgbjIgPiAxOiBzdGFjay5hcHBlbmQoKGxlZnQsIGxhc3QpKQotCWFycmF5Lm1lc3NhZ2UoIlNvcnRlZCIpCisgICAgICAgIHN0YWNrID0gWygwLCBzaXplKV0KKyAgICAgICAgd2hpbGUgc3RhY2s6CisgICAgICAgICAgICBmaXJzdCwgbGFzdCA9IHN0YWNrWy0xXQorICAgICAgICAgICAgZGVsIHN0YWNrWy0xXQorICAgICAgICAgICAgYXJyYXkuc2hvd19wYXJ0aXRpb24oZmlyc3QsIGxhc3QpCisgICAgICAgICAgICBpZiBsYXN0LWZpcnN0IDwgNToKKyAgICAgICAgICAgICAgICBhcnJheS5tZXNzYWdlKCJJbnNlcnRpb24gc29ydCIpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZmlyc3QrMSwgbGFzdCk6CisgICAgICAgICAgICAgICAgICAgIGogPSBpLTEKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgaiA+PSBmaXJzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFycmF5LmNvbXBhcmUoaiwgaisxKSA8PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5zd2FwKGosIGorMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSBqLTEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgYXJyYXkubWVzc2FnZSgiQ2hvb3NpbmcgcGl2b3QiKQorICAgICAgICAgICAgaiwgaSwgayA9IGZpcnN0LCAoZmlyc3QrbGFzdCkvMiwgbGFzdC0xCisgICAgICAgICAgICBpZiBhcnJheS5jb21wYXJlKGssIGkpIDwgMDoKKyAgICAgICAgICAgICAgICBhcnJheS5zd2FwKGssIGkpCisgICAgICAgICAgICBpZiBhcnJheS5jb21wYXJlKGssIGopIDwgMDoKKyAgICAgICAgICAgICAgICBhcnJheS5zd2FwKGssIGopCisgICAgICAgICAgICBpZiBhcnJheS5jb21wYXJlKGosIGkpIDwgMDoKKyAgICAgICAgICAgICAgICBhcnJheS5zd2FwKGosIGkpCisgICAgICAgICAgICBwaXZvdCA9IGoKKyAgICAgICAgICAgIGFycmF5LnNob3dfcGl2b3QocGl2b3QpCisgICAgICAgICAgICBhcnJheS5tZXNzYWdlKCJQaXZvdCBhdCBsZWZ0IG9mIHBhcnRpdGlvbiIpCisgICAgICAgICAgICBhcnJheS53YWl0KDEwMDApCisgICAgICAgICAgICBsZWZ0ID0gZmlyc3QKKyAgICAgICAgICAgIHJpZ2h0ID0gbGFzdAorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBhcnJheS5tZXNzYWdlKCJTd2VlcCByaWdodCBwb2ludGVyIikKKyAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0LTEKKyAgICAgICAgICAgICAgICBhcnJheS5zaG93X3JpZ2h0KHJpZ2h0KQorICAgICAgICAgICAgICAgIHdoaWxlIHJpZ2h0ID4gZmlyc3QgYW5kIGFycmF5LmNvbXBhcmUocmlnaHQsIHBpdm90KSA+PSAwOgorICAgICAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0LTEKKyAgICAgICAgICAgICAgICAgICAgYXJyYXkuc2hvd19yaWdodChyaWdodCkKKyAgICAgICAgICAgICAgICBhcnJheS5tZXNzYWdlKCJTd2VlcCBsZWZ0IHBvaW50ZXIiKQorICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0KzEKKyAgICAgICAgICAgICAgICBhcnJheS5zaG93X2xlZnQobGVmdCkKKyAgICAgICAgICAgICAgICB3aGlsZSBsZWZ0IDwgbGFzdCBhbmQgYXJyYXkuY29tcGFyZShsZWZ0LCBwaXZvdCkgPD0gMDoKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQrMQorICAgICAgICAgICAgICAgICAgICBhcnJheS5zaG93X2xlZnQobGVmdCkKKyAgICAgICAgICAgICAgICBpZiBsZWZ0ID4gcmlnaHQ6CisgICAgICAgICAgICAgICAgICAgIGFycmF5Lm1lc3NhZ2UoIkVuZCBvZiBwYXJ0aXRpb24iKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGFycmF5Lm1lc3NhZ2UoIlN3YXAgaXRlbXMiKQorICAgICAgICAgICAgICAgIGFycmF5LnN3YXAobGVmdCwgcmlnaHQpCisgICAgICAgICAgICBhcnJheS5tZXNzYWdlKCJTd2FwIHBpdm90IGJhY2siKQorICAgICAgICAgICAgYXJyYXkuc3dhcChwaXZvdCwgcmlnaHQpCisgICAgICAgICAgICBuMSA9IHJpZ2h0LWZpcnN0CisgICAgICAgICAgICBuMiA9IGxhc3QtbGVmdAorICAgICAgICAgICAgaWYgbjEgPiAxOiBzdGFjay5hcHBlbmQoKGZpcnN0LCByaWdodCkpCisgICAgICAgICAgICBpZiBuMiA+IDE6IHN0YWNrLmFwcGVuZCgobGVmdCwgbGFzdCkpCisgICAgICAgIGFycmF5Lm1lc3NhZ2UoIlNvcnRlZCIpCiAgICAgZmluYWxseToKLQlhcnJheS5oaWRlX3BhcnRpdGlvbigpCisgICAgICAgIGFycmF5LmhpZGVfcGFydGl0aW9uKCkKIAogZGVmIGRlbW9zb3J0KGFycmF5KToKICAgICB3aGlsZSAxOgotCWZvciBhbGcgaW4gW3F1aWNrc29ydCwgaW5zZXJ0aW9uc29ydCwgc2VsZWN0aW9uc29ydCwgYnViYmxlc29ydF06Ci0JICAgIHJhbmRvbWl6ZShhcnJheSkKLQkgICAgYWxnKGFycmF5KQorICAgICAgICBmb3IgYWxnIGluIFtxdWlja3NvcnQsIGluc2VydGlvbnNvcnQsIHNlbGVjdGlvbnNvcnQsIGJ1YmJsZXNvcnRdOgorICAgICAgICAgICAgcmFuZG9taXplKGFycmF5KQorICAgICAgICAgICAgYWxnKGFycmF5KQogCiAKICMgU29ydCBkZW1vIGNsYXNzIC0tIHVzYWJsZSBhcyBhIEdyYWlsIGFwcGxldApAQCAtNDgyLDE0NCArNDgyLDE0NCBAQAogY2xhc3MgU29ydERlbW86CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBzaXplPTE1KToKLQlzZWxmLm1hc3RlciA9IG1hc3RlcgotCXNlbGYuc2l6ZSA9IHNpemUKLQlzZWxmLmJ1c3kgPSAwCi0Jc2VsZi5hcnJheSA9IEFycmF5KHNlbGYubWFzdGVyKQorICAgICAgICBzZWxmLm1hc3RlciA9IG1hc3RlcgorICAgICAgICBzZWxmLnNpemUgPSBzaXplCisgICAgICAgIHNlbGYuYnVzeSA9IDAKKyAgICAgICAgc2VsZi5hcnJheSA9IEFycmF5KHNlbGYubWFzdGVyKQogCi0Jc2VsZi5ib3RmcmFtZSA9IEZyYW1lKG1hc3RlcikKLQlzZWxmLmJvdGZyYW1lLnBhY2soc2lkZT1CT1RUT00pCi0Jc2VsZi5ib3RsZWZ0ZnJhbWUgPSBGcmFtZShzZWxmLmJvdGZyYW1lKQotCXNlbGYuYm90bGVmdGZyYW1lLnBhY2soc2lkZT1MRUZULCBmaWxsPVkpCi0Jc2VsZi5ib3RyaWdodGZyYW1lID0gRnJhbWUoc2VsZi5ib3RmcmFtZSkKLQlzZWxmLmJvdHJpZ2h0ZnJhbWUucGFjayhzaWRlPVJJR0hULCBmaWxsPVkpCisgICAgICAgIHNlbGYuYm90ZnJhbWUgPSBGcmFtZShtYXN0ZXIpCisgICAgICAgIHNlbGYuYm90ZnJhbWUucGFjayhzaWRlPUJPVFRPTSkKKyAgICAgICAgc2VsZi5ib3RsZWZ0ZnJhbWUgPSBGcmFtZShzZWxmLmJvdGZyYW1lKQorICAgICAgICBzZWxmLmJvdGxlZnRmcmFtZS5wYWNrKHNpZGU9TEVGVCwgZmlsbD1ZKQorICAgICAgICBzZWxmLmJvdHJpZ2h0ZnJhbWUgPSBGcmFtZShzZWxmLmJvdGZyYW1lKQorICAgICAgICBzZWxmLmJvdHJpZ2h0ZnJhbWUucGFjayhzaWRlPVJJR0hULCBmaWxsPVkpCiAKLQlzZWxmLmJfcXNvcnQgPSBCdXR0b24oc2VsZi5ib3RsZWZ0ZnJhbWUsCi0JCQkgICAgICB0ZXh0PSJRdWlja3NvcnQiLCBjb21tYW5kPXNlbGYuY19xc29ydCkKLQlzZWxmLmJfcXNvcnQucGFjayhmaWxsPVgpCi0Jc2VsZi5iX2lzb3J0ID0gQnV0dG9uKHNlbGYuYm90bGVmdGZyYW1lLAotCQkJICAgICAgdGV4dD0iSW5zZXJ0aW9uIHNvcnQiLCBjb21tYW5kPXNlbGYuY19pc29ydCkKLQlzZWxmLmJfaXNvcnQucGFjayhmaWxsPVgpCi0Jc2VsZi5iX3Nzb3J0ID0gQnV0dG9uKHNlbGYuYm90bGVmdGZyYW1lLAotCQkJICAgICAgdGV4dD0iU2VsZWN0aW9uIHNvcnQiLCBjb21tYW5kPXNlbGYuY19zc29ydCkKLQlzZWxmLmJfc3NvcnQucGFjayhmaWxsPVgpCi0Jc2VsZi5iX2Jzb3J0ID0gQnV0dG9uKHNlbGYuYm90bGVmdGZyYW1lLAotCQkJICAgICAgdGV4dD0iQnViYmxlIHNvcnQiLCBjb21tYW5kPXNlbGYuY19ic29ydCkKLQlzZWxmLmJfYnNvcnQucGFjayhmaWxsPVgpCisgICAgICAgIHNlbGYuYl9xc29ydCA9IEJ1dHRvbihzZWxmLmJvdGxlZnRmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9IlF1aWNrc29ydCIsIGNvbW1hbmQ9c2VsZi5jX3Fzb3J0KQorICAgICAgICBzZWxmLmJfcXNvcnQucGFjayhmaWxsPVgpCisgICAgICAgIHNlbGYuYl9pc29ydCA9IEJ1dHRvbihzZWxmLmJvdGxlZnRmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9Ikluc2VydGlvbiBzb3J0IiwgY29tbWFuZD1zZWxmLmNfaXNvcnQpCisgICAgICAgIHNlbGYuYl9pc29ydC5wYWNrKGZpbGw9WCkKKyAgICAgICAgc2VsZi5iX3Nzb3J0ID0gQnV0dG9uKHNlbGYuYm90bGVmdGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iU2VsZWN0aW9uIHNvcnQiLCBjb21tYW5kPXNlbGYuY19zc29ydCkKKyAgICAgICAgc2VsZi5iX3Nzb3J0LnBhY2soZmlsbD1YKQorICAgICAgICBzZWxmLmJfYnNvcnQgPSBCdXR0b24oc2VsZi5ib3RsZWZ0ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJCdWJibGUgc29ydCIsIGNvbW1hbmQ9c2VsZi5jX2Jzb3J0KQorICAgICAgICBzZWxmLmJfYnNvcnQucGFjayhmaWxsPVgpCiAKLQkjIFRlcnJpYmxlIGhhY2sgdG8gb3ZlcmNvbWUgbGltaXRhdGlvbiBvZiBPcHRpb25NZW51Li4uCi0JY2xhc3MgTXlJbnRWYXIoSW50VmFyKToKLQkgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgZGVtbyk6Ci0JCXNlbGYuZGVtbyA9IGRlbW8KLQkJSW50VmFyLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLQkgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6Ci0JCUludFZhci5zZXQoc2VsZiwgdmFsdWUpCi0JCWlmIHN0cih2YWx1ZSkgIT0gJzAnOgotCQkgICAgc2VsZi5kZW1vLnJlc2l6ZSh2YWx1ZSkKKyAgICAgICAgIyBUZXJyaWJsZSBoYWNrIHRvIG92ZXJjb21lIGxpbWl0YXRpb24gb2YgT3B0aW9uTWVudS4uLgorICAgICAgICBjbGFzcyBNeUludFZhcihJbnRWYXIpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgZGVtbyk6CisgICAgICAgICAgICAgICAgc2VsZi5kZW1vID0gZGVtbworICAgICAgICAgICAgICAgIEludFZhci5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBJbnRWYXIuc2V0KHNlbGYsIHZhbHVlKQorICAgICAgICAgICAgICAgIGlmIHN0cih2YWx1ZSkgIT0gJzAnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbW8ucmVzaXplKHZhbHVlKQogCi0Jc2VsZi52X3NpemUgPSBNeUludFZhcihzZWxmLm1hc3Rlciwgc2VsZikKLQlzZWxmLnZfc2l6ZS5zZXQoc2l6ZSkKLQlzaXplcyA9IFsxLCAyLCAzLCA0XSArIHJhbmdlKDUsIDU1LCA1KQotCWlmIHNlbGYuc2l6ZSBub3QgaW4gc2l6ZXM6Ci0JICAgIHNpemVzLmFwcGVuZChzZWxmLnNpemUpCi0JICAgIHNpemVzLnNvcnQoKQotCXNlbGYubV9zaXplID0gYXBwbHkoT3B0aW9uTWVudSwKLQkJCSAgICAoc2VsZi5ib3RsZWZ0ZnJhbWUsIHNlbGYudl9zaXplKSArIHR1cGxlKHNpemVzKSkKLQlzZWxmLm1fc2l6ZS5wYWNrKGZpbGw9WCkKLQkKLQlzZWxmLnZfc3BlZWQgPSBTdHJpbmdWYXIoc2VsZi5tYXN0ZXIpCi0Jc2VsZi52X3NwZWVkLnNldCgibm9ybWFsIikKLQlzZWxmLm1fc3BlZWQgPSBPcHRpb25NZW51KHNlbGYuYm90bGVmdGZyYW1lLCBzZWxmLnZfc3BlZWQsCi0JCQkJICAic2luZ2xlLXN0ZXAiLCAibm9ybWFsIiwgImZhc3QiLCAiZmFzdGVzdCIpCi0Jc2VsZi5tX3NwZWVkLnBhY2soZmlsbD1YKQotCQotCXNlbGYuYl9zdGVwID0gQnV0dG9uKHNlbGYuYm90bGVmdGZyYW1lLAotCQkJICAgICB0ZXh0PSJTdGVwIiwgY29tbWFuZD1zZWxmLmNfc3RlcCkKLQlzZWxmLmJfc3RlcC5wYWNrKGZpbGw9WCkKLQkKLQlzZWxmLmJfcmFuZG9taXplID0gQnV0dG9uKHNlbGYuYm90cmlnaHRmcmFtZSwKLQkJCQkgIHRleHQ9IlJhbmRvbWl6ZSIsIGNvbW1hbmQ9c2VsZi5jX3JhbmRvbWl6ZSkKLQlzZWxmLmJfcmFuZG9taXplLnBhY2soZmlsbD1YKQotCXNlbGYuYl91bmlmb3JtID0gQnV0dG9uKHNlbGYuYm90cmlnaHRmcmFtZSwKLQkJCQkgIHRleHQ9IlVuaWZvcm0iLCBjb21tYW5kPXNlbGYuY191bmlmb3JtKQotCXNlbGYuYl91bmlmb3JtLnBhY2soZmlsbD1YKQotCXNlbGYuYl9kaXN0aW5jdCA9IEJ1dHRvbihzZWxmLmJvdHJpZ2h0ZnJhbWUsCi0JCQkJICB0ZXh0PSJEaXN0aW5jdCIsIGNvbW1hbmQ9c2VsZi5jX2Rpc3RpbmN0KQotCXNlbGYuYl9kaXN0aW5jdC5wYWNrKGZpbGw9WCkKLQlzZWxmLmJfZGVtbyA9IEJ1dHRvbihzZWxmLmJvdHJpZ2h0ZnJhbWUsCi0JCQkgICAgIHRleHQ9IkRlbW8iLCBjb21tYW5kPXNlbGYuY19kZW1vKQotCXNlbGYuYl9kZW1vLnBhY2soZmlsbD1YKQotIAlzZWxmLmJfY2FuY2VsID0gQnV0dG9uKHNlbGYuYm90cmlnaHRmcmFtZSwKLQkJCSAgICAgICB0ZXh0PSJDYW5jZWwiLCBjb21tYW5kPXNlbGYuY19jYW5jZWwpCi0gCXNlbGYuYl9jYW5jZWwucGFjayhmaWxsPVgpCi0Jc2VsZi5iX2NhbmNlbC5jb25maWcoc3RhdGU9RElTQUJMRUQpCi0Jc2VsZi5iX3F1aXQgPSBCdXR0b24oc2VsZi5ib3RyaWdodGZyYW1lLAotCQkJICAgICB0ZXh0PSJRdWl0IiwgY29tbWFuZD1zZWxmLmNfcXVpdCkKLQlzZWxmLmJfcXVpdC5wYWNrKGZpbGw9WCkKKyAgICAgICAgc2VsZi52X3NpemUgPSBNeUludFZhcihzZWxmLm1hc3Rlciwgc2VsZikKKyAgICAgICAgc2VsZi52X3NpemUuc2V0KHNpemUpCisgICAgICAgIHNpemVzID0gWzEsIDIsIDMsIDRdICsgcmFuZ2UoNSwgNTUsIDUpCisgICAgICAgIGlmIHNlbGYuc2l6ZSBub3QgaW4gc2l6ZXM6CisgICAgICAgICAgICBzaXplcy5hcHBlbmQoc2VsZi5zaXplKQorICAgICAgICAgICAgc2l6ZXMuc29ydCgpCisgICAgICAgIHNlbGYubV9zaXplID0gYXBwbHkoT3B0aW9uTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5ib3RsZWZ0ZnJhbWUsIHNlbGYudl9zaXplKSArIHR1cGxlKHNpemVzKSkKKyAgICAgICAgc2VsZi5tX3NpemUucGFjayhmaWxsPVgpCisKKyAgICAgICAgc2VsZi52X3NwZWVkID0gU3RyaW5nVmFyKHNlbGYubWFzdGVyKQorICAgICAgICBzZWxmLnZfc3BlZWQuc2V0KCJub3JtYWwiKQorICAgICAgICBzZWxmLm1fc3BlZWQgPSBPcHRpb25NZW51KHNlbGYuYm90bGVmdGZyYW1lLCBzZWxmLnZfc3BlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZS1zdGVwIiwgIm5vcm1hbCIsICJmYXN0IiwgImZhc3Rlc3QiKQorICAgICAgICBzZWxmLm1fc3BlZWQucGFjayhmaWxsPVgpCisKKyAgICAgICAgc2VsZi5iX3N0ZXAgPSBCdXR0b24oc2VsZi5ib3RsZWZ0ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9IlN0ZXAiLCBjb21tYW5kPXNlbGYuY19zdGVwKQorICAgICAgICBzZWxmLmJfc3RlcC5wYWNrKGZpbGw9WCkKKworICAgICAgICBzZWxmLmJfcmFuZG9taXplID0gQnV0dG9uKHNlbGYuYm90cmlnaHRmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJSYW5kb21pemUiLCBjb21tYW5kPXNlbGYuY19yYW5kb21pemUpCisgICAgICAgIHNlbGYuYl9yYW5kb21pemUucGFjayhmaWxsPVgpCisgICAgICAgIHNlbGYuYl91bmlmb3JtID0gQnV0dG9uKHNlbGYuYm90cmlnaHRmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJVbmlmb3JtIiwgY29tbWFuZD1zZWxmLmNfdW5pZm9ybSkKKyAgICAgICAgc2VsZi5iX3VuaWZvcm0ucGFjayhmaWxsPVgpCisgICAgICAgIHNlbGYuYl9kaXN0aW5jdCA9IEJ1dHRvbihzZWxmLmJvdHJpZ2h0ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iRGlzdGluY3QiLCBjb21tYW5kPXNlbGYuY19kaXN0aW5jdCkKKyAgICAgICAgc2VsZi5iX2Rpc3RpbmN0LnBhY2soZmlsbD1YKQorICAgICAgICBzZWxmLmJfZGVtbyA9IEJ1dHRvbihzZWxmLmJvdHJpZ2h0ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9IkRlbW8iLCBjb21tYW5kPXNlbGYuY19kZW1vKQorICAgICAgICBzZWxmLmJfZGVtby5wYWNrKGZpbGw9WCkKKyAgICAgICAgc2VsZi5iX2NhbmNlbCA9IEJ1dHRvbihzZWxmLmJvdHJpZ2h0ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iQ2FuY2VsIiwgY29tbWFuZD1zZWxmLmNfY2FuY2VsKQorICAgICAgICBzZWxmLmJfY2FuY2VsLnBhY2soZmlsbD1YKQorICAgICAgICBzZWxmLmJfY2FuY2VsLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgc2VsZi5iX3F1aXQgPSBCdXR0b24oc2VsZi5ib3RyaWdodGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJRdWl0IiwgY29tbWFuZD1zZWxmLmNfcXVpdCkKKyAgICAgICAgc2VsZi5iX3F1aXQucGFjayhmaWxsPVgpCiAKICAgICBkZWYgcmVzaXplKHNlbGYsIG5ld3NpemUpOgotCWlmIHNlbGYuYnVzeToKLQkgICAgc2VsZi5tYXN0ZXIuYmVsbCgpCi0JICAgIHJldHVybgotCXNlbGYuc2l6ZSA9IG5ld3NpemUKLQlzZWxmLmFycmF5LnNldGRhdGEocmFuZ2UoMSwgc2VsZi5zaXplKzEpKQorICAgICAgICBpZiBzZWxmLmJ1c3k6CisgICAgICAgICAgICBzZWxmLm1hc3Rlci5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnNpemUgPSBuZXdzaXplCisgICAgICAgIHNlbGYuYXJyYXkuc2V0ZGF0YShyYW5nZSgxLCBzZWxmLnNpemUrMSkpCiAKICAgICBkZWYgY19xc29ydChzZWxmKToKLQlzZWxmLnJ1bihxdWlja3NvcnQpCisgICAgICAgIHNlbGYucnVuKHF1aWNrc29ydCkKIAogICAgIGRlZiBjX2lzb3J0KHNlbGYpOgotCXNlbGYucnVuKGluc2VydGlvbnNvcnQpCisgICAgICAgIHNlbGYucnVuKGluc2VydGlvbnNvcnQpCiAKICAgICBkZWYgY19zc29ydChzZWxmKToKLQlzZWxmLnJ1bihzZWxlY3Rpb25zb3J0KQorICAgICAgICBzZWxmLnJ1bihzZWxlY3Rpb25zb3J0KQogCiAgICAgZGVmIGNfYnNvcnQoc2VsZik6Ci0Jc2VsZi5ydW4oYnViYmxlc29ydCkKKyAgICAgICAgc2VsZi5ydW4oYnViYmxlc29ydCkKIAogICAgIGRlZiBjX2RlbW8oc2VsZik6Ci0Jc2VsZi5ydW4oZGVtb3NvcnQpCisgICAgICAgIHNlbGYucnVuKGRlbW9zb3J0KQogCiAgICAgZGVmIGNfcmFuZG9taXplKHNlbGYpOgotCXNlbGYucnVuKHJhbmRvbWl6ZSkKKyAgICAgICAgc2VsZi5ydW4ocmFuZG9taXplKQogCiAgICAgZGVmIGNfdW5pZm9ybShzZWxmKToKLQlzZWxmLnJ1bih1bmlmb3JtKQorICAgICAgICBzZWxmLnJ1bih1bmlmb3JtKQogCiAgICAgZGVmIGNfZGlzdGluY3Qoc2VsZik6Ci0Jc2VsZi5ydW4oZGlzdGluY3QpCisgICAgICAgIHNlbGYucnVuKGRpc3RpbmN0KQogCiAgICAgZGVmIHJ1bihzZWxmLCBmdW5jKToKLQlpZiBzZWxmLmJ1c3k6Ci0JICAgIHNlbGYubWFzdGVyLmJlbGwoKQotCSAgICByZXR1cm4KLQlzZWxmLmJ1c3kgPSAxCi0Jc2VsZi5hcnJheS5zZXRzcGVlZChzZWxmLnZfc3BlZWQuZ2V0KCkpCi0Jc2VsZi5iX2NhbmNlbC5jb25maWcoc3RhdGU9Tk9STUFMKQotCXRyeToKLQkgICAgZnVuYyhzZWxmLmFycmF5KQotCWV4Y2VwdCBBcnJheS5DYW5jZWxsZWQ6Ci0JICAgIHBhc3MKLQlzZWxmLmJfY2FuY2VsLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKLQlzZWxmLmJ1c3kgPSAwCisgICAgICAgIGlmIHNlbGYuYnVzeToKKyAgICAgICAgICAgIHNlbGYubWFzdGVyLmJlbGwoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYnVzeSA9IDEKKyAgICAgICAgc2VsZi5hcnJheS5zZXRzcGVlZChzZWxmLnZfc3BlZWQuZ2V0KCkpCisgICAgICAgIHNlbGYuYl9jYW5jZWwuY29uZmlnKHN0YXRlPU5PUk1BTCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYyhzZWxmLmFycmF5KQorICAgICAgICBleGNlcHQgQXJyYXkuQ2FuY2VsbGVkOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmJfY2FuY2VsLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgc2VsZi5idXN5ID0gMAogCiAgICAgZGVmIGNfY2FuY2VsKHNlbGYpOgotCWlmIG5vdCBzZWxmLmJ1c3k6Ci0JICAgIHNlbGYubWFzdGVyLmJlbGwoKQotCSAgICByZXR1cm4KLQlzZWxmLmFycmF5LmNhbmNlbCgpCisgICAgICAgIGlmIG5vdCBzZWxmLmJ1c3k6CisgICAgICAgICAgICBzZWxmLm1hc3Rlci5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFycmF5LmNhbmNlbCgpCiAKICAgICBkZWYgY19zdGVwKHNlbGYpOgotCWlmIG5vdCBzZWxmLmJ1c3k6Ci0JICAgIHNlbGYubWFzdGVyLmJlbGwoKQotCSAgICByZXR1cm4KLQlzZWxmLnZfc3BlZWQuc2V0KCJzaW5nbGUtc3RlcCIpCi0Jc2VsZi5hcnJheS5zZXRzcGVlZCgic2luZ2xlLXN0ZXAiKQotCXNlbGYuYXJyYXkuc3RlcCgpCisgICAgICAgIGlmIG5vdCBzZWxmLmJ1c3k6CisgICAgICAgICAgICBzZWxmLm1hc3Rlci5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnZfc3BlZWQuc2V0KCJzaW5nbGUtc3RlcCIpCisgICAgICAgIHNlbGYuYXJyYXkuc2V0c3BlZWQoInNpbmdsZS1zdGVwIikKKyAgICAgICAgc2VsZi5hcnJheS5zdGVwKCkKIAogICAgIGRlZiBjX3F1aXQoc2VsZik6Ci0JaWYgc2VsZi5idXN5OgotCSAgICBzZWxmLmFycmF5LmNhbmNlbCgpCi0Jc2VsZi5tYXN0ZXIuYWZ0ZXJfaWRsZShzZWxmLm1hc3Rlci5xdWl0KQorICAgICAgICBpZiBzZWxmLmJ1c3k6CisgICAgICAgICAgICBzZWxmLmFycmF5LmNhbmNlbCgpCisgICAgICAgIHNlbGYubWFzdGVyLmFmdGVyX2lkbGUoc2VsZi5tYXN0ZXIucXVpdCkKIAogCiAjIE1haW4gcHJvZ3JhbSAtLSBmb3Igc3RhbmQtYWxvbmUgb3BlcmF0aW9uIG91dHNpZGUgR3JhaWwKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby9zczEucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vc3MxLnB5CmluZGV4IDk1YjNkODEuLjg5MzU0NzUgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9ndWlkby9zczEucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL3NzMS5weQpAQCAtMzE1LDcgKzMxNSw3IEBACiAgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc2hlZXQgY2VsbHMuCiAKICAgICBTdWJjbGFzc2VzIG1heSBidXQgbmVlZG4ndCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgQVBJczoKLSAgICAKKwogICAgIGNlbGwucmVzZXQoKSAtLSBwcmVwYXJlIGZvciByZWNhbGN1bGF0aW9uCiAgICAgY2VsbC5yZWNhbGMocmV4ZWMpIC0+IHZhbHVlIC0tIHJlY2FsY3VsYXRlIGZvcm11bGEKICAgICBjZWxsLmZvcm1hdCgpIC0+ICh2YWx1ZSwgYWxpZ25tZW50KSAtLSByZXR1cm4gZm9ybWF0dGVkIHZhbHVlCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvZ3VpZG8vc3ZraWxsLnB5IGIvRGVtby90a2ludGVyL2d1aWRvL3N2a2lsbC5weQppbmRleCAxYzU0ZTRiLi42OWY3ZjNiIDEwMDc1NQotLS0gYS9EZW1vL3RraW50ZXIvZ3VpZG8vc3ZraWxsLnB5CisrKyBiL0RlbW8vdGtpbnRlci9ndWlkby9zdmtpbGwucHkKQEAgLTUsNyArNSw3IEBACiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIAogaWYgVGtWZXJzaW9uIDwgNC4wOgotCXJhaXNlIEltcG9ydEVycm9yLCAiVGhpcyB2ZXJzaW9uIG9mIHN2a2lsbCByZXF1aXJlcyBUayA0LjAgb3IgbGF0ZXIiCisgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJUaGlzIHZlcnNpb24gb2Ygc3ZraWxsIHJlcXVpcmVzIFRrIDQuMCBvciBsYXRlciIKIAogZnJvbSBzdHJpbmcgaW1wb3J0IHNwbGl0ZmllbGRzCiBmcm9tIHN0cmluZyBpbXBvcnQgc3BsaXQKQEAgLTE1LDExNCArMTUsMTE0IEBACiB1c2VyID0gb3MuZW52aXJvblsnTE9HTkFNRSddCiAKIGNsYXNzIEJhckJ1dHRvbihNZW51YnV0dG9uKToKLQlkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqY25mKToKLQkJYXBwbHkoTWVudWJ1dHRvbi5fX2luaXRfXywgKHNlbGYsIG1hc3RlciksIGNuZikKLQkJc2VsZi5wYWNrKHNpZGU9TEVGVCkKLQkJc2VsZi5tZW51ID0gTWVudShzZWxmLCBuYW1lPSdtZW51JykKLQkJc2VsZlsnbWVudSddID0gc2VsZi5tZW51CQkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqY25mKToKKyAgICAgICAgYXBwbHkoTWVudWJ1dHRvbi5fX2luaXRfXywgKHNlbGYsIG1hc3RlciksIGNuZikKKyAgICAgICAgc2VsZi5wYWNrKHNpZGU9TEVGVCkKKyAgICAgICAgc2VsZi5tZW51ID0gTWVudShzZWxmLCBuYW1lPSdtZW51JykKKyAgICAgICAgc2VsZlsnbWVudSddID0gc2VsZi5tZW51CiAKIGNsYXNzIEtpbGwoRnJhbWUpOgotCSMgTGlzdCBvZiAobmFtZSwgb3B0aW9uLCBwaWRfY29sdW1uKQotCXZpZXdfbGlzdCA9IFsKLQkJKCdEZWZhdWx0JywgJycpLAotCQkoJ0V2ZXJ5ICgtZSknLCAnLWUnKSwKLQkJKCdOb24gcHJvY2VzcyBncm91cCBsZWFkZXJzICgtZCknLCAnLWQnKSwKLQkJKCdOb24gbGVhZGVycyB3aXRoIHR0eSAoLWEpJywgJy1hJyksCi0JCSgnRm9yIHRoaXMgdXNlciAoLXUgJXMpJyAlIHVzZXIsICctdSAlcycgJSB1c2VyKSwKLQkJXQotCWZvcm1hdF9saXN0ID0gWwotCQkoJ0RlZmF1bHQnLCAnJywgMCksCi0JCSgnTG9uZyAoLWwpJywgJy1sJywgMyksCi0JCSgnRnVsbCAoLWYpJywgJy1mJywgMSksCi0JCSgnRnVsbCBMb25nICgtZiAtbCknLCAnLWwgLWYnLCAzKSwKLQkJKCdTZXNzaW9uIGFuZCBncm91cCBJRCAoLWopJywgJy1qJywgMCksCi0JCSgnU2NoZWR1bGVyIHByb3BlcnRpZXMgKC1jKScsICctYycsIDApLAotCQldCi0JZGVmIGtpbGwoc2VsZiwgc2VsZWN0ZWQpOgotCQljID0gc2VsZi5mb3JtYXRfbGlzdFtzZWxmLmZvcm1hdC5nZXQoKV1bMl0KLQkJcGlkID0gc3BsaXQoc2VsZWN0ZWQpW2NdCi0JCW9zLnN5c3RlbSgna2lsbCAtOSAnICsgcGlkKQotCQlzZWxmLmRvX3VwZGF0ZSgpCi0JZGVmIGRvX3VwZGF0ZShzZWxmKToKLQkJZm9ybWF0ID0gc2VsZi5mb3JtYXRfbGlzdFtzZWxmLmZvcm1hdC5nZXQoKV1bMV0KLQkJdmlldyA9IHNlbGYudmlld19saXN0W3NlbGYudmlldy5nZXQoKV1bMV0KLQkJcyA9IGNvbW1hbmRzLmdldG91dHB1dCgncHMgJXMgJXMnICUgKHZpZXcsIGZvcm1hdCkpCi0JCWxpc3QgPSBzcGxpdGZpZWxkcyhzLCAnXG4nKQotCQlzZWxmLmhlYWRlci5zZXQobGlzdFswXSArICcgICAgICAgICAgJykKLQkJZGVsIGxpc3RbMF0KLQkJc2VsZi5mcmFtZS5saXN0LmRlbGV0ZSgwLCBBdEVuZCgpKQotCQlmb3IgbGluZSBpbiBsaXN0OgotCQkJc2VsZi5mcmFtZS5saXN0Lmluc2VydCgwLCBsaW5lKQotCWRlZiBkb19tb3Rpb24oc2VsZiwgZSk6Ci0JCWUud2lkZ2V0LnNlbGVjdF9jbGVhcignMCcsICdlbmQnKQotCQllLndpZGdldC5zZWxlY3Rfc2V0KGUud2lkZ2V0Lm5lYXJlc3QoZS55KSkKLQlkZWYgZG9fbGVhdmUoc2VsZiwgZSk6Ci0JCWUud2lkZ2V0LnNlbGVjdF9jbGVhcignMCcsICdlbmQnKQotCWRlZiBkb18xKHNlbGYsIGUpOgotCQlzZWxmLmtpbGwoZS53aWRnZXQuZ2V0KGUud2lkZ2V0Lm5lYXJlc3QoZS55KSkpCi0JZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmNuZik6Ci0JCWFwcGx5KEZyYW1lLl9faW5pdF9fLCAoc2VsZiwgbWFzdGVyKSwgY25mKQotCQlzZWxmLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKLQkJc2VsZi5iYXIgPSBGcmFtZShzZWxmLCBuYW1lPSdiYXInLCByZWxpZWY9UkFJU0VELAotCQkJCSBib3JkZXJ3aWR0aD0yKQotCQlzZWxmLmJhci5wYWNrKGZpbGw9WCkKLQkJc2VsZi5iYXIuZmlsZSA9IEJhckJ1dHRvbihzZWxmLmJhciwgdGV4dD0nRmlsZScpCi0JCXNlbGYuYmFyLmZpbGUubWVudS5hZGRfY29tbWFuZCgKLQkJCWxhYmVsPSdRdWl0JywgY29tbWFuZD1zZWxmLnF1aXQpCi0JCXNlbGYuYmFyLnZpZXcgPSBCYXJCdXR0b24oc2VsZi5iYXIsIHRleHQ9J1ZpZXcnKQotCQlzZWxmLmJhci5mb3JtYXQgPSBCYXJCdXR0b24oc2VsZi5iYXIsIHRleHQ9J0Zvcm1hdCcpCi0JCXNlbGYudmlldyA9IEludFZhcihzZWxmKQotCQlzZWxmLnZpZXcuc2V0KDApCi0JCXNlbGYuZm9ybWF0ID0gSW50VmFyKHNlbGYpCi0JCXNlbGYuZm9ybWF0LnNldCgwKQotCQlmb3IgbnVtIGluIHJhbmdlKGxlbihzZWxmLnZpZXdfbGlzdCkpOgotCQkJbGFiZWwsIG9wdGlvbiA9IHNlbGYudmlld19saXN0W251bV0KLQkJCXNlbGYuYmFyLnZpZXcubWVudS5hZGRfcmFkaW9idXR0b24oCi0JCQkJbGFiZWw9bGFiZWwsCi0JCQkJY29tbWFuZD1zZWxmLmRvX3VwZGF0ZSwKLQkJCQl2YXJpYWJsZT1zZWxmLnZpZXcsCi0JCQkJdmFsdWU9bnVtKQotCQlmb3IgbnVtIGluIHJhbmdlKGxlbihzZWxmLmZvcm1hdF9saXN0KSk6Ci0JCQlsYWJlbCwgb3B0aW9uLCBjb2wgPSBzZWxmLmZvcm1hdF9saXN0W251bV0KLQkJCXNlbGYuYmFyLmZvcm1hdC5tZW51LmFkZF9yYWRpb2J1dHRvbigKLQkJCQlsYWJlbD1sYWJlbCwKLQkJCQljb21tYW5kPXNlbGYuZG9fdXBkYXRlLAotCQkJCXZhcmlhYmxlPXNlbGYuZm9ybWF0LAotCQkJCXZhbHVlPW51bSkKLQkJc2VsZi5iYXIudGtfbWVudUJhcihzZWxmLmJhci5maWxlLAotCQkJCSAgICBzZWxmLmJhci52aWV3LAotCQkJCSAgICBzZWxmLmJhci5mb3JtYXQpCi0JCXNlbGYuZnJhbWUgPSBGcmFtZShzZWxmLCByZWxpZWY9UkFJU0VELCBib3JkZXJ3aWR0aD0yKQotCQlzZWxmLmZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKLQkJc2VsZi5oZWFkZXIgPSBTdHJpbmdWYXIoc2VsZikKLQkJc2VsZi5mcmFtZS5sYWJlbCA9IExhYmVsKAotCQkJc2VsZi5mcmFtZSwgcmVsaWVmPUZMQVQsIGFuY2hvcj1OVywgYm9yZGVyd2lkdGg9MCwKLQkJCWZvbnQ9JyotQ291cmllci1Cb2xkLVItTm9ybWFsLSotMTIwLSonLAotCQkJdGV4dHZhcmlhYmxlPXNlbGYuaGVhZGVyKQotCQlzZWxmLmZyYW1lLmxhYmVsLnBhY2soZmlsbD1ZLCBhbmNob3I9VykKLQkJc2VsZi5mcmFtZS52c2Nyb2xsID0gU2Nyb2xsYmFyKHNlbGYuZnJhbWUsIG9yaWVudD1WRVJUSUNBTCkKLQkJc2VsZi5mcmFtZS5saXN0ID0gTGlzdGJveCgKLQkJCXNlbGYuZnJhbWUsIAotCQkJcmVsaWVmPVNVTktFTiwKLQkJCWZvbnQ9JyotQ291cmllci1NZWRpdW0tUi1Ob3JtYWwtKi0xMjAtKicsCi0JCQl3aWR0aD00MCwgaGVpZ2h0PTEwLAotCQkJc2VsZWN0YmFja2dyb3VuZD0nI2VlZDViNycsCi0JCQlzZWxlY3Rib3JkZXJ3aWR0aD0wLAotCQkJc2VsZWN0bW9kZT1CUk9XU0UsCi0JCQl5c2Nyb2xsPXNlbGYuZnJhbWUudnNjcm9sbC5zZXQpCi0JCXNlbGYuZnJhbWUudnNjcm9sbFsnY29tbWFuZCddID0gc2VsZi5mcmFtZS5saXN0Lnl2aWV3Ci0JCXNlbGYuZnJhbWUudnNjcm9sbC5wYWNrKHNpZGU9UklHSFQsIGZpbGw9WSkKLQkJc2VsZi5mcmFtZS5saXN0LnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKLQkJc2VsZi51cGRhdGUgPSBCdXR0b24oc2VsZiwgdGV4dD0nVXBkYXRlJywKLQkJCQkgICAgIGNvbW1hbmQ9c2VsZi5kb191cGRhdGUpCi0JCXNlbGYudXBkYXRlLnBhY2soZmlsbD1YKQotCQlzZWxmLmZyYW1lLmxpc3QuYmluZCgnPE1vdGlvbj4nLCBzZWxmLmRvX21vdGlvbikKLQkJc2VsZi5mcmFtZS5saXN0LmJpbmQoJzxMZWF2ZT4nLCBzZWxmLmRvX2xlYXZlKQotCQlzZWxmLmZyYW1lLmxpc3QuYmluZCgnPDE+Jywgc2VsZi5kb18xKQotCQlzZWxmLmRvX3VwZGF0ZSgpCisgICAgIyBMaXN0IG9mIChuYW1lLCBvcHRpb24sIHBpZF9jb2x1bW4pCisgICAgdmlld19saXN0ID0gWworICAgICAgICAgICAgKCdEZWZhdWx0JywgJycpLAorICAgICAgICAgICAgKCdFdmVyeSAoLWUpJywgJy1lJyksCisgICAgICAgICAgICAoJ05vbiBwcm9jZXNzIGdyb3VwIGxlYWRlcnMgKC1kKScsICctZCcpLAorICAgICAgICAgICAgKCdOb24gbGVhZGVycyB3aXRoIHR0eSAoLWEpJywgJy1hJyksCisgICAgICAgICAgICAoJ0ZvciB0aGlzIHVzZXIgKC11ICVzKScgJSB1c2VyLCAnLXUgJXMnICUgdXNlciksCisgICAgICAgICAgICBdCisgICAgZm9ybWF0X2xpc3QgPSBbCisgICAgICAgICAgICAoJ0RlZmF1bHQnLCAnJywgMCksCisgICAgICAgICAgICAoJ0xvbmcgKC1sKScsICctbCcsIDMpLAorICAgICAgICAgICAgKCdGdWxsICgtZiknLCAnLWYnLCAxKSwKKyAgICAgICAgICAgICgnRnVsbCBMb25nICgtZiAtbCknLCAnLWwgLWYnLCAzKSwKKyAgICAgICAgICAgICgnU2Vzc2lvbiBhbmQgZ3JvdXAgSUQgKC1qKScsICctaicsIDApLAorICAgICAgICAgICAgKCdTY2hlZHVsZXIgcHJvcGVydGllcyAoLWMpJywgJy1jJywgMCksCisgICAgICAgICAgICBdCisgICAgZGVmIGtpbGwoc2VsZiwgc2VsZWN0ZWQpOgorICAgICAgICBjID0gc2VsZi5mb3JtYXRfbGlzdFtzZWxmLmZvcm1hdC5nZXQoKV1bMl0KKyAgICAgICAgcGlkID0gc3BsaXQoc2VsZWN0ZWQpW2NdCisgICAgICAgIG9zLnN5c3RlbSgna2lsbCAtOSAnICsgcGlkKQorICAgICAgICBzZWxmLmRvX3VwZGF0ZSgpCisgICAgZGVmIGRvX3VwZGF0ZShzZWxmKToKKyAgICAgICAgZm9ybWF0ID0gc2VsZi5mb3JtYXRfbGlzdFtzZWxmLmZvcm1hdC5nZXQoKV1bMV0KKyAgICAgICAgdmlldyA9IHNlbGYudmlld19saXN0W3NlbGYudmlldy5nZXQoKV1bMV0KKyAgICAgICAgcyA9IGNvbW1hbmRzLmdldG91dHB1dCgncHMgJXMgJXMnICUgKHZpZXcsIGZvcm1hdCkpCisgICAgICAgIGxpc3QgPSBzcGxpdGZpZWxkcyhzLCAnXG4nKQorICAgICAgICBzZWxmLmhlYWRlci5zZXQobGlzdFswXSArICcgICAgICAgICAgJykKKyAgICAgICAgZGVsIGxpc3RbMF0KKyAgICAgICAgc2VsZi5mcmFtZS5saXN0LmRlbGV0ZSgwLCBBdEVuZCgpKQorICAgICAgICBmb3IgbGluZSBpbiBsaXN0OgorICAgICAgICAgICAgc2VsZi5mcmFtZS5saXN0Lmluc2VydCgwLCBsaW5lKQorICAgIGRlZiBkb19tb3Rpb24oc2VsZiwgZSk6CisgICAgICAgIGUud2lkZ2V0LnNlbGVjdF9jbGVhcignMCcsICdlbmQnKQorICAgICAgICBlLndpZGdldC5zZWxlY3Rfc2V0KGUud2lkZ2V0Lm5lYXJlc3QoZS55KSkKKyAgICBkZWYgZG9fbGVhdmUoc2VsZiwgZSk6CisgICAgICAgIGUud2lkZ2V0LnNlbGVjdF9jbGVhcignMCcsICdlbmQnKQorICAgIGRlZiBkb18xKHNlbGYsIGUpOgorICAgICAgICBzZWxmLmtpbGwoZS53aWRnZXQuZ2V0KGUud2lkZ2V0Lm5lYXJlc3QoZS55KSkpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmNuZik6CisgICAgICAgIGFwcGx5KEZyYW1lLl9faW5pdF9fLCAoc2VsZiwgbWFzdGVyKSwgY25mKQorICAgICAgICBzZWxmLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5iYXIgPSBGcmFtZShzZWxmLCBuYW1lPSdiYXInLCByZWxpZWY9UkFJU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcndpZHRoPTIpCisgICAgICAgIHNlbGYuYmFyLnBhY2soZmlsbD1YKQorICAgICAgICBzZWxmLmJhci5maWxlID0gQmFyQnV0dG9uKHNlbGYuYmFyLCB0ZXh0PSdGaWxlJykKKyAgICAgICAgc2VsZi5iYXIuZmlsZS5tZW51LmFkZF9jb21tYW5kKAorICAgICAgICAgICAgICAgIGxhYmVsPSdRdWl0JywgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuYmFyLnZpZXcgPSBCYXJCdXR0b24oc2VsZi5iYXIsIHRleHQ9J1ZpZXcnKQorICAgICAgICBzZWxmLmJhci5mb3JtYXQgPSBCYXJCdXR0b24oc2VsZi5iYXIsIHRleHQ9J0Zvcm1hdCcpCisgICAgICAgIHNlbGYudmlldyA9IEludFZhcihzZWxmKQorICAgICAgICBzZWxmLnZpZXcuc2V0KDApCisgICAgICAgIHNlbGYuZm9ybWF0ID0gSW50VmFyKHNlbGYpCisgICAgICAgIHNlbGYuZm9ybWF0LnNldCgwKQorICAgICAgICBmb3IgbnVtIGluIHJhbmdlKGxlbihzZWxmLnZpZXdfbGlzdCkpOgorICAgICAgICAgICAgbGFiZWwsIG9wdGlvbiA9IHNlbGYudmlld19saXN0W251bV0KKyAgICAgICAgICAgIHNlbGYuYmFyLnZpZXcubWVudS5hZGRfcmFkaW9idXR0b24oCisgICAgICAgICAgICAgICAgICAgIGxhYmVsPWxhYmVsLAorICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuZG9fdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLnZpZXcsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPW51bSkKKyAgICAgICAgZm9yIG51bSBpbiByYW5nZShsZW4oc2VsZi5mb3JtYXRfbGlzdCkpOgorICAgICAgICAgICAgbGFiZWwsIG9wdGlvbiwgY29sID0gc2VsZi5mb3JtYXRfbGlzdFtudW1dCisgICAgICAgICAgICBzZWxmLmJhci5mb3JtYXQubWVudS5hZGRfcmFkaW9idXR0b24oCisgICAgICAgICAgICAgICAgICAgIGxhYmVsPWxhYmVsLAorICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuZG9fdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9bnVtKQorICAgICAgICBzZWxmLmJhci50a19tZW51QmFyKHNlbGYuYmFyLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iYXIudmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJhci5mb3JtYXQpCisgICAgICAgIHNlbGYuZnJhbWUgPSBGcmFtZShzZWxmLCByZWxpZWY9UkFJU0VELCBib3JkZXJ3aWR0aD0yKQorICAgICAgICBzZWxmLmZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5oZWFkZXIgPSBTdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5mcmFtZS5sYWJlbCA9IExhYmVsKAorICAgICAgICAgICAgICAgIHNlbGYuZnJhbWUsIHJlbGllZj1GTEFULCBhbmNob3I9TlcsIGJvcmRlcndpZHRoPTAsCisgICAgICAgICAgICAgICAgZm9udD0nKi1Db3VyaWVyLUJvbGQtUi1Ob3JtYWwtKi0xMjAtKicsCisgICAgICAgICAgICAgICAgdGV4dHZhcmlhYmxlPXNlbGYuaGVhZGVyKQorICAgICAgICBzZWxmLmZyYW1lLmxhYmVsLnBhY2soZmlsbD1ZLCBhbmNob3I9VykKKyAgICAgICAgc2VsZi5mcmFtZS52c2Nyb2xsID0gU2Nyb2xsYmFyKHNlbGYuZnJhbWUsIG9yaWVudD1WRVJUSUNBTCkKKyAgICAgICAgc2VsZi5mcmFtZS5saXN0ID0gTGlzdGJveCgKKyAgICAgICAgICAgICAgICBzZWxmLmZyYW1lLAorICAgICAgICAgICAgICAgIHJlbGllZj1TVU5LRU4sCisgICAgICAgICAgICAgICAgZm9udD0nKi1Db3VyaWVyLU1lZGl1bS1SLU5vcm1hbC0qLTEyMC0qJywKKyAgICAgICAgICAgICAgICB3aWR0aD00MCwgaGVpZ2h0PTEwLAorICAgICAgICAgICAgICAgIHNlbGVjdGJhY2tncm91bmQ9JyNlZWQ1YjcnLAorICAgICAgICAgICAgICAgIHNlbGVjdGJvcmRlcndpZHRoPTAsCisgICAgICAgICAgICAgICAgc2VsZWN0bW9kZT1CUk9XU0UsCisgICAgICAgICAgICAgICAgeXNjcm9sbD1zZWxmLmZyYW1lLnZzY3JvbGwuc2V0KQorICAgICAgICBzZWxmLmZyYW1lLnZzY3JvbGxbJ2NvbW1hbmQnXSA9IHNlbGYuZnJhbWUubGlzdC55dmlldworICAgICAgICBzZWxmLmZyYW1lLnZzY3JvbGwucGFjayhzaWRlPVJJR0hULCBmaWxsPVkpCisgICAgICAgIHNlbGYuZnJhbWUubGlzdC5wYWNrKGV4cGFuZD0xLCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYudXBkYXRlID0gQnV0dG9uKHNlbGYsIHRleHQ9J1VwZGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5kb191cGRhdGUpCisgICAgICAgIHNlbGYudXBkYXRlLnBhY2soZmlsbD1YKQorICAgICAgICBzZWxmLmZyYW1lLmxpc3QuYmluZCgnPE1vdGlvbj4nLCBzZWxmLmRvX21vdGlvbikKKyAgICAgICAgc2VsZi5mcmFtZS5saXN0LmJpbmQoJzxMZWF2ZT4nLCBzZWxmLmRvX2xlYXZlKQorICAgICAgICBzZWxmLmZyYW1lLmxpc3QuYmluZCgnPDE+Jywgc2VsZi5kb18xKQorICAgICAgICBzZWxmLmRvX3VwZGF0ZSgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0Ja2lsbCA9IEtpbGwoTm9uZSwgYm9yZGVyd2lkdGg9NSkKLQlraWxsLndpbmZvX3RvcGxldmVsKCkudGl0bGUoJ1RraW50ZXIgUHJvY2VzcyBLaWxsZXIgKFNZU1YpJykKLQlraWxsLndpbmZvX3RvcGxldmVsKCkubWluc2l6ZSgxLCAxKQotCWtpbGwubWFpbmxvb3AoKQorICAgIGtpbGwgPSBLaWxsKE5vbmUsIGJvcmRlcndpZHRoPTUpCisgICAga2lsbC53aW5mb190b3BsZXZlbCgpLnRpdGxlKCdUa2ludGVyIFByb2Nlc3MgS2lsbGVyIChTWVNWKScpCisgICAga2lsbC53aW5mb190b3BsZXZlbCgpLm1pbnNpemUoMSwgMSkKKyAgICBraWxsLm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby90a21hbi5weSBiL0RlbW8vdGtpbnRlci9ndWlkby90a21hbi5weQppbmRleCA4NDY3MmZjLi4xMWQ5NjkwIDEwMDc1NQotLS0gYS9EZW1vL3RraW50ZXIvZ3VpZG8vdGttYW4ucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL3RrbWFuLnB5CkBAIC0xNSwyNTMgKzE1LDI1MyBAQAogZm91bmRtYW5uZGlyID0gMAogZm9yIGRpciBpbiBNQU5ORElSTElTVDoKICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkaXIpOgotCU1BTk5ESVIgPSBkaXIKLQlmb3VuZG1hbm5kaXIgPSAxCisgICAgICAgIE1BTk5ESVIgPSBkaXIKKyAgICAgICAgZm91bmRtYW5uZGlyID0gMQogCiBmb3VuZG1hbjNkaXIgPSAwCiBmb3IgZGlyIGluIE1BTjNESVJMSVNUOgogICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpcik6Ci0JTUFOM0RJUiA9IGRpcgotCWZvdW5kbWFuM2RpciA9ICAxCisgICAgICAgIE1BTjNESVIgPSBkaXIKKyAgICAgICAgZm91bmRtYW4zZGlyID0gIDEKIAogaWYgbm90IGZvdW5kbWFubmRpciBvciBub3QgZm91bmRtYW4zZGlyOgogICAgIHN5cy5zdGRlcnIud3JpdGUoJ1xuJykKICAgICBpZiBub3QgZm91bmRtYW5uZGlyOgotCW1zZyA9ICIiIlwKKyAgICAgICAgbXNnID0gIiIiXAogRmFpbGVkIHRvIGZpbmQgbWFubiBkaXJlY3RvcnkuCi1QbGVhc2UgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIHRoZSBNQU5ORElSTElTVCAKK1BsZWFzZSBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gdGhlIE1BTk5ESVJMSVNUCiBhdCB0aGUgdG9wIG9mICVzIHNjcmlwdC4iIiIgJSBcCiBzeXMuYXJndlswXQotCXN5cy5zdGRlcnIud3JpdGUoIiVzXG5cbiIgJSBtc2cpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzXG5cbiIgJSBtc2cpCiAgICAgaWYgbm90IGZvdW5kbWFuM2RpcjoKLQltc2cgPSAiIiJcCisgICAgICAgIG1zZyA9ICIiIlwKIEZhaWxlZCB0byBmaW5kIG1hbjMgZGlyZWN0b3J5LgotUGxlYXNlIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byB0aGUgTUFOM0RJUkxJU1QgCitQbGVhc2UgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIHRoZSBNQU4zRElSTElTVAogYXQgdGhlIHRvcCBvZiAlcyBzY3JpcHQuIiIiICUgXAogc3lzLmFyZ3ZbMF0KLQlzeXMuc3RkZXJyLndyaXRlKCIlc1xuXG4iICUgbXNnKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlc1xuXG4iICUgbXNnKQogICAgIHN5cy5leGl0KDEpCiAKIGRlbCBmb3VuZG1hbm5kaXIKIGRlbCBmb3VuZG1hbjNkaXIKIAogZGVmIGxpc3RtYW5wYWdlcyhtYW5kaXIpOgotCWZpbGVzID0gb3MubGlzdGRpcihtYW5kaXIpCi0JbmFtZXMgPSBbXQotCWZvciBmaWxlIGluIGZpbGVzOgotCQlpZiBmaWxlWy0yOi0xXSA9PSAnLicgYW5kICAoZmlsZVstMV0gaW4gJ2xuMTIzNDU2Nzg5Jyk6Ci0JCQluYW1lcy5hcHBlbmQoZmlsZVs6LTJdKQotCW5hbWVzLnNvcnQoKQotCXJldHVybiBuYW1lcworICAgIGZpbGVzID0gb3MubGlzdGRpcihtYW5kaXIpCisgICAgbmFtZXMgPSBbXQorICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgICBpZiBmaWxlWy0yOi0xXSA9PSAnLicgYW5kICAoZmlsZVstMV0gaW4gJ2xuMTIzNDU2Nzg5Jyk6CisgICAgICAgICAgICBuYW1lcy5hcHBlbmQoZmlsZVs6LTJdKQorICAgIG5hbWVzLnNvcnQoKQorICAgIHJldHVybiBuYW1lcwogCiBjbGFzcyBTZWxlY3Rpb25Cb3g6CiAKLQlkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotCQlzZWxmLmNob2ljZXMgPSBbXQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6CisgICAgICAgIHNlbGYuY2hvaWNlcyA9IFtdCiAKLQkJc2VsZi5mcmFtZSA9IEZyYW1lKG1hc3RlciwgbmFtZT0iZnJhbWUiKQotCQlzZWxmLmZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKLQkJc2VsZi5tYXN0ZXIgPSBzZWxmLmZyYW1lLm1hc3RlcgotCQlzZWxmLnN1YmZyYW1lID0gRnJhbWUoc2VsZi5mcmFtZSwgbmFtZT0ic3ViZnJhbWUiKQotCQlzZWxmLnN1YmZyYW1lLnBhY2soZXhwYW5kPTAsIGZpbGw9Qk9USCkKLQkJc2VsZi5sZWZ0c3ViZnJhbWUgPSBGcmFtZShzZWxmLnN1YmZyYW1lLCBuYW1lPSdsZWZ0c3ViZnJhbWUnKQotCQlzZWxmLmxlZnRzdWJmcmFtZS5wYWNrKHNpZGU9TEVGVCwgZXhwYW5kPTEsIGZpbGw9Qk9USCkKLQkJc2VsZi5yaWdodHN1YmZyYW1lID0gRnJhbWUoc2VsZi5zdWJmcmFtZSwgbmFtZT0ncmlnaHRzdWJmcmFtZScpCi0JCXNlbGYucmlnaHRzdWJmcmFtZS5wYWNrKHNpZGU9UklHSFQsIGV4cGFuZD0xLCBmaWxsPUJPVEgpCi0JCXNlbGYuY2hhcHRlcnZhciA9IFN0cmluZ1ZhcihtYXN0ZXIpCi0JCXNlbGYuY2hhcHRlciA9IE1lbnVidXR0b24oc2VsZi5yaWdodHN1YmZyYW1lLCBuYW1lPSdjaGFwdGVyJywKLQkJCQkJICB0ZXh0PSdEaXJlY3RvcnknLCByZWxpZWY9UkFJU0VELAotCQkJCQkgIGJvcmRlcndpZHRoPTIpCi0JCXNlbGYuY2hhcHRlci5wYWNrKHNpZGU9VE9QKQotCQlzZWxmLmNoYXB0ZXJtZW51ID0gTWVudShzZWxmLmNoYXB0ZXIsIG5hbWU9J2NoYXB0ZXJtZW51JykKLQkJc2VsZi5jaGFwdGVybWVudS5hZGRfcmFkaW9idXR0b24obGFiZWw9J0MgZnVuY3Rpb25zJywKLQkJCQkJCSB2YWx1ZT1NQU4zRElSLAotCQkJCQkJIHZhcmlhYmxlPXNlbGYuY2hhcHRlcnZhciwKLQkJCQkJCSBjb21tYW5kPXNlbGYubmV3Y2hhcHRlcikKLQkJc2VsZi5jaGFwdGVybWVudS5hZGRfcmFkaW9idXR0b24obGFiZWw9J1RjbC9UayBmdW5jdGlvbnMnLAotCQkJCQkJIHZhbHVlPU1BTk5ESVIsCi0JCQkJCQkgdmFyaWFibGU9c2VsZi5jaGFwdGVydmFyLAotCQkJCQkJIGNvbW1hbmQ9c2VsZi5uZXdjaGFwdGVyKQotCQlzZWxmLmNoYXB0ZXJbJ21lbnUnXSA9IHNlbGYuY2hhcHRlcm1lbnUKLQkJc2VsZi5saXN0Ym94ID0gTGlzdGJveChzZWxmLnJpZ2h0c3ViZnJhbWUsIG5hbWU9J2xpc3Rib3gnLAotCQkJCSAgICAgICByZWxpZWY9U1VOS0VOLCBib3JkZXJ3aWR0aD0yLAotCQkJCSAgICAgICB3aWR0aD0yMCwgaGVpZ2h0PTUpCi0JCXNlbGYubGlzdGJveC5wYWNrKGV4cGFuZD0xLCBmaWxsPUJPVEgpCi0JCXNlbGYubDEgPSBCdXR0b24oc2VsZi5sZWZ0c3ViZnJhbWUsIG5hbWU9J2wxJywKLQkJCQkgdGV4dD0nRGlzcGxheSBtYW51YWwgcGFnZSBuYW1lZDonLAotCQkJCSBjb21tYW5kPXNlbGYuZW50cnlfY2IpCi0JCXNlbGYubDEucGFjayhzaWRlPVRPUCkKLQkJc2VsZi5lbnRyeSA9IEVudHJ5KHNlbGYubGVmdHN1YmZyYW1lLCBuYW1lPSdlbnRyeScsCi0JCQkJICAgIHJlbGllZj1TVU5LRU4sIGJvcmRlcndpZHRoPTIsCi0JCQkJICAgIHdpZHRoPTIwKQotCQlzZWxmLmVudHJ5LnBhY2soZXhwYW5kPTAsIGZpbGw9WCkKLQkJc2VsZi5sMmZyYW1lID0gRnJhbWUoc2VsZi5sZWZ0c3ViZnJhbWUsIG5hbWU9J2wyZnJhbWUnKQotCQlzZWxmLmwyZnJhbWUucGFjayhleHBhbmQ9MCwgZmlsbD1OT05FKQotCQlzZWxmLmwyID0gQnV0dG9uKHNlbGYubDJmcmFtZSwgbmFtZT0nbDInLAotCQkJCSB0ZXh0PSdTZWFyY2ggcmVnZXhwOicsCi0JCQkJIGNvbW1hbmQ9c2VsZi5zZWFyY2hfY2IpCi0JCXNlbGYubDIucGFjayhzaWRlPUxFRlQpCi0JCXNlbGYuY2FzZXZhciA9IEJvb2xlYW5WYXIoKQotCQlzZWxmLmNhc2VzZW5zZSA9IENoZWNrYnV0dG9uKHNlbGYubDJmcmFtZSwgbmFtZT0nY2FzZXNlbnNlJywKLQkJCQkJICAgICB0ZXh0PSdDYXNlIHNlbnNpdGl2ZScsCi0JCQkJCSAgICAgdmFyaWFibGU9c2VsZi5jYXNldmFyLAotCQkJCQkgICAgIHJlbGllZj1GTEFUKQotCQlzZWxmLmNhc2VzZW5zZS5wYWNrKHNpZGU9TEVGVCkKLQkJc2VsZi5zZWFyY2ggPSBFbnRyeShzZWxmLmxlZnRzdWJmcmFtZSwgbmFtZT0nc2VhcmNoJywKLQkJCQkgICAgcmVsaWVmPVNVTktFTiwgYm9yZGVyd2lkdGg9MiwKLQkJCQkgICAgd2lkdGg9MjApCi0JCXNlbGYuc2VhcmNoLnBhY2soZXhwYW5kPTAsIGZpbGw9WCkKLQkJc2VsZi50aXRsZSA9IExhYmVsKHNlbGYubGVmdHN1YmZyYW1lLCBuYW1lPSd0aXRsZScsCi0JCQkJICAgdGV4dD0nKG5vbmUpJykKLQkJc2VsZi50aXRsZS5wYWNrKHNpZGU9Qk9UVE9NKQotCQlzZWxmLnRleHQgPSBNYW5QYWdlKHNlbGYuZnJhbWUsIG5hbWU9J3RleHQnLAotCQkJCSAgICByZWxpZWY9U1VOS0VOLCBib3JkZXJ3aWR0aD0yLAotCQkJCSAgICB3cmFwPU5PTkUsIHdpZHRoPTcyLAotCQkJCSAgICBzZWxlY3RiYWNrZ3JvdW5kPSdwaW5rJykKLQkJc2VsZi50ZXh0LnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5mcmFtZSA9IEZyYW1lKG1hc3RlciwgbmFtZT0iZnJhbWUiKQorICAgICAgICBzZWxmLmZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5tYXN0ZXIgPSBzZWxmLmZyYW1lLm1hc3RlcgorICAgICAgICBzZWxmLnN1YmZyYW1lID0gRnJhbWUoc2VsZi5mcmFtZSwgbmFtZT0ic3ViZnJhbWUiKQorICAgICAgICBzZWxmLnN1YmZyYW1lLnBhY2soZXhwYW5kPTAsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5sZWZ0c3ViZnJhbWUgPSBGcmFtZShzZWxmLnN1YmZyYW1lLCBuYW1lPSdsZWZ0c3ViZnJhbWUnKQorICAgICAgICBzZWxmLmxlZnRzdWJmcmFtZS5wYWNrKHNpZGU9TEVGVCwgZXhwYW5kPTEsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5yaWdodHN1YmZyYW1lID0gRnJhbWUoc2VsZi5zdWJmcmFtZSwgbmFtZT0ncmlnaHRzdWJmcmFtZScpCisgICAgICAgIHNlbGYucmlnaHRzdWJmcmFtZS5wYWNrKHNpZGU9UklHSFQsIGV4cGFuZD0xLCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuY2hhcHRlcnZhciA9IFN0cmluZ1ZhcihtYXN0ZXIpCisgICAgICAgIHNlbGYuY2hhcHRlciA9IE1lbnVidXR0b24oc2VsZi5yaWdodHN1YmZyYW1lLCBuYW1lPSdjaGFwdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdEaXJlY3RvcnknLCByZWxpZWY9UkFJU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcndpZHRoPTIpCisgICAgICAgIHNlbGYuY2hhcHRlci5wYWNrKHNpZGU9VE9QKQorICAgICAgICBzZWxmLmNoYXB0ZXJtZW51ID0gTWVudShzZWxmLmNoYXB0ZXIsIG5hbWU9J2NoYXB0ZXJtZW51JykKKyAgICAgICAgc2VsZi5jaGFwdGVybWVudS5hZGRfcmFkaW9idXR0b24obGFiZWw9J0MgZnVuY3Rpb25zJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9TUFOM0RJUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU9c2VsZi5jaGFwdGVydmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYubmV3Y2hhcHRlcikKKyAgICAgICAgc2VsZi5jaGFwdGVybWVudS5hZGRfcmFkaW9idXR0b24obGFiZWw9J1RjbC9UayBmdW5jdGlvbnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1NQU5ORElSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmNoYXB0ZXJ2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5uZXdjaGFwdGVyKQorICAgICAgICBzZWxmLmNoYXB0ZXJbJ21lbnUnXSA9IHNlbGYuY2hhcHRlcm1lbnUKKyAgICAgICAgc2VsZi5saXN0Ym94ID0gTGlzdGJveChzZWxmLnJpZ2h0c3ViZnJhbWUsIG5hbWU9J2xpc3Rib3gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGllZj1TVU5LRU4sIGJvcmRlcndpZHRoPTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MjAsIGhlaWdodD01KQorICAgICAgICBzZWxmLmxpc3Rib3gucGFjayhleHBhbmQ9MSwgZmlsbD1CT1RIKQorICAgICAgICBzZWxmLmwxID0gQnV0dG9uKHNlbGYubGVmdHN1YmZyYW1lLCBuYW1lPSdsMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nRGlzcGxheSBtYW51YWwgcGFnZSBuYW1lZDonLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5lbnRyeV9jYikKKyAgICAgICAgc2VsZi5sMS5wYWNrKHNpZGU9VE9QKQorICAgICAgICBzZWxmLmVudHJ5ID0gRW50cnkoc2VsZi5sZWZ0c3ViZnJhbWUsIG5hbWU9J2VudHJ5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZWY9U1VOS0VOLCBib3JkZXJ3aWR0aD0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTIwKQorICAgICAgICBzZWxmLmVudHJ5LnBhY2soZXhwYW5kPTAsIGZpbGw9WCkKKyAgICAgICAgc2VsZi5sMmZyYW1lID0gRnJhbWUoc2VsZi5sZWZ0c3ViZnJhbWUsIG5hbWU9J2wyZnJhbWUnKQorICAgICAgICBzZWxmLmwyZnJhbWUucGFjayhleHBhbmQ9MCwgZmlsbD1OT05FKQorICAgICAgICBzZWxmLmwyID0gQnV0dG9uKHNlbGYubDJmcmFtZSwgbmFtZT0nbDInLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9J1NlYXJjaCByZWdleHA6JywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuc2VhcmNoX2NiKQorICAgICAgICBzZWxmLmwyLnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLmNhc2V2YXIgPSBCb29sZWFuVmFyKCkKKyAgICAgICAgc2VsZi5jYXNlc2Vuc2UgPSBDaGVja2J1dHRvbihzZWxmLmwyZnJhbWUsIG5hbWU9J2Nhc2VzZW5zZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nQ2FzZSBzZW5zaXRpdmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYuY2FzZXZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZWY9RkxBVCkKKyAgICAgICAgc2VsZi5jYXNlc2Vuc2UucGFjayhzaWRlPUxFRlQpCisgICAgICAgIHNlbGYuc2VhcmNoID0gRW50cnkoc2VsZi5sZWZ0c3ViZnJhbWUsIG5hbWU9J3NlYXJjaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVNVTktFTiwgYm9yZGVyd2lkdGg9MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0yMCkKKyAgICAgICAgc2VsZi5zZWFyY2gucGFjayhleHBhbmQ9MCwgZmlsbD1YKQorICAgICAgICBzZWxmLnRpdGxlID0gTGFiZWwoc2VsZi5sZWZ0c3ViZnJhbWUsIG5hbWU9J3RpdGxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9Jyhub25lKScpCisgICAgICAgIHNlbGYudGl0bGUucGFjayhzaWRlPUJPVFRPTSkKKyAgICAgICAgc2VsZi50ZXh0ID0gTWFuUGFnZShzZWxmLmZyYW1lLCBuYW1lPSd0ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZWY9U1VOS0VOLCBib3JkZXJ3aWR0aD0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA9Tk9ORSwgd2lkdGg9NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YmFja2dyb3VuZD0ncGluaycpCisgICAgICAgIHNlbGYudGV4dC5wYWNrKGV4cGFuZD0xLCBmaWxsPUJPVEgpCiAKLQkJc2VsZi5lbnRyeS5iaW5kKCc8UmV0dXJuPicsIHNlbGYuZW50cnlfY2IpCi0JCXNlbGYuc2VhcmNoLmJpbmQoJzxSZXR1cm4+Jywgc2VsZi5zZWFyY2hfY2IpCi0JCXNlbGYubGlzdGJveC5iaW5kKCc8RG91YmxlLTE+Jywgc2VsZi5saXN0Ym94X2NiKQorICAgICAgICBzZWxmLmVudHJ5LmJpbmQoJzxSZXR1cm4+Jywgc2VsZi5lbnRyeV9jYikKKyAgICAgICAgc2VsZi5zZWFyY2guYmluZCgnPFJldHVybj4nLCBzZWxmLnNlYXJjaF9jYikKKyAgICAgICAgc2VsZi5saXN0Ym94LmJpbmQoJzxEb3VibGUtMT4nLCBzZWxmLmxpc3Rib3hfY2IpCiAKLQkJc2VsZi5lbnRyeS5iaW5kKCc8VGFiPicsIHNlbGYuZW50cnlfdGFiKQotCQlzZWxmLnNlYXJjaC5iaW5kKCc8VGFiPicsIHNlbGYuc2VhcmNoX3RhYikKLQkJc2VsZi50ZXh0LmJpbmQoJzxUYWI+Jywgc2VsZi50ZXh0X3RhYikKKyAgICAgICAgc2VsZi5lbnRyeS5iaW5kKCc8VGFiPicsIHNlbGYuZW50cnlfdGFiKQorICAgICAgICBzZWxmLnNlYXJjaC5iaW5kKCc8VGFiPicsIHNlbGYuc2VhcmNoX3RhYikKKyAgICAgICAgc2VsZi50ZXh0LmJpbmQoJzxUYWI+Jywgc2VsZi50ZXh0X3RhYikKIAotCQlzZWxmLmVudHJ5LmZvY3VzX3NldCgpCisgICAgICAgIHNlbGYuZW50cnkuZm9jdXNfc2V0KCkKIAotCQlzZWxmLmNoYXB0ZXJ2YXIuc2V0KE1BTk5ESVIpCi0JCXNlbGYubmV3Y2hhcHRlcigpCisgICAgICAgIHNlbGYuY2hhcHRlcnZhci5zZXQoTUFOTkRJUikKKyAgICAgICAgc2VsZi5uZXdjaGFwdGVyKCkKIAotCWRlZiBuZXdjaGFwdGVyKHNlbGYpOgotCQltYW5kaXIgPSBzZWxmLmNoYXB0ZXJ2YXIuZ2V0KCkKLQkJc2VsZi5jaG9pY2VzID0gW10KLQkJc2VsZi5hZGRsaXN0KGxpc3RtYW5wYWdlcyhtYW5kaXIpKQorICAgIGRlZiBuZXdjaGFwdGVyKHNlbGYpOgorICAgICAgICBtYW5kaXIgPSBzZWxmLmNoYXB0ZXJ2YXIuZ2V0KCkKKyAgICAgICAgc2VsZi5jaG9pY2VzID0gW10KKyAgICAgICAgc2VsZi5hZGRsaXN0KGxpc3RtYW5wYWdlcyhtYW5kaXIpKQogCi0JZGVmIGFkZGNob2ljZShzZWxmLCBjaG9pY2UpOgotCQlpZiBjaG9pY2Ugbm90IGluIHNlbGYuY2hvaWNlczoKLQkJCXNlbGYuY2hvaWNlcy5hcHBlbmQoY2hvaWNlKQotCQkJc2VsZi5jaG9pY2VzLnNvcnQoKQotCQlzZWxmLnVwZGF0ZSgpCisgICAgZGVmIGFkZGNob2ljZShzZWxmLCBjaG9pY2UpOgorICAgICAgICBpZiBjaG9pY2Ugbm90IGluIHNlbGYuY2hvaWNlczoKKyAgICAgICAgICAgIHNlbGYuY2hvaWNlcy5hcHBlbmQoY2hvaWNlKQorICAgICAgICAgICAgc2VsZi5jaG9pY2VzLnNvcnQoKQorICAgICAgICBzZWxmLnVwZGF0ZSgpCiAKLQlkZWYgYWRkbGlzdChzZWxmLCBsaXN0KToKLQkJc2VsZi5jaG9pY2VzW2xlbihzZWxmLmNob2ljZXMpOl0gPSBsaXN0Ci0JCXNlbGYuY2hvaWNlcy5zb3J0KCkKLQkJc2VsZi51cGRhdGUoKQorICAgIGRlZiBhZGRsaXN0KHNlbGYsIGxpc3QpOgorICAgICAgICBzZWxmLmNob2ljZXNbbGVuKHNlbGYuY2hvaWNlcyk6XSA9IGxpc3QKKyAgICAgICAgc2VsZi5jaG9pY2VzLnNvcnQoKQorICAgICAgICBzZWxmLnVwZGF0ZSgpCiAKLQlkZWYgZW50cnlfY2Ioc2VsZiwgKmUpOgotCQlzZWxmLnVwZGF0ZSgpCisgICAgZGVmIGVudHJ5X2NiKHNlbGYsICplKToKKyAgICAgICAgc2VsZi51cGRhdGUoKQogCi0JZGVmIGxpc3Rib3hfY2Ioc2VsZiwgZSk6Ci0JCXNlbGVjdGlvbiA9IHNlbGYubGlzdGJveC5jdXJzZWxlY3Rpb24oKQotCQlpZiBzZWxlY3Rpb24gYW5kIGxlbihzZWxlY3Rpb24pID09IDE6Ci0JCQluYW1lID0gc2VsZi5saXN0Ym94LmdldChzZWxlY3Rpb25bMF0pCi0JCQlzZWxmLnNob3dfcGFnZShuYW1lKQorICAgIGRlZiBsaXN0Ym94X2NiKHNlbGYsIGUpOgorICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKCkKKyAgICAgICAgaWYgc2VsZWN0aW9uIGFuZCBsZW4oc2VsZWN0aW9uKSA9PSAxOgorICAgICAgICAgICAgbmFtZSA9IHNlbGYubGlzdGJveC5nZXQoc2VsZWN0aW9uWzBdKQorICAgICAgICAgICAgc2VsZi5zaG93X3BhZ2UobmFtZSkKIAotCWRlZiBzZWFyY2hfY2Ioc2VsZiwgKmUpOgotCQlzZWxmLnNlYXJjaF9zdHJpbmcoc2VsZi5zZWFyY2guZ2V0KCkpCisgICAgZGVmIHNlYXJjaF9jYihzZWxmLCAqZSk6CisgICAgICAgIHNlbGYuc2VhcmNoX3N0cmluZyhzZWxmLnNlYXJjaC5nZXQoKSkKIAotCWRlZiBlbnRyeV90YWIoc2VsZiwgZSk6Ci0JCXNlbGYuc2VhcmNoLmZvY3VzX3NldCgpCisgICAgZGVmIGVudHJ5X3RhYihzZWxmLCBlKToKKyAgICAgICAgc2VsZi5zZWFyY2guZm9jdXNfc2V0KCkKIAotCWRlZiBzZWFyY2hfdGFiKHNlbGYsIGUpOgotCQlzZWxmLmVudHJ5LmZvY3VzX3NldCgpCisgICAgZGVmIHNlYXJjaF90YWIoc2VsZiwgZSk6CisgICAgICAgIHNlbGYuZW50cnkuZm9jdXNfc2V0KCkKIAotCWRlZiB0ZXh0X3RhYihzZWxmLCBlKToKLQkJc2VsZi5lbnRyeS5mb2N1c19zZXQoKQorICAgIGRlZiB0ZXh0X3RhYihzZWxmLCBlKToKKyAgICAgICAgc2VsZi5lbnRyeS5mb2N1c19zZXQoKQogCi0JZGVmIHVwZGF0ZWxpc3Qoc2VsZik6Ci0JCWtleSA9IHNlbGYuZW50cnkuZ2V0KCkKLQkJb2sgPSBmaWx0ZXIobGFtYmRhIG5hbWUsIGtleT1rZXksIG49bGVuKGtleSk6IG5hbWVbOm5dPT1rZXksCi0JCQkgc2VsZi5jaG9pY2VzKQotCQlpZiBub3Qgb2s6Ci0JCQlzZWxmLmZyYW1lLmJlbGwoKQotCQlzZWxmLmxpc3Rib3guZGVsZXRlKDAsIEF0RW5kKCkpCi0JCWV4YWN0bWF0Y2ggPSAwCi0JCWZvciBpdGVtIGluIG9rOgotCQkJaWYgaXRlbSA9PSBrZXk6IGV4YWN0bWF0Y2ggPSAxCi0JCQlzZWxmLmxpc3Rib3guaW5zZXJ0KEF0RW5kKCksIGl0ZW0pCi0JCWlmIGV4YWN0bWF0Y2g6Ci0JCQlyZXR1cm4ga2V5Ci0JCW4gPSBzZWxmLmxpc3Rib3guc2l6ZSgpCi0JCWlmIG4gPT0gMToKLQkJCXJldHVybiBzZWxmLmxpc3Rib3guZ2V0KDApCi0JCSMgRWxzZSByZXR1cm4gTm9uZSwgbWVhbmluZyBub3QgYSB1bmlxdWUgc2VsZWN0aW9uCisgICAgZGVmIHVwZGF0ZWxpc3Qoc2VsZik6CisgICAgICAgIGtleSA9IHNlbGYuZW50cnkuZ2V0KCkKKyAgICAgICAgb2sgPSBmaWx0ZXIobGFtYmRhIG5hbWUsIGtleT1rZXksIG49bGVuKGtleSk6IG5hbWVbOm5dPT1rZXksCisgICAgICAgICAgICAgICAgIHNlbGYuY2hvaWNlcykKKyAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgc2VsZi5mcmFtZS5iZWxsKCkKKyAgICAgICAgc2VsZi5saXN0Ym94LmRlbGV0ZSgwLCBBdEVuZCgpKQorICAgICAgICBleGFjdG1hdGNoID0gMAorICAgICAgICBmb3IgaXRlbSBpbiBvazoKKyAgICAgICAgICAgIGlmIGl0ZW0gPT0ga2V5OiBleGFjdG1hdGNoID0gMQorICAgICAgICAgICAgc2VsZi5saXN0Ym94Lmluc2VydChBdEVuZCgpLCBpdGVtKQorICAgICAgICBpZiBleGFjdG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIGtleQorICAgICAgICBuID0gc2VsZi5saXN0Ym94LnNpemUoKQorICAgICAgICBpZiBuID09IDE6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5saXN0Ym94LmdldCgwKQorICAgICAgICAjIEVsc2UgcmV0dXJuIE5vbmUsIG1lYW5pbmcgbm90IGEgdW5pcXVlIHNlbGVjdGlvbgogCi0JZGVmIHVwZGF0ZShzZWxmKToKLQkJbmFtZSA9IHNlbGYudXBkYXRlbGlzdCgpCi0JCWlmIG5hbWU6Ci0JCQlzZWxmLnNob3dfcGFnZShuYW1lKQotCQkJc2VsZi5lbnRyeS5kZWxldGUoMCwgQXRFbmQoKSkKLQkJCXNlbGYudXBkYXRlbGlzdCgpCisgICAgZGVmIHVwZGF0ZShzZWxmKToKKyAgICAgICAgbmFtZSA9IHNlbGYudXBkYXRlbGlzdCgpCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBzZWxmLnNob3dfcGFnZShuYW1lKQorICAgICAgICAgICAgc2VsZi5lbnRyeS5kZWxldGUoMCwgQXRFbmQoKSkKKyAgICAgICAgICAgIHNlbGYudXBkYXRlbGlzdCgpCiAKLQlkZWYgc2hvd19wYWdlKHNlbGYsIG5hbWUpOgotCQlmaWxlID0gJyVzLyVzLj8nICUgKHNlbGYuY2hhcHRlcnZhci5nZXQoKSwgbmFtZSkKLQkJZnAgPSBvcy5wb3BlbignbnJvZmYgLW1hbiAlcyB8IHVsIC1pJyAlIGZpbGUsICdyJykKLQkJc2VsZi50ZXh0LmtpbGwoKQotCQlzZWxmLnRpdGxlWyd0ZXh0J10gPSBuYW1lCi0JCXNlbGYudGV4dC5wYXJzZWZpbGUoZnApCisgICAgZGVmIHNob3dfcGFnZShzZWxmLCBuYW1lKToKKyAgICAgICAgZmlsZSA9ICclcy8lcy4/JyAlIChzZWxmLmNoYXB0ZXJ2YXIuZ2V0KCksIG5hbWUpCisgICAgICAgIGZwID0gb3MucG9wZW4oJ25yb2ZmIC1tYW4gJXMgfCB1bCAtaScgJSBmaWxlLCAncicpCisgICAgICAgIHNlbGYudGV4dC5raWxsKCkKKyAgICAgICAgc2VsZi50aXRsZVsndGV4dCddID0gbmFtZQorICAgICAgICBzZWxmLnRleHQucGFyc2VmaWxlKGZwKQogCi0JZGVmIHNlYXJjaF9zdHJpbmcoc2VsZiwgc2VhcmNoKToKLQkJaWYgbm90IHNlYXJjaDoKLQkJCXNlbGYuZnJhbWUuYmVsbCgpCi0JCQlwcmludCAnRW1wdHkgc2VhcmNoIHN0cmluZycKLQkJCXJldHVybgotCQlpZiBub3Qgc2VsZi5jYXNldmFyLmdldCgpOgotCQkJbWFwID0gcmVnZXguY2FzZWZvbGQKLQkJZWxzZToKLQkJCW1hcCA9IE5vbmUKLQkJdHJ5OgotCQkJaWYgbWFwOgotCQkJCXByb2cgPSByZWdleC5jb21waWxlKHNlYXJjaCwgbWFwKQotCQkJZWxzZToKLQkJCQlwcm9nID0gcmVnZXguY29tcGlsZShzZWFyY2gpCi0JCWV4Y2VwdCByZWdleC5lcnJvciwgbXNnOgotCQkJc2VsZi5mcmFtZS5iZWxsKCkKLQkJCXByaW50ICdSZWdleCBlcnJvcjonLCBtc2cKLQkJCXJldHVybgotCQloZXJlID0gc2VsZi50ZXh0LmluZGV4KEF0SW5zZXJ0KCkpCi0JCWxpbmVubyA9IHN0cmluZy5hdG9pKGhlcmVbOnN0cmluZy5maW5kKGhlcmUsICcuJyldKQotCQllbmQgPSBzZWxmLnRleHQuaW5kZXgoQXRFbmQoKSkKLQkJZW5kbGluZW5vID0gc3RyaW5nLmF0b2koZW5kWzpzdHJpbmcuZmluZChlbmQsICcuJyldKQotCQl3cmFwbGluZW5vID0gbGluZW5vCi0JCWZvdW5kID0gMAotCQl3aGlsZSAxOgotCQkJbGluZW5vID0gbGluZW5vICsgMQotCQkJaWYgbGluZW5vID4gZW5kbGluZW5vOgotCQkJCWlmIHdyYXBsaW5lbm8gPD0gMDoKLQkJCQkJYnJlYWsKLQkJCQllbmRsaW5lbm8gPSB3cmFwbGluZW5vCi0JCQkJbGluZW5vID0gMAotCQkJCXdyYXBsaW5lbm8gPSAwCi0JCQlsaW5lID0gc2VsZi50ZXh0LmdldCgnJWQuMCBsaW5lc3RhcnQnICUgbGluZW5vLAotCQkJCQkgICAgICclZC4wIGxpbmVlbmQnICUgbGluZW5vKQotCQkJaSA9IHByb2cuc2VhcmNoKGxpbmUpCi0JCQlpZiBpID49IDA6Ci0JCQkJZm91bmQgPSAxCi0JCQkJbiA9IG1heCgxLCBsZW4ocHJvZy5ncm91cCgwKSkpCi0JCQkJdHJ5OgotCQkJCQlzZWxmLnRleHQudGFnX3JlbW92ZSgnc2VsJywKLQkJCQkJCQkgICAgIEF0U2VsRmlyc3QoKSwKLQkJCQkJCQkgICAgIEF0U2VsTGFzdCgpKQotCQkJCWV4Y2VwdCBUY2xFcnJvcjoKLQkJCQkJcGFzcwotCQkJCXNlbGYudGV4dC50YWdfYWRkKCdzZWwnLAotCQkJCQkJICAnJWQuJWQnICUgKGxpbmVubywgaSksCi0JCQkJCQkgICclZC4lZCcgJSAobGluZW5vLCBpK24pKQotCQkJCXNlbGYudGV4dC5tYXJrX3NldChBdEluc2VydCgpLAotCQkJCQkJICAgJyVkLiVkJyAlIChsaW5lbm8sIGkpKQotCQkJCXNlbGYudGV4dC55dmlld19waWNrcGxhY2UoQXRJbnNlcnQoKSkKLQkJCQlicmVhawotCQlpZiBub3QgZm91bmQ6Ci0JCQlzZWxmLmZyYW1lLmJlbGwoKQorICAgIGRlZiBzZWFyY2hfc3RyaW5nKHNlbGYsIHNlYXJjaCk6CisgICAgICAgIGlmIG5vdCBzZWFyY2g6CisgICAgICAgICAgICBzZWxmLmZyYW1lLmJlbGwoKQorICAgICAgICAgICAgcHJpbnQgJ0VtcHR5IHNlYXJjaCBzdHJpbmcnCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHNlbGYuY2FzZXZhci5nZXQoKToKKyAgICAgICAgICAgIG1hcCA9IHJlZ2V4LmNhc2Vmb2xkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXAgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG1hcDoKKyAgICAgICAgICAgICAgICBwcm9nID0gcmVnZXguY29tcGlsZShzZWFyY2gsIG1hcCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJvZyA9IHJlZ2V4LmNvbXBpbGUoc2VhcmNoKQorICAgICAgICBleGNlcHQgcmVnZXguZXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlbGYuZnJhbWUuYmVsbCgpCisgICAgICAgICAgICBwcmludCAnUmVnZXggZXJyb3I6JywgbXNnCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaGVyZSA9IHNlbGYudGV4dC5pbmRleChBdEluc2VydCgpKQorICAgICAgICBsaW5lbm8gPSBzdHJpbmcuYXRvaShoZXJlWzpzdHJpbmcuZmluZChoZXJlLCAnLicpXSkKKyAgICAgICAgZW5kID0gc2VsZi50ZXh0LmluZGV4KEF0RW5kKCkpCisgICAgICAgIGVuZGxpbmVubyA9IHN0cmluZy5hdG9pKGVuZFs6c3RyaW5nLmZpbmQoZW5kLCAnLicpXSkKKyAgICAgICAgd3JhcGxpbmVubyA9IGxpbmVubworICAgICAgICBmb3VuZCA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgICAgIGlmIGxpbmVubyA+IGVuZGxpbmVubzoKKyAgICAgICAgICAgICAgICBpZiB3cmFwbGluZW5vIDw9IDA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZW5kbGluZW5vID0gd3JhcGxpbmVubworICAgICAgICAgICAgICAgIGxpbmVubyA9IDAKKyAgICAgICAgICAgICAgICB3cmFwbGluZW5vID0gMAorICAgICAgICAgICAgbGluZSA9IHNlbGYudGV4dC5nZXQoJyVkLjAgbGluZXN0YXJ0JyAlIGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclZC4wIGxpbmVlbmQnICUgbGluZW5vKQorICAgICAgICAgICAgaSA9IHByb2cuc2VhcmNoKGxpbmUpCisgICAgICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICAgICAgZm91bmQgPSAxCisgICAgICAgICAgICAgICAgbiA9IG1heCgxLCBsZW4ocHJvZy5ncm91cCgwKSkpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRleHQudGFnX3JlbW92ZSgnc2VsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRTZWxGaXJzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdFNlbExhc3QoKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBzZWxmLnRleHQudGFnX2FkZCgnc2VsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJWQuJWQnICUgKGxpbmVubywgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVkLiVkJyAlIChsaW5lbm8sIGkrbikpCisgICAgICAgICAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KEF0SW5zZXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclZC4lZCcgJSAobGluZW5vLCBpKSkKKyAgICAgICAgICAgICAgICBzZWxmLnRleHQueXZpZXdfcGlja3BsYWNlKEF0SW5zZXJ0KCkpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbm90IGZvdW5kOgorICAgICAgICAgICAgc2VsZi5mcmFtZS5iZWxsKCkKIAogZGVmIG1haW4oKToKLQlyb290ID0gVGsoKQotCXNiID0gU2VsZWN0aW9uQm94KHJvb3QpCi0JaWYgc3lzLmFyZ3ZbMTpdOgotCQlzYi5zaG93X3BhZ2Uoc3lzLmFyZ3ZbMV0pCi0Jcm9vdC5taW5zaXplKDEsIDEpCi0Jcm9vdC5tYWlubG9vcCgpCisgICAgcm9vdCA9IFRrKCkKKyAgICBzYiA9IFNlbGVjdGlvbkJveChyb290KQorICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgc2Iuc2hvd19wYWdlKHN5cy5hcmd2WzFdKQorICAgIHJvb3QubWluc2l6ZSgxLCAxKQorICAgIHJvb3QubWFpbmxvb3AoKQogCiBtYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9ndWlkby93aXNoLnB5IGIvRGVtby90a2ludGVyL2d1aWRvL3dpc2gucHkKaW5kZXggNGY2ZmRlZS4uMGE2MWFkOCAxMDA3NTUKLS0tIGEvRGVtby90a2ludGVyL2d1aWRvL3dpc2gucHkKKysrIGIvRGVtby90a2ludGVyL2d1aWRvL3dpc2gucHkKQEAgLTksMTkgKzksMTkgQEAKIGNtZCA9ICcnCiAKIHdoaWxlIDE6Ci0JaWYgY21kOiBwcm9tcHQgPSAnJwotCWVsc2U6IHByb21wdCA9ICclICcKLQl0cnk6Ci0JCWxpbmUgPSByYXdfaW5wdXQocHJvbXB0KQotCWV4Y2VwdCBFT0ZFcnJvcjoKLQkJYnJlYWsKLQljbWQgPSBjbWQgKyAobGluZSArICdcbicpCi0JaWYgdGsuZ2V0Ym9vbGVhbih0ay5jYWxsKCdpbmZvJywgJ2NvbXBsZXRlJywgY21kKSk6Ci0JCXRrLnJlY29yZChsaW5lKQotCQl0cnk6Ci0JCQlyZXN1bHQgPSB0ay5jYWxsKCdldmFsJywgY21kKQotCQlleGNlcHQgX3RraW50ZXIuVGNsRXJyb3IsIG1zZzoKLQkJCXByaW50ICdUY2xFcnJvcjonLCBtc2cKLQkJZWxzZToKLQkJCWlmIHJlc3VsdDogcHJpbnQgcmVzdWx0Ci0JCWNtZCA9ICcnCisgICAgaWYgY21kOiBwcm9tcHQgPSAnJworICAgIGVsc2U6IHByb21wdCA9ICclICcKKyAgICB0cnk6CisgICAgICAgIGxpbmUgPSByYXdfaW5wdXQocHJvbXB0KQorICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgYnJlYWsKKyAgICBjbWQgPSBjbWQgKyAobGluZSArICdcbicpCisgICAgaWYgdGsuZ2V0Ym9vbGVhbih0ay5jYWxsKCdpbmZvJywgJ2NvbXBsZXRlJywgY21kKSk6CisgICAgICAgIHRrLnJlY29yZChsaW5lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSB0ay5jYWxsKCdldmFsJywgY21kKQorICAgICAgICBleGNlcHQgX3RraW50ZXIuVGNsRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHByaW50ICdUY2xFcnJvcjonLCBtc2cKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHJlc3VsdDogcHJpbnQgcmVzdWx0CisgICAgICAgIGNtZCA9ICcnCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC8wMC1IRUxMTy1XT1JMRC5weSBiL0RlbW8vdGtpbnRlci9tYXR0LzAwLUhFTExPLVdPUkxELnB5CmluZGV4IGEzMjk0MWIuLjFjMzE1MWIgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0LzAwLUhFTExPLVdPUkxELnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0LzAwLUhFTExPLVdPUkxELnB5CkBAIC0xLDI3ICsxLDI3IEBACiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIAotIyBub3RlIHRoYXQgdGhlcmUgaXMgbm8gZXhwbGljaXQgY2FsbCB0byBzdGFydCBUay4gCi0jIFRraW50ZXIgaXMgc21hcnQgZW5vdWdoIHRvIHN0YXJ0IHRoZSBzeXN0ZW0gaWYgaXQncyBub3QgYWxyZWFkeSBnb2luZy4gCisjIG5vdGUgdGhhdCB0aGVyZSBpcyBubyBleHBsaWNpdCBjYWxsIHRvIHN0YXJ0IFRrLgorIyBUa2ludGVyIGlzIHNtYXJ0IGVub3VnaCB0byBzdGFydCB0aGUgc3lzdGVtIGlmIGl0J3Mgbm90IGFscmVhZHkgZ29pbmcuCiAKIGNsYXNzIFRlc3QoRnJhbWUpOgogICAgIGRlZiBwcmludGl0KHNlbGYpOgotCXByaW50ICJoaSIKKyAgICAgICAgcHJpbnQgImhpIgogCiAgICAgZGVmIGNyZWF0ZVdpZGdldHMoc2VsZik6Ci0Jc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCBmb3JlZ3JvdW5kPSdyZWQnLCAKLQkJCSAgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RIKQorICAgICAgICBzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGZvcmVncm91bmQ9J3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucXVpdCkKIAotCSMgYSBoZWxsbyBidXR0b24KLQlzZWxmLmhpX3RoZXJlID0gQnV0dG9uKHNlbGYsIHRleHQ9J0hlbGxvJywgCi0JCQkgICAgICAgY29tbWFuZD1zZWxmLnByaW50aXQpCi0Jc2VsZi5oaV90aGVyZS5wYWNrKHNpZGU9TEVGVCkKKyAgICAgICAgc2VsZi5RVUlULnBhY2soc2lkZT1MRUZULCBmaWxsPUJPVEgpCisKKyAgICAgICAgIyBhIGhlbGxvIGJ1dHRvbgorICAgICAgICBzZWxmLmhpX3RoZXJlID0gQnV0dG9uKHNlbGYsIHRleHQ9J0hlbGxvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucHJpbnRpdCkKKyAgICAgICAgc2VsZi5oaV90aGVyZS5wYWNrKHNpZGU9TEVGVCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBQYWNrLmNvbmZpZyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZVdpZGdldHMoKQogCiB0ZXN0ID0gVGVzdCgpCiB0ZXN0Lm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L2FuaW1hdGlvbi1zaW1wbGUucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9hbmltYXRpb24tc2ltcGxlLnB5CmluZGV4IDQzNWQ2ZmEuLmI1MmUxZGMgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L2FuaW1hdGlvbi1zaW1wbGUucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvYW5pbWF0aW9uLXNpbXBsZS5weQpAQCAtNCwzMCArNCwzMCBAQAogCiBjbGFzcyBUZXN0KEZyYW1lKToKICAgICBkZWYgcHJpbnRpdChzZWxmKToKLQlwcmludCAiaGkiCisgICAgICAgIHByaW50ICJoaSIKIAogICAgIGRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgotCXNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywgCi0JCQkgICBjb21tYW5kPXNlbGYucXVpdCkKLQlzZWxmLlFVSVQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCBmb3JlZ3JvdW5kPSdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuUVVJVC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RIKQogCi0Jc2VsZi5kcmF3ID0gQ2FudmFzKHNlbGYsIHdpZHRoPSI1aSIsIGhlaWdodD0iNWkiKQorICAgICAgICBzZWxmLmRyYXcgPSBDYW52YXMoc2VsZiwgd2lkdGg9IjVpIiwgaGVpZ2h0PSI1aSIpCiAKLQkjIGFsbCBvZiB0aGVzZSB3b3JrLi4KLQlzZWxmLmRyYXcuY3JlYXRlX3JlY3RhbmdsZSgwLCAwLCAxMCwgMTAsIHRhZ3M9InRoaW5nIiwgZmlsbD0iYmx1ZSIpCi0Jc2VsZi5kcmF3LnBhY2soc2lkZT1MRUZUKQorICAgICAgICAjIGFsbCBvZiB0aGVzZSB3b3JrLi4KKyAgICAgICAgc2VsZi5kcmF3LmNyZWF0ZV9yZWN0YW5nbGUoMCwgMCwgMTAsIDEwLCB0YWdzPSJ0aGluZyIsIGZpbGw9ImJsdWUiKQorICAgICAgICBzZWxmLmRyYXcucGFjayhzaWRlPUxFRlQpCiAKICAgICBkZWYgbW92ZVRoaW5nKHNlbGYsICphcmdzKToKLQkjIG1vdmUgMS8xMCBvZiBhbiBpbmNoIGV2ZXJ5IDEvMTAgc2VjICgxIiBwZXIgc2Vjb25kLCBzbW9vdGhseSkKLQlzZWxmLmRyYXcubW92ZSgidGhpbmciLCAiMC4wMWkiLCAiMC4wMWkiKQotCXNlbGYuYWZ0ZXIoMTAsIHNlbGYubW92ZVRoaW5nKQorICAgICAgICAjIG1vdmUgMS8xMCBvZiBhbiBpbmNoIGV2ZXJ5IDEvMTAgc2VjICgxIiBwZXIgc2Vjb25kLCBzbW9vdGhseSkKKyAgICAgICAgc2VsZi5kcmF3Lm1vdmUoInRoaW5nIiwgIjAuMDFpIiwgIjAuMDFpIikKKyAgICAgICAgc2VsZi5hZnRlcigxMCwgc2VsZi5tb3ZlVGhpbmcpCiAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKLQlzZWxmLmFmdGVyKDEwLCBzZWxmLm1vdmVUaGluZykKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBQYWNrLmNvbmZpZyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZVdpZGdldHMoKQorICAgICAgICBzZWxmLmFmdGVyKDEwLCBzZWxmLm1vdmVUaGluZykKIAogCiB0ZXN0ID0gVGVzdCgpCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC9hbmltYXRpb24tdy12ZWxvY2l0eS1jdHJsLnB5IGIvRGVtby90a2ludGVyL21hdHQvYW5pbWF0aW9uLXctdmVsb2NpdHktY3RybC5weQppbmRleCBmMzMzMmYyLi5lNjc2MzM4IDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvbWF0dC9hbmltYXRpb24tdy12ZWxvY2l0eS1jdHJsLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L2FuaW1hdGlvbi13LXZlbG9jaXR5LWN0cmwucHkKQEAgLTEsNDIgKzEsNDIgQEAKIGZyb20gVGtpbnRlciBpbXBvcnQgKgogCi0jIHRoaXMgaXMgdGhlIHNhbWUgYXMgc2ltcGxlLWRlbW8tMS5weSwgYnV0IHVzZXMgCi0jIHN1YmNsYXNzaW5nLiAKLSMgbm90ZSB0aGF0IHRoZXJlIGlzIG5vIGV4cGxpY2l0IGNhbGwgdG8gc3RhcnQgVGsuIAotIyBUa2ludGVyIGlzIHNtYXJ0IGVub3VnaCB0byBzdGFydCB0aGUgc3lzdGVtIGlmIGl0J3Mgbm90IGFscmVhZHkgZ29pbmcuIAorIyB0aGlzIGlzIHRoZSBzYW1lIGFzIHNpbXBsZS1kZW1vLTEucHksIGJ1dCB1c2VzCisjIHN1YmNsYXNzaW5nLgorIyBub3RlIHRoYXQgdGhlcmUgaXMgbm8gZXhwbGljaXQgY2FsbCB0byBzdGFydCBUay4KKyMgVGtpbnRlciBpcyBzbWFydCBlbm91Z2ggdG8gc3RhcnQgdGhlIHN5c3RlbSBpZiBpdCdzIG5vdCBhbHJlYWR5IGdvaW5nLgogCiAKIGNsYXNzIFRlc3QoRnJhbWUpOgogICAgIGRlZiBwcmludGl0KHNlbGYpOgotCXByaW50ICJoaSIKKyAgICAgICAgcHJpbnQgImhpIgogCiAgICAgZGVmIGNyZWF0ZVdpZGdldHMoc2VsZik6Ci0Jc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCBmb3JlZ3JvdW5kPSdyZWQnLCAKLQkJCSAgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5xdWl0KQorICAgICAgICBzZWxmLlFVSVQucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1CT1RIKQogCi0Jc2VsZi5kcmF3ID0gQ2FudmFzKHNlbGYsIHdpZHRoPSI1aSIsIGhlaWdodD0iNWkiKQorICAgICAgICBzZWxmLmRyYXcgPSBDYW52YXMoc2VsZiwgd2lkdGg9IjVpIiwgaGVpZ2h0PSI1aSIpCiAKLQlzZWxmLnNwZWVkID0gU2NhbGUoc2VsZiwgb3JpZW50PUhPUklaT05UQUwsIGZyb21fPS0xMDAsIHRvPTEwMCkKKyAgICAgICAgc2VsZi5zcGVlZCA9IFNjYWxlKHNlbGYsIG9yaWVudD1IT1JJWk9OVEFMLCBmcm9tXz0tMTAwLCB0bz0xMDApCiAKLQlzZWxmLnNwZWVkLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKKyAgICAgICAgc2VsZi5zcGVlZC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCiAKLQkjIGFsbCBvZiB0aGVzZSB3b3JrLi4KLQlzZWxmLmRyYXcuY3JlYXRlX3JlY3RhbmdsZSgwLCAwLCAxMCwgMTAsIHRhZ3M9InRoaW5nIiwgZmlsbD0iYmx1ZSIpCi0Jc2VsZi5kcmF3LnBhY2soc2lkZT1MRUZUKQorICAgICAgICAjIGFsbCBvZiB0aGVzZSB3b3JrLi4KKyAgICAgICAgc2VsZi5kcmF3LmNyZWF0ZV9yZWN0YW5nbGUoMCwgMCwgMTAsIDEwLCB0YWdzPSJ0aGluZyIsIGZpbGw9ImJsdWUiKQorICAgICAgICBzZWxmLmRyYXcucGFjayhzaWRlPUxFRlQpCiAKICAgICBkZWYgbW92ZVRoaW5nKHNlbGYsICphcmdzKToKLQl2ZWxvY2l0eSA9IHNlbGYuc3BlZWQuZ2V0KCkKLQlzdHIgPSBmbG9hdCh2ZWxvY2l0eSkgLyAxMDAwLjAKLQlzdHIgPSAiJXJpIiAlIChzdHIsKQotCXNlbGYuZHJhdy5tb3ZlKCJ0aGluZyIsICBzdHIsIHN0cikKLQlzZWxmLmFmdGVyKDEwLCBzZWxmLm1vdmVUaGluZykKKyAgICAgICAgdmVsb2NpdHkgPSBzZWxmLnNwZWVkLmdldCgpCisgICAgICAgIHN0ciA9IGZsb2F0KHZlbG9jaXR5KSAvIDEwMDAuMAorICAgICAgICBzdHIgPSAiJXJpIiAlIChzdHIsKQorICAgICAgICBzZWxmLmRyYXcubW92ZSgidGhpbmciLCAgc3RyLCBzdHIpCisgICAgICAgIHNlbGYuYWZ0ZXIoMTAsIHNlbGYubW92ZVRoaW5nKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKLQlGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCi0JUGFjay5jb25maWcoc2VsZikKLQlzZWxmLmNyZWF0ZVdpZGdldHMoKQotCXNlbGYuYWZ0ZXIoMTAsIHNlbGYubW92ZVRoaW5nKQorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIFBhY2suY29uZmlnKHNlbGYpCisgICAgICAgIHNlbGYuY3JlYXRlV2lkZ2V0cygpCisgICAgICAgIHNlbGYuYWZ0ZXIoMTAsIHNlbGYubW92ZVRoaW5nKQogCiAKIHRlc3QgPSBUZXN0KCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L2JpbmQtdy1tdWx0LWNhbGxzLXAtdHlwZS5weSBiL0RlbW8vdGtpbnRlci9tYXR0L2JpbmQtdy1tdWx0LWNhbGxzLXAtdHlwZS5weQppbmRleCAwOTA3ZTQxLi5mMzIyMGRhIDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvbWF0dC9iaW5kLXctbXVsdC1jYWxscy1wLXR5cGUucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvYmluZC13LW11bHQtY2FsbHMtcC10eXBlLnB5CkBAIC0xLDM0ICsxLDM0IEBACiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKLWltcG9ydCBzdHJpbmcgCitpbXBvcnQgc3RyaW5nCiAKICMgVGhpcyBwcm9ncmFtICBzaG93cyBob3cgdG8gdXNlIGEgc2ltcGxlIHR5cGUtaW4gYm94CiAKIGNsYXNzIEFwcChGcmFtZSk6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKLQlGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCi0Jc2VsZi5wYWNrKCkKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBzZWxmLnBhY2soKQogCi0Jc2VsZi5lbnRyeXRoaW5neSA9IEVudHJ5KCkKLQlzZWxmLmVudHJ5dGhpbmd5LnBhY2soKQorICAgICAgICBzZWxmLmVudHJ5dGhpbmd5ID0gRW50cnkoKQorICAgICAgICBzZWxmLmVudHJ5dGhpbmd5LnBhY2soKQogCi0JIyBhbmQgaGVyZSB3ZSBnZXQgYSBjYWxsYmFjayB3aGVuIHRoZSB1c2VyIGhpdHMgcmV0dXJuLiB3ZSBjb3VsZAotCSMgbWFrZSB0aGUga2V5IHRoYXQgdHJpZ2dlcnMgdGhlIGNhbGxiYWNrIGFueXRoaW5nIHdlIHdhbnRlZCB0by4KLQkjIG90aGVyIHR5cGljYWwgb3B0aW9ucyBtaWdodCBiZSA8S2V5LVRhYj4gb3IgPEtleT4gKGZvciBhbnl0aGluZykKLQlzZWxmLmVudHJ5dGhpbmd5LmJpbmQoJzxLZXktUmV0dXJuPicsIHNlbGYucHJpbnRfY29udGVudHMpCisgICAgICAgICMgYW5kIGhlcmUgd2UgZ2V0IGEgY2FsbGJhY2sgd2hlbiB0aGUgdXNlciBoaXRzIHJldHVybi4gd2UgY291bGQKKyAgICAgICAgIyBtYWtlIHRoZSBrZXkgdGhhdCB0cmlnZ2VycyB0aGUgY2FsbGJhY2sgYW55dGhpbmcgd2Ugd2FudGVkIHRvLgorICAgICAgICAjIG90aGVyIHR5cGljYWwgb3B0aW9ucyBtaWdodCBiZSA8S2V5LVRhYj4gb3IgPEtleT4gKGZvciBhbnl0aGluZykKKyAgICAgICAgc2VsZi5lbnRyeXRoaW5neS5iaW5kKCc8S2V5LVJldHVybj4nLCBzZWxmLnByaW50X2NvbnRlbnRzKQogCi0JIyBOb3RlIHRoYXQgaGVyZSBpcyB3aGVyZSB3ZSBiaW5kIGEgY29tcGxldGVseSBkaWZmZXJlbnQgY2FsbGJhY2sgdG8gCi0JIyB0aGUgc2FtZSBldmVudC4gV2UgcGFzcyAiKyIgaGVyZSB0byBpbmRpY2F0ZSB0aGF0IHdlIHdpc2ggdG8gQUREIAotCSMgdGhpcyBjYWxsYmFjayB0byB0aGUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudCB0eXBlLgotCSMgTm90IHNwZWNpZnlpbmcgIisiIHdvdWxkIHNpbXBseSBvdmVycmlkZSB3aGF0ZXZlciBjYWxsYmFjayB3YXMKLQkjIGRlZmluZWQgb24gdGhpcyBldmVudC4KLQlzZWxmLmVudHJ5dGhpbmd5LmJpbmQoJzxLZXktUmV0dXJuPicsIHNlbGYucHJpbnRfc29tZXRoaW5nX2Vsc2UsICIrIikKKyAgICAgICAgIyBOb3RlIHRoYXQgaGVyZSBpcyB3aGVyZSB3ZSBiaW5kIGEgY29tcGxldGVseSBkaWZmZXJlbnQgY2FsbGJhY2sgdG8KKyAgICAgICAgIyB0aGUgc2FtZSBldmVudC4gV2UgcGFzcyAiKyIgaGVyZSB0byBpbmRpY2F0ZSB0aGF0IHdlIHdpc2ggdG8gQURECisgICAgICAgICMgdGhpcyBjYWxsYmFjayB0byB0aGUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudCB0eXBlLgorICAgICAgICAjIE5vdCBzcGVjaWZ5aW5nICIrIiB3b3VsZCBzaW1wbHkgb3ZlcnJpZGUgd2hhdGV2ZXIgY2FsbGJhY2sgd2FzCisgICAgICAgICMgZGVmaW5lZCBvbiB0aGlzIGV2ZW50LgorICAgICAgICBzZWxmLmVudHJ5dGhpbmd5LmJpbmQoJzxLZXktUmV0dXJuPicsIHNlbGYucHJpbnRfc29tZXRoaW5nX2Vsc2UsICIrIikKIAogICAgIGRlZiBwcmludF9jb250ZW50cyhzZWxmLCBldmVudCk6Ci0JcHJpbnQgImhpLiBjb250ZW50cyBvZiBlbnRyeSBpcyBub3cgLS0tLT4iLCBzZWxmLmVudHJ5dGhpbmd5LmdldCgpCisgICAgICAgIHByaW50ICJoaS4gY29udGVudHMgb2YgZW50cnkgaXMgbm93IC0tLS0+Iiwgc2VsZi5lbnRyeXRoaW5neS5nZXQoKQogCiAKICAgICBkZWYgcHJpbnRfc29tZXRoaW5nX2Vsc2Uoc2VsZiwgZXZlbnQpOgotCXByaW50ICJoaS4gTm93IGRvaW5nIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCIKKyAgICAgICAgcHJpbnQgImhpLiBOb3cgZG9pbmcgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IgogCiAKIHJvb3QgPSBBcHAoKQpAQCAtMzcsOCArMzcsOCBAQAogCiAKIAotIyBzZWNyZXQgdGlwIGZvciBleHBlcnRzOiBpZiB5b3UgcGFzcyAqYW55KiBub24tZmFsc2UgdmFsdWUgYXMgCi0jIHRoZSB0aGlyZCBwYXJhbWV0ZXIgdG8gYmluZCgpLCBUa2ludGVyLnB5IHdpbGwgYWNjdW11bGF0ZSAKKyMgc2VjcmV0IHRpcCBmb3IgZXhwZXJ0czogaWYgeW91IHBhc3MgKmFueSogbm9uLWZhbHNlIHZhbHVlIGFzCisjIHRoZSB0aGlyZCBwYXJhbWV0ZXIgdG8gYmluZCgpLCBUa2ludGVyLnB5IHdpbGwgYWNjdW11bGF0ZQogIyBjYWxsYmFja3MgaW5zdGVhZCBvZiBvdmVyd3JpdGluZy4gSSB1c2UgIisiIGhlcmUgYmVjYXVzZSB0aGF0J3MKLSMgdGhlIFRrIG5vdGF0aW9uIGZvciBnZXR0aW5nIHRoaXMgc29ydCBvZiBiZWhhdmlvci4gVGhlIHBlcmZlY3QgR1VJIAorIyB0aGUgVGsgbm90YXRpb24gZm9yIGdldHRpbmcgdGhpcyBzb3J0IG9mIGJlaGF2aW9yLiBUaGUgcGVyZmVjdCBHVUkKICMgaW50ZXJmYWNlIHdvdWxkIHVzZSBhIGxlc3Mgb2JzY3VyZSBub3RhdGlvbi4KZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L2NhbnZhcy1kZW1vLXNpbXBsZS5weSBiL0RlbW8vdGtpbnRlci9tYXR0L2NhbnZhcy1kZW1vLXNpbXBsZS5weQppbmRleCBkOTg5NjI2Li5hMDE2NzlhIDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtZGVtby1zaW1wbGUucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvY2FudmFzLWRlbW8tc2ltcGxlLnB5CkBAIC00LDI0ICs0LDI0IEBACiAKIGNsYXNzIFRlc3QoRnJhbWUpOgogICAgIGRlZiBwcmludGl0KHNlbGYpOgotCXByaW50ICJoaSIKKyAgICAgICAgcHJpbnQgImhpIgogCiAgICAgZGVmIGNyZWF0ZVdpZGdldHMoc2VsZik6Ci0Jc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCBmb3JlZ3JvdW5kPSdyZWQnLCAKLQkJCSAgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5xdWl0KQorICAgICAgICBzZWxmLlFVSVQucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1CT1RIKQogCi0Jc2VsZi5kcmF3ID0gQ2FudmFzKHNlbGYsIHdpZHRoPSI1aSIsIGhlaWdodD0iNWkiKQorICAgICAgICBzZWxmLmRyYXcgPSBDYW52YXMoc2VsZiwgd2lkdGg9IjVpIiwgaGVpZ2h0PSI1aSIpCiAKLQkjIHNlZSB0aGUgb3RoZXIgZGVtb3MgZm9yIG90aGVyIHdheXMgb2Ygc3BlY2lmeWluZyBjb29yZHMgZm9yIGEgcG9seWdvbgotCXNlbGYuZHJhdy5jcmVhdGVfcmVjdGFuZ2xlKDAsIDAsICIzaSIsICIzaSIsIGZpbGw9ImJsYWNrIikKKyAgICAgICAgIyBzZWUgdGhlIG90aGVyIGRlbW9zIGZvciBvdGhlciB3YXlzIG9mIHNwZWNpZnlpbmcgY29vcmRzIGZvciBhIHBvbHlnb24KKyAgICAgICAgc2VsZi5kcmF3LmNyZWF0ZV9yZWN0YW5nbGUoMCwgMCwgIjNpIiwgIjNpIiwgZmlsbD0iYmxhY2siKQogCi0Jc2VsZi5kcmF3LnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLmRyYXcucGFjayhzaWRlPUxFRlQpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotCUZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLQlQYWNrLmNvbmZpZyhzZWxmKQotCXNlbGYuY3JlYXRlV2lkZ2V0cygpCisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgUGFjay5jb25maWcoc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVXaWRnZXRzKCkKIAogdGVzdCA9IFRlc3QoKQogCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtZ3JpZGRpbmcucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtZ3JpZGRpbmcucHkKaW5kZXggYjIwMGVhNC4uM2M1MmI5MSAxMDA2NDQKLS0tIGEvRGVtby90a2ludGVyL21hdHQvY2FudmFzLWdyaWRkaW5nLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L2NhbnZhcy1ncmlkZGluZy5weQpAQCAtMSw2MCArMSw2MCBAQAogZnJvbSBUa2ludGVyIGltcG9ydCAqCiAKLSMgdGhpcyBpcyB0aGUgc2FtZSBhcyBzaW1wbGUtZGVtby0xLnB5LCBidXQgdXNlcyAKLSMgc3ViY2xhc3NpbmcuIAotIyBub3RlIHRoYXQgdGhlcmUgaXMgbm8gZXhwbGljaXQgY2FsbCB0byBzdGFydCBUay4gCi0jIFRraW50ZXIgaXMgc21hcnQgZW5vdWdoIHRvIHN0YXJ0IHRoZSBzeXN0ZW0gaWYgaXQncyBub3QgYWxyZWFkeSBnb2luZy4gCisjIHRoaXMgaXMgdGhlIHNhbWUgYXMgc2ltcGxlLWRlbW8tMS5weSwgYnV0IHVzZXMKKyMgc3ViY2xhc3NpbmcuCisjIG5vdGUgdGhhdCB0aGVyZSBpcyBubyBleHBsaWNpdCBjYWxsIHRvIHN0YXJ0IFRrLgorIyBUa2ludGVyIGlzIHNtYXJ0IGVub3VnaCB0byBzdGFydCB0aGUgc3lzdGVtIGlmIGl0J3Mgbm90IGFscmVhZHkgZ29pbmcuCiAKIGNsYXNzIFRlc3QoRnJhbWUpOgogICAgIGRlZiBwcmludGl0KHNlbGYpOgotCXByaW50ICJoaSIKKyAgICAgICAgcHJpbnQgImhpIgogCiAgICAgZGVmIGNyZWF0ZVdpZGdldHMoc2VsZik6Ci0Jc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCAKLQkJCQkgIGJhY2tncm91bmQ9J3JlZCcsIAotCQkJCSAgZm9yZWdyb3VuZD0nd2hpdGUnLCAKLQkJCQkgIGhlaWdodD0zLCAKLQkJCQkgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCQorICAgICAgICBzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kPSd3aGl0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCiAKLQlzZWxmLmNhbnZhc09iamVjdCA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIikKLQlzZWxmLmNhbnZhc09iamVjdC5wYWNrKHNpZGU9TEVGVCkKKyAgICAgICAgc2VsZi5jYW52YXNPYmplY3QgPSBDYW52YXMoc2VsZiwgd2lkdGg9IjVpIiwgaGVpZ2h0PSI1aSIpCisgICAgICAgIHNlbGYuY2FudmFzT2JqZWN0LnBhY2soc2lkZT1MRUZUKQogCiAgICAgZGVmIG1vdXNlRG93bihzZWxmLCBldmVudCk6Ci0JIyBjYW52YXMgeCBhbmQgeSB0YWtlIHRoZSBzY3JlZW4gY29vcmRzIGZyb20gdGhlIGV2ZW50IGFuZCB0cmFuc2xhdGUKLQkjIHRoZW0gaW50byB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGNhbnZhcyBvYmplY3QKLQlzZWxmLnN0YXJ0eCA9IHNlbGYuY2FudmFzT2JqZWN0LmNhbnZhc3goZXZlbnQueCwgc2VsZi5ncmlkZGluZ1NpemUpCi0Jc2VsZi5zdGFydHkgPSBzZWxmLmNhbnZhc09iamVjdC5jYW52YXN5KGV2ZW50LnksIHNlbGYuZ3JpZGRpbmdTaXplKQorICAgICAgICAjIGNhbnZhcyB4IGFuZCB5IHRha2UgdGhlIHNjcmVlbiBjb29yZHMgZnJvbSB0aGUgZXZlbnQgYW5kIHRyYW5zbGF0ZQorICAgICAgICAjIHRoZW0gaW50byB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGNhbnZhcyBvYmplY3QKKyAgICAgICAgc2VsZi5zdGFydHggPSBzZWxmLmNhbnZhc09iamVjdC5jYW52YXN4KGV2ZW50LngsIHNlbGYuZ3JpZGRpbmdTaXplKQorICAgICAgICBzZWxmLnN0YXJ0eSA9IHNlbGYuY2FudmFzT2JqZWN0LmNhbnZhc3koZXZlbnQueSwgc2VsZi5ncmlkZGluZ1NpemUpCiAKICAgICBkZWYgbW91c2VNb3Rpb24oc2VsZiwgZXZlbnQpOgotCSMgY2FudmFzIHggYW5kIHkgdGFrZSB0aGUgc2NyZWVuIGNvb3JkcyBmcm9tIHRoZSBldmVudCBhbmQgdHJhbnNsYXRlCi0JIyB0aGVtIGludG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBjYW52YXMgb2JqZWN0Ci0JeCA9IHNlbGYuY2FudmFzT2JqZWN0LmNhbnZhc3goZXZlbnQueCwgc2VsZi5ncmlkZGluZ1NpemUpCi0JeSA9IHNlbGYuY2FudmFzT2JqZWN0LmNhbnZhc3koZXZlbnQueSwgc2VsZi5ncmlkZGluZ1NpemUpCisgICAgICAgICMgY2FudmFzIHggYW5kIHkgdGFrZSB0aGUgc2NyZWVuIGNvb3JkcyBmcm9tIHRoZSBldmVudCBhbmQgdHJhbnNsYXRlCisgICAgICAgICMgdGhlbSBpbnRvIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgY2FudmFzIG9iamVjdAorICAgICAgICB4ID0gc2VsZi5jYW52YXNPYmplY3QuY2FudmFzeChldmVudC54LCBzZWxmLmdyaWRkaW5nU2l6ZSkKKyAgICAgICAgeSA9IHNlbGYuY2FudmFzT2JqZWN0LmNhbnZhc3koZXZlbnQueSwgc2VsZi5ncmlkZGluZ1NpemUpCiAKLQlpZiAoc2VsZi5zdGFydHggIT0gZXZlbnQueCkgIGFuZCAoc2VsZi5zdGFydHkgIT0gZXZlbnQueSkgOiAKLQkgICAgc2VsZi5jYW52YXNPYmplY3QuZGVsZXRlKHNlbGYucnViYmVyYmFuZEJveCkKLQkgICAgc2VsZi5ydWJiZXJiYW5kQm94ID0gc2VsZi5jYW52YXNPYmplY3QuY3JlYXRlX3JlY3RhbmdsZSgKLQkJc2VsZi5zdGFydHgsIHNlbGYuc3RhcnR5LCB4LCB5KQotCSAgICAjIHRoaXMgZmx1c2hlcyB0aGUgb3V0cHV0LCBtYWtpbmcgc3VyZSB0aGF0IAotCSAgICAjIHRoZSByZWN0YW5nbGUgbWFrZXMgaXQgdG8gdGhlIHNjcmVlbiAKLQkgICAgIyBiZWZvcmUgdGhlIG5leHQgZXZlbnQgaXMgaGFuZGxlZAotCSAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBpZiAoc2VsZi5zdGFydHggIT0gZXZlbnQueCkgIGFuZCAoc2VsZi5zdGFydHkgIT0gZXZlbnQueSkgOgorICAgICAgICAgICAgc2VsZi5jYW52YXNPYmplY3QuZGVsZXRlKHNlbGYucnViYmVyYmFuZEJveCkKKyAgICAgICAgICAgIHNlbGYucnViYmVyYmFuZEJveCA9IHNlbGYuY2FudmFzT2JqZWN0LmNyZWF0ZV9yZWN0YW5nbGUoCisgICAgICAgICAgICAgICAgc2VsZi5zdGFydHgsIHNlbGYuc3RhcnR5LCB4LCB5KQorICAgICAgICAgICAgIyB0aGlzIGZsdXNoZXMgdGhlIG91dHB1dCwgbWFraW5nIHN1cmUgdGhhdAorICAgICAgICAgICAgIyB0aGUgcmVjdGFuZ2xlIG1ha2VzIGl0IHRvIHRoZSBzY3JlZW4KKyAgICAgICAgICAgICMgYmVmb3JlIHRoZSBuZXh0IGV2ZW50IGlzIGhhbmRsZWQKKyAgICAgICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotCUZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLQlQYWNrLmNvbmZpZyhzZWxmKQotCXNlbGYuY3JlYXRlV2lkZ2V0cygpCisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgUGFjay5jb25maWcoc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVXaWRnZXRzKCkKIAotCSMgdGhpcyBpcyBhICJ0YWdPcklkIiBmb3IgdGhlIHJlY3RhbmdsZSB3ZSBkcmF3IG9uIHRoZSBjYW52YXMKLQlzZWxmLnJ1YmJlcmJhbmRCb3ggPSBOb25lCisgICAgICAgICMgdGhpcyBpcyBhICJ0YWdPcklkIiBmb3IgdGhlIHJlY3RhbmdsZSB3ZSBkcmF3IG9uIHRoZSBjYW52YXMKKyAgICAgICAgc2VsZi5ydWJiZXJiYW5kQm94ID0gTm9uZQogCi0JIyB0aGlzIGlzIHRoZSBzaXplIG9mIHRoZSBncmlkZGluZyBzcXVhcmVzCi0Jc2VsZi5ncmlkZGluZ1NpemUgPSA1MAorICAgICAgICAjIHRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGdyaWRkaW5nIHNxdWFyZXMKKyAgICAgICAgc2VsZi5ncmlkZGluZ1NpemUgPSA1MAogCi0JV2lkZ2V0LmJpbmQoc2VsZi5jYW52YXNPYmplY3QsICI8QnV0dG9uLTE+Iiwgc2VsZi5tb3VzZURvd24pCi0JV2lkZ2V0LmJpbmQoc2VsZi5jYW52YXNPYmplY3QsICI8QnV0dG9uMS1Nb3Rpb24+Iiwgc2VsZi5tb3VzZU1vdGlvbikKLQkKKyAgICAgICAgV2lkZ2V0LmJpbmQoc2VsZi5jYW52YXNPYmplY3QsICI8QnV0dG9uLTE+Iiwgc2VsZi5tb3VzZURvd24pCisgICAgICAgIFdpZGdldC5iaW5kKHNlbGYuY2FudmFzT2JqZWN0LCAiPEJ1dHRvbjEtTW90aW9uPiIsIHNlbGYubW91c2VNb3Rpb24pCisKIAogdGVzdCA9IFRlc3QoKQogCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtbW92aW5nLW9yLWNyZWF0aW5nLnB5IGIvRGVtby90a2ludGVyL21hdHQvY2FudmFzLW1vdmluZy1vci1jcmVhdGluZy5weQppbmRleCA3NDcyOWE2Li41MzI3YzA4IDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtbW92aW5nLW9yLWNyZWF0aW5nLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L2NhbnZhcy1tb3Zpbmctb3ItY3JlYXRpbmcucHkKQEAgLTEsNiArMSw2IEBACiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIAotIyB0aGlzIGZpbGUgZGVtb25zdHJhdGVzIGEgbW9yZSBzb3BoaXN0aWNhdGVkIG1vdmVtZW50IC0tIAorIyB0aGlzIGZpbGUgZGVtb25zdHJhdGVzIGEgbW9yZSBzb3BoaXN0aWNhdGVkIG1vdmVtZW50IC0tCiAjIG1vdmUgZG90cyBvciBjcmVhdGUgbmV3IG9uZXMgaWYgeW91IGNsaWNrIG91dHNpZGUgdGhlIGRvdHMKIAogY2xhc3MgVGVzdChGcmFtZSk6CkBAIC04LDU4ICs4LDU1IEBACiAgICAgIyMjIyMjIEV2ZW50IGNhbGxiYWNrcyBmb3IgVEhFIENBTlZBUyAobm90IHRoZSBzdHVmZiBkcmF3biBvbiBpdCkKICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgZGVmIG1vdXNlRG93bihzZWxmLCBldmVudCk6Ci0JIyBzZWUgaWYgd2UncmUgaW5zaWRlIGEgZG90LiBJZiB3ZSBhcmUsIGl0Ci0JIyBnZXRzIHRhZ2dlZCBhcyBDVVJSRU5UIGZvciBmcmVlIGJ5IHRrLgotCWlmIG5vdCBldmVudC53aWRnZXQuZmluZF93aXRodGFnKENVUlJFTlQpOgotCSAgICAjIHRoZXJlIGlzIG5vIGRvdCBoZXJlLCBzbyB3ZSBjYW4gbWFrZSBvbmUsCi0JICAgICMgYW5kIGJpbmQgc29tZSBpbnRlcmVzdGluZyBiZWhhdmlvciB0byBpdC4KLQkgICAgIyAtLS0tLS0KLQkgICAgIyBjcmVhdGUgYSBkb3QsIGFuZCBtYXJrIGl0IGFzIENVUlJFTlQKLQkgICAgZnJlZCA9IHNlbGYuZHJhdy5jcmVhdGVfb3ZhbCgKLQkJZXZlbnQueCAtIDEwLCBldmVudC55IC0xMCwgZXZlbnQueCArMTAsIGV2ZW50LnkgKyAxMCwKLQkJZmlsbD0iZ3JlZW4iLCB0YWdzPUNVUlJFTlQpCisgICAgICAgICMgc2VlIGlmIHdlJ3JlIGluc2lkZSBhIGRvdC4gSWYgd2UgYXJlLCBpdAorICAgICAgICAjIGdldHMgdGFnZ2VkIGFzIENVUlJFTlQgZm9yIGZyZWUgYnkgdGsuCisgICAgICAgIGlmIG5vdCBldmVudC53aWRnZXQuZmluZF93aXRodGFnKENVUlJFTlQpOgorICAgICAgICAgICAgIyB0aGVyZSBpcyBubyBkb3QgaGVyZSwgc28gd2UgY2FuIG1ha2Ugb25lLAorICAgICAgICAgICAgIyBhbmQgYmluZCBzb21lIGludGVyZXN0aW5nIGJlaGF2aW9yIHRvIGl0LgorICAgICAgICAgICAgIyAtLS0tLS0KKyAgICAgICAgICAgICMgY3JlYXRlIGEgZG90LCBhbmQgbWFyayBpdCBhcyBDVVJSRU5UCisgICAgICAgICAgICBmcmVkID0gc2VsZi5kcmF3LmNyZWF0ZV9vdmFsKAorICAgICAgICAgICAgICAgIGV2ZW50LnggLSAxMCwgZXZlbnQueSAtMTAsIGV2ZW50LnggKzEwLCBldmVudC55ICsgMTAsCisgICAgICAgICAgICAgICAgZmlsbD0iZ3JlZW4iLCB0YWdzPUNVUlJFTlQpCiAKLQkgICAgc2VsZi5kcmF3LnRhZ19iaW5kKGZyZWQsICI8QW55LUVudGVyPiIsIHNlbGYubW91c2VFbnRlcikKLQkgICAgc2VsZi5kcmF3LnRhZ19iaW5kKGZyZWQsICI8QW55LUxlYXZlPiIsIHNlbGYubW91c2VMZWF2ZSkKKyAgICAgICAgICAgIHNlbGYuZHJhdy50YWdfYmluZChmcmVkLCAiPEFueS1FbnRlcj4iLCBzZWxmLm1vdXNlRW50ZXIpCisgICAgICAgICAgICBzZWxmLmRyYXcudGFnX2JpbmQoZnJlZCwgIjxBbnktTGVhdmU+Iiwgc2VsZi5tb3VzZUxlYXZlKQogCi0Jc2VsZi5sYXN0eCA9IGV2ZW50LngKLQlzZWxmLmxhc3R5ID0gZXZlbnQueQorICAgICAgICBzZWxmLmxhc3R4ID0gZXZlbnQueAorICAgICAgICBzZWxmLmxhc3R5ID0gZXZlbnQueQogCiAgICAgZGVmIG1vdXNlTW92ZShzZWxmLCBldmVudCk6Ci0Jc2VsZi5kcmF3Lm1vdmUoQ1VSUkVOVCwgZXZlbnQueCAtIHNlbGYubGFzdHgsIGV2ZW50LnkgLSBzZWxmLmxhc3R5KQotCXNlbGYubGFzdHggPSBldmVudC54Ci0Jc2VsZi5sYXN0eSA9IGV2ZW50LnkKKyAgICAgICAgc2VsZi5kcmF3Lm1vdmUoQ1VSUkVOVCwgZXZlbnQueCAtIHNlbGYubGFzdHgsIGV2ZW50LnkgLSBzZWxmLmxhc3R5KQorICAgICAgICBzZWxmLmxhc3R4ID0gZXZlbnQueAorICAgICAgICBzZWxmLmxhc3R5ID0gZXZlbnQueQogCiAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICMjIyMjIyBFdmVudCBjYWxsYmFja3MgZm9yIGNhbnZhcyBJVEVNUyAoc3R1ZmYgZHJhd24gb24gdGhlIGNhbnZhcykKICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgZGVmIG1vdXNlRW50ZXIoc2VsZiwgZXZlbnQpOgogICAgICAgICAjIHRoZSBDVVJSRU5UIHRhZyBpcyBhcHBsaWVkIHRvIHRoZSBvYmplY3QgdGhlIGN1cnNvciBpcyBvdmVyLgotCSMgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkuCi0Jc2VsZi5kcmF3Lml0ZW1jb25maWcoQ1VSUkVOVCwgZmlsbD0icmVkIikKKyAgICAgICAgIyB0aGlzIGhhcHBlbnMgYXV0b21hdGljYWxseS4KKyAgICAgICAgc2VsZi5kcmF3Lml0ZW1jb25maWcoQ1VSUkVOVCwgZmlsbD0icmVkIikKIAogICAgIGRlZiBtb3VzZUxlYXZlKHNlbGYsIGV2ZW50KToKLQkjIHRoZSBDVVJSRU5UIHRhZyBpcyBhcHBsaWVkIHRvIHRoZSBvYmplY3QgdGhlIGN1cnNvciBpcyBvdmVyLgotCSMgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkuCi0Jc2VsZi5kcmF3Lml0ZW1jb25maWcoQ1VSUkVOVCwgZmlsbD0iYmx1ZSIpCisgICAgICAgICMgdGhlIENVUlJFTlQgdGFnIGlzIGFwcGxpZWQgdG8gdGhlIG9iamVjdCB0aGUgY3Vyc29yIGlzIG92ZXIuCisgICAgICAgICMgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkuCisgICAgICAgIHNlbGYuZHJhdy5pdGVtY29uZmlnKENVUlJFTlQsIGZpbGw9ImJsdWUiKQogCiAgICAgZGVmIGNyZWF0ZVdpZGdldHMoc2VsZik6Ci0Jc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCBmb3JlZ3JvdW5kPSdyZWQnLCAKLQkJCSAgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RIKQotCXNlbGYuZHJhdyA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIikKLQlzZWxmLmRyYXcucGFjayhzaWRlPUxFRlQpCisgICAgICAgIHNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5xdWl0KQorICAgICAgICBzZWxmLlFVSVQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5kcmF3ID0gQ2FudmFzKHNlbGYsIHdpZHRoPSI1aSIsIGhlaWdodD0iNWkiKQorICAgICAgICBzZWxmLmRyYXcucGFjayhzaWRlPUxFRlQpCiAKLQlXaWRnZXQuYmluZChzZWxmLmRyYXcsICI8MT4iLCBzZWxmLm1vdXNlRG93bikKLQlXaWRnZXQuYmluZChzZWxmLmRyYXcsICI8QjEtTW90aW9uPiIsIHNlbGYubW91c2VNb3ZlKQorICAgICAgICBXaWRnZXQuYmluZChzZWxmLmRyYXcsICI8MT4iLCBzZWxmLm1vdXNlRG93bikKKyAgICAgICAgV2lkZ2V0LmJpbmQoc2VsZi5kcmF3LCAiPEIxLU1vdGlvbj4iLCBzZWxmLm1vdXNlTW92ZSkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBQYWNrLmNvbmZpZyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZVdpZGdldHMoKQogCiB0ZXN0ID0gVGVzdCgpCiB0ZXN0Lm1haW5sb29wKCkKLQotCi0KZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L2NhbnZhcy1tb3Zpbmctdy1tb3VzZS5weSBiL0RlbW8vdGtpbnRlci9tYXR0L2NhbnZhcy1tb3Zpbmctdy1tb3VzZS5weQppbmRleCA0NDdlMjkwLi44MTc4NWQ4IDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtbW92aW5nLXctbW91c2UucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvY2FudmFzLW1vdmluZy13LW1vdXNlLnB5CkBAIC03LDQ5ICs3LDQ5IEBACiAgICAgIyMjIyMjIEV2ZW50IGNhbGxiYWNrcyBmb3IgVEhFIENBTlZBUyAobm90IHRoZSBzdHVmZiBkcmF3biBvbiBpdCkKICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgZGVmIG1vdXNlRG93bihzZWxmLCBldmVudCk6Ci0JIyByZW1lbWJlciB3aGVyZSB0aGUgbW91c2Ugd2VudCBkb3duCi0Jc2VsZi5sYXN0eCA9IGV2ZW50LngKLQlzZWxmLmxhc3R5ID0gZXZlbnQueQorICAgICAgICAjIHJlbWVtYmVyIHdoZXJlIHRoZSBtb3VzZSB3ZW50IGRvd24KKyAgICAgICAgc2VsZi5sYXN0eCA9IGV2ZW50LngKKyAgICAgICAgc2VsZi5sYXN0eSA9IGV2ZW50LnkKIAogICAgIGRlZiBtb3VzZU1vdmUoc2VsZiwgZXZlbnQpOgotCSMgd2hhdGV2ZXIgdGhlIG1vdXNlIGlzIG92ZXIgZ2V0cyB0YWdnZWQgYXMgQ1VSUkVOVCBmb3IgZnJlZSBieSB0ay4KLQlzZWxmLmRyYXcubW92ZShDVVJSRU5ULCBldmVudC54IC0gc2VsZi5sYXN0eCwgZXZlbnQueSAtIHNlbGYubGFzdHkpCi0Jc2VsZi5sYXN0eCA9IGV2ZW50LngKLQlzZWxmLmxhc3R5ID0gZXZlbnQueQorICAgICAgICAjIHdoYXRldmVyIHRoZSBtb3VzZSBpcyBvdmVyIGdldHMgdGFnZ2VkIGFzIENVUlJFTlQgZm9yIGZyZWUgYnkgdGsuCisgICAgICAgIHNlbGYuZHJhdy5tb3ZlKENVUlJFTlQsIGV2ZW50LnggLSBzZWxmLmxhc3R4LCBldmVudC55IC0gc2VsZi5sYXN0eSkKKyAgICAgICAgc2VsZi5sYXN0eCA9IGV2ZW50LngKKyAgICAgICAgc2VsZi5sYXN0eSA9IGV2ZW50LnkKIAogICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAjIyMjIyMgRXZlbnQgY2FsbGJhY2tzIGZvciBjYW52YXMgSVRFTVMgKHN0dWZmIGRyYXduIG9uIHRoZSBjYW52YXMpCiAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIGRlZiBtb3VzZUVudGVyKHNlbGYsIGV2ZW50KToKICAgICAgICAgIyB0aGUgQ1VSUkVOVCB0YWcgaXMgYXBwbGllZCB0byB0aGUgb2JqZWN0IHRoZSBjdXJzb3IgaXMgb3Zlci4KLQkjIHRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5LgotCXNlbGYuZHJhdy5pdGVtY29uZmlnKENVUlJFTlQsIGZpbGw9InJlZCIpCi0JCisgICAgICAgICMgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkuCisgICAgICAgIHNlbGYuZHJhdy5pdGVtY29uZmlnKENVUlJFTlQsIGZpbGw9InJlZCIpCisKICAgICBkZWYgbW91c2VMZWF2ZShzZWxmLCBldmVudCk6Ci0JIyB0aGUgQ1VSUkVOVCB0YWcgaXMgYXBwbGllZCB0byB0aGUgb2JqZWN0IHRoZSBjdXJzb3IgaXMgb3Zlci4KLQkjIHRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5LgotCXNlbGYuZHJhdy5pdGVtY29uZmlnKENVUlJFTlQsIGZpbGw9ImJsdWUiKQorICAgICAgICAjIHRoZSBDVVJSRU5UIHRhZyBpcyBhcHBsaWVkIHRvIHRoZSBvYmplY3QgdGhlIGN1cnNvciBpcyBvdmVyLgorICAgICAgICAjIHRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5LgorICAgICAgICBzZWxmLmRyYXcuaXRlbWNvbmZpZyhDVVJSRU5ULCBmaWxsPSJibHVlIikKIAogICAgIGRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgotCXNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywgCi0JCQkgICBjb21tYW5kPXNlbGYucXVpdCkKLQlzZWxmLlFVSVQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCkKLQlzZWxmLmRyYXcgPSBDYW52YXMoc2VsZiwgd2lkdGg9IjVpIiwgaGVpZ2h0PSI1aSIpCi0Jc2VsZi5kcmF3LnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGZvcmVncm91bmQ9J3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucXVpdCkKKyAgICAgICAgc2VsZi5RVUlULnBhY2soc2lkZT1MRUZULCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuZHJhdyA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIikKKyAgICAgICAgc2VsZi5kcmF3LnBhY2soc2lkZT1MRUZUKQogCi0JZnJlZCA9IHNlbGYuZHJhdy5jcmVhdGVfb3ZhbCgwLCAwLCAyMCwgMjAsCi0JCQkJICAgICBmaWxsPSJncmVlbiIsIHRhZ3M9InNlbGVjdGVkIikKKyAgICAgICAgZnJlZCA9IHNlbGYuZHJhdy5jcmVhdGVfb3ZhbCgwLCAwLCAyMCwgMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0iZ3JlZW4iLCB0YWdzPSJzZWxlY3RlZCIpCiAKLQlzZWxmLmRyYXcudGFnX2JpbmQoZnJlZCwgIjxBbnktRW50ZXI+Iiwgc2VsZi5tb3VzZUVudGVyKQotCXNlbGYuZHJhdy50YWdfYmluZChmcmVkLCAiPEFueS1MZWF2ZT4iLCBzZWxmLm1vdXNlTGVhdmUpCisgICAgICAgIHNlbGYuZHJhdy50YWdfYmluZChmcmVkLCAiPEFueS1FbnRlcj4iLCBzZWxmLm1vdXNlRW50ZXIpCisgICAgICAgIHNlbGYuZHJhdy50YWdfYmluZChmcmVkLCAiPEFueS1MZWF2ZT4iLCBzZWxmLm1vdXNlTGVhdmUpCiAKLQlXaWRnZXQuYmluZChzZWxmLmRyYXcsICI8MT4iLCBzZWxmLm1vdXNlRG93bikKLQlXaWRnZXQuYmluZChzZWxmLmRyYXcsICI8QjEtTW90aW9uPiIsIHNlbGYubW91c2VNb3ZlKQorICAgICAgICBXaWRnZXQuYmluZChzZWxmLmRyYXcsICI8MT4iLCBzZWxmLm1vdXNlRG93bikKKyAgICAgICAgV2lkZ2V0LmJpbmQoc2VsZi5kcmF3LCAiPEIxLU1vdGlvbj4iLCBzZWxmLm1vdXNlTW92ZSkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBQYWNrLmNvbmZpZyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZVdpZGdldHMoKQogCiB0ZXN0ID0gVGVzdCgpCiB0ZXN0Lm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L2NhbnZhcy1tdWx0LWl0ZW0tc2VsLnB5IGIvRGVtby90a2ludGVyL21hdHQvY2FudmFzLW11bHQtaXRlbS1zZWwucHkKaW5kZXggMjM2ODczMy4uYTRmMjY3YyAxMDA2NDQKLS0tIGEvRGVtby90a2ludGVyL21hdHQvY2FudmFzLW11bHQtaXRlbS1zZWwucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvY2FudmFzLW11bHQtaXRlbS1zZWwucHkKQEAgLTEsNiArMSw2IEBACiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIAotIyBhbGxvd3MgbW92aW5nIGRvdHMgd2l0aCBtdWx0aXBsZSBzZWxlY3Rpb24uIAorIyBhbGxvd3MgbW92aW5nIGRvdHMgd2l0aCBtdWx0aXBsZSBzZWxlY3Rpb24uCiAKIFNFTEVDVEVEX0NPTE9SID0gInJlZCIKIFVOU0VMRUNURURfQ09MT1IgPSAiYmx1ZSIKQEAgLTEwLDcyICsxMCw2OSBAQAogICAgICMjIyMjIyBFdmVudCBjYWxsYmFja3MgZm9yIFRIRSBDQU5WQVMgKG5vdCB0aGUgc3R1ZmYgZHJhd24gb24gaXQpCiAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIGRlZiBtb3VzZURvd24oc2VsZiwgZXZlbnQpOgotCSMgc2VlIGlmIHdlJ3JlIGluc2lkZSBhIGRvdC4gSWYgd2UgYXJlLCBpdAotCSMgZ2V0cyB0YWdnZWQgYXMgQ1VSUkVOVCBmb3IgZnJlZSBieSB0ay4KKyAgICAgICAgIyBzZWUgaWYgd2UncmUgaW5zaWRlIGEgZG90LiBJZiB3ZSBhcmUsIGl0CisgICAgICAgICMgZ2V0cyB0YWdnZWQgYXMgQ1VSUkVOVCBmb3IgZnJlZSBieSB0ay4KIAotCWlmIG5vdCBldmVudC53aWRnZXQuZmluZF93aXRodGFnKENVUlJFTlQpOgotCSAgICAjIHdlIGNsaWNrZWQgb3V0c2lkZSBvZiBhbGwgZG90cyBvbiB0aGUgY2FudmFzLiB1bnNlbGVjdCBhbGwuCi0JICAgIAotCSAgICAjIHJlLWNvbG9yIGV2ZXJ5dGhpbmcgYmFjayB0byBhbiB1bnNlbGVjdGVkIGNvbG9yCi0JICAgIHNlbGYuZHJhdy5pdGVtY29uZmlnKCJzZWxlY3RlZCIsIGZpbGw9VU5TRUxFQ1RFRF9DT0xPUikKLQkgICAgIyB1bnNlbGVjdCBldmVyeXRoaW5nCi0JICAgIHNlbGYuZHJhdy5kdGFnKCJzZWxlY3RlZCIpCi0JZWxzZToKLQkgICAgIyBtYXJrIGFzICJzZWxlY3RlZCIgdGhlIHRoaW5nIHRoZSBjdXJzb3IgaXMgdW5kZXIKLQkgICAgc2VsZi5kcmF3LmFkZHRhZygic2VsZWN0ZWQiLCAid2l0aHRhZyIsIENVUlJFTlQpCi0JICAgICMgY29sb3IgaXQgYXMgc2VsZWN0ZWQKLQkgICAgc2VsZi5kcmF3Lml0ZW1jb25maWcoInNlbGVjdGVkIiwgZmlsbD1TRUxFQ1RFRF9DT0xPUikKKyAgICAgICAgaWYgbm90IGV2ZW50LndpZGdldC5maW5kX3dpdGh0YWcoQ1VSUkVOVCk6CisgICAgICAgICAgICAjIHdlIGNsaWNrZWQgb3V0c2lkZSBvZiBhbGwgZG90cyBvbiB0aGUgY2FudmFzLiB1bnNlbGVjdCBhbGwuCiAKLQlzZWxmLmxhc3R4ID0gZXZlbnQueAotCXNlbGYubGFzdHkgPSBldmVudC55Ci0JCQotCQorICAgICAgICAgICAgIyByZS1jb2xvciBldmVyeXRoaW5nIGJhY2sgdG8gYW4gdW5zZWxlY3RlZCBjb2xvcgorICAgICAgICAgICAgc2VsZi5kcmF3Lml0ZW1jb25maWcoInNlbGVjdGVkIiwgZmlsbD1VTlNFTEVDVEVEX0NPTE9SKQorICAgICAgICAgICAgIyB1bnNlbGVjdCBldmVyeXRoaW5nCisgICAgICAgICAgICBzZWxmLmRyYXcuZHRhZygic2VsZWN0ZWQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBtYXJrIGFzICJzZWxlY3RlZCIgdGhlIHRoaW5nIHRoZSBjdXJzb3IgaXMgdW5kZXIKKyAgICAgICAgICAgIHNlbGYuZHJhdy5hZGR0YWcoInNlbGVjdGVkIiwgIndpdGh0YWciLCBDVVJSRU5UKQorICAgICAgICAgICAgIyBjb2xvciBpdCBhcyBzZWxlY3RlZAorICAgICAgICAgICAgc2VsZi5kcmF3Lml0ZW1jb25maWcoInNlbGVjdGVkIiwgZmlsbD1TRUxFQ1RFRF9DT0xPUikKKworICAgICAgICBzZWxmLmxhc3R4ID0gZXZlbnQueAorICAgICAgICBzZWxmLmxhc3R5ID0gZXZlbnQueQorCisKICAgICBkZWYgbW91c2VNb3ZlKHNlbGYsIGV2ZW50KToKLQlzZWxmLmRyYXcubW92ZSgic2VsZWN0ZWQiLCBldmVudC54IC0gc2VsZi5sYXN0eCwgZXZlbnQueSAtIHNlbGYubGFzdHkpCi0Jc2VsZi5sYXN0eCA9IGV2ZW50LngKLQlzZWxmLmxhc3R5ID0gZXZlbnQueQorICAgICAgICBzZWxmLmRyYXcubW92ZSgic2VsZWN0ZWQiLCBldmVudC54IC0gc2VsZi5sYXN0eCwgZXZlbnQueSAtIHNlbGYubGFzdHkpCisgICAgICAgIHNlbGYubGFzdHggPSBldmVudC54CisgICAgICAgIHNlbGYubGFzdHkgPSBldmVudC55CiAKICAgICBkZWYgbWFrZU5ld0RvdChzZWxmKToKLQkjIGNyZWF0ZSBhIGRvdCwgYW5kIG1hcmsgaXQgYXMgY3VycmVudAotCWZyZWQgPSBzZWxmLmRyYXcuY3JlYXRlX292YWwoMCwgMCwgMjAsIDIwLCAKLQkJCQkgICAgIGZpbGw9U0VMRUNURURfQ09MT1IsIHRhZ3M9Q1VSUkVOVCkKLQkjIGFuZCBtYWtlIGl0IHNlbGVjdGVkCi0Jc2VsZi5kcmF3LmFkZHRhZygic2VsZWN0ZWQiLCAid2l0aHRhZyIsIENVUlJFTlQpCi0JCisgICAgICAgICMgY3JlYXRlIGEgZG90LCBhbmQgbWFyayBpdCBhcyBjdXJyZW50CisgICAgICAgIGZyZWQgPSBzZWxmLmRyYXcuY3JlYXRlX292YWwoMCwgMCwgMjAsIDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9U0VMRUNURURfQ09MT1IsIHRhZ3M9Q1VSUkVOVCkKKyAgICAgICAgIyBhbmQgbWFrZSBpdCBzZWxlY3RlZAorICAgICAgICBzZWxmLmRyYXcuYWRkdGFnKCJzZWxlY3RlZCIsICJ3aXRodGFnIiwgQ1VSUkVOVCkKKwogICAgIGRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgotCXNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKLQkJCSAgIGNvbW1hbmQ9c2VsZi5xdWl0KQorICAgICAgICBzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGZvcmVncm91bmQ9J3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucXVpdCkKIAotCSMjIyMjIyMjIyMjIyMjIyMKLQkjIG1ha2UgdGhlIGNhbnZhcyBhbmQgYmluZCBzb21lIGJlaGF2aW9yIHRvIGl0Ci0JIyMjIyMjIyMjIyMjIyMjIwotCXNlbGYuZHJhdyA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIikKLQlXaWRnZXQuYmluZChzZWxmLmRyYXcsICI8MT4iLCBzZWxmLm1vdXNlRG93bikKLQlXaWRnZXQuYmluZChzZWxmLmRyYXcsICI8QjEtTW90aW9uPiIsIHNlbGYubW91c2VNb3ZlKQorICAgICAgICAjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgbWFrZSB0aGUgY2FudmFzIGFuZCBiaW5kIHNvbWUgYmVoYXZpb3IgdG8gaXQKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIworICAgICAgICBzZWxmLmRyYXcgPSBDYW52YXMoc2VsZiwgd2lkdGg9IjVpIiwgaGVpZ2h0PSI1aSIpCisgICAgICAgIFdpZGdldC5iaW5kKHNlbGYuZHJhdywgIjwxPiIsIHNlbGYubW91c2VEb3duKQorICAgICAgICBXaWRnZXQuYmluZChzZWxmLmRyYXcsICI8QjEtTW90aW9uPiIsIHNlbGYubW91c2VNb3ZlKQogCi0JIyBhbmQgb3RoZXIgdGhpbmdzLi4uLi4KLQlzZWxmLmJ1dHRvbiA9IEJ1dHRvbihzZWxmLCB0ZXh0PSJtYWtlIGEgbmV3IGRvdCIsIGZvcmVncm91bmQ9ImJsdWUiLAotCQkJICAgICBjb21tYW5kPXNlbGYubWFrZU5ld0RvdCkKKyAgICAgICAgIyBhbmQgb3RoZXIgdGhpbmdzLi4uLi4KKyAgICAgICAgc2VsZi5idXR0b24gPSBCdXR0b24oc2VsZiwgdGV4dD0ibWFrZSBhIG5ldyBkb3QiLCBmb3JlZ3JvdW5kPSJibHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLm1ha2VOZXdEb3QpCiAKLQltZXNzYWdlID0gKCIlcyBkb3RzIGFyZSBzZWxlY3RlZCBhbmQgY2FuIGJlIGRyYWdnZWQuXG4iCi0JCSAgICIlcyBhcmUgbm90IHNlbGVjdGVkLlxuIgotCQkgICAiQ2xpY2sgaW4gYSBkb3QgdG8gc2VsZWN0IGl0LlxuIgotCQkgICAiQ2xpY2sgb24gZW1wdHkgc3BhY2UgdG8gZGVzZWxlY3QgYWxsIGRvdHMuIgotCQkgICApICUgKFNFTEVDVEVEX0NPTE9SLCBVTlNFTEVDVEVEX0NPTE9SKQotCXNlbGYubGFiZWwgPSBNZXNzYWdlKHNlbGYsIHdpZHRoPSI1aSIsIHRleHQ9bWVzc2FnZSkKKyAgICAgICAgbWVzc2FnZSA9ICgiJXMgZG90cyBhcmUgc2VsZWN0ZWQgYW5kIGNhbiBiZSBkcmFnZ2VkLlxuIgorICAgICAgICAgICAgICAgICAgICIlcyBhcmUgbm90IHNlbGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICAgICJDbGljayBpbiBhIGRvdCB0byBzZWxlY3QgaXQuXG4iCisgICAgICAgICAgICAgICAgICAgIkNsaWNrIG9uIGVtcHR5IHNwYWNlIHRvIGRlc2VsZWN0IGFsbCBkb3RzLiIKKyAgICAgICAgICAgICAgICAgICApICUgKFNFTEVDVEVEX0NPTE9SLCBVTlNFTEVDVEVEX0NPTE9SKQorICAgICAgICBzZWxmLmxhYmVsID0gTWVzc2FnZShzZWxmLCB3aWR0aD0iNWkiLCB0ZXh0PW1lc3NhZ2UpCiAKLQlzZWxmLlFVSVQucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1CT1RIKQotCXNlbGYubGFiZWwucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1YLCBleHBhbmQ9MSkKLQlzZWxmLmJ1dHRvbi5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCi0Jc2VsZi5kcmF3LnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLlFVSVQucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1CT1RIKQorICAgICAgICBzZWxmLmxhYmVsLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCwgZXhwYW5kPTEpCisgICAgICAgIHNlbGYuYnV0dG9uLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKKyAgICAgICAgc2VsZi5kcmF3LnBhY2soc2lkZT1MRUZUKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKLQlGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCi0JUGFjay5jb25maWcoc2VsZikKLQlzZWxmLmNyZWF0ZVdpZGdldHMoKQorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIFBhY2suY29uZmlnKHNlbGYpCisgICAgICAgIHNlbGYuY3JlYXRlV2lkZ2V0cygpCiAKIHRlc3QgPSBUZXN0KCkKIHRlc3QubWFpbmxvb3AoKQotCi0KLQpkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL21hdHQvY2FudmFzLXJlYWRpbmctdGFnLWluZm8ucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtcmVhZGluZy10YWctaW5mby5weQppbmRleCA3MDQ0NjkxLi5mNTdlYTE4IDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtcmVhZGluZy10YWctaW5mby5weQorKysgYi9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtcmVhZGluZy10YWctaW5mby5weQpAQCAtMyw0NiArMyw0NiBAQAogCiBjbGFzcyBUZXN0KEZyYW1lKToKICAgICBkZWYgcHJpbnRpdChzZWxmKToKLQlwcmludCAiaGkiCisgICAgICAgIHByaW50ICJoaSIKIAogICAgIGRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgotCXNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywgCi0JCQkgICBjb21tYW5kPXNlbGYucXVpdCkKLQlzZWxmLlFVSVQucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1CT1RIKQorICAgICAgICBzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGZvcmVncm91bmQ9J3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucXVpdCkKKyAgICAgICAgc2VsZi5RVUlULnBhY2soc2lkZT1CT1RUT00sIGZpbGw9Qk9USCkKIAotCXNlbGYuZHJhd2luZyA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIikKKyAgICAgICAgc2VsZi5kcmF3aW5nID0gQ2FudmFzKHNlbGYsIHdpZHRoPSI1aSIsIGhlaWdodD0iNWkiKQogCi0JIyBtYWtlIGEgc2hhcGUKLQlwZ29uID0gc2VsZi5kcmF3aW5nLmNyZWF0ZV9wb2x5Z29uKAotCSAgICAxMCwgMTAsIDExMCwgMTAsIDExMCwgMTEwLCAxMCAsIDExMCwKLQkgICAgZmlsbD0icmVkIiwgdGFncz0oIndlZWUiLCAiZm9vIiwgImdyb28iKSkKKyAgICAgICAgIyBtYWtlIGEgc2hhcGUKKyAgICAgICAgcGdvbiA9IHNlbGYuZHJhd2luZy5jcmVhdGVfcG9seWdvbigKKyAgICAgICAgICAgIDEwLCAxMCwgMTEwLCAxMCwgMTEwLCAxMTAsIDEwICwgMTEwLAorICAgICAgICAgICAgZmlsbD0icmVkIiwgdGFncz0oIndlZWUiLCAiZm9vIiwgImdyb28iKSkKIAotCSMgdGhpcyBpcyBob3cgeW91IHF1ZXJ5IGFuIG9iamVjdCBmb3IgaXRzIGF0dHJpYnV0ZXMgCi0JIyBjb25maWcgb3B0aW9ucyBGT1IgQ0FOVkFTIElURU1TIGFsd2F5cyBjb21lIGJhY2sgaW4gdHVwbGVzIG9mIGxlbmd0aCA1LgotCSMgMCBhdHRyaWJ1dGUgbmFtZQotCSMgMSBCTEFOSyAKLQkjIDIgQkxBTksgCi0JIyAzIGRlZmF1bHQgdmFsdWUKLQkjIDQgY3VycmVudCB2YWx1ZQotCSMgdGhlIGJsYW5rIHNwb3RzIGFyZSBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgY29uZmlnIGNvbW1hbmQgdGhhdCAKLQkjIGlzIHVzZWQgZm9yIHdpZGdldHMuIChyZW1lbWJlciwgdGhpcyBpcyBmb3IgSVRFTVMgZHJhd24gCi0JIyBvbiBhIGNhbnZhcyB3aWRnZXQsIG5vdCB3aWRnZXRzKQotCW9wdGlvbl92YWx1ZSA9IHNlbGYuZHJhd2luZy5pdGVtY29uZmlnKHBnb24sICJzdGlwcGxlIikKLQlwcmludCAicGdvbidzIGN1cnJlbnQgc3RpcHBsZSB2YWx1ZSBpcyAtLT4iLCBvcHRpb25fdmFsdWVbNF0sICI8LS0iCi0Jb3B0aW9uX3ZhbHVlID0gc2VsZi5kcmF3aW5nLml0ZW1jb25maWcocGdvbiwgICJmaWxsIikKLQlwcmludCAicGdvbidzIGN1cnJlbnQgZmlsbCB2YWx1ZSBpcyAtLT4iLCBvcHRpb25fdmFsdWVbNF0sICI8LS0iCi0JcHJpbnQgIiAgd2hlbiBoZSBpcyB1c3VhbGx5IGNvbG9yZWQgLS0+Iiwgb3B0aW9uX3ZhbHVlWzNdLCAiPC0tIgorICAgICAgICAjIHRoaXMgaXMgaG93IHlvdSBxdWVyeSBhbiBvYmplY3QgZm9yIGl0cyBhdHRyaWJ1dGVzCisgICAgICAgICMgY29uZmlnIG9wdGlvbnMgRk9SIENBTlZBUyBJVEVNUyBhbHdheXMgY29tZSBiYWNrIGluIHR1cGxlcyBvZiBsZW5ndGggNS4KKyAgICAgICAgIyAwIGF0dHJpYnV0ZSBuYW1lCisgICAgICAgICMgMSBCTEFOSworICAgICAgICAjIDIgQkxBTksKKyAgICAgICAgIyAzIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgIyA0IGN1cnJlbnQgdmFsdWUKKyAgICAgICAgIyB0aGUgYmxhbmsgc3BvdHMgYXJlIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBjb25maWcgY29tbWFuZCB0aGF0CisgICAgICAgICMgaXMgdXNlZCBmb3Igd2lkZ2V0cy4gKHJlbWVtYmVyLCB0aGlzIGlzIGZvciBJVEVNUyBkcmF3bgorICAgICAgICAjIG9uIGEgY2FudmFzIHdpZGdldCwgbm90IHdpZGdldHMpCisgICAgICAgIG9wdGlvbl92YWx1ZSA9IHNlbGYuZHJhd2luZy5pdGVtY29uZmlnKHBnb24sICJzdGlwcGxlIikKKyAgICAgICAgcHJpbnQgInBnb24ncyBjdXJyZW50IHN0aXBwbGUgdmFsdWUgaXMgLS0+Iiwgb3B0aW9uX3ZhbHVlWzRdLCAiPC0tIgorICAgICAgICBvcHRpb25fdmFsdWUgPSBzZWxmLmRyYXdpbmcuaXRlbWNvbmZpZyhwZ29uLCAgImZpbGwiKQorICAgICAgICBwcmludCAicGdvbidzIGN1cnJlbnQgZmlsbCB2YWx1ZSBpcyAtLT4iLCBvcHRpb25fdmFsdWVbNF0sICI8LS0iCisgICAgICAgIHByaW50ICIgIHdoZW4gaGUgaXMgdXN1YWxseSBjb2xvcmVkIC0tPiIsIG9wdGlvbl92YWx1ZVszXSwgIjwtLSIKIAotCSMjIGhlcmUgd2UgcHJpbnQgb3V0IGFsbCB0aGUgdGFncyBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKLQlvcHRpb25fdmFsdWUgPSBzZWxmLmRyYXdpbmcuaXRlbWNvbmZpZyhwZ29uLCAgInRhZ3MiKQotCXByaW50ICJwZ29uJ3MgdGFncyBhcmUiLCBvcHRpb25fdmFsdWVbNF0KKyAgICAgICAgIyMgaGVyZSB3ZSBwcmludCBvdXQgYWxsIHRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdAorICAgICAgICBvcHRpb25fdmFsdWUgPSBzZWxmLmRyYXdpbmcuaXRlbWNvbmZpZyhwZ29uLCAgInRhZ3MiKQorICAgICAgICBwcmludCAicGdvbidzIHRhZ3MgYXJlIiwgb3B0aW9uX3ZhbHVlWzRdCiAKLQlzZWxmLmRyYXdpbmcucGFjayhzaWRlPUxFRlQpCisgICAgICAgIHNlbGYuZHJhd2luZy5wYWNrKHNpZGU9TEVGVCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBQYWNrLmNvbmZpZyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZVdpZGdldHMoKQogCiB0ZXN0ID0gVGVzdCgpCiAKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L2NhbnZhcy13LXdpZGdldC1kcmF3LWVsLnB5IGIvRGVtby90a2ludGVyL21hdHQvY2FudmFzLXctd2lkZ2V0LWRyYXctZWwucHkKaW5kZXggYTFiYjNiNS4uNWIyNjIxMCAxMDA2NDQKLS0tIGEvRGVtby90a2ludGVyL21hdHQvY2FudmFzLXctd2lkZ2V0LWRyYXctZWwucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvY2FudmFzLXctd2lkZ2V0LWRyYXctZWwucHkKQEAgLTQsMzIgKzQsMzIgQEAKIAogY2xhc3MgVGVzdChGcmFtZSk6CiAgICAgZGVmIHByaW50aGkoc2VsZik6Ci0JcHJpbnQgImhpIgorICAgICAgICBwcmludCAiaGkiCiAKICAgICBkZWYgY3JlYXRlV2lkZ2V0cyhzZWxmKToKLQlzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGZvcmVncm91bmQ9J3JlZCcsIAotCQkJICAgY29tbWFuZD1zZWxmLnF1aXQpCi0Jc2VsZi5RVUlULnBhY2soc2lkZT1CT1RUT00sIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCBmb3JlZ3JvdW5kPSdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCiAKLQlzZWxmLmRyYXcgPSBDYW52YXMoc2VsZiwgd2lkdGg9IjVpIiwgaGVpZ2h0PSI1aSIpCisgICAgICAgIHNlbGYuZHJhdyA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIikKIAotCXNlbGYuYnV0dG9uID0gQnV0dG9uKHNlbGYsIHRleHQ9InRoaXMgaXMgYSBidXR0b24iLCAKLQkJCSAgICAgY29tbWFuZD1zZWxmLnByaW50aGkpCisgICAgICAgIHNlbGYuYnV0dG9uID0gQnV0dG9uKHNlbGYsIHRleHQ9InRoaXMgaXMgYSBidXR0b24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucHJpbnRoaSkKIAotCSMgbm90ZSBoZXJlIHRoZSBjb29yZHMgYXJlIGdpdmVuIGluIHBpeGVscyAoZm9ybSB0aGUgCi0JIyB1cHBlciByaWdodCBhbmQgY29ybmVyIG9mIHRoZSB3aW5kb3csIGFzIHVzdWFsIGZvciBYKSAKLQkjIGJ1dCBtaWdodCBqdXN0IGhhdmUgd2VsbCBiZWVuIGdpdmVuIGluIGluY2hlcyBvciBwb2ludHMgb3IKLQkjIHdoYXRldmVyLi4udXNlIHRoZSAiYW5jaG9yIiBvcHRpb24gdG8gY29udHJvbCB3aGF0IHBvaW50IG9mIHRoZSAKLQkjIHdpZGdldCAoaW4gdGhpcyBjYXNlIHRoZSBidXR0b24pIGdldHMgbWFwcGVkIHRvIHRoZSBnaXZlbiB4LCB5LiAKLQkjIHlvdSBjYW4gc3BlY2lmeSBjb3JuZXJzLCBlZGdlcywgY2VudGVyLCBldGMuLi4KLQlzZWxmLmRyYXcuY3JlYXRlX3dpbmRvdygzMDAsIDMwMCwgd2luZG93PXNlbGYuYnV0dG9uKQorICAgICAgICAjIG5vdGUgaGVyZSB0aGUgY29vcmRzIGFyZSBnaXZlbiBpbiBwaXhlbHMgKGZvcm0gdGhlCisgICAgICAgICMgdXBwZXIgcmlnaHQgYW5kIGNvcm5lciBvZiB0aGUgd2luZG93LCBhcyB1c3VhbCBmb3IgWCkKKyAgICAgICAgIyBidXQgbWlnaHQganVzdCBoYXZlIHdlbGwgYmVlbiBnaXZlbiBpbiBpbmNoZXMgb3IgcG9pbnRzIG9yCisgICAgICAgICMgd2hhdGV2ZXIuLi51c2UgdGhlICJhbmNob3IiIG9wdGlvbiB0byBjb250cm9sIHdoYXQgcG9pbnQgb2YgdGhlCisgICAgICAgICMgd2lkZ2V0IChpbiB0aGlzIGNhc2UgdGhlIGJ1dHRvbikgZ2V0cyBtYXBwZWQgdG8gdGhlIGdpdmVuIHgsIHkuCisgICAgICAgICMgeW91IGNhbiBzcGVjaWZ5IGNvcm5lcnMsIGVkZ2VzLCBjZW50ZXIsIGV0Yy4uLgorICAgICAgICBzZWxmLmRyYXcuY3JlYXRlX3dpbmRvdygzMDAsIDMwMCwgd2luZG93PXNlbGYuYnV0dG9uKQogCi0Jc2VsZi5kcmF3LnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLmRyYXcucGFjayhzaWRlPUxFRlQpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotCUZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLQlQYWNrLmNvbmZpZyhzZWxmKQotCXNlbGYuY3JlYXRlV2lkZ2V0cygpCisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgUGFjay5jb25maWcoc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVXaWRnZXRzKCkKIAogdGVzdCA9IFRlc3QoKQogCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtd2l0aC1zY3JvbGxiYXJzLnB5IGIvRGVtby90a2ludGVyL21hdHQvY2FudmFzLXdpdGgtc2Nyb2xsYmFycy5weQppbmRleCA2MGM3YjEzLi44MWVmMjVhIDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvbWF0dC9jYW52YXMtd2l0aC1zY3JvbGxiYXJzLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L2NhbnZhcy13aXRoLXNjcm9sbGJhcnMucHkKQEAgLTEsNTkgKzEsNTkgQEAKIGZyb20gVGtpbnRlciBpbXBvcnQgKgogCi0jIFRoaXMgZXhhbXBsZSBwcm9ncmFtIGNyZWF0ZXMgYSBzY3JvbGluZyBjYW52YXMsIGFuZCBkZW1vbnN0cmF0ZXMgCisjIFRoaXMgZXhhbXBsZSBwcm9ncmFtIGNyZWF0ZXMgYSBzY3JvbGluZyBjYW52YXMsIGFuZCBkZW1vbnN0cmF0ZXMKICMgaG93IHRvIHRpZSBzY3JvbGxiYXJzIGFuZCBjYW52c2VzIHRvZ2V0aGVyLiBUaGUgbWVjaGFuaXNtCiAjIGlzIGFuYWxvZ3VzIGZvciBsaXN0Ym94ZXMgYW5kIG90aGVyIHdpZGdldHMgd2l0aAogIyAieHNjcm9sbCIgYW5kICJ5c2Nyb2xsIiBjb25maWd1cmF0aW9uIG9wdGlvbnMuCiAKIGNsYXNzIFRlc3QoRnJhbWUpOgogICAgIGRlZiBwcmludGl0KHNlbGYpOgotCXByaW50ICJoaSIKKyAgICAgICAgcHJpbnQgImhpIgogCiAgICAgZGVmIGNyZWF0ZVdpZGdldHMoc2VsZik6Ci0Jc2VsZi5xdWVzdGlvbiA9IExhYmVsKHNlbGYsIHRleHQ9IkNhbiBGaW5kIFRoZSBCTFVFIFNxdWFyZT8/Pz8/PyIpCi0Jc2VsZi5xdWVzdGlvbi5wYWNrKCkKKyAgICAgICAgc2VsZi5xdWVzdGlvbiA9IExhYmVsKHNlbGYsIHRleHQ9IkNhbiBGaW5kIFRoZSBCTFVFIFNxdWFyZT8/Pz8/PyIpCisgICAgICAgIHNlbGYucXVlc3Rpb24ucGFjaygpCiAKLQlzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGJhY2tncm91bmQ9J3JlZCcsIAotCQkJICAgaGVpZ2h0PTMsIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCQotCXNwYWNlciA9IEZyYW1lKHNlbGYsIGhlaWdodD0iMC4yNWkiKQotCXNwYWNlci5wYWNrKHNpZGU9Qk9UVE9NKQorICAgICAgICBzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGJhY2tncm91bmQ9J3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9MywgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCisgICAgICAgIHNwYWNlciA9IEZyYW1lKHNlbGYsIGhlaWdodD0iMC4yNWkiKQorICAgICAgICBzcGFjZXIucGFjayhzaWRlPUJPVFRPTSkKIAotCSMgbm90aWNlIHRoYXQgdGhlIHNjcm9sbCByZWdpb24gKDIwIiB4IDIwIikgaXMgbGFyZ2VyIHRoYW4gCi0JIyBkaXNwbGF5ZWQgc2l6ZSBvZiB0aGUgd2lkZ2V0ICg1IiB4IDUiKQotCXNlbGYuZHJhdyA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIiwKLQkJCSAgIGJhY2tncm91bmQ9IndoaXRlIiwKLQkJCSAgIHNjcm9sbHJlZ2lvbj0oMCwgMCwgIjIwaSIsICIyMGkiKSkKKyAgICAgICAgIyBub3RpY2UgdGhhdCB0aGUgc2Nyb2xsIHJlZ2lvbiAoMjAiIHggMjAiKSBpcyBsYXJnZXIgdGhhbgorICAgICAgICAjIGRpc3BsYXllZCBzaXplIG9mIHRoZSB3aWRnZXQgKDUiIHggNSIpCisgICAgICAgIHNlbGYuZHJhdyA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9IndoaXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbHJlZ2lvbj0oMCwgMCwgIjIwaSIsICIyMGkiKSkKIAotCXNlbGYuZHJhdy5zY3JvbGxYID0gU2Nyb2xsYmFyKHNlbGYsIG9yaWVudD1IT1JJWk9OVEFMKQotCXNlbGYuZHJhdy5zY3JvbGxZID0gU2Nyb2xsYmFyKHNlbGYsIG9yaWVudD1WRVJUSUNBTCkKKyAgICAgICAgc2VsZi5kcmF3LnNjcm9sbFggPSBTY3JvbGxiYXIoc2VsZiwgb3JpZW50PUhPUklaT05UQUwpCisgICAgICAgIHNlbGYuZHJhdy5zY3JvbGxZID0gU2Nyb2xsYmFyKHNlbGYsIG9yaWVudD1WRVJUSUNBTCkKIAotCSMgbm93IHRpZSB0aGUgdGhyZWUgdG9nZXRoZXIuIFRoaXMgaXMgc3RhbmRhcmQgYm9pbGVycGxhdGUgdGV4dAotCXNlbGYuZHJhd1sneHNjcm9sbGNvbW1hbmQnXSA9IHNlbGYuZHJhdy5zY3JvbGxYLnNldAotCXNlbGYuZHJhd1sneXNjcm9sbGNvbW1hbmQnXSA9IHNlbGYuZHJhdy5zY3JvbGxZLnNldAotCXNlbGYuZHJhdy5zY3JvbGxYWydjb21tYW5kJ10gPSBzZWxmLmRyYXcueHZpZXcKLQlzZWxmLmRyYXcuc2Nyb2xsWVsnY29tbWFuZCddID0gc2VsZi5kcmF3Lnl2aWV3CisgICAgICAgICMgbm93IHRpZSB0aGUgdGhyZWUgdG9nZXRoZXIuIFRoaXMgaXMgc3RhbmRhcmQgYm9pbGVycGxhdGUgdGV4dAorICAgICAgICBzZWxmLmRyYXdbJ3hzY3JvbGxjb21tYW5kJ10gPSBzZWxmLmRyYXcuc2Nyb2xsWC5zZXQKKyAgICAgICAgc2VsZi5kcmF3Wyd5c2Nyb2xsY29tbWFuZCddID0gc2VsZi5kcmF3LnNjcm9sbFkuc2V0CisgICAgICAgIHNlbGYuZHJhdy5zY3JvbGxYWydjb21tYW5kJ10gPSBzZWxmLmRyYXcueHZpZXcKKyAgICAgICAgc2VsZi5kcmF3LnNjcm9sbFlbJ2NvbW1hbmQnXSA9IHNlbGYuZHJhdy55dmlldwogCi0JIyBkcmF3IHNvbWV0aGluZy4gTm90ZSB0aGF0IHRoZSBmaXJzdCBzcXVhcmUgCi0JIyBpcyB2aXNpYmxlLCBidXQgeW91IG5lZWQgdG8gc2Nyb2xsIHRvIHNlZSB0aGUgc2Vjb25kIG9uZS4KLQlzZWxmLmRyYXcuY3JlYXRlX3JlY3RhbmdsZSgwLCAwLCAiMy41aSIsICIzLjVpIiwgZmlsbD0iYmxhY2siKQotCXNlbGYuZHJhdy5jcmVhdGVfcmVjdGFuZ2xlKCIxMGkiLCAiMTBpIiwgIjEzLjVpIiwgIjEzLjVpIiwgZmlsbD0iYmx1ZSIpCisgICAgICAgICMgZHJhdyBzb21ldGhpbmcuIE5vdGUgdGhhdCB0aGUgZmlyc3Qgc3F1YXJlCisgICAgICAgICMgaXMgdmlzaWJsZSwgYnV0IHlvdSBuZWVkIHRvIHNjcm9sbCB0byBzZWUgdGhlIHNlY29uZCBvbmUuCisgICAgICAgIHNlbGYuZHJhdy5jcmVhdGVfcmVjdGFuZ2xlKDAsIDAsICIzLjVpIiwgIjMuNWkiLCBmaWxsPSJibGFjayIpCisgICAgICAgIHNlbGYuZHJhdy5jcmVhdGVfcmVjdGFuZ2xlKCIxMGkiLCAiMTBpIiwgIjEzLjVpIiwgIjEzLjVpIiwgZmlsbD0iYmx1ZSIpCiAKLQkjIHBhY2sgJ2VtIHVwCi0Jc2VsZi5kcmF3LnNjcm9sbFgucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1YKQotCXNlbGYuZHJhdy5zY3JvbGxZLnBhY2soc2lkZT1SSUdIVCwgZmlsbD1ZKQotCXNlbGYuZHJhdy5wYWNrKHNpZGU9TEVGVCkKKyAgICAgICAgIyBwYWNrICdlbSB1cAorICAgICAgICBzZWxmLmRyYXcuc2Nyb2xsWC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCisgICAgICAgIHNlbGYuZHJhdy5zY3JvbGxZLnBhY2soc2lkZT1SSUdIVCwgZmlsbD1ZKQorICAgICAgICBzZWxmLmRyYXcucGFjayhzaWRlPUxFRlQpCiAKIAotICAgIGRlZiBzY3JvbGxDYW52YXNYKHNlbGYsICphcmdzKTogCi0JcHJpbnQgInNjcm9sbGluZyIsIGFyZ3MKLQlwcmludCBzZWxmLmRyYXcuc2Nyb2xsWC5nZXQoKQorICAgIGRlZiBzY3JvbGxDYW52YXNYKHNlbGYsICphcmdzKToKKyAgICAgICAgcHJpbnQgInNjcm9sbGluZyIsIGFyZ3MKKyAgICAgICAgcHJpbnQgc2VsZi5kcmF3LnNjcm9sbFguZ2V0KCkKIAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKLQlGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCi0JUGFjay5jb25maWcoc2VsZikKLQlzZWxmLmNyZWF0ZVdpZGdldHMoKQorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIFBhY2suY29uZmlnKHNlbGYpCisgICAgICAgIHNlbGYuY3JlYXRlV2lkZ2V0cygpCiAKIHRlc3QgPSBUZXN0KCkKIApkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL21hdHQvZGlhbG9nLWJveC5weSBiL0RlbW8vdGtpbnRlci9tYXR0L2RpYWxvZy1ib3gucHkKaW5kZXggY2JmZTI5Zi4uZGVhOGYzOSAxMDA2NDQKLS0tIGEvRGVtby90a2ludGVyL21hdHQvZGlhbG9nLWJveC5weQorKysgYi9EZW1vL3RraW50ZXIvbWF0dC9kaWFsb2ctYm94LnB5CkBAIC02LDU5ICs2LDU5IEBACiAKIGNsYXNzIFRlc3QoRnJhbWUpOgogICAgIGRlZiBwcmludGl0KHNlbGYpOgotCXByaW50ICJoaSIKKyAgICAgICAgcHJpbnQgImhpIgogCiAgICAgZGVmIG1ha2VXaW5kb3coc2VsZik6Ci0JIiIiQ3JlYXRlIGEgdG9wLWxldmVsIGRpYWxvZyB3aXRoIHNvbWUgYnV0dG9ucy4KKyAgICAgICAgIiIiQ3JlYXRlIGEgdG9wLWxldmVsIGRpYWxvZyB3aXRoIHNvbWUgYnV0dG9ucy4KIAotCVRoaXMgdXNlcyB0aGUgRGlhbG9nIGNsYXNzLCB3aGljaCBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBUY2wvVGsKLQl0a19kaWFsb2cgc2NyaXB0LiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgMCBpZiB0aGUgdXNlciBjbGlja3MgJ3llcycKLQlvciAxIGlmIHRoZSB1c2VyIGNsaWNrcyAnbm8nLgotCSIiIgotCSMgdGhlIHBhcmFtZXRlcnMgdG8gdGhpcyBjYWxsIGFyZSBhcyBmb2xsb3dzOiAKLQlkID0gRGlhbG9nKAotCSAgICBzZWxmLAkJCSMjIG5hbWUgb2YgYSB0b3BsZXZlbCB3aW5kb3cKLQkgICAgdGl0bGU9ImZyZWQgdGhlIGRpYWxvZyBib3giLCMjIHRpdGxlIG9uIHRoZSB3aW5kb3cKLQkgICAgdGV4dD0iY2xpY2sgb24gYSBjaG9pY2UiLAkjIyBtZXNzYWdlIHRvIGFwcGVhciBpbiB3aW5kb3cKLQkgICAgYml0bWFwPSJpbmZvIiwJCSMjIGJpdG1hcCAoaWYgYW55KSB0byBhcHBlYXI7Ci0JCQkJCSMjIGlmIG5vbmUsIHVzZSAiIgotCSAgICAjICAgICBsZWdhbCB2YWx1ZXMgaGVyZSBhcmU6Ci0JICAgICMgICAgICBzdHJpbmcgICAgICB3aGF0IGl0IGxvb2tzIGxpa2UKLQkgICAgIyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgICAgIyAgICAgIGVycm9yICAgICAgIGEgY2lyY2xlIHdpdGggYSBzbGFzaCB0aHJvdWdoIGl0Ci0JICAgICMJICAgZ3JleTI1ICAgICAgZ3JleSBzcXVhcmUKLQkgICAgIwkgICBncmV5NTAgICAgICBkYXJrZXIgZ3JleSBzcXVhcmUKLQkgICAgIwkgICBob3VyZ2xhc3MgICB1c2UgZm9yICJ3YWl0Li4iCi0JICAgICMJICAgaW5mbyAgICAgICAgYSBsYXJnZSwgbG93ZXIgY2FzZSAiaSIKLQkgICAgIwkgICBxdWVzdGhlYWQgICBhIGh1bWFuIGhlYWQgd2l0aCBhICI/IiBpbiBpdAotCSAgICAjCSAgIHF1ZXN0aW9uICAgIGEgbGFyZ2UgIj8iCi0JICAgICMJICAgd2FybmluZyAgICAgYSBsYXJnZSAiISIgCi0JICAgICMgICAgICAgIEBmbmFtZSAgICBYIGJpdG1hcCB3aGVyZSBmbmFtZSBpcyB0aGUgcGF0aCB0byB0aGUgZmlsZSAgCi0JICAgICMKLQkgICAgZGVmYXVsdD0wLCAgICAjIHRoZSBpbmRleCBvZiB0aGUgZGVmYXVsdCBidXR0b24gY2hvaWNlLgotCQkJICAjIGhpdHRpbmcgcmV0dXJuIHNlbGVjdHMgdGhpcwotCSAgICBzdHJpbmdzPSgieWVzIiwgIm5vIikpCi0JCQkgICMgdmFsdWVzIG9mIHRoZSAnc3RyaW5ncycga2V5IGFyZSB0aGUgbGFiZWxzIGZvciB0aGUgCi0JCQkgICMgYnV0dG9ucyB0aGF0IGFwcGVhciBsZWZ0IHRvIHJpZ2h0IGluIHRoZSBkaWFsb2cgYm94Ci0JcmV0dXJuIGQubnVtCisgICAgICAgIFRoaXMgdXNlcyB0aGUgRGlhbG9nIGNsYXNzLCB3aGljaCBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBUY2wvVGsKKyAgICAgICAgdGtfZGlhbG9nIHNjcmlwdC4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIDAgaWYgdGhlIHVzZXIgY2xpY2tzICd5ZXMnCisgICAgICAgIG9yIDEgaWYgdGhlIHVzZXIgY2xpY2tzICdubycuCisgICAgICAgICIiIgorICAgICAgICAjIHRoZSBwYXJhbWV0ZXJzIHRvIHRoaXMgY2FsbCBhcmUgYXMgZm9sbG93czoKKyAgICAgICAgZCA9IERpYWxvZygKKyAgICAgICAgICAgIHNlbGYsICAgICAgICAgICAgICAgICAgICAgICAjIyBuYW1lIG9mIGEgdG9wbGV2ZWwgd2luZG93CisgICAgICAgICAgICB0aXRsZT0iZnJlZCB0aGUgZGlhbG9nIGJveCIsIyMgdGl0bGUgb24gdGhlIHdpbmRvdworICAgICAgICAgICAgdGV4dD0iY2xpY2sgb24gYSBjaG9pY2UiLCAgICMjIG1lc3NhZ2UgdG8gYXBwZWFyIGluIHdpbmRvdworICAgICAgICAgICAgYml0bWFwPSJpbmZvIiwgICAgICAgICAgICAgICMjIGJpdG1hcCAoaWYgYW55KSB0byBhcHBlYXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgaWYgbm9uZSwgdXNlICIiCisgICAgICAgICAgICAjICAgICBsZWdhbCB2YWx1ZXMgaGVyZSBhcmU6CisgICAgICAgICAgICAjICAgICAgc3RyaW5nICAgICAgd2hhdCBpdCBsb29rcyBsaWtlCisgICAgICAgICAgICAjICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgIyAgICAgIGVycm9yICAgICAgIGEgY2lyY2xlIHdpdGggYSBzbGFzaCB0aHJvdWdoIGl0CisgICAgICAgICAgICAjICAgICAgZ3JleTI1ICAgICAgZ3JleSBzcXVhcmUKKyAgICAgICAgICAgICMgICAgICBncmV5NTAgICAgICBkYXJrZXIgZ3JleSBzcXVhcmUKKyAgICAgICAgICAgICMgICAgICBob3VyZ2xhc3MgICB1c2UgZm9yICJ3YWl0Li4iCisgICAgICAgICAgICAjICAgICAgaW5mbyAgICAgICAgYSBsYXJnZSwgbG93ZXIgY2FzZSAiaSIKKyAgICAgICAgICAgICMgICAgICBxdWVzdGhlYWQgICBhIGh1bWFuIGhlYWQgd2l0aCBhICI/IiBpbiBpdAorICAgICAgICAgICAgIyAgICAgIHF1ZXN0aW9uICAgIGEgbGFyZ2UgIj8iCisgICAgICAgICAgICAjICAgICAgd2FybmluZyAgICAgYSBsYXJnZSAiISIKKyAgICAgICAgICAgICMgICAgICAgIEBmbmFtZSAgICBYIGJpdG1hcCB3aGVyZSBmbmFtZSBpcyB0aGUgcGF0aCB0byB0aGUgZmlsZQorICAgICAgICAgICAgIworICAgICAgICAgICAgZGVmYXVsdD0wLCAgICAjIHRoZSBpbmRleCBvZiB0aGUgZGVmYXVsdCBidXR0b24gY2hvaWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhpdHRpbmcgcmV0dXJuIHNlbGVjdHMgdGhpcworICAgICAgICAgICAgc3RyaW5ncz0oInllcyIsICJubyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAjIHZhbHVlcyBvZiB0aGUgJ3N0cmluZ3MnIGtleSBhcmUgdGhlIGxhYmVscyBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgYnV0dG9ucyB0aGF0IGFwcGVhciBsZWZ0IHRvIHJpZ2h0IGluIHRoZSBkaWFsb2cgYm94CisgICAgICAgIHJldHVybiBkLm51bQogCiAKICAgICBkZWYgY3JlYXRlV2lkZ2V0cyhzZWxmKToKLQlzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGZvcmVncm91bmQ9J3JlZCcsIAotCQkJICAgY29tbWFuZD1zZWxmLnF1aXQpCQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RIKQorICAgICAgICBzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGZvcmVncm91bmQ9J3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucXVpdCkKKyAgICAgICAgc2VsZi5RVUlULnBhY2soc2lkZT1MRUZULCBmaWxsPUJPVEgpCiAKLQkjIGEgaGVsbG8gYnV0dG9uCi0Jc2VsZi5oaV90aGVyZSA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdNYWtlIGEgTmV3IFdpbmRvdycsIAotCQkJICAgICAgIGNvbW1hbmQ9c2VsZi5tYWtlV2luZG93KQotCXNlbGYuaGlfdGhlcmUucGFjayhzaWRlPUxFRlQpCisgICAgICAgICMgYSBoZWxsbyBidXR0b24KKyAgICAgICAgc2VsZi5oaV90aGVyZSA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdNYWtlIGEgTmV3IFdpbmRvdycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLm1ha2VXaW5kb3cpCisgICAgICAgIHNlbGYuaGlfdGhlcmUucGFjayhzaWRlPUxFRlQpCiAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi53aW5kb3dudW0gPSAwIAotCXNlbGYuY3JlYXRlV2lkZ2V0cygpCisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgUGFjay5jb25maWcoc2VsZikKKyAgICAgICAgc2VsZi53aW5kb3dudW0gPSAwCisgICAgICAgIHNlbGYuY3JlYXRlV2lkZ2V0cygpCiAKIHRlc3QgPSBUZXN0KCkKIHRlc3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL21hdHQvZW50cnktc2ltcGxlLnB5IGIvRGVtby90a2ludGVyL21hdHQvZW50cnktc2ltcGxlLnB5CmluZGV4IGNmODJiODkuLjUxNDZlNmYgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L2VudHJ5LXNpbXBsZS5weQorKysgYi9EZW1vL3RraW50ZXIvbWF0dC9lbnRyeS1zaW1wbGUucHkKQEAgLTEsMjUgKzEsMjQgQEAKIGZyb20gVGtpbnRlciBpbXBvcnQgKgotaW1wb3J0IHN0cmluZyAKK2ltcG9ydCBzdHJpbmcKIAogIyBUaGlzIHByb2dyYW0gIHNob3dzIGhvdyB0byB1c2UgYSBzaW1wbGUgdHlwZS1pbiBib3gKIAogY2xhc3MgQXBwKEZyYW1lKToKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotCUZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLQlzZWxmLnBhY2soKQorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIHNlbGYucGFjaygpCiAKLQlzZWxmLmVudHJ5dGhpbmd5ID0gRW50cnkoKQotCXNlbGYuZW50cnl0aGluZ3kucGFjaygpCisgICAgICAgIHNlbGYuZW50cnl0aGluZ3kgPSBFbnRyeSgpCisgICAgICAgIHNlbGYuZW50cnl0aGluZ3kucGFjaygpCiAKLQkjIGFuZCBoZXJlIHdlIGdldCBhIGNhbGxiYWNrIHdoZW4gdGhlIHVzZXIgaGl0cyByZXR1cm4uIHdlIGNvdWxkCi0JIyBtYWtlIHRoZSBrZXkgdGhhdCB0cmlnZ2VycyB0aGUgY2FsbGJhY2sgYW55dGhpbmcgd2Ugd2FudGVkIHRvLgotCSMgb3RoZXIgdHlwaWNhbCBvcHRpb25zIG1pZ2h0IGJlIDxLZXktVGFiPiBvciA8S2V5PiAoZm9yIGFueXRoaW5nKQotCXNlbGYuZW50cnl0aGluZ3kuYmluZCgnPEtleS1SZXR1cm4+Jywgc2VsZi5wcmludF9jb250ZW50cykKKyAgICAgICAgIyBhbmQgaGVyZSB3ZSBnZXQgYSBjYWxsYmFjayB3aGVuIHRoZSB1c2VyIGhpdHMgcmV0dXJuLiB3ZSBjb3VsZAorICAgICAgICAjIG1ha2UgdGhlIGtleSB0aGF0IHRyaWdnZXJzIHRoZSBjYWxsYmFjayBhbnl0aGluZyB3ZSB3YW50ZWQgdG8uCisgICAgICAgICMgb3RoZXIgdHlwaWNhbCBvcHRpb25zIG1pZ2h0IGJlIDxLZXktVGFiPiBvciA8S2V5PiAoZm9yIGFueXRoaW5nKQorICAgICAgICBzZWxmLmVudHJ5dGhpbmd5LmJpbmQoJzxLZXktUmV0dXJuPicsIHNlbGYucHJpbnRfY29udGVudHMpCiAKICAgICBkZWYgcHJpbnRfY29udGVudHMoc2VsZiwgZXZlbnQpOgotCXByaW50ICJoaS4gY29udGVudHMgb2YgZW50cnkgaXMgbm93IC0tLS0+Iiwgc2VsZi5lbnRyeXRoaW5neS5nZXQoKQorICAgICAgICBwcmludCAiaGkuIGNvbnRlbnRzIG9mIGVudHJ5IGlzIG5vdyAtLS0tPiIsIHNlbGYuZW50cnl0aGluZ3kuZ2V0KCkKIAogcm9vdCA9IEFwcCgpCiByb290Lm1hc3Rlci50aXRsZSgiRm9vIikKIHJvb3QubWFpbmxvb3AoKQotCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC9lbnRyeS13aXRoLXNoYXJlZC12YXJpYWJsZS5weSBiL0RlbW8vdGtpbnRlci9tYXR0L2VudHJ5LXdpdGgtc2hhcmVkLXZhcmlhYmxlLnB5CmluZGV4IDM2MGY5NzMuLjJiNzYxNjIgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L2VudHJ5LXdpdGgtc2hhcmVkLXZhcmlhYmxlLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L2VudHJ5LXdpdGgtc2hhcmVkLXZhcmlhYmxlLnB5CkBAIC0xLDQ3ICsxLDQ2IEBACiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKLWltcG9ydCBzdHJpbmcgCitpbXBvcnQgc3RyaW5nCiAKICMgVGhpcyBwcm9ncmFtICBzaG93cyBob3cgdG8gbWFrZSBhIHR5cGVpbiBib3ggc2hhZG93IGEgcHJvZ3JhbSB2YXJpYWJsZS4KIAogY2xhc3MgQXBwKEZyYW1lKToKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotCUZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLQlzZWxmLnBhY2soKQorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIHNlbGYucGFjaygpCiAKLQlzZWxmLmVudHJ5dGhpbmd5ID0gRW50cnkoc2VsZikKLQlzZWxmLmVudHJ5dGhpbmd5LnBhY2soKQorICAgICAgICBzZWxmLmVudHJ5dGhpbmd5ID0gRW50cnkoc2VsZikKKyAgICAgICAgc2VsZi5lbnRyeXRoaW5neS5wYWNrKCkKIAotCXNlbGYuYnV0dG9uID0gQnV0dG9uKHNlbGYsIHRleHQ9IlVwcGVyY2FzZSBUaGUgRW50cnkiLAotCQkJICAgICBjb21tYW5kPXNlbGYudXBwZXIpCi0Jc2VsZi5idXR0b24ucGFjaygpCisgICAgICAgIHNlbGYuYnV0dG9uID0gQnV0dG9uKHNlbGYsIHRleHQ9IlVwcGVyY2FzZSBUaGUgRW50cnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYudXBwZXIpCisgICAgICAgIHNlbGYuYnV0dG9uLnBhY2soKQogCi0JIyBoZXJlIHdlIGhhdmUgdGhlIHRleHQgaW4gdGhlIGVudHJ5IHdpZGdldCB0aWVkIHRvIGEgdmFyaWFibGUuCi0JIyBjaGFuZ2VzIGluIHRoZSB2YXJpYWJsZSBhcmUgZWNob2VkIGluIHRoZSB3aWRnZXQgYW5kIHZpY2UgdmVyc2EuIAotCSMgVmVyeSBoYW5keS4KLQkjIHRoZXJlIGFyZSBvdGhlciBWYXJpYWJsZSB0eXBlcy4gU2VlIFRraW50ZXIucHkgZm9yIGFsbAotCSMgdGhlIG90aGVyIHZhcmlhYmxlIHR5cGVzIHRoYXQgY2FuIGJlIHNoYWRvd2VkCi0Jc2VsZi5jb250ZW50cyA9IFN0cmluZ1ZhcigpCi0Jc2VsZi5jb250ZW50cy5zZXQoInRoaXMgaXMgYSB2YXJpYWJsZSIpCi0Jc2VsZi5lbnRyeXRoaW5neS5jb25maWcodGV4dHZhcmlhYmxlPXNlbGYuY29udGVudHMpCisgICAgICAgICMgaGVyZSB3ZSBoYXZlIHRoZSB0ZXh0IGluIHRoZSBlbnRyeSB3aWRnZXQgdGllZCB0byBhIHZhcmlhYmxlLgorICAgICAgICAjIGNoYW5nZXMgaW4gdGhlIHZhcmlhYmxlIGFyZSBlY2hvZWQgaW4gdGhlIHdpZGdldCBhbmQgdmljZSB2ZXJzYS4KKyAgICAgICAgIyBWZXJ5IGhhbmR5LgorICAgICAgICAjIHRoZXJlIGFyZSBvdGhlciBWYXJpYWJsZSB0eXBlcy4gU2VlIFRraW50ZXIucHkgZm9yIGFsbAorICAgICAgICAjIHRoZSBvdGhlciB2YXJpYWJsZSB0eXBlcyB0aGF0IGNhbiBiZSBzaGFkb3dlZAorICAgICAgICBzZWxmLmNvbnRlbnRzID0gU3RyaW5nVmFyKCkKKyAgICAgICAgc2VsZi5jb250ZW50cy5zZXQoInRoaXMgaXMgYSB2YXJpYWJsZSIpCisgICAgICAgIHNlbGYuZW50cnl0aGluZ3kuY29uZmlnKHRleHR2YXJpYWJsZT1zZWxmLmNvbnRlbnRzKQogCi0JIyBhbmQgaGVyZSB3ZSBnZXQgYSBjYWxsYmFjayB3aGVuIHRoZSB1c2VyIGhpdHMgcmV0dXJuLiB3ZSBjb3VsZAotCSMgbWFrZSB0aGUga2V5IHRoYXQgdHJpZ2dlcnMgdGhlIGNhbGxiYWNrIGFueXRoaW5nIHdlIHdhbnRlZCB0by4KLQkjIG90aGVyIHR5cGljYWwgb3B0aW9ucyBtaWdodCBiZSA8S2V5LVRhYj4gb3IgPEtleT4gKGZvciBhbnl0aGluZykKLQlzZWxmLmVudHJ5dGhpbmd5LmJpbmQoJzxLZXktUmV0dXJuPicsIHNlbGYucHJpbnRfY29udGVudHMpCisgICAgICAgICMgYW5kIGhlcmUgd2UgZ2V0IGEgY2FsbGJhY2sgd2hlbiB0aGUgdXNlciBoaXRzIHJldHVybi4gd2UgY291bGQKKyAgICAgICAgIyBtYWtlIHRoZSBrZXkgdGhhdCB0cmlnZ2VycyB0aGUgY2FsbGJhY2sgYW55dGhpbmcgd2Ugd2FudGVkIHRvLgorICAgICAgICAjIG90aGVyIHR5cGljYWwgb3B0aW9ucyBtaWdodCBiZSA8S2V5LVRhYj4gb3IgPEtleT4gKGZvciBhbnl0aGluZykKKyAgICAgICAgc2VsZi5lbnRyeXRoaW5neS5iaW5kKCc8S2V5LVJldHVybj4nLCBzZWxmLnByaW50X2NvbnRlbnRzKQogCiAgICAgZGVmIHVwcGVyKHNlbGYpOgotCSMgbm90aWNlIGhlcmUsIHdlIGRvbid0IGFjdHVhbGx5IHJlZmVyIHRvIHRoZSBlbnRyeSBib3guCi0JIyB3ZSBqdXN0IG9wZXJhdGUgb24gdGhlIHN0cmluZyB2YXJpYWJsZSBhbmQgd2UgCisgICAgICAgICMgbm90aWNlIGhlcmUsIHdlIGRvbid0IGFjdHVhbGx5IHJlZmVyIHRvIHRoZSBlbnRyeSBib3guCisgICAgICAgICMgd2UganVzdCBvcGVyYXRlIG9uIHRoZSBzdHJpbmcgdmFyaWFibGUgYW5kIHdlCiAgICAgICAgICMgYmVjYXVzZSBpdCdzIGJlaW5nIGxvb2tlZCBhdCBieSB0aGUgZW50cnkgd2lkZ2V0LCBjaGFuZ2luZwotCSMgdGhlIHZhcmlhYmxlIGNoYW5nZXMgdGhlIGVudHJ5IHdpZGdldCBkaXNwbGF5IGF1dG9tYXRpY2FsbHkuCi0JIyB0aGUgc3RyYW5nZSBnZXQvc2V0IG9wZXJhdG9ycyBhcmUgY2x1bmt5LCB0cnVlLi4uCi0Jc3RyID0gc3RyaW5nLnVwcGVyKHNlbGYuY29udGVudHMuZ2V0KCkpCi0Jc2VsZi5jb250ZW50cy5zZXQoc3RyKQorICAgICAgICAjIHRoZSB2YXJpYWJsZSBjaGFuZ2VzIHRoZSBlbnRyeSB3aWRnZXQgZGlzcGxheSBhdXRvbWF0aWNhbGx5LgorICAgICAgICAjIHRoZSBzdHJhbmdlIGdldC9zZXQgb3BlcmF0b3JzIGFyZSBjbHVua3ksIHRydWUuLi4KKyAgICAgICAgc3RyID0gc3RyaW5nLnVwcGVyKHNlbGYuY29udGVudHMuZ2V0KCkpCisgICAgICAgIHNlbGYuY29udGVudHMuc2V0KHN0cikKIAogICAgIGRlZiBwcmludF9jb250ZW50cyhzZWxmLCBldmVudCk6Ci0JcHJpbnQgImhpLiBjb250ZW50cyBvZiBlbnRyeSBpcyBub3cgLS0tLT4iLCBzZWxmLmNvbnRlbnRzLmdldCgpCisgICAgICAgIHByaW50ICJoaS4gY29udGVudHMgb2YgZW50cnkgaXMgbm93IC0tLS0+Iiwgc2VsZi5jb250ZW50cy5nZXQoKQogCiByb290ID0gQXBwKCkKIHJvb3QubWFzdGVyLnRpdGxlKCJGb28iKQogcm9vdC5tYWlubG9vcCgpCi0KZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L2tpbGxpbmctd2luZG93LXctd20ucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9raWxsaW5nLXdpbmRvdy13LXdtLnB5CmluZGV4IDgwNWE2YmMuLjZhMGUyZmUgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L2tpbGxpbmctd2luZG93LXctd20ucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQva2lsbGluZy13aW5kb3ctdy13bS5weQpAQCAtMSw4ICsxLDggQEAKIGZyb20gVGtpbnRlciBpbXBvcnQgKgogCi0jIFRoaXMgZmlsZSBzaG93cyBob3cgdG8gdHJhcCB0aGUga2lsbGluZyBvZiBhIHdpbmRvdyAKKyMgVGhpcyBmaWxlIHNob3dzIGhvdyB0byB0cmFwIHRoZSBraWxsaW5nIG9mIGEgd2luZG93CiAjIHdoZW4gdGhlIHVzZXIgdXNlcyB3aW5kb3cgbWFuYWdlciBtZW51cyAodHlwLiB1cHBlciBsZWZ0IGhhbmQgY29ybmVyCi0jIG1lbnUgaW4gdGhlIGRlY29yYXRpb24gYm9yZGVyKS4gCisjIG1lbnUgaW4gdGhlIGRlY29yYXRpb24gYm9yZGVyKS4KIAogCiAjIyMgKioqKioqKiB0aGlzIGlzbid0IHJlYWxseSBjYWxsZWQgLS0gcmVhZCB0aGUgY29tbWVudHMKQEAgLTExLDMxICsxMSwzMSBAQAogCiBjbGFzcyBUZXN0KEZyYW1lKToKICAgICBkZWYgZGVhdGhIYW5kbGVyKHNlbGYsIGV2ZW50KToKLQlwcmludCBzZWxmLCAiaXMgbm93IGdldHRpbmcgbnVrZWQuIHBlcmZvcm1pbmcgc29tZSBzYXZlIGhlcmUuLi4uIgorICAgICAgICBwcmludCBzZWxmLCAiaXMgbm93IGdldHRpbmcgbnVrZWQuIHBlcmZvcm1pbmcgc29tZSBzYXZlIGhlcmUuLi4uIgogCiAgICAgZGVmIGNyZWF0ZVdpZGdldHMoc2VsZik6Ci0JIyBhIGhlbGxvIGJ1dHRvbgotCXNlbGYuaGlfdGhlcmUgPSBCdXR0b24oc2VsZiwgdGV4dD0nSGVsbG8nKQotCXNlbGYuaGlfdGhlcmUucGFjayhzaWRlPUxFRlQpCisgICAgICAgICMgYSBoZWxsbyBidXR0b24KKyAgICAgICAgc2VsZi5oaV90aGVyZSA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdIZWxsbycpCisgICAgICAgIHNlbGYuaGlfdGhlcmUucGFjayhzaWRlPUxFRlQpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotCUZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLQlQYWNrLmNvbmZpZyhzZWxmKQotCXNlbGYuY3JlYXRlV2lkZ2V0cygpCisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgUGFjay5jb25maWcoc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVXaWRnZXRzKCkKIAotCSMjIwotCSMjIyAgUFJFVkVOVCBXTSBraWxscyBmcm9tIGhhcHBlbmluZwotCSMjIworICAgICAgICAjIyMKKyAgICAgICAgIyMjICBQUkVWRU5UIFdNIGtpbGxzIGZyb20gaGFwcGVuaW5nCisgICAgICAgICMjIwogCi0JIyB0aGUgZG9jcyB3b3VsZCBoYXZlIHlvdSBkbyB0aGlzOiAKKyAgICAgICAgIyB0aGUgZG9jcyB3b3VsZCBoYXZlIHlvdSBkbyB0aGlzOgogCi0jCXNlbGYubWFzdGVyLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgbXlfZGVsZXRlX2NhbGxiYWNrKQorIyAgICAgICBzZWxmLm1hc3Rlci5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIG15X2RlbGV0ZV9jYWxsYmFjaykKIAotCSMgdW5mb3J0dW5hdGVseSwgc29tZSB3aW5kb3cgbWFuYWdlcnMgd2lsbCBub3Qgc2VuZCB0aGlzIHJlcXVlc3QgdG8gYSB3aW5kb3cuCi0JIyB0aGUgInByb3RvY29sIiBmdW5jdGlvbiBzZWVtcyBpbmNhcGFibGUgb2YgdHJhcHBpbmcgdGhlc2UgImFnZ3Jlc3NpdmUiIHdpbmRvdyBraWxscy4KLQkjIHRoaXMgbGluZSBvZiBjb2RlIGNhdGNoZXMgZXZlcnl0aGluZywgdGhvLiBUaGUgd2luZG93IGlzIGRlbGV0ZWQsIGJ1dCB5b3UgaGF2ZSBhIGNoYW5jZQotCSMgb2YgY2xlYW5pbmcgdXAgZmlyc3QuCi0Jc2VsZi5iaW5kX2FsbCgiPERlc3Ryb3k+Iiwgc2VsZi5kZWF0aEhhbmRsZXIpCisgICAgICAgICMgdW5mb3J0dW5hdGVseSwgc29tZSB3aW5kb3cgbWFuYWdlcnMgd2lsbCBub3Qgc2VuZCB0aGlzIHJlcXVlc3QgdG8gYSB3aW5kb3cuCisgICAgICAgICMgdGhlICJwcm90b2NvbCIgZnVuY3Rpb24gc2VlbXMgaW5jYXBhYmxlIG9mIHRyYXBwaW5nIHRoZXNlICJhZ2dyZXNzaXZlIiB3aW5kb3cga2lsbHMuCisgICAgICAgICMgdGhpcyBsaW5lIG9mIGNvZGUgY2F0Y2hlcyBldmVyeXRoaW5nLCB0aG8uIFRoZSB3aW5kb3cgaXMgZGVsZXRlZCwgYnV0IHlvdSBoYXZlIGEgY2hhbmNlCisgICAgICAgICMgb2YgY2xlYW5pbmcgdXAgZmlyc3QuCisgICAgICAgIHNlbGYuYmluZF9hbGwoIjxEZXN0cm95PiIsIHNlbGYuZGVhdGhIYW5kbGVyKQogCiAKIHRlc3QgPSBUZXN0KCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L21lbnUtYWxsLXR5cGVzLW9mLWVudHJpZXMucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9tZW51LWFsbC10eXBlcy1vZi1lbnRyaWVzLnB5CmluZGV4IDFhYzUxYzguLmY0YWZlNGEgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L21lbnUtYWxsLXR5cGVzLW9mLWVudHJpZXMucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvbWVudS1hbGwtdHlwZXMtb2YtZW50cmllcy5weQpAQCAtMSwxNiArMSwxNiBAQAogZnJvbSBUa2ludGVyIGltcG9ydCAqCiAKLSMgc29tZSB2b2NhYnVsYXJ5IHRvIGtlZXAgZnJvbSBnZXR0aW5nIGNvbmZ1c2VkLiBUaGlzIHRlcm1pbm9sb2d5IAotIyBpcyBzb21ldGhpbmcgSSBjb29rZWQgdXAgZm9yIHRoaXMgZmlsZSwgYnV0IGZvbGxvd3MgdGhlIG1hbiBwYWdlcyAKKyMgc29tZSB2b2NhYnVsYXJ5IHRvIGtlZXAgZnJvbSBnZXR0aW5nIGNvbmZ1c2VkLiBUaGlzIHRlcm1pbm9sb2d5CisjIGlzIHNvbWV0aGluZyBJIGNvb2tlZCB1cCBmb3IgdGhpcyBmaWxlLCBidXQgZm9sbG93cyB0aGUgbWFuIHBhZ2VzCiAjIHByZXR0eSBjbG9zZWx5Ci0jIAotIyAKLSMgCisjCisjCisjCiAjICAgICAgIFRoaXMgaXMgYSBNRU5VQlVUVE9OCiAjICAgICAgIFYKICMgKy0tLS0tLS0tLS0tLS0rCiAjIHwgICAgICAgICAgICAgfAotIyAKKyMKICMgKy0tLS0tLS0tLS0tLSsrLS0tLS0tLS0tLS0tKystLS0tLS0tLS0tLS0rCiAjIHwgICAgICAgICAgICB8fCAgICAgICAgICAgIHx8ICAgICAgICAgICAgfAogIyB8ICBGaWxlICAgICAgfHwgIEVkaXQgICAgICB8fCBPcHRpb25zICAgIHwgICA8LS0tLS0tLS0gdGhlIE1FTlVCQVIKQEAgLTIyLDcgKzIyLDcgQEAKICMgfCAgICAgICAgICAgICAgICB8ICA8LS0tLS0tLS0gVGhpcyBpcyBhIE1FTlUuIFRoZSBsaW5lcyBvZiB0ZXh0IGluIHRoZSBtZW51IGFyZQogIyB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVOVSBFTlRSSUVTCiAjIHwgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKLSMgfCBPcGVuIEZpbGVzID4gICB8IGZpbGUxICAgICAgICAgfCAgICAgICAgICAgICAgIAorIyB8IE9wZW4gRmlsZXMgPiAgIHwgZmlsZTEgICAgICAgICB8CiAjIHwgICAgICAgICAgICAgICAgfCBmaWxlMiAgICAgICAgIHwKICMgfCAgICAgICAgICAgICAgICB8IGFub3RoZXIgZmlsZSAgfCA8LS0tLS0tIHRoaXMgY2FzY2FkaW5nIHBhcnQgaXMgYWxzbyBhIE1FTlUKICMgKy0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgfApAQCAtNTMsMTEgKzUzLDExIEBACiAgICAgcHJpbnQgImFuY2hvdmllcz8iLCBhbmNob3ZpZXMKIAogZGVmIG1ha2VDb21tYW5kTWVudSgpOgotICAgICMgbWFrZSBtZW51IGJ1dHRvbiAKLSAgICBDb21tYW5kX2J1dHRvbiA9IE1lbnVidXR0b24obUJhciwgdGV4dD0nU2ltcGxlIEJ1dHRvbiBDb21tYW5kcycsIAotCQkJCXVuZGVybGluZT0wKQorICAgICMgbWFrZSBtZW51IGJ1dHRvbgorICAgIENvbW1hbmRfYnV0dG9uID0gTWVudWJ1dHRvbihtQmFyLCB0ZXh0PSdTaW1wbGUgQnV0dG9uIENvbW1hbmRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lPTApCiAgICAgQ29tbWFuZF9idXR0b24ucGFjayhzaWRlPUxFRlQsIHBhZHg9IjJtIikKLSAgICAKKwogICAgICMgbWFrZSB0aGUgcHVsbGRvd24gcGFydCBvZiB0aGUgRmlsZSBtZW51LiBUaGUgcGFyYW1ldGVyIHBhc3NlZCBpcyB0aGUgbWFzdGVyLgogICAgICMgd2UgYXR0YWNoIGl0IHRvIHRoZSBidXR0b24gYXMgYSBweXRob24gYXR0cmlidXRlIGNhbGxlZCAibWVudSIgYnkgY29udmVudGlvbi4KICAgICAjIGhvcGVmdWxseSB0aGlzIGlzbid0IHRvbyBjb25mdXNpbmcuLi4KQEAgLTY4LDI4ICs2OCwyOCBAQAogICAgICMgdW5kbyBpcyB0aGUgMHRoIGVudHJ5Li4uCiAgICAgQ29tbWFuZF9idXR0b24ubWVudS5lbnRyeWNvbmZpZygwLCBzdGF0ZT1ESVNBQkxFRCkKIAotICAgIENvbW1hbmRfYnV0dG9uLm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9J05ldy4uLicsIHVuZGVybGluZT0wLCAKLQkJCQkgICAgY29tbWFuZD1uZXdfZmlsZSkKLSAgICBDb21tYW5kX2J1dHRvbi5tZW51LmFkZF9jb21tYW5kKGxhYmVsPSdPcGVuLi4uJywgdW5kZXJsaW5lPTAsIAotCQkJCSAgICBjb21tYW5kPW9wZW5fZmlsZSkKKyAgICBDb21tYW5kX2J1dHRvbi5tZW51LmFkZF9jb21tYW5kKGxhYmVsPSdOZXcuLi4nLCB1bmRlcmxpbmU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9bmV3X2ZpbGUpCisgICAgQ29tbWFuZF9idXR0b24ubWVudS5hZGRfY29tbWFuZChsYWJlbD0nT3Blbi4uLicsIHVuZGVybGluZT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1vcGVuX2ZpbGUpCiAgICAgQ29tbWFuZF9idXR0b24ubWVudS5hZGRfY29tbWFuZChsYWJlbD0nRGlmZmVyZW50IEZvbnQnLCB1bmRlcmxpbmU9MCwKLQkJCQkgICAgZm9udD0nLSotaGVsdmV0aWNhLSotci0qLSotKi0xODAtKi0qLSotKi0qLSonLAotCQkJCSAgICBjb21tYW5kPXByaW50X3NvbWV0aGluZykKLSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ9Jy0qLWhlbHZldGljYS0qLXItKi0qLSotMTgwLSotKi0qLSotKi0qJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9cHJpbnRfc29tZXRoaW5nKQorCiAgICAgIyB3ZSBjYW4gbWFrZSBiaXRtYXBzIGJlIG1lbnUgZW50cmllcyB0b28uIEZpbGUgZm9ybWF0IGlzIFgxMSBiaXRtYXAuCiAgICAgIyBpZiB5b3UgdXNlIFhWLCBzYXZlIGl0IHVuZGVyIFgxMSBiaXRtYXAgZm9ybWF0LiBkdWgtdWguLC4uCiAgICAgQ29tbWFuZF9idXR0b24ubWVudS5hZGRfY29tbWFuZCgKLQliaXRtYXA9ImluZm8iKQotCSNiaXRtYXA9J0AvaG9tZS9tamM0eS9kaWxiZXJ0L3Byb2plY3Quc3RhdHVzLmlzLmRvb21lZC5sYXN0LnBhbmVsLmJtJykKLSAgICAKKyAgICAgICAgYml0bWFwPSJpbmZvIikKKyAgICAgICAgI2JpdG1hcD0nQC9ob21lL21qYzR5L2RpbGJlcnQvcHJvamVjdC5zdGF0dXMuaXMuZG9vbWVkLmxhc3QucGFuZWwuYm0nKQorCiAgICAgIyB0aGlzIGlzIGp1c3QgYSBsaW5lCiAgICAgQ29tbWFuZF9idXR0b24ubWVudS5hZGQoJ3NlcGFyYXRvcicpCiAKICAgICAjIGNoYW5nZSB0aGUgY29sb3IKLSAgICBDb21tYW5kX2J1dHRvbi5tZW51LmFkZF9jb21tYW5kKGxhYmVsPSdRdWl0JywgdW5kZXJsaW5lPTAsIAotCQkJCSAgICBiYWNrZ3JvdW5kPSdyZWQnLCAKLQkJCQkgICAgYWN0aXZlYmFja2dyb3VuZD0nZ3JlZW4nLCAKLQkJCQkgICAgY29tbWFuZD1Db21tYW5kX2J1dHRvbi5xdWl0KQorICAgIENvbW1hbmRfYnV0dG9uLm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9J1F1aXQnLCB1bmRlcmxpbmU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9J3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmViYWNrZ3JvdW5kPSdncmVlbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPUNvbW1hbmRfYnV0dG9uLnF1aXQpCiAKICAgICAjIHNldCB1cCBhIHBvaW50ZXIgZnJvbSB0aGUgZmlsZSBtZW51YnV0dG9uIGJhY2sgdG8gdGhlIGZpbGUgbWVudQogICAgIENvbW1hbmRfYnV0dG9uWydtZW51J10gPSBDb21tYW5kX2J1dHRvbi5tZW51CkBAIC05OSwxMCArOTksMTAgQEAKIAogCiBkZWYgbWFrZUNhc2NhZGVNZW51KCk6Ci0gICAgIyBtYWtlIG1lbnUgYnV0dG9uIAorICAgICMgbWFrZSBtZW51IGJ1dHRvbgogICAgIENhc2NhZGVfYnV0dG9uID0gTWVudWJ1dHRvbihtQmFyLCB0ZXh0PSdDYXNjYWRpbmcgTWVudXMnLCB1bmRlcmxpbmU9MCkKICAgICBDYXNjYWRlX2J1dHRvbi5wYWNrKHNpZGU9TEVGVCwgcGFkeD0iMm0iKQotICAgIAorCiAgICAgIyB0aGUgcHJpbWFyeSBwdWxsZG93bgogICAgIENhc2NhZGVfYnV0dG9uLm1lbnUgPSBNZW51KENhc2NhZGVfYnV0dG9uKQogCkBAIC0xMjUsMTIgKzEyNSwxMiBAQAogICAgIENhc2NhZGVfYnV0dG9uLm1lbnUuY2hvaWNlcy5hZGRfY29tbWFuZChsYWJlbD0nUm9ja3kgUm9hZCcpCiAgICAgQ2FzY2FkZV9idXR0b24ubWVudS5jaG9pY2VzLmFkZF9jb21tYW5kKGxhYmVsPSdCdWJibGVHdW0nKQogICAgIENhc2NhZGVfYnV0dG9uLm1lbnUuY2hvaWNlcy5hZGRfY2FzY2FkZSgKLQlsYWJlbD0nV2llcmQgRmxhdm9ycycsIAotCW1lbnU9Q2FzY2FkZV9idXR0b24ubWVudS5jaG9pY2VzLndpZXJkb25lcykKKyAgICAgICAgbGFiZWw9J1dpZXJkIEZsYXZvcnMnLAorICAgICAgICBtZW51PUNhc2NhZGVfYnV0dG9uLm1lbnUuY2hvaWNlcy53aWVyZG9uZXMpCiAKICAgICAjIGFuZCBmaW5hbGx5LCB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIHRvcCBsZXZlbAotICAgIENhc2NhZGVfYnV0dG9uLm1lbnUuYWRkX2Nhc2NhZGUobGFiZWw9J21vcmUgY2hvaWNlcycsIAotCQkJCSAgICBtZW51PUNhc2NhZGVfYnV0dG9uLm1lbnUuY2hvaWNlcykKKyAgICBDYXNjYWRlX2J1dHRvbi5tZW51LmFkZF9jYXNjYWRlKGxhYmVsPSdtb3JlIGNob2ljZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudT1DYXNjYWRlX2J1dHRvbi5tZW51LmNob2ljZXMpCiAKICAgICBDYXNjYWRlX2J1dHRvblsnbWVudSddID0gQ2FzY2FkZV9idXR0b24ubWVudQogCkBAIC0xMzgsMzkgKzEzOCwzOSBAQAogCiBkZWYgbWFrZUNoZWNrYnV0dG9uTWVudSgpOgogICAgIGdsb2JhbCBmcmVkCi0gICAgIyBtYWtlIG1lbnUgYnV0dG9uIAotICAgIENoZWNrYnV0dG9uX2J1dHRvbiA9IE1lbnVidXR0b24obUJhciwgdGV4dD0nQ2hlY2tidXR0b24gTWVudXMnLCAKLQkJCQkgICAgdW5kZXJsaW5lPTApCisgICAgIyBtYWtlIG1lbnUgYnV0dG9uCisgICAgQ2hlY2tidXR0b25fYnV0dG9uID0gTWVudWJ1dHRvbihtQmFyLCB0ZXh0PSdDaGVja2J1dHRvbiBNZW51cycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmU9MCkKICAgICBDaGVja2J1dHRvbl9idXR0b24ucGFjayhzaWRlPUxFRlQsIHBhZHg9JzJtJykKLSAgICAKKwogICAgICMgdGhlIHByaW1hcnkgcHVsbGRvd24KICAgICBDaGVja2J1dHRvbl9idXR0b24ubWVudSA9IE1lbnUoQ2hlY2tidXR0b25fYnV0dG9uKQogCiAgICAgIyBhbmQgYWxsIHRoZSBjaGVjayBidXR0b25zLiBOb3RlIHRoYXQgdGhlICJ2YXJpYWJsZSIgIm9udmFsdWUiIGFuZCAib2ZmdmFsdWUiIG9wdGlvbnMKLSAgICAjIGFyZSBub3Qgc3VwcG9ydGVkIGNvcnJlY3RseSBhdCBwcmVzZW50LiBZb3UgaGF2ZSB0byBkbyBhbGwgeW91ciBhcHBsaWNhdGlvbiAKKyAgICAjIGFyZSBub3Qgc3VwcG9ydGVkIGNvcnJlY3RseSBhdCBwcmVzZW50LiBZb3UgaGF2ZSB0byBkbyBhbGwgeW91ciBhcHBsaWNhdGlvbgogICAgICMgd29yayB0aHJvdWdoIHRoZSBjYWxiYWNrLgogICAgIENoZWNrYnV0dG9uX2J1dHRvbi5tZW51LmFkZF9jaGVja2J1dHRvbihsYWJlbD0nUGVwcGVyb25pJykKICAgICBDaGVja2J1dHRvbl9idXR0b24ubWVudS5hZGRfY2hlY2tidXR0b24obGFiZWw9J1NhdXNhZ2UnKQogICAgIENoZWNrYnV0dG9uX2J1dHRvbi5tZW51LmFkZF9jaGVja2J1dHRvbihsYWJlbD0nRXh0cmEgQ2hlZXNlJykKIAogICAgICMgc28gaGVyZSdzIGEgY2FsbGJhY2sKLSAgICBDaGVja2J1dHRvbl9idXR0b24ubWVudS5hZGRfY2hlY2tidXR0b24obGFiZWw9J0FuY2hvdnknLCAKLQkJCQkJICAgIGNvbW1hbmQ9cHJpbnRfYW5jaG92aWVzKQorICAgIENoZWNrYnV0dG9uX2J1dHRvbi5tZW51LmFkZF9jaGVja2J1dHRvbihsYWJlbD0nQW5jaG92eScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9cHJpbnRfYW5jaG92aWVzKQogCi0gICAgIyBhbmQgc3RhcnQgd2l0aCBhbmNob3ZpZXMgc2VsZWN0ZWQgdG8gYmUgb24uIERvIHRoaXMgYnkgCisgICAgIyBhbmQgc3RhcnQgd2l0aCBhbmNob3ZpZXMgc2VsZWN0ZWQgdG8gYmUgb24uIERvIHRoaXMgYnkKICAgICAjIGNhbGxpbmcgaW52b2tlIG9uIHRoaXMgbWVudSBvcHRpb24uIFRvIHJlZmVyIHRvIHRoZSAiYW5jaG92eSIgbWVudQogICAgICMgZW50cnkgd2UgbmVlZCB0byBrbm93IGl0J3MgaW5kZXguIFRvIGRvIHRoaXMsIHdlIHVzZSB0aGUgaW5kZXggbWV0aG9kCi0gICAgIyB3aGljaCB0YWtlcyBhcmd1bWVudHMgb2Ygc2V2ZXJhbCBmb3JtczogCisgICAgIyB3aGljaCB0YWtlcyBhcmd1bWVudHMgb2Ygc2V2ZXJhbCBmb3JtczoKICAgICAjCiAgICAgIyBhcmd1bWVudCAgICAgICAgd2hhdCBpdCBkb2VzCiAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICMgYSBudW1iZXIgICAgICAgIC0tIHRoaXMgaXMgdXNlbGVzcy4gCisgICAgIyBhIG51bWJlciAgICAgICAgLS0gdGhpcyBpcyB1c2VsZXNzLgogICAgICMgImxhc3QiICAgICAgICAgIC0tIGxhc3Qgb3B0aW9uIGluIHRoZSBtZW51CiAgICAgIyAibm9uZSIgICAgICAgICAgLS0gdXNlZCB3aXRoIHRoZSBhY3RpdmF0ZSBjb21tYW5kLiBzZWUgdGhlIG1hbiBwYWdlIG9uIG1lbnVzCiAgICAgIyAiYWN0aXZlIiAgICAgICAgLS0gdGhlIGN1cnJlbnRseSBhY3RpdmUgbWVudSBvcHRpb24uIEEgbWVudSBvcHRpb24gaXMgbWFkZSBhY3RpdmUKICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlICdhY3RpdmF0ZScgbWV0aG9kCiAgICAgIyAiQG51bWJlciIgICAgICAgLS0gd2hlcmUgJ251bWJlcicgaXMgYW4gaW50ZWdlciBhbmQgaXMgdHJlYXRlZCBsaWtlIGEgeSBjb29yZGluYXRlIGluIHBpeGVscwotICAgICMgc3RyaW5nIHBhdHRlcm4gIC0tIHRoaXMgaXMgdGhlIG9wdGlvbiB1c2VkIGJlbG93LCBhbmQgYXR0ZW1wdHMgdG8gbWF0Y2ggImxhYmVscyIgdXNpbmcgdGhlIAorICAgICMgc3RyaW5nIHBhdHRlcm4gIC0tIHRoaXMgaXMgdGhlIG9wdGlvbiB1c2VkIGJlbG93LCBhbmQgYXR0ZW1wdHMgdG8gbWF0Y2ggImxhYmVscyIgdXNpbmcgdGhlCiAgICAgIyAgICAgICAgICAgICAgICAgICAgcnVsZXMgb2YgVGNsX1N0cmluZ01hdGNoCiAgICAgQ2hlY2tidXR0b25fYnV0dG9uLm1lbnUuaW52b2tlKENoZWNrYnV0dG9uX2J1dHRvbi5tZW51LmluZGV4KCdBbmNob3Z5JykpCiAKQEAgLTE4MSwxNiArMTgxLDE2IEBACiAKIAogZGVmIG1ha2VSYWRpb2J1dHRvbk1lbnUoKToKLSAgICAjIG1ha2UgbWVudSBidXR0b24gCi0gICAgUmFkaW9idXR0b25fYnV0dG9uID0gTWVudWJ1dHRvbihtQmFyLCB0ZXh0PSdSYWRpb2J1dHRvbiBNZW51cycsIAotCQkJCSAgICB1bmRlcmxpbmU9MCkKKyAgICAjIG1ha2UgbWVudSBidXR0b24KKyAgICBSYWRpb2J1dHRvbl9idXR0b24gPSBNZW51YnV0dG9uKG1CYXIsIHRleHQ9J1JhZGlvYnV0dG9uIE1lbnVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZT0wKQogICAgIFJhZGlvYnV0dG9uX2J1dHRvbi5wYWNrKHNpZGU9TEVGVCwgcGFkeD0nMm0nKQotICAgIAorCiAgICAgIyB0aGUgcHJpbWFyeSBwdWxsZG93bgogICAgIFJhZGlvYnV0dG9uX2J1dHRvbi5tZW51ID0gTWVudShSYWRpb2J1dHRvbl9idXR0b24pCiAKICAgICAjIGFuZCBhbGwgdGhlIFJhZGlvIGJ1dHRvbnMuIE5vdGUgdGhhdCB0aGUgInZhcmlhYmxlIiAib252YWx1ZSIgYW5kICJvZmZ2YWx1ZSIgb3B0aW9ucwotICAgICMgYXJlIG5vdCBzdXBwb3J0ZWQgY29ycmVjdGx5IGF0IHByZXNlbnQuIFlvdSBoYXZlIHRvIGRvIGFsbCB5b3VyIGFwcGxpY2F0aW9uIAorICAgICMgYXJlIG5vdCBzdXBwb3J0ZWQgY29ycmVjdGx5IGF0IHByZXNlbnQuIFlvdSBoYXZlIHRvIGRvIGFsbCB5b3VyIGFwcGxpY2F0aW9uCiAgICAgIyB3b3JrIHRocm91Z2ggdGhlIGNhbGJhY2suCiAgICAgUmFkaW9idXR0b25fYnV0dG9uLm1lbnUuYWRkX3JhZGlvYnV0dG9uKGxhYmVsPSdSZXB1YmxpY2FuJykKICAgICBSYWRpb2J1dHRvbl9idXR0b24ubWVudS5hZGRfcmFkaW9idXR0b24obGFiZWw9J0RlbW9jcmF0JykKQEAgLTIwOSw3ICsyMDksNyBAQAogICAgIHJldHVybiBSYWRpb2J1dHRvbl9idXR0b24KIAogCi1kZWYgbWFrZURpc2FibGVkTWVudSgpOiAKK2RlZiBtYWtlRGlzYWJsZWRNZW51KCk6CiAgICAgRHVtbXlfYnV0dG9uID0gTWVudWJ1dHRvbihtQmFyLCB0ZXh0PSdEZWFkIE1lbnUnLCB1bmRlcmxpbmU9MCkKICAgICBEdW1teV9idXR0b24ucGFjayhzaWRlPUxFRlQsIHBhZHg9JzJtJykKIApAQCAtMjMzLDcgKzIzMyw3IEBACiBSYWRpb2J1dHRvbl9idXR0b24gPSBtYWtlUmFkaW9idXR0b25NZW51KCkKIE5vTWVudSAgICAgICAgICAgICA9IG1ha2VEaXNhYmxlZE1lbnUoKQogCi0jIGZpbmFsbHksIGluc3RhbGwgdGhlIGJ1dHRvbnMgaW4gdGhlIG1lbnUgYmFyLiAKKyMgZmluYWxseSwgaW5zdGFsbCB0aGUgYnV0dG9ucyBpbiB0aGUgbWVudSBiYXIuCiAjIFRoaXMgYWxsb3dzIGZvciBzY2FubmluZyBmcm9tIG9uZSBtZW51YnV0dG9uIHRvIHRoZSBuZXh0LgogbUJhci50a19tZW51QmFyKENvbW1hbmRfYnV0dG9uLCBDYXNjYWRlX2J1dHRvbiwgQ2hlY2tidXR0b25fYnV0dG9uLCBSYWRpb2J1dHRvbl9idXR0b24sIE5vTWVudSkKIApAQCAtMjQyLDkgKzI0MiwzIEBACiByb290Lmljb25uYW1lKCdtZW51IGRlbW8nKQogCiByb290Lm1haW5sb29wKCkKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L21lbnUtc2ltcGxlLnB5IGIvRGVtby90a2ludGVyL21hdHQvbWVudS1zaW1wbGUucHkKaW5kZXggMjhmMmM5ZS4uNDZiNTM2NCAxMDA2NDQKLS0tIGEvRGVtby90a2ludGVyL21hdHQvbWVudS1zaW1wbGUucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvbWVudS1zaW1wbGUucHkKQEAgLTEsMTYgKzEsMTYgQEAKIGZyb20gVGtpbnRlciBpbXBvcnQgKgogCi0jIHNvbWUgdm9jYWJ1bGFyeSB0byBrZWVwIGZyb20gZ2V0dGluZyBjb25mdXNlZC4gVGhpcyB0ZXJtaW5vbG9neSAKLSMgaXMgc29tZXRoaW5nIEkgY29va2VkIHVwIGZvciB0aGlzIGZpbGUsIGJ1dCBmb2xsb3dzIHRoZSBtYW4gcGFnZXMgCisjIHNvbWUgdm9jYWJ1bGFyeSB0byBrZWVwIGZyb20gZ2V0dGluZyBjb25mdXNlZC4gVGhpcyB0ZXJtaW5vbG9neQorIyBpcyBzb21ldGhpbmcgSSBjb29rZWQgdXAgZm9yIHRoaXMgZmlsZSwgYnV0IGZvbGxvd3MgdGhlIG1hbiBwYWdlcwogIyBwcmV0dHkgY2xvc2VseQotIyAKLSMgCi0jIAorIworIworIwogIyAgICAgICBUaGlzIGlzIGEgTUVOVUJVVFRPTgogIyAgICAgICBWCiAjICstLS0tLS0tLS0tLS0tKwogIyB8ICAgICAgICAgICAgIHwKLSMgCisjCiAjICstLS0tLS0tLS0tLS0rKy0tLS0tLS0tLS0tLSsrLS0tLS0tLS0tLS0tKwogIyB8ICAgICAgICAgICAgfHwgICAgICAgICAgICB8fCAgICAgICAgICAgIHwKICMgfCAgRmlsZSAgICAgIHx8ICBFZGl0ICAgICAgfHwgT3B0aW9ucyAgICB8ICAgPC0tLS0tLS0tIHRoZSBNRU5VQkFSCkBAIC0yMiw3ICsyMiw3IEBACiAjIHwgICAgICAgICAgICAgICAgfCAgPC0tLS0tLSBUaGlzIGlzIGEgTUVOVS4gVGhlIGxpbmVzIG9mIHRleHQgaW4gdGhlIG1lbnUgYXJlCiAjIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgTUVOVSBFTlRSSUVTCiAjIHwgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKLSMgfCBPcGVuIEZpbGVzID4gICB8IGZpbGUxICAgICAgICAgfCAgICAgICAgICAgICAgIAorIyB8IE9wZW4gRmlsZXMgPiAgIHwgZmlsZTEgICAgICAgICB8CiAjIHwgICAgICAgICAgICAgICAgfCBmaWxlMiAgICAgICAgIHwKICMgfCAgICAgICAgICAgICAgICB8IGFub3RoZXIgZmlsZSAgfCA8LS0tLS0tIHRoaXMgY2FzY2FkaW5nIHBhcnQgaXMgYWxzbyBhIE1FTlUKICMgKy0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgfApAQCAtNDYsMTkgKzQ2LDE5IEBACiAgICAgRmlsZV9idXR0b24gPSBNZW51YnV0dG9uKG1CYXIsIHRleHQ9J0ZpbGUnLCB1bmRlcmxpbmU9MCkKICAgICBGaWxlX2J1dHRvbi5wYWNrKHNpZGU9TEVGVCwgcGFkeD0iMW0iKQogICAgIEZpbGVfYnV0dG9uLm1lbnUgPSBNZW51KEZpbGVfYnV0dG9uKQotICAgIAotICAgICMgYWRkIGFuIGl0ZW0uIFRoZSBmaXJzdCBwYXJhbSBpcyBhIG1lbnUgZW50cnkgdHlwZSwgCisKKyAgICAjIGFkZCBhbiBpdGVtLiBUaGUgZmlyc3QgcGFyYW0gaXMgYSBtZW51IGVudHJ5IHR5cGUsCiAgICAgIyBtdXN0IGJlIG9uZSBvZjogImNhc2NhZGUiLCAiY2hlY2tidXR0b24iLCAiY29tbWFuZCIsICJyYWRpb2J1dHRvbiIsICJzZXBlcmF0b3IiCiAgICAgIyBzZWUgbWVudS1kZW1vLTIucHkgZm9yIGV4YW1wbGVzIG9mIHVzZQotICAgIEZpbGVfYnV0dG9uLm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9J05ldy4uLicsIHVuZGVybGluZT0wLCAKLQkJCQkgY29tbWFuZD1uZXdfZmlsZSkKLSAgICAKLSAgICAKLSAgICBGaWxlX2J1dHRvbi5tZW51LmFkZF9jb21tYW5kKGxhYmVsPSdPcGVuLi4uJywgdW5kZXJsaW5lPTAsIAotCQkJCSBjb21tYW5kPW9wZW5fZmlsZSkKLSAgICAKLSAgICBGaWxlX2J1dHRvbi5tZW51LmFkZF9jb21tYW5kKGxhYmVsPSdRdWl0JywgdW5kZXJsaW5lPTAsIAotCQkJCSBjb21tYW5kPSdleGl0JykKKyAgICBGaWxlX2J1dHRvbi5tZW51LmFkZF9jb21tYW5kKGxhYmVsPSdOZXcuLi4nLCB1bmRlcmxpbmU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9bmV3X2ZpbGUpCisKKworICAgIEZpbGVfYnV0dG9uLm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9J09wZW4uLi4nLCB1bmRlcmxpbmU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9b3Blbl9maWxlKQorCisgICAgRmlsZV9idXR0b24ubWVudS5hZGRfY29tbWFuZChsYWJlbD0nUXVpdCcsIHVuZGVybGluZT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD0nZXhpdCcpCiAKICAgICAjIHNldCB1cCBhIHBvaW50ZXIgZnJvbSB0aGUgZmlsZSBtZW51YnV0dG9uIGJhY2sgdG8gdGhlIGZpbGUgbWVudQogICAgIEZpbGVfYnV0dG9uWydtZW51J10gPSBGaWxlX2J1dHRvbi5tZW51CkBAIC0xMDIsNyArMTAyLDcgQEAKIEZpbGVfYnV0dG9uID0gbWFrZUZpbGVNZW51KCkKIEVkaXRfYnV0dG9uID0gbWFrZUVkaXRNZW51KCkKIAotIyBmaW5hbGx5LCBpbnN0YWxsIHRoZSBidXR0b25zIGluIHRoZSBtZW51IGJhci4gCisjIGZpbmFsbHksIGluc3RhbGwgdGhlIGJ1dHRvbnMgaW4gdGhlIG1lbnUgYmFyLgogIyBUaGlzIGFsbG93cyBmb3Igc2Nhbm5pbmcgZnJvbSBvbmUgbWVudWJ1dHRvbiB0byB0aGUgbmV4dC4KIG1CYXIudGtfbWVudUJhcihGaWxlX2J1dHRvbiwgRWRpdF9idXR0b24pCiAKQEAgLTExMCw5ICsxMTAsMyBAQAogcm9vdC5pY29ubmFtZSgncGFja2VyJykKIAogcm9vdC5tYWlubG9vcCgpCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC9ub3Qtd2hhdC15b3UtbWlnaHQtdGhpbmstMS5weSBiL0RlbW8vdGtpbnRlci9tYXR0L25vdC13aGF0LXlvdS1taWdodC10aGluay0xLnB5CmluZGV4IDI0ZGUyZWYuLjdiMjBmMDIgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L25vdC13aGF0LXlvdS1taWdodC10aGluay0xLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L25vdC13aGF0LXlvdS1taWdodC10aGluay0xLnB5CkBAIC00LDIxICs0LDIxIEBACiBjbGFzcyBUZXN0KEZyYW1lKToKICAgICBkZWYgY3JlYXRlV2lkZ2V0cyhzZWxmKToKIAotCXNlbGYuR3BhbmVsID0gRnJhbWUoc2VsZiwgd2lkdGg9JzFpJywgaGVpZ2h0PScxaScsCi0JCQkgICAgYmFja2dyb3VuZD0nZ3JlZW4nKSAKLQlzZWxmLkdwYW5lbC5wYWNrKHNpZGU9TEVGVCkKKyAgICAgICAgc2VsZi5HcGFuZWwgPSBGcmFtZShzZWxmLCB3aWR0aD0nMWknLCBoZWlnaHQ9JzFpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kPSdncmVlbicpCisgICAgICAgIHNlbGYuR3BhbmVsLnBhY2soc2lkZT1MRUZUKQogCi0JIyBhIFFVSVQgYnV0dG9uCi0Jc2VsZi5HcGFuZWwuUVVJVCA9IEJ1dHRvbihzZWxmLkdwYW5lbCwgdGV4dD0nUVVJVCcsIAotCQkJCSAgZm9yZWdyb3VuZD0ncmVkJywKLQkJCQkgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuR3BhbmVsLlFVSVQucGFjayhzaWRlPUxFRlQpCisgICAgICAgICMgYSBRVUlUIGJ1dHRvbgorICAgICAgICBzZWxmLkdwYW5lbC5RVUlUID0gQnV0dG9uKHNlbGYuR3BhbmVsLCB0ZXh0PSdRVUlUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kPSdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5xdWl0KQorICAgICAgICBzZWxmLkdwYW5lbC5RVUlULnBhY2soc2lkZT1MRUZUKQogCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotCUZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLQlQYWNrLmNvbmZpZyhzZWxmKQotCXNlbGYuY3JlYXRlV2lkZ2V0cygpCisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgUGFjay5jb25maWcoc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVXaWRnZXRzKCkKIAogdGVzdCA9IFRlc3QoKQogCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC9ub3Qtd2hhdC15b3UtbWlnaHQtdGhpbmstMi5weSBiL0RlbW8vdGtpbnRlci9tYXR0L25vdC13aGF0LXlvdS1taWdodC10aGluay0yLnB5CmluZGV4IGMwMTg1NGUuLjllZTE5N2MgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L25vdC13aGF0LXlvdS1taWdodC10aGluay0yLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L25vdC13aGF0LXlvdS1taWdodC10aGluay0yLnB5CkBAIC00LDIzICs0LDIzIEBACiBjbGFzcyBUZXN0KEZyYW1lKToKICAgICBkZWYgY3JlYXRlV2lkZ2V0cyhzZWxmKToKIAotCXNlbGYuR3BhbmVsID0gRnJhbWUoc2VsZiwgd2lkdGg9JzFpJywgaGVpZ2h0PScxaScsCi0JCQkgICAgYmFja2dyb3VuZD0nZ3JlZW4nKQorICAgICAgICBzZWxmLkdwYW5lbCA9IEZyYW1lKHNlbGYsIHdpZHRoPScxaScsIGhlaWdodD0nMWknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9J2dyZWVuJykKIAotCSMgdGhpcyBsaW5lIHR1cm5zIG9mZiB0aGUgcmVjYWxjdWxhdGlvbiBvZiBnZW9tZXRyeSBieSBtYXN0ZXJzLgotCXNlbGYuR3BhbmVsLnByb3BhZ2F0ZSgwKQorICAgICAgICAjIHRoaXMgbGluZSB0dXJucyBvZmYgdGhlIHJlY2FsY3VsYXRpb24gb2YgZ2VvbWV0cnkgYnkgbWFzdGVycy4KKyAgICAgICAgc2VsZi5HcGFuZWwucHJvcGFnYXRlKDApCiAKLQlzZWxmLkdwYW5lbC5wYWNrKHNpZGU9TEVGVCkKKyAgICAgICAgc2VsZi5HcGFuZWwucGFjayhzaWRlPUxFRlQpCiAKLQkjIGEgUVVJVCBidXR0b24KLQlzZWxmLkdwYW5lbC5RVUlUID0gQnV0dG9uKHNlbGYuR3BhbmVsLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKLQkJCQkgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuR3BhbmVsLlFVSVQucGFjayhzaWRlPUxFRlQpCisgICAgICAgICMgYSBRVUlUIGJ1dHRvbgorICAgICAgICBzZWxmLkdwYW5lbC5RVUlUID0gQnV0dG9uKHNlbGYuR3BhbmVsLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucXVpdCkKKyAgICAgICAgc2VsZi5HcGFuZWwuUVVJVC5wYWNrKHNpZGU9TEVGVCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBQYWNrLmNvbmZpZyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZVdpZGdldHMoKQogCiB0ZXN0ID0gVGVzdCgpCiAKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L3BhY2tlci1hbmQtcGxhY2VyLXRvZ2V0aGVyLnB5IGIvRGVtby90a2ludGVyL21hdHQvcGFja2VyLWFuZC1wbGFjZXItdG9nZXRoZXIucHkKaW5kZXggNGNlZWM1NC4uMTg0ZDU2YiAxMDA2NDQKLS0tIGEvRGVtby90a2ludGVyL21hdHQvcGFja2VyLWFuZC1wbGFjZXItdG9nZXRoZXIucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvcGFja2VyLWFuZC1wbGFjZXItdG9nZXRoZXIucHkKQEAgLTEsNiArMSw2IEBACiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIAotIyBUaGlzIGlzIGEgcHJvZ3JhbSB0aGF0IHRlc3RzIHRoZSBwbGFjZXIgZ2VvbSBtYW5hZ2VyIGluIGNvbmp1bmN0aW9uIHdpdGggCisjIFRoaXMgaXMgYSBwcm9ncmFtIHRoYXQgdGVzdHMgdGhlIHBsYWNlciBnZW9tIG1hbmFnZXIgaW4gY29uanVuY3Rpb24gd2l0aAogIyB0aGUgcGFja2VyLiBUaGUgYmFja2dyb3VuZCAoZ3JlZW4pIGlzIHBhY2tlZCwgd2hpbGUgdGhlIHdpZGdldCBpbnNpZGUgaXMgcGxhY2VkCiAKIApAQCAtMTcsMTUgKzE3LDE1IEBACiAgICAgIyBhcmVhIGlzIGluYWNjZXNzc2libGUuCiAgICAgZiA9IEZyYW1lKHRvcCwgd2lkdGg9MjAwLCBoZWlnaHQ9MjAwLCBiYWNrZ3JvdW5kPSdncmVlbicpCiAKLSAgICAjIG5vdGUgdGhhdCB3ZSB1c2UgYSBkaWZmZXJlbnQgbWFuYWdlciBoZXJlLiAKLSAgICAjIFRoaXMgd2F5LCB0aGUgdG9wIGxldmVsIGZyYW1lIHdpZGdldCByZXNpemVzIHdoZW4gdGhlIAotICAgICMgYXBwbGljYXRpb24gd2luZG93IGRvZXMuIAorICAgICMgbm90ZSB0aGF0IHdlIHVzZSBhIGRpZmZlcmVudCBtYW5hZ2VyIGhlcmUuCisgICAgIyBUaGlzIHdheSwgdGhlIHRvcCBsZXZlbCBmcmFtZSB3aWRnZXQgcmVzaXplcyB3aGVuIHRoZQorICAgICMgYXBwbGljYXRpb24gd2luZG93IGRvZXMuCiAgICAgZi5wYWNrKGZpbGw9Qk9USCwgZXhwYW5kPTEpCiAKICAgICAjIG5vdyBtYWtlIGEgYnV0dG9uCiAgICAgZi5idXR0b24gPSBCdXR0b24oZiwgZm9yZWdyb3VuZD0ncmVkJywgdGV4dD0nYW1hemluZycsIGNvbW1hbmQ9ZG90aGlzKQogCi0gICAgIyBhbmQgcGxhY2UgaXQgc28gdGhhdCB0aGUgbncgY29ybmVyIGlzIAorICAgICMgYW5kIHBsYWNlIGl0IHNvIHRoYXQgdGhlIG53IGNvcm5lciBpcwogICAgICMgMS8yIHdheSBhbG9uZyB0aGUgdG9wIFggZWRnZSBvZiBpdHMnIHBhcmVudAogICAgIGYuYnV0dG9uLnBsYWNlKHJlbHg9MC41LCByZWx5PTAuMCwgYW5jaG9yPU5XKQogCkBAIC0zOSw0ICszOSwzIEBACiByb290Lmdlb21ldHJ5KCI0MDB4NDAwIikKIHJvb3QubWF4c2l6ZSgxMDAwLCAxMDAwKQogcm9vdC5tYWlubG9vcCgpCi0KZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L3BhY2tlci1zaW1wbGUucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9wYWNrZXItc2ltcGxlLnB5CmluZGV4IDc3NzNjYWUuLmY1NWYxYmUgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L3BhY2tlci1zaW1wbGUucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvcGFja2VyLXNpbXBsZS5weQpAQCAtMywzMCArMywzMCBAQAogCiBjbGFzcyBUZXN0KEZyYW1lKToKICAgICBkZWYgcHJpbnRpdChzZWxmKToKLQlwcmludCBzZWxmLmhpX3RoZXJlWyJjb21tYW5kIl0KKyAgICAgICAgcHJpbnQgc2VsZi5oaV90aGVyZVsiY29tbWFuZCJdCiAKICAgICBkZWYgY3JlYXRlV2lkZ2V0cyhzZWxmKToKLQkjIGEgaGVsbG8gYnV0dG9uCi0Jc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCBmb3JlZ3JvdW5kPSdyZWQnLCAKLQkJCSAgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RIKQorICAgICAgICAjIGEgaGVsbG8gYnV0dG9uCisgICAgICAgIHNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5xdWl0KQorICAgICAgICBzZWxmLlFVSVQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCkKIAotCXNlbGYuaGlfdGhlcmUgPSBCdXR0b24oc2VsZiwgdGV4dD0nSGVsbG8nLCAKLQkJCSAgICAgICBjb21tYW5kPXNlbGYucHJpbnRpdCkKLQlzZWxmLmhpX3RoZXJlLnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLmhpX3RoZXJlID0gQnV0dG9uKHNlbGYsIHRleHQ9J0hlbGxvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucHJpbnRpdCkKKyAgICAgICAgc2VsZi5oaV90aGVyZS5wYWNrKHNpZGU9TEVGVCkKIAotCSMgbm90ZSBob3cgUGFja2VyIGRlZmF1bHRzIHRvIHNpZGU9VE9QCisgICAgICAgICMgbm90ZSBob3cgUGFja2VyIGRlZmF1bHRzIHRvIHNpZGU9VE9QCiAKLQlzZWxmLmd1eTIgPSBCdXR0b24oc2VsZiwgdGV4dD0nYnV0dG9uIDInKQotCXNlbGYuZ3V5Mi5wYWNrKCkKKyAgICAgICAgc2VsZi5ndXkyID0gQnV0dG9uKHNlbGYsIHRleHQ9J2J1dHRvbiAyJykKKyAgICAgICAgc2VsZi5ndXkyLnBhY2soKQogCi0Jc2VsZi5ndXkzID0gQnV0dG9uKHNlbGYsIHRleHQ9J2J1dHRvbiAzJykKLQlzZWxmLmd1eTMucGFjaygpCisgICAgICAgIHNlbGYuZ3V5MyA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdidXR0b24gMycpCisgICAgICAgIHNlbGYuZ3V5My5wYWNrKCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBQYWNrLmNvbmZpZyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZVdpZGdldHMoKQogCiB0ZXN0ID0gVGVzdCgpCiB0ZXN0Lm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L3BsYWNlci1zaW1wbGUucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9wbGFjZXItc2ltcGxlLnB5CmluZGV4IGI3Y2FlN2UuLjMwZDllOWUgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L3BsYWNlci1zaW1wbGUucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvcGxhY2VyLXNpbXBsZS5weQpAQCAtMTUsNyArMTUsNyBAQAogICAgICMgYXJlYSBpcyBpbmFjY2Vzc3NpYmxlLgogICAgIGYgPSBGcmFtZSh0b3AsIHdpZHRoPTIwMCwgaGVpZ2h0PTIwMCwgYmFja2dyb3VuZD0nZ3JlZW4nKQogCi0gICAgIyBwbGFjZSBpdCBzbyB0aGUgdXBwZXIgbGVmdCBoYW5kIGNvcm5lciBvZiAKKyAgICAjIHBsYWNlIGl0IHNvIHRoZSB1cHBlciBsZWZ0IGhhbmQgY29ybmVyIG9mCiAgICAgIyB0aGUgZnJhbWUgaXMgaW4gdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mCiAgICAgIyB0aGUgcGFyZW50CiAgICAgZi5wbGFjZShyZWx4PTAuMCwgcmVseT0wLjApCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgIyBub3cgbWFrZSBhIGJ1dHRvbgogICAgIGYuYnV0dG9uID0gQnV0dG9uKGYsIGZvcmVncm91bmQ9J3JlZCcsIHRleHQ9J2FtYXppbmcnLCBjb21tYW5kPWRvdGhpcykKIAotICAgICMgYW5kIHBsYWNlIGl0IHNvIHRoYXQgdGhlIG53IGNvcm5lciBpcyAKKyAgICAjIGFuZCBwbGFjZSBpdCBzbyB0aGF0IHRoZSBudyBjb3JuZXIgaXMKICAgICAjIDEvMiB3YXkgYWxvbmcgdGhlIHRvcCBYIGVkZ2Ugb2YgaXRzJyBwYXJlbnQKICAgICBmLmJ1dHRvbi5wbGFjZShyZWx4PTAuNSwgcmVseT0wLjAsIGFuY2hvcj1OVykKIApAQCAtMzcsNCArMzcsMyBAQAogcm9vdC5nZW9tZXRyeSgiNDAweDQwMCIpCiByb290Lm1heHNpemUoMTAwMCwgMTAwMCkKIHJvb3QubWFpbmxvb3AoKQotCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC9wb25nLWRlbW8tMS5weSBiL0RlbW8vdGtpbnRlci9tYXR0L3BvbmctZGVtby0xLnB5CmluZGV4IGEyN2YzMzQuLjdmY2Y4MDAgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L3BvbmctZGVtby0xLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L3BvbmctZGVtby0xLnB5CkBAIC01LDQ4ICs1LDQ4IEBACiAKIGNsYXNzIFBvbmcoRnJhbWUpOgogICAgIGRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgotCXNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywgCi0JCQkgICBjb21tYW5kPXNlbGYucXVpdCkKLQlzZWxmLlFVSVQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCBmb3JlZ3JvdW5kPSdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuUVVJVC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RIKQogCi0JIyMgVGhlIHBsYXlpbmcgZmllbGQKLQlzZWxmLmRyYXcgPSBDYW52YXMoc2VsZiwgd2lkdGg9IjVpIiwgaGVpZ2h0PSI1aSIpCisgICAgICAgICMjIFRoZSBwbGF5aW5nIGZpZWxkCisgICAgICAgIHNlbGYuZHJhdyA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIikKIAotCSMjIFRoZSBzcGVlZCBjb250cm9sIGZvciB0aGUgYmFsbAotCXNlbGYuc3BlZWQgPSBTY2FsZShzZWxmLCBvcmllbnQ9SE9SSVpPTlRBTCwgbGFiZWw9ImJhbGwgc3BlZWQiLCAKLQkJCSAgIGZyb21fPS0xMDAsIHRvPTEwMCkKKyAgICAgICAgIyMgVGhlIHNwZWVkIGNvbnRyb2wgZm9yIHRoZSBiYWxsCisgICAgICAgIHNlbGYuc3BlZWQgPSBTY2FsZShzZWxmLCBvcmllbnQ9SE9SSVpPTlRBTCwgbGFiZWw9ImJhbGwgc3BlZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV89LTEwMCwgdG89MTAwKQogCi0Jc2VsZi5zcGVlZC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCisgICAgICAgIHNlbGYuc3BlZWQucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1YKQogCi0JIyBUaGUgYmFsbAotCXNlbGYuYmFsbCA9IHNlbGYuZHJhdy5jcmVhdGVfb3ZhbCgiMGkiLCAiMGkiLCAiMC4xMGkiLCAiMC4xMGkiLAotCQkJCQkgIGZpbGw9InJlZCIpCi0Jc2VsZi54ID0gMC4wNQotCXNlbGYueSA9IDAuMDUKLQlzZWxmLnZlbG9jaXR5X3ggPSAwLjMKLQlzZWxmLnZlbG9jaXR5X3kgPSAwLjUKKyAgICAgICAgIyBUaGUgYmFsbAorICAgICAgICBzZWxmLmJhbGwgPSBzZWxmLmRyYXcuY3JlYXRlX292YWwoIjBpIiwgIjBpIiwgIjAuMTBpIiwgIjAuMTBpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9InJlZCIpCisgICAgICAgIHNlbGYueCA9IDAuMDUKKyAgICAgICAgc2VsZi55ID0gMC4wNQorICAgICAgICBzZWxmLnZlbG9jaXR5X3ggPSAwLjMKKyAgICAgICAgc2VsZi52ZWxvY2l0eV95ID0gMC41CiAKLQlzZWxmLmRyYXcucGFjayhzaWRlPUxFRlQpCisgICAgICAgIHNlbGYuZHJhdy5wYWNrKHNpZGU9TEVGVCkKIAogICAgIGRlZiBtb3ZlQmFsbChzZWxmLCAqYXJncyk6Ci0JaWYgKHNlbGYueCA+IDUuMCkgb3IgKHNlbGYueCA8IDAuMCk6IAotCSAgICBzZWxmLnZlbG9jaXR5X3ggPSAtMS4wICogc2VsZi52ZWxvY2l0eV94Ci0JaWYgKHNlbGYueSA+IDUuMCkgb3IgKHNlbGYueSA8IDAuMCk6IAotCSAgICBzZWxmLnZlbG9jaXR5X3kgPSAtMS4wICogc2VsZi52ZWxvY2l0eV95CisgICAgICAgIGlmIChzZWxmLnggPiA1LjApIG9yIChzZWxmLnggPCAwLjApOgorICAgICAgICAgICAgc2VsZi52ZWxvY2l0eV94ID0gLTEuMCAqIHNlbGYudmVsb2NpdHlfeAorICAgICAgICBpZiAoc2VsZi55ID4gNS4wKSBvciAoc2VsZi55IDwgMC4wKToKKyAgICAgICAgICAgIHNlbGYudmVsb2NpdHlfeSA9IC0xLjAgKiBzZWxmLnZlbG9jaXR5X3kKIAotCWRlbHRheCA9IChzZWxmLnZlbG9jaXR5X3ggKiBzZWxmLnNwZWVkLmdldCgpIC8gMTAwLjApCi0JZGVsdGF5ID0gKHNlbGYudmVsb2NpdHlfeSAqIHNlbGYuc3BlZWQuZ2V0KCkgLyAxMDAuMCkKLQlzZWxmLnggPSBzZWxmLnggKyBkZWx0YXgKLQlzZWxmLnkgPSBzZWxmLnkgKyBkZWx0YXkKKyAgICAgICAgZGVsdGF4ID0gKHNlbGYudmVsb2NpdHlfeCAqIHNlbGYuc3BlZWQuZ2V0KCkgLyAxMDAuMCkKKyAgICAgICAgZGVsdGF5ID0gKHNlbGYudmVsb2NpdHlfeSAqIHNlbGYuc3BlZWQuZ2V0KCkgLyAxMDAuMCkKKyAgICAgICAgc2VsZi54ID0gc2VsZi54ICsgZGVsdGF4CisgICAgICAgIHNlbGYueSA9IHNlbGYueSArIGRlbHRheQogCi0Jc2VsZi5kcmF3Lm1vdmUoc2VsZi5iYWxsLCAgIiVyaSIgJSBkZWx0YXgsICIlcmkiICUgZGVsdGF5KQotCXNlbGYuYWZ0ZXIoMTAsIHNlbGYubW92ZUJhbGwpCisgICAgICAgIHNlbGYuZHJhdy5tb3ZlKHNlbGYuYmFsbCwgICIlcmkiICUgZGVsdGF4LCAiJXJpIiAlIGRlbHRheSkKKyAgICAgICAgc2VsZi5hZnRlcigxMCwgc2VsZi5tb3ZlQmFsbCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKLQlzZWxmLmFmdGVyKDEwLCBzZWxmLm1vdmVCYWxsKQorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIFBhY2suY29uZmlnKHNlbGYpCisgICAgICAgIHNlbGYuY3JlYXRlV2lkZ2V0cygpCisgICAgICAgIHNlbGYuYWZ0ZXIoMTAsIHNlbGYubW92ZUJhbGwpCiAKIAogZ2FtZSA9IFBvbmcoKQpkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL21hdHQvcHJpbnRpbmctY29vcmRzLW9mLWl0ZW1zLnB5IGIvRGVtby90a2ludGVyL21hdHQvcHJpbnRpbmctY29vcmRzLW9mLWl0ZW1zLnB5CmluZGV4IDY0MDBmZDguLmEzNzczM2QgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L3ByaW50aW5nLWNvb3Jkcy1vZi1pdGVtcy5weQorKysgYi9EZW1vL3RraW50ZXIvbWF0dC9wcmludGluZy1jb29yZHMtb2YtaXRlbXMucHkKQEAgLTcsNTggKzcsNTUgQEAKICAgICAjIyMjIyMgRXZlbnQgY2FsbGJhY2tzIGZvciBUSEUgQ0FOVkFTIChub3QgdGhlIHN0dWZmIGRyYXduIG9uIGl0KQogICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICBkZWYgbW91c2VEb3duKHNlbGYsIGV2ZW50KToKLQkjIHNlZSBpZiB3ZSdyZSBpbnNpZGUgYSBkb3QuIElmIHdlIGFyZSwgaXQKLQkjIGdldHMgdGFnZ2VkIGFzIENVUlJFTlQgZm9yIGZyZWUgYnkgdGsuCisgICAgICAgICMgc2VlIGlmIHdlJ3JlIGluc2lkZSBhIGRvdC4gSWYgd2UgYXJlLCBpdAorICAgICAgICAjIGdldHMgdGFnZ2VkIGFzIENVUlJFTlQgZm9yIGZyZWUgYnkgdGsuCiAKLQlpZiBub3QgZXZlbnQud2lkZ2V0LmZpbmRfd2l0aHRhZyhDVVJSRU5UKToKLQkgICAgIyB0aGVyZSBpcyBubyBkb3QgaGVyZSwgc28gd2UgY2FuIG1ha2Ugb25lLAotCSAgICAjIGFuZCBiaW5kIHNvbWUgaW50ZXJlc3RpbmcgYmVoYXZpb3IgdG8gaXQuCi0JICAgICMgLS0tLS0tCi0JICAgICMgY3JlYXRlIGEgZG90LCBhbmQgbWFyayBpdCBhcyBjdXJyZW50Ci0JICAgIGZyZWQgPSBzZWxmLmRyYXcuY3JlYXRlX292YWwoCi0JCWV2ZW50LnggLSAxMCwgZXZlbnQueSAtMTAsIGV2ZW50LnggKzEwLCBldmVudC55ICsgMTAsCi0JCWZpbGw9ImdyZWVuIikKLQkgICAgc2VsZi5kcmF3LnRhZ19iaW5kKGZyZWQsICI8RW50ZXI+Iiwgc2VsZi5tb3VzZUVudGVyKQotCSAgICBzZWxmLmRyYXcudGFnX2JpbmQoZnJlZCwgIjxMZWF2ZT4iLCBzZWxmLm1vdXNlTGVhdmUpCi0Jc2VsZi5sYXN0eCA9IGV2ZW50LngKLQlzZWxmLmxhc3R5ID0gZXZlbnQueQorICAgICAgICBpZiBub3QgZXZlbnQud2lkZ2V0LmZpbmRfd2l0aHRhZyhDVVJSRU5UKToKKyAgICAgICAgICAgICMgdGhlcmUgaXMgbm8gZG90IGhlcmUsIHNvIHdlIGNhbiBtYWtlIG9uZSwKKyAgICAgICAgICAgICMgYW5kIGJpbmQgc29tZSBpbnRlcmVzdGluZyBiZWhhdmlvciB0byBpdC4KKyAgICAgICAgICAgICMgLS0tLS0tCisgICAgICAgICAgICAjIGNyZWF0ZSBhIGRvdCwgYW5kIG1hcmsgaXQgYXMgY3VycmVudAorICAgICAgICAgICAgZnJlZCA9IHNlbGYuZHJhdy5jcmVhdGVfb3ZhbCgKKyAgICAgICAgICAgICAgICBldmVudC54IC0gMTAsIGV2ZW50LnkgLTEwLCBldmVudC54ICsxMCwgZXZlbnQueSArIDEwLAorICAgICAgICAgICAgICAgIGZpbGw9ImdyZWVuIikKKyAgICAgICAgICAgIHNlbGYuZHJhdy50YWdfYmluZChmcmVkLCAiPEVudGVyPiIsIHNlbGYubW91c2VFbnRlcikKKyAgICAgICAgICAgIHNlbGYuZHJhdy50YWdfYmluZChmcmVkLCAiPExlYXZlPiIsIHNlbGYubW91c2VMZWF2ZSkKKyAgICAgICAgc2VsZi5sYXN0eCA9IGV2ZW50LngKKyAgICAgICAgc2VsZi5sYXN0eSA9IGV2ZW50LnkKIAogICAgIGRlZiBtb3VzZU1vdmUoc2VsZiwgZXZlbnQpOgotCXNlbGYuZHJhdy5tb3ZlKENVUlJFTlQsIGV2ZW50LnggLSBzZWxmLmxhc3R4LCBldmVudC55IC0gc2VsZi5sYXN0eSkKLQlzZWxmLmxhc3R4ID0gZXZlbnQueAotCXNlbGYubGFzdHkgPSBldmVudC55CisgICAgICAgIHNlbGYuZHJhdy5tb3ZlKENVUlJFTlQsIGV2ZW50LnggLSBzZWxmLmxhc3R4LCBldmVudC55IC0gc2VsZi5sYXN0eSkKKyAgICAgICAgc2VsZi5sYXN0eCA9IGV2ZW50LngKKyAgICAgICAgc2VsZi5sYXN0eSA9IGV2ZW50LnkKIAogICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAjIyMjIyMgRXZlbnQgY2FsbGJhY2tzIGZvciBjYW52YXMgSVRFTVMgKHN0dWZmIGRyYXduIG9uIHRoZSBjYW52YXMpCiAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIGRlZiBtb3VzZUVudGVyKHNlbGYsIGV2ZW50KToKICAgICAgICAgIyB0aGUgImN1cnJlbnQiIHRhZyBpcyBhcHBsaWVkIHRvIHRoZSBvYmplY3QgdGhlIGN1cnNvciBpcyBvdmVyLgotCSMgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkuCi0Jc2VsZi5kcmF3Lml0ZW1jb25maWcoQ1VSUkVOVCwgZmlsbD0icmVkIikKLQlwcmludCBzZWxmLmRyYXcuY29vcmRzKENVUlJFTlQpCi0JCisgICAgICAgICMgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkuCisgICAgICAgIHNlbGYuZHJhdy5pdGVtY29uZmlnKENVUlJFTlQsIGZpbGw9InJlZCIpCisgICAgICAgIHByaW50IHNlbGYuZHJhdy5jb29yZHMoQ1VSUkVOVCkKKwogICAgIGRlZiBtb3VzZUxlYXZlKHNlbGYsIGV2ZW50KToKLQkjIHRoZSAiY3VycmVudCIgdGFnIGlzIGFwcGxpZWQgdG8gdGhlIG9iamVjdCB0aGUgY3Vyc29yIGlzIG92ZXIuCi0JIyB0aGlzIGhhcHBlbnMgYXV0b21hdGljYWxseS4KLQlzZWxmLmRyYXcuaXRlbWNvbmZpZyhDVVJSRU5ULCBmaWxsPSJibHVlIikKKyAgICAgICAgIyB0aGUgImN1cnJlbnQiIHRhZyBpcyBhcHBsaWVkIHRvIHRoZSBvYmplY3QgdGhlIGN1cnNvciBpcyBvdmVyLgorICAgICAgICAjIHRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5LgorICAgICAgICBzZWxmLmRyYXcuaXRlbWNvbmZpZyhDVVJSRU5ULCBmaWxsPSJibHVlIikKIAogICAgIGRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgotCXNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKLQkJCSAgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RIKQkKLQlzZWxmLmRyYXcgPSBDYW52YXMoc2VsZiwgd2lkdGg9IjVpIiwgaGVpZ2h0PSI1aSIpCi0Jc2VsZi5kcmF3LnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGZvcmVncm91bmQ9J3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucXVpdCkKKyAgICAgICAgc2VsZi5RVUlULnBhY2soc2lkZT1MRUZULCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuZHJhdyA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIikKKyAgICAgICAgc2VsZi5kcmF3LnBhY2soc2lkZT1MRUZUKQogCi0JV2lkZ2V0LmJpbmQoc2VsZi5kcmF3LCAiPDE+Iiwgc2VsZi5tb3VzZURvd24pCi0JV2lkZ2V0LmJpbmQoc2VsZi5kcmF3LCAiPEIxLU1vdGlvbj4iLCBzZWxmLm1vdXNlTW92ZSkKKyAgICAgICAgV2lkZ2V0LmJpbmQoc2VsZi5kcmF3LCAiPDE+Iiwgc2VsZi5tb3VzZURvd24pCisgICAgICAgIFdpZGdldC5iaW5kKHNlbGYuZHJhdywgIjxCMS1Nb3Rpb24+Iiwgc2VsZi5tb3VzZU1vdmUpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotCUZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLQlQYWNrLmNvbmZpZyhzZWxmKQotCXNlbGYuY3JlYXRlV2lkZ2V0cygpCisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgUGFjay5jb25maWcoc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVXaWRnZXRzKCkKIAogdGVzdCA9IFRlc3QoKQogdGVzdC5tYWlubG9vcCgpCi0KLQotCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC9yYWRpb2J1dHRvbi1zaW1wbGUucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9yYWRpb2J1dHRvbi1zaW1wbGUucHkKaW5kZXggNjVkZmU1Mi4uZTlkNmFmZSAxMDA2NDQKLS0tIGEvRGVtby90a2ludGVyL21hdHQvcmFkaW9idXR0b24tc2ltcGxlLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L3JhZGlvYnV0dG9uLXNpbXBsZS5weQpAQCAtMSwxMCArMSwxMCBAQAogZnJvbSBUa2ludGVyIGltcG9ydCAqCiAKLSMgVGhpcyBpcyBhIGRlbW8gcHJvZ3JhbSB0aGF0IHNob3dzIGhvdyB0byAKLSMgY3JlYXRlIHJhZGlvIGJ1dHRvbnMgYW5kIGhvdyB0byBnZXQgb3RoZXIgd2lkZ2V0cyB0byAKLSMgc2hhcmUgdGhlIGluZm9ybWF0aW9uIGluIGEgcmFkaW8gYnV0dG9uLiAKLSMgCi0jIFRoZXJlIGFyZSBvdGhlciB3YXlzIG9mIGRvaW5nIHRoaXMgdG9vLCBidXQgCisjIFRoaXMgaXMgYSBkZW1vIHByb2dyYW0gdGhhdCBzaG93cyBob3cgdG8KKyMgY3JlYXRlIHJhZGlvIGJ1dHRvbnMgYW5kIGhvdyB0byBnZXQgb3RoZXIgd2lkZ2V0cyB0bworIyBzaGFyZSB0aGUgaW5mb3JtYXRpb24gaW4gYSByYWRpbyBidXR0b24uCisjCisjIFRoZXJlIGFyZSBvdGhlciB3YXlzIG9mIGRvaW5nIHRoaXMgdG9vLCBidXQKICMgdGhlICJ2YXJpYWJsZSIgb3B0aW9uIG9mIHJhZGlvYnV0dG9ucyBzZWVtcyB0byBiZSB0aGUgZWFzaWVzdC4KICMKICMgbm90ZSBob3cgZWFjaCBidXR0b24gaGFzIGEgdmFsdWUgaXQgc2V0cyB0aGUgdmFyaWFibGUgdG8gYXMgaXQgZ2V0cyBoaXQuCkBAIC0xMiw1MCArMTIsNTAgQEAKIAogY2xhc3MgVGVzdChGcmFtZSk6CiAgICAgZGVmIHByaW50aXQoc2VsZik6Ci0JcHJpbnQgImhpIgorICAgICAgICBwcmludCAiaGkiCiAKICAgICBkZWYgY3JlYXRlV2lkZ2V0cyhzZWxmKToKIAotCXNlbGYuZmxhdm9yID0gU3RyaW5nVmFyKCkKLQlzZWxmLmZsYXZvci5zZXQoImNob2NvbGF0ZSIpCisgICAgICAgIHNlbGYuZmxhdm9yID0gU3RyaW5nVmFyKCkKKyAgICAgICAgc2VsZi5mbGF2b3Iuc2V0KCJjaG9jb2xhdGUiKQogCi0Jc2VsZi5yYWRpb2ZyYW1lID0gRnJhbWUoc2VsZikKLQlzZWxmLnJhZGlvZnJhbWUucGFjaygpCisgICAgICAgIHNlbGYucmFkaW9mcmFtZSA9IEZyYW1lKHNlbGYpCisgICAgICAgIHNlbGYucmFkaW9mcmFtZS5wYWNrKCkKIAotCSMgJ3RleHQnIGlzIHRoZSBsYWJlbAotCSMgJ3ZhcmlhYmxlJyBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCBhbGwgdGhlc2UgcmFkaW8gYnV0dG9ucyBzaGFyZQotCSMgJ3ZhbHVlJyBpcyB0aGUgdmFsdWUgdGhpcyB2YXJpYWJsZSB0YWtlcyBvbiB3aGVuIHRoZSByYWRpbyBidXR0b24gaXMgc2VsZWN0ZWQKLQkjICdhbmNob3InIG1ha2VzIHRoZSB0ZXh0IGFwcGVhciBsZWZ0IGp1c3RpZmllZCAoZGVmYXVsdCBpcyBjZW50ZXJlZC4gaWNrKQotCXNlbGYucmFkaW9mcmFtZS5jaG9jID0gUmFkaW9idXR0b24oCi0JICAgIHNlbGYucmFkaW9mcmFtZSwgdGV4dD0iQ2hvY29sYXRlIEZsYXZvciIsIAotCSAgICB2YXJpYWJsZT1zZWxmLmZsYXZvciwgdmFsdWU9ImNob2NvbGF0ZSIsCi0JICAgIGFuY2hvcj1XKQotCXNlbGYucmFkaW9mcmFtZS5jaG9jLnBhY2soZmlsbD1YKQorICAgICAgICAjICd0ZXh0JyBpcyB0aGUgbGFiZWwKKyAgICAgICAgIyAndmFyaWFibGUnIGlzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IGFsbCB0aGVzZSByYWRpbyBidXR0b25zIHNoYXJlCisgICAgICAgICMgJ3ZhbHVlJyBpcyB0aGUgdmFsdWUgdGhpcyB2YXJpYWJsZSB0YWtlcyBvbiB3aGVuIHRoZSByYWRpbyBidXR0b24gaXMgc2VsZWN0ZWQKKyAgICAgICAgIyAnYW5jaG9yJyBtYWtlcyB0aGUgdGV4dCBhcHBlYXIgbGVmdCBqdXN0aWZpZWQgKGRlZmF1bHQgaXMgY2VudGVyZWQuIGljaykKKyAgICAgICAgc2VsZi5yYWRpb2ZyYW1lLmNob2MgPSBSYWRpb2J1dHRvbigKKyAgICAgICAgICAgIHNlbGYucmFkaW9mcmFtZSwgdGV4dD0iQ2hvY29sYXRlIEZsYXZvciIsCisgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmZsYXZvciwgdmFsdWU9ImNob2NvbGF0ZSIsCisgICAgICAgICAgICBhbmNob3I9VykKKyAgICAgICAgc2VsZi5yYWRpb2ZyYW1lLmNob2MucGFjayhmaWxsPVgpCiAKLQlzZWxmLnJhZGlvZnJhbWUuc3RyYXcgPSBSYWRpb2J1dHRvbigKLQkgICAgc2VsZi5yYWRpb2ZyYW1lLCB0ZXh0PSJTdHJhd2JlcnJ5IEZsYXZvciIsIAotCSAgICB2YXJpYWJsZT1zZWxmLmZsYXZvciwgdmFsdWU9InN0cmF3YmVycnkiLAotCSAgICBhbmNob3I9VykKLQlzZWxmLnJhZGlvZnJhbWUuc3RyYXcucGFjayhmaWxsPVgpCisgICAgICAgIHNlbGYucmFkaW9mcmFtZS5zdHJhdyA9IFJhZGlvYnV0dG9uKAorICAgICAgICAgICAgc2VsZi5yYWRpb2ZyYW1lLCB0ZXh0PSJTdHJhd2JlcnJ5IEZsYXZvciIsCisgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmZsYXZvciwgdmFsdWU9InN0cmF3YmVycnkiLAorICAgICAgICAgICAgYW5jaG9yPVcpCisgICAgICAgIHNlbGYucmFkaW9mcmFtZS5zdHJhdy5wYWNrKGZpbGw9WCkKIAotCXNlbGYucmFkaW9mcmFtZS5sZW1vbiA9IFJhZGlvYnV0dG9uKAotCSAgICBzZWxmLnJhZGlvZnJhbWUsIHRleHQ9IkxlbW9uIEZsYXZvciIsIAotCSAgICB2YXJpYWJsZT1zZWxmLmZsYXZvciwgdmFsdWU9ImxlbW9uIiwgCi0JICAgIGFuY2hvcj1XKQotCXNlbGYucmFkaW9mcmFtZS5sZW1vbi5wYWNrKGZpbGw9WCkKLQkKLQkjIHRoaXMgaXMgYSB0ZXh0IGVudHJ5IHRoYXQgbGV0cyB5b3UgdHlwZSBpbiB0aGUgbmFtZSBvZiBhIGZsYXZvciB0b28uCi0Jc2VsZi5lbnRyeSA9IEVudHJ5KHNlbGYsIHRleHR2YXJpYWJsZT1zZWxmLmZsYXZvcikKLQlzZWxmLmVudHJ5LnBhY2soZmlsbD1YKQotCXNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKLQkJCSAgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYucmFkaW9mcmFtZS5sZW1vbiA9IFJhZGlvYnV0dG9uKAorICAgICAgICAgICAgc2VsZi5yYWRpb2ZyYW1lLCB0ZXh0PSJMZW1vbiBGbGF2b3IiLAorICAgICAgICAgICAgdmFyaWFibGU9c2VsZi5mbGF2b3IsIHZhbHVlPSJsZW1vbiIsCisgICAgICAgICAgICBhbmNob3I9VykKKyAgICAgICAgc2VsZi5yYWRpb2ZyYW1lLmxlbW9uLnBhY2soZmlsbD1YKQorCisgICAgICAgICMgdGhpcyBpcyBhIHRleHQgZW50cnkgdGhhdCBsZXRzIHlvdSB0eXBlIGluIHRoZSBuYW1lIG9mIGEgZmxhdm9yIHRvby4KKyAgICAgICAgc2VsZi5lbnRyeSA9IEVudHJ5KHNlbGYsIHRleHR2YXJpYWJsZT1zZWxmLmZsYXZvcikKKyAgICAgICAgc2VsZi5lbnRyeS5wYWNrKGZpbGw9WCkKKyAgICAgICAgc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCBmb3JlZ3JvdW5kPSdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCiAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBQYWNrLmNvbmZpZyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZVdpZGdldHMoKQogCiB0ZXN0ID0gVGVzdCgpCiAKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L3J1YmJlci1iYW5kLWJveC1kZW1vLTEucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9ydWJiZXItYmFuZC1ib3gtZGVtby0xLnB5CmluZGV4IDUxOTZiZjcuLmIwMDUxOGUgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L3J1YmJlci1iYW5kLWJveC1kZW1vLTEucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvcnViYmVyLWJhbmQtYm94LWRlbW8tMS5weQpAQCAtMiw1NSArMiw1NSBAQAogCiBjbGFzcyBUZXN0KEZyYW1lKToKICAgICBkZWYgcHJpbnRpdChzZWxmKToKLQlwcmludCAiaGkiCisgICAgICAgIHByaW50ICJoaSIKIAogICAgIGRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgotCXNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywKLQkJCQkgIGJhY2tncm91bmQ9J3JlZCcsIAotCQkJCSAgZm9yZWdyb3VuZD0nd2hpdGUnLCAKLQkJCQkgIGhlaWdodD0zLCAKLQkJCQkgIGNvbW1hbmQ9c2VsZi5xdWl0KQotCXNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kPSdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVncm91bmQ9J3doaXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucXVpdCkKKyAgICAgICAgc2VsZi5RVUlULnBhY2soc2lkZT1CT1RUT00sIGZpbGw9Qk9USCkKIAotCXNlbGYuY2FudmFzT2JqZWN0ID0gQ2FudmFzKHNlbGYsIHdpZHRoPSI1aSIsIGhlaWdodD0iNWkiKQotCXNlbGYuY2FudmFzT2JqZWN0LnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLmNhbnZhc09iamVjdCA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIikKKyAgICAgICAgc2VsZi5jYW52YXNPYmplY3QucGFjayhzaWRlPUxFRlQpCiAKICAgICBkZWYgbW91c2VEb3duKHNlbGYsIGV2ZW50KToKLQkjIGNhbnZhcyB4IGFuZCB5IHRha2UgdGhlIHNjcmVlbiBjb29yZHMgZnJvbSB0aGUgZXZlbnQgYW5kIHRyYW5zbGF0ZQotCSMgdGhlbSBpbnRvIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgY2FudmFzIG9iamVjdAotCXNlbGYuc3RhcnR4ID0gc2VsZi5jYW52YXNPYmplY3QuY2FudmFzeChldmVudC54KQotCXNlbGYuc3RhcnR5ID0gc2VsZi5jYW52YXNPYmplY3QuY2FudmFzeShldmVudC55KQorICAgICAgICAjIGNhbnZhcyB4IGFuZCB5IHRha2UgdGhlIHNjcmVlbiBjb29yZHMgZnJvbSB0aGUgZXZlbnQgYW5kIHRyYW5zbGF0ZQorICAgICAgICAjIHRoZW0gaW50byB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGNhbnZhcyBvYmplY3QKKyAgICAgICAgc2VsZi5zdGFydHggPSBzZWxmLmNhbnZhc09iamVjdC5jYW52YXN4KGV2ZW50LngpCisgICAgICAgIHNlbGYuc3RhcnR5ID0gc2VsZi5jYW52YXNPYmplY3QuY2FudmFzeShldmVudC55KQogCiAgICAgZGVmIG1vdXNlTW90aW9uKHNlbGYsIGV2ZW50KToKLQkjIGNhbnZhcyB4IGFuZCB5IHRha2UgdGhlIHNjcmVlbiBjb29yZHMgZnJvbSB0aGUgZXZlbnQgYW5kIHRyYW5zbGF0ZQotCSMgdGhlbSBpbnRvIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgY2FudmFzIG9iamVjdAotCXggPSBzZWxmLmNhbnZhc09iamVjdC5jYW52YXN4KGV2ZW50LngpCi0JeSA9IHNlbGYuY2FudmFzT2JqZWN0LmNhbnZhc3koZXZlbnQueSkKKyAgICAgICAgIyBjYW52YXMgeCBhbmQgeSB0YWtlIHRoZSBzY3JlZW4gY29vcmRzIGZyb20gdGhlIGV2ZW50IGFuZCB0cmFuc2xhdGUKKyAgICAgICAgIyB0aGVtIGludG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBjYW52YXMgb2JqZWN0CisgICAgICAgIHggPSBzZWxmLmNhbnZhc09iamVjdC5jYW52YXN4KGV2ZW50LngpCisgICAgICAgIHkgPSBzZWxmLmNhbnZhc09iamVjdC5jYW52YXN5KGV2ZW50LnkpCiAKLQlpZiAoc2VsZi5zdGFydHggIT0gZXZlbnQueCkgIGFuZCAoc2VsZi5zdGFydHkgIT0gZXZlbnQueSkgOiAKLQkgICAgc2VsZi5jYW52YXNPYmplY3QuZGVsZXRlKHNlbGYucnViYmVyYmFuZEJveCkKLQkgICAgc2VsZi5ydWJiZXJiYW5kQm94ID0gc2VsZi5jYW52YXNPYmplY3QuY3JlYXRlX3JlY3RhbmdsZSgKLQkJc2VsZi5zdGFydHgsIHNlbGYuc3RhcnR5LCB4LCB5KQotCSAgICAjIHRoaXMgZmx1c2hlcyB0aGUgb3V0cHV0LCBtYWtpbmcgc3VyZSB0aGF0IAotCSAgICAjIHRoZSByZWN0YW5nbGUgbWFrZXMgaXQgdG8gdGhlIHNjcmVlbiAKLQkgICAgIyBiZWZvcmUgdGhlIG5leHQgZXZlbnQgaXMgaGFuZGxlZAotCSAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBpZiAoc2VsZi5zdGFydHggIT0gZXZlbnQueCkgIGFuZCAoc2VsZi5zdGFydHkgIT0gZXZlbnQueSkgOgorICAgICAgICAgICAgc2VsZi5jYW52YXNPYmplY3QuZGVsZXRlKHNlbGYucnViYmVyYmFuZEJveCkKKyAgICAgICAgICAgIHNlbGYucnViYmVyYmFuZEJveCA9IHNlbGYuY2FudmFzT2JqZWN0LmNyZWF0ZV9yZWN0YW5nbGUoCisgICAgICAgICAgICAgICAgc2VsZi5zdGFydHgsIHNlbGYuc3RhcnR5LCB4LCB5KQorICAgICAgICAgICAgIyB0aGlzIGZsdXNoZXMgdGhlIG91dHB1dCwgbWFraW5nIHN1cmUgdGhhdAorICAgICAgICAgICAgIyB0aGUgcmVjdGFuZ2xlIG1ha2VzIGl0IHRvIHRoZSBzY3JlZW4KKyAgICAgICAgICAgICMgYmVmb3JlIHRoZSBuZXh0IGV2ZW50IGlzIGhhbmRsZWQKKyAgICAgICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpCiAKICAgICBkZWYgbW91c2VVcChzZWxmLCBldmVudCk6Ci0Jc2VsZi5jYW52YXNPYmplY3QuZGVsZXRlKHNlbGYucnViYmVyYmFuZEJveCkKLQkKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgotCUZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKLQlQYWNrLmNvbmZpZyhzZWxmKQotCXNlbGYuY3JlYXRlV2lkZ2V0cygpCisgICAgICAgIHNlbGYuY2FudmFzT2JqZWN0LmRlbGV0ZShzZWxmLnJ1YmJlcmJhbmRCb3gpCiAKLQkjIHRoaXMgaXMgYSAidGFnT3JJZCIgZm9yIHRoZSByZWN0YW5nbGUgd2UgZHJhdyBvbiB0aGUgY2FudmFzCi0Jc2VsZi5ydWJiZXJiYW5kQm94ID0gTm9uZQotCQotCSMgYW5kIHRoZSBiaW5kaW5ncyB0aGF0IG1ha2UgaXQgd29yay4uCi0JV2lkZ2V0LmJpbmQoc2VsZi5jYW52YXNPYmplY3QsICI8QnV0dG9uLTE+Iiwgc2VsZi5tb3VzZURvd24pCi0JV2lkZ2V0LmJpbmQoc2VsZi5jYW52YXNPYmplY3QsICI8QnV0dG9uMS1Nb3Rpb24+Iiwgc2VsZi5tb3VzZU1vdGlvbikKLQlXaWRnZXQuYmluZChzZWxmLmNhbnZhc09iamVjdCwgIjxCdXR0b24xLUJ1dHRvblJlbGVhc2U+Iiwgc2VsZi5tb3VzZVVwKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6CisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgUGFjay5jb25maWcoc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVXaWRnZXRzKCkKKworICAgICAgICAjIHRoaXMgaXMgYSAidGFnT3JJZCIgZm9yIHRoZSByZWN0YW5nbGUgd2UgZHJhdyBvbiB0aGUgY2FudmFzCisgICAgICAgIHNlbGYucnViYmVyYmFuZEJveCA9IE5vbmUKKworICAgICAgICAjIGFuZCB0aGUgYmluZGluZ3MgdGhhdCBtYWtlIGl0IHdvcmsuLgorICAgICAgICBXaWRnZXQuYmluZChzZWxmLmNhbnZhc09iamVjdCwgIjxCdXR0b24tMT4iLCBzZWxmLm1vdXNlRG93bikKKyAgICAgICAgV2lkZ2V0LmJpbmQoc2VsZi5jYW52YXNPYmplY3QsICI8QnV0dG9uMS1Nb3Rpb24+Iiwgc2VsZi5tb3VzZU1vdGlvbikKKyAgICAgICAgV2lkZ2V0LmJpbmQoc2VsZi5jYW52YXNPYmplY3QsICI8QnV0dG9uMS1CdXR0b25SZWxlYXNlPiIsIHNlbGYubW91c2VVcCkKIAogCiB0ZXN0ID0gVGVzdCgpCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC9ydWJiZXItbGluZS1kZW1vLTEucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9ydWJiZXItbGluZS1kZW1vLTEucHkKaW5kZXggZjZkODUzNS4uNTliOGJkOSAxMDA2NDQKLS0tIGEvRGVtby90a2ludGVyL21hdHQvcnViYmVyLWxpbmUtZGVtby0xLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L3J1YmJlci1saW5lLWRlbW8tMS5weQpAQCAtMiw0OSArMiw0OSBAQAogCiBjbGFzcyBUZXN0KEZyYW1lKToKICAgICBkZWYgcHJpbnRpdChzZWxmKToKLQlwcmludCAiaGkiCisgICAgICAgIHByaW50ICJoaSIKIAogICAgIGRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgotCXNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgCi0JCQkJICBiYWNrZ3JvdW5kPSdyZWQnLCAKLQkJCQkgIGZvcmVncm91bmQ9J3doaXRlJywgCi0JCQkJICBoZWlnaHQ9MywgCi0JCQkJICBjb21tYW5kPXNlbGYucXVpdCkKLQlzZWxmLlFVSVQucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1CT1RIKQorICAgICAgICBzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kPSd3aGl0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuUVVJVC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPUJPVEgpCiAKLQlzZWxmLmNhbnZhc09iamVjdCA9IENhbnZhcyhzZWxmLCB3aWR0aD0iNWkiLCBoZWlnaHQ9IjVpIikKLQlzZWxmLmNhbnZhc09iamVjdC5wYWNrKHNpZGU9TEVGVCkKKyAgICAgICAgc2VsZi5jYW52YXNPYmplY3QgPSBDYW52YXMoc2VsZiwgd2lkdGg9IjVpIiwgaGVpZ2h0PSI1aSIpCisgICAgICAgIHNlbGYuY2FudmFzT2JqZWN0LnBhY2soc2lkZT1MRUZUKQogCiAgICAgZGVmIG1vdXNlRG93bihzZWxmLCBldmVudCk6Ci0JIyBjYW52YXMgeCBhbmQgeSB0YWtlIHRoZSBzY3JlZW4gY29vcmRzIGZyb20gdGhlIGV2ZW50IGFuZCB0cmFuc2xhdGUKLQkjIHRoZW0gaW50byB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGNhbnZhcyBvYmplY3QKLQlzZWxmLnN0YXJ0eCA9IHNlbGYuY2FudmFzT2JqZWN0LmNhbnZhc3goZXZlbnQueCkKLQlzZWxmLnN0YXJ0eSA9IHNlbGYuY2FudmFzT2JqZWN0LmNhbnZhc3koZXZlbnQueSkKKyAgICAgICAgIyBjYW52YXMgeCBhbmQgeSB0YWtlIHRoZSBzY3JlZW4gY29vcmRzIGZyb20gdGhlIGV2ZW50IGFuZCB0cmFuc2xhdGUKKyAgICAgICAgIyB0aGVtIGludG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBjYW52YXMgb2JqZWN0CisgICAgICAgIHNlbGYuc3RhcnR4ID0gc2VsZi5jYW52YXNPYmplY3QuY2FudmFzeChldmVudC54KQorICAgICAgICBzZWxmLnN0YXJ0eSA9IHNlbGYuY2FudmFzT2JqZWN0LmNhbnZhc3koZXZlbnQueSkKIAogICAgIGRlZiBtb3VzZU1vdGlvbihzZWxmLCBldmVudCk6Ci0JIyBjYW52YXMgeCBhbmQgeSB0YWtlIHRoZSBzY3JlZW4gY29vcmRzIGZyb20gdGhlIGV2ZW50IGFuZCB0cmFuc2xhdGUKLQkjIHRoZW0gaW50byB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGNhbnZhcyBvYmplY3QKLQl4ID0gc2VsZi5jYW52YXNPYmplY3QuY2FudmFzeChldmVudC54KQotCXkgPSBzZWxmLmNhbnZhc09iamVjdC5jYW52YXN5KGV2ZW50LnkpCisgICAgICAgICMgY2FudmFzIHggYW5kIHkgdGFrZSB0aGUgc2NyZWVuIGNvb3JkcyBmcm9tIHRoZSBldmVudCBhbmQgdHJhbnNsYXRlCisgICAgICAgICMgdGhlbSBpbnRvIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgY2FudmFzIG9iamVjdAorICAgICAgICB4ID0gc2VsZi5jYW52YXNPYmplY3QuY2FudmFzeChldmVudC54KQorICAgICAgICB5ID0gc2VsZi5jYW52YXNPYmplY3QuY2FudmFzeShldmVudC55KQogCi0JaWYgKHNlbGYuc3RhcnR4ICE9IGV2ZW50LngpICBhbmQgKHNlbGYuc3RhcnR5ICE9IGV2ZW50LnkpIDogCi0JICAgIHNlbGYuY2FudmFzT2JqZWN0LmRlbGV0ZShzZWxmLnJ1YmJlcmJhbmRMaW5lKQotCSAgICBzZWxmLnJ1YmJlcmJhbmRMaW5lID0gc2VsZi5jYW52YXNPYmplY3QuY3JlYXRlX2xpbmUoCi0JCXNlbGYuc3RhcnR4LCBzZWxmLnN0YXJ0eSwgeCwgeSkKLQkgICAgIyB0aGlzIGZsdXNoZXMgdGhlIG91dHB1dCwgbWFraW5nIHN1cmUgdGhhdCAKLQkgICAgIyB0aGUgcmVjdGFuZ2xlIG1ha2VzIGl0IHRvIHRoZSBzY3JlZW4gCi0JICAgICMgYmVmb3JlIHRoZSBuZXh0IGV2ZW50IGlzIGhhbmRsZWQKLQkgICAgc2VsZi51cGRhdGVfaWRsZXRhc2tzKCkKKyAgICAgICAgaWYgKHNlbGYuc3RhcnR4ICE9IGV2ZW50LngpICBhbmQgKHNlbGYuc3RhcnR5ICE9IGV2ZW50LnkpIDoKKyAgICAgICAgICAgIHNlbGYuY2FudmFzT2JqZWN0LmRlbGV0ZShzZWxmLnJ1YmJlcmJhbmRMaW5lKQorICAgICAgICAgICAgc2VsZi5ydWJiZXJiYW5kTGluZSA9IHNlbGYuY2FudmFzT2JqZWN0LmNyZWF0ZV9saW5lKAorICAgICAgICAgICAgICAgIHNlbGYuc3RhcnR4LCBzZWxmLnN0YXJ0eSwgeCwgeSkKKyAgICAgICAgICAgICMgdGhpcyBmbHVzaGVzIHRoZSBvdXRwdXQsIG1ha2luZyBzdXJlIHRoYXQKKyAgICAgICAgICAgICMgdGhlIHJlY3RhbmdsZSBtYWtlcyBpdCB0byB0aGUgc2NyZWVuCisgICAgICAgICAgICAjIGJlZm9yZSB0aGUgbmV4dCBldmVudCBpcyBoYW5kbGVkCisgICAgICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKLQlGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCi0JUGFjay5jb25maWcoc2VsZikKLQlzZWxmLmNyZWF0ZVdpZGdldHMoKQotCSMgdGhpcyBpcyBhICJ0YWdPcklkIiBmb3IgdGhlIHJlY3RhbmdsZSB3ZSBkcmF3IG9uIHRoZSBjYW52YXMKLQlzZWxmLnJ1YmJlcmJhbmRMaW5lID0gTm9uZQotCVdpZGdldC5iaW5kKHNlbGYuY2FudmFzT2JqZWN0LCAiPEJ1dHRvbi0xPiIsIHNlbGYubW91c2VEb3duKQotCVdpZGdldC5iaW5kKHNlbGYuY2FudmFzT2JqZWN0LCAiPEJ1dHRvbjEtTW90aW9uPiIsIHNlbGYubW91c2VNb3Rpb24pCi0JCisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgUGFjay5jb25maWcoc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgIyB0aGlzIGlzIGEgInRhZ09ySWQiIGZvciB0aGUgcmVjdGFuZ2xlIHdlIGRyYXcgb24gdGhlIGNhbnZhcworICAgICAgICBzZWxmLnJ1YmJlcmJhbmRMaW5lID0gTm9uZQorICAgICAgICBXaWRnZXQuYmluZChzZWxmLmNhbnZhc09iamVjdCwgIjxCdXR0b24tMT4iLCBzZWxmLm1vdXNlRG93bikKKyAgICAgICAgV2lkZ2V0LmJpbmQoc2VsZi5jYW52YXNPYmplY3QsICI8QnV0dG9uMS1Nb3Rpb24+Iiwgc2VsZi5tb3VzZU1vdGlvbikKKwogCiB0ZXN0ID0gVGVzdCgpCiAKZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L3NsaWRlci1kZW1vLTEucHkgYi9EZW1vL3RraW50ZXIvbWF0dC9zbGlkZXItZGVtby0xLnB5CmluZGV4IDQwMzk1ZGYuLmRiNjExNGIgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L3NsaWRlci1kZW1vLTEucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvc2xpZGVyLWRlbW8tMS5weQpAQCAtNSwzMiArNSwzMiBAQAogCiBjbGFzcyBUZXN0KEZyYW1lKToKICAgICBkZWYgcHJpbnRfdmFsdWUoc2VsZiwgdmFsKToKLQlwcmludCAic2xpZGVyIG5vdyBhdCIsIHZhbAorICAgICAgICBwcmludCAic2xpZGVyIG5vdyBhdCIsIHZhbAogCi0gICAgZGVmIHJlc2V0KHNlbGYpOiAKLQlzZWxmLnNsaWRlci5zZXQoMCkKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2xpZGVyLnNldCgwKQogCiAgICAgZGVmIGNyZWF0ZVdpZGdldHMoc2VsZik6Ci0Jc2VsZi5zbGlkZXIgPSBTY2FsZShzZWxmLCBmcm9tXz0wLCB0bz0xMDAsIAotCQkJICAgIG9yaWVudD1IT1JJWk9OVEFMLCAKLQkJCSAgICBsZW5ndGg9IjNpIiwgCi0JCQkgICAgbGFiZWw9ImhhcHB5IHNsaWRlciIsIAotCQkJICAgIGNvbW1hbmQ9c2VsZi5wcmludF92YWx1ZSkKKyAgICAgICAgc2VsZi5zbGlkZXIgPSBTY2FsZShzZWxmLCBmcm9tXz0wLCB0bz0xMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50PUhPUklaT05UQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoPSIzaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9ImhhcHB5IHNsaWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLnByaW50X3ZhbHVlKQogCi0Jc2VsZi5yZXNldCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdyZXNldCBzbGlkZXInLCAKLQkJCSAgICBjb21tYW5kPXNlbGYucmVzZXQpCisgICAgICAgIHNlbGYucmVzZXQgPSBCdXR0b24oc2VsZiwgdGV4dD0ncmVzZXQgc2xpZGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYucmVzZXQpCiAKLQlzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGZvcmVncm91bmQ9J3JlZCcsIAotCQkJICAgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5xdWl0KQogCi0Jc2VsZi5zbGlkZXIucGFjayhzaWRlPUxFRlQpCi0Jc2VsZi5yZXNldC5wYWNrKHNpZGU9TEVGVCkKLQlzZWxmLlFVSVQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5zbGlkZXIucGFjayhzaWRlPUxFRlQpCisgICAgICAgIHNlbGYucmVzZXQucGFjayhzaWRlPUxFRlQpCisgICAgICAgIHNlbGYuUVVJVC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RIKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKLQlGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCi0JUGFjay5jb25maWcoc2VsZikKLQlzZWxmLmNyZWF0ZVdpZGdldHMoKQorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIFBhY2suY29uZmlnKHNlbGYpCisgICAgICAgIHNlbGYuY3JlYXRlV2lkZ2V0cygpCiAKIHRlc3QgPSBUZXN0KCkKIHRlc3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL21hdHQvc3ViY2xhc3MtZXhpc3Rpbmctd2lkZ2V0cy5weSBiL0RlbW8vdGtpbnRlci9tYXR0L3N1YmNsYXNzLWV4aXN0aW5nLXdpZGdldHMucHkKaW5kZXggZTc5ZGQ1Yy4uMGUwOGY5MiAxMDA2NDQKLS0tIGEvRGVtby90a2ludGVyL21hdHQvc3ViY2xhc3MtZXhpc3Rpbmctd2lkZ2V0cy5weQorKysgYi9EZW1vL3RraW50ZXIvbWF0dC9zdWJjbGFzcy1leGlzdGluZy13aWRnZXRzLnB5CkBAIC01LDkgKzUsOSBAQAogCiBjbGFzcyBOZXdfQnV0dG9uKEJ1dHRvbik6CiAgICAgZGVmIGNhbGxiYWNrKHNlbGYpOgotCXByaW50IHNlbGYuY291bnRlcgotCXNlbGYuY291bnRlciA9IHNlbGYuY291bnRlciArIDEKLSAgICAKKyAgICAgICAgcHJpbnQgc2VsZi5jb3VudGVyCisgICAgICAgIHNlbGYuY291bnRlciA9IHNlbGYuY291bnRlciArIDEKKwogZGVmIGNyZWF0ZVdpZGdldHModG9wKToKICAgICBmID0gRnJhbWUodG9wKQogICAgIGYucGFjaygpCkBAIC0yNiw0ICsyNiwzIEBACiByb290ID0gVGsoKQogY3JlYXRlV2lkZ2V0cyhyb290KQogcm9vdC5tYWlubG9vcCgpCi0KZGlmZiAtLWdpdCBhL0RlbW8vdGtpbnRlci9tYXR0L3R3by1yYWRpby1ncm91cHMucHkgYi9EZW1vL3RraW50ZXIvbWF0dC90d28tcmFkaW8tZ3JvdXBzLnB5CmluZGV4IDVjMTczMzMuLjlmZDhmNGYgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L3R3by1yYWRpby1ncm91cHMucHkKKysrIGIvRGVtby90a2ludGVyL21hdHQvdHdvLXJhZGlvLWdyb3Vwcy5weQpAQCAtMSw0NCArMSw0NCBAQAogZnJvbSBUa2ludGVyIGltcG9ydCAqCiAKLSMJVGhlIHdheSB0byB0aGluayBhYm91dCB0aGlzIGlzIHRoYXQgZWFjaCByYWRpbyBidXR0b24gbWVudQotIwljb250cm9scyBhIGRpZmZlcmVudCB2YXJpYWJsZSAtLSBjbGlja2luZyBvbiBvbmUgb2YgdGhlCi0jCW11dHVhbGx5IGV4Y2x1c2l2ZSBjaG9pY2VzIGluIGEgcmFkaW9idXR0b24gYXNzaWducyBzb21lIHZhbHVlCi0jCXRvIGFuIGFwcGxpY2F0aW9uIHZhcmlhYmxlIHlvdSBwcm92aWRlLiBXaGVuIHlvdSBkZWZpbmUgYQotIwlyYWRpb2J1dHRvbiBtZW51IGNob2ljZSwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBzcGVjaWZ5aW5nIHRoZQotIwluYW1lIG9mIGEgdmFyYWlibGUgYW5kIHZhbHVlIHRvIGFzc2lnbiB0byB0aGF0IHZhcmlhYmxlIHdoZW4KLSMJdGhhdCBjaG9pY2UgaXMgc2VsZWN0ZWQuIFRoaXMgY2xldmVyIG1lY2hhbmlzbSByZWxpZXZlcyB5b3UsCi0jCXRoZSBwcm9ncmFtbWVyLCBmcm9tIGhhdmluZyB0byB3cml0ZSBhIGR1bWIgY2FsbGJhY2sgdGhhdAotIwlwcm9iYWJseSB3b3VsZG4ndCBoYXZlIGRvbmUgYW55dGhpbmcgbW9yZSB0aGFuIGFuIGFzc2lnbm1lbnQKLSMJYW55d2F5LiBUaGUgVGtpbnRlciBvcHRpb25zIGZvciB0aGlzIGZvbGxvdyB0aGVpciBUawotIwljb3VudGVycGFydHM6IAotIwl7InZhcmlhYmxlIiA6IG15X2ZsYXZvcl92YXJpYWJsZSwgInZhbHVlIiA6ICJzdHJhd2JlcnJ5In0KKyMgICAgICAgVGhlIHdheSB0byB0aGluayBhYm91dCB0aGlzIGlzIHRoYXQgZWFjaCByYWRpbyBidXR0b24gbWVudQorIyAgICAgICBjb250cm9scyBhIGRpZmZlcmVudCB2YXJpYWJsZSAtLSBjbGlja2luZyBvbiBvbmUgb2YgdGhlCisjICAgICAgIG11dHVhbGx5IGV4Y2x1c2l2ZSBjaG9pY2VzIGluIGEgcmFkaW9idXR0b24gYXNzaWducyBzb21lIHZhbHVlCisjICAgICAgIHRvIGFuIGFwcGxpY2F0aW9uIHZhcmlhYmxlIHlvdSBwcm92aWRlLiBXaGVuIHlvdSBkZWZpbmUgYQorIyAgICAgICByYWRpb2J1dHRvbiBtZW51IGNob2ljZSwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBzcGVjaWZ5aW5nIHRoZQorIyAgICAgICBuYW1lIG9mIGEgdmFyYWlibGUgYW5kIHZhbHVlIHRvIGFzc2lnbiB0byB0aGF0IHZhcmlhYmxlIHdoZW4KKyMgICAgICAgdGhhdCBjaG9pY2UgaXMgc2VsZWN0ZWQuIFRoaXMgY2xldmVyIG1lY2hhbmlzbSByZWxpZXZlcyB5b3UsCisjICAgICAgIHRoZSBwcm9ncmFtbWVyLCBmcm9tIGhhdmluZyB0byB3cml0ZSBhIGR1bWIgY2FsbGJhY2sgdGhhdAorIyAgICAgICBwcm9iYWJseSB3b3VsZG4ndCBoYXZlIGRvbmUgYW55dGhpbmcgbW9yZSB0aGFuIGFuIGFzc2lnbm1lbnQKKyMgICAgICAgYW55d2F5LiBUaGUgVGtpbnRlciBvcHRpb25zIGZvciB0aGlzIGZvbGxvdyB0aGVpciBUaworIyAgICAgICBjb3VudGVycGFydHM6CisjICAgICAgIHsidmFyaWFibGUiIDogbXlfZmxhdm9yX3ZhcmlhYmxlLCAidmFsdWUiIDogInN0cmF3YmVycnkifQogIyAgICAgICB3aGVyZSBteV9mbGF2b3JfdmFyaWFibGUgaXMgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZQogIyAgICAgICBzdWJjbGFzc2VzIG9mIFZhcmlhYmxlLCBwcm92aWRlZCBpbiBUa2ludGVyLnB5ICh0aGVyZSBpcwotIwlTdHJpbmdWYXIoKSwgSW50VmFyKCksIERvdWJsZVZhcigpIGFuZCBCb29sZWFuVmFyKCkgdG8gY2hvb3NlCi0jCWZyb20pIAorIyAgICAgICBTdHJpbmdWYXIoKSwgSW50VmFyKCksIERvdWJsZVZhcigpIGFuZCBCb29sZWFuVmFyKCkgdG8gY2hvb3NlCisjICAgICAgIGZyb20pCiAKIAogCiBkZWYgbWFrZVBvbGl0aWNhbFBhcnRpZXModmFyKToKLSAgICAjIG1ha2UgbWVudSBidXR0b24gCi0gICAgUmFkaW9idXR0b25fYnV0dG9uID0gTWVudWJ1dHRvbihtQmFyLCB0ZXh0PSdQb2xpdGljYWwgUGFydHknLCAKLQkJCQkgICAgdW5kZXJsaW5lPTApCisgICAgIyBtYWtlIG1lbnUgYnV0dG9uCisgICAgUmFkaW9idXR0b25fYnV0dG9uID0gTWVudWJ1dHRvbihtQmFyLCB0ZXh0PSdQb2xpdGljYWwgUGFydHknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lPTApCiAgICAgUmFkaW9idXR0b25fYnV0dG9uLnBhY2soc2lkZT1MRUZULCBwYWR4PScybScpCi0gICAgCisKICAgICAjIHRoZSBwcmltYXJ5IHB1bGxkb3duCiAgICAgUmFkaW9idXR0b25fYnV0dG9uLm1lbnUgPSBNZW51KFJhZGlvYnV0dG9uX2J1dHRvbikKIAotICAgIFJhZGlvYnV0dG9uX2J1dHRvbi5tZW51LmFkZF9yYWRpb2J1dHRvbihsYWJlbD0nUmVwdWJsaWNhbicsIAotCQkJCQkgICAgdmFyaWFibGU9dmFyLCB2YWx1ZT0xKQorICAgIFJhZGlvYnV0dG9uX2J1dHRvbi5tZW51LmFkZF9yYWRpb2J1dHRvbihsYWJlbD0nUmVwdWJsaWNhbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlPXZhciwgdmFsdWU9MSkKIAotICAgIFJhZGlvYnV0dG9uX2J1dHRvbi5tZW51LmFkZCgncmFkaW9idXR0b24nLCB7J2xhYmVsJzogJ0RlbW9jcmF0JywgCi0JCQkJCQkndmFyaWFibGUnIDogdmFyLCAKLQkJCQkJCSd2YWx1ZScgOiAyfSkKKyAgICBSYWRpb2J1dHRvbl9idXR0b24ubWVudS5hZGQoJ3JhZGlvYnV0dG9uJywgeydsYWJlbCc6ICdEZW1vY3JhdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFyaWFibGUnIDogdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyA6IDJ9KQogCi0gICAgUmFkaW9idXR0b25fYnV0dG9uLm1lbnUuYWRkKCdyYWRpb2J1dHRvbicsIHsnbGFiZWwnOiAnTGliZXJ0YXJpYW4nLCAKLQkJCQkJCSd2YXJpYWJsZScgOiB2YXIsIAotCQkJCQkJJ3ZhbHVlJyA6IDN9KQotICAgIAorICAgIFJhZGlvYnV0dG9uX2J1dHRvbi5tZW51LmFkZCgncmFkaW9idXR0b24nLCB7J2xhYmVsJzogJ0xpYmVydGFyaWFuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YXJpYWJsZScgOiB2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnIDogM30pCisKICAgICB2YXIuc2V0KDIpCiAKICAgICAjIHNldCB1cCBhIHBvaW50ZXIgZnJvbSB0aGUgZmlsZSBtZW51YnV0dG9uIGJhY2sgdG8gdGhlIGZpbGUgbWVudQpAQCAtNDgsMjIgKzQ4LDIyIEBACiAKIAogZGVmIG1ha2VGbGF2b3JzKHZhcik6Ci0gICAgIyBtYWtlIG1lbnUgYnV0dG9uIAotICAgIFJhZGlvYnV0dG9uX2J1dHRvbiA9IE1lbnVidXR0b24obUJhciwgdGV4dD0nRmxhdm9ycycsIAotCQkJCSAgICB1bmRlcmxpbmU9MCkKKyAgICAjIG1ha2UgbWVudSBidXR0b24KKyAgICBSYWRpb2J1dHRvbl9idXR0b24gPSBNZW51YnV0dG9uKG1CYXIsIHRleHQ9J0ZsYXZvcnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lPTApCiAgICAgUmFkaW9idXR0b25fYnV0dG9uLnBhY2soc2lkZT1MRUZULCBwYWR4PScybScpCiAKICAgICAjIHRoZSBwcmltYXJ5IHB1bGxkb3duCiAgICAgUmFkaW9idXR0b25fYnV0dG9uLm1lbnUgPSBNZW51KFJhZGlvYnV0dG9uX2J1dHRvbikKIAogICAgIFJhZGlvYnV0dG9uX2J1dHRvbi5tZW51LmFkZF9yYWRpb2J1dHRvbihsYWJlbD0nU3RyYXdiZXJyeScsCi0JCQkJCSAgICB2YXJpYWJsZT12YXIsIHZhbHVlPSdTdHJhd2JlcnJ5JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU9dmFyLCB2YWx1ZT0nU3RyYXdiZXJyeScpCiAKICAgICBSYWRpb2J1dHRvbl9idXR0b24ubWVudS5hZGRfcmFkaW9idXR0b24obGFiZWw9J0Nob2NvbGF0ZScsCi0JCQkJCSAgICB2YXJpYWJsZT12YXIsIHZhbHVlPSdDaG9jb2xhdGUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT12YXIsIHZhbHVlPSdDaG9jb2xhdGUnKQogCiAgICAgUmFkaW9idXR0b25fYnV0dG9uLm1lbnUuYWRkX3JhZGlvYnV0dG9uKGxhYmVsPSdSb2NreSBSb2FkJywKLQkJCQkJICAgIHZhcmlhYmxlPXZhciwgdmFsdWU9J1JvY2t5IFJvYWQnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT12YXIsIHZhbHVlPSdSb2NreSBSb2FkJykKIAogICAgICMgY2hvb3NlIGEgZGVmYXVsdAogICAgIHZhci5zZXQoIkNob2NvbGF0ZSIpCkBAIC04OCw3ICs4OCw3IEBACiBtQmFyID0gRnJhbWUocm9vdCwgcmVsaWVmPVJBSVNFRCwgYm9yZGVyd2lkdGg9MikKIG1CYXIucGFjayhmaWxsPVgpCiAKLSMgbWFrZSB0d28gYXBwbGljYXRpb24gdmFyaWFibGVzLCAKKyMgbWFrZSB0d28gYXBwbGljYXRpb24gdmFyaWFibGVzLAogIyBvbmUgdG8gY29udHJvbCBlYWNoIHJhZGlvIGJ1dHRvbiBzZXQKIHBhcnR5ID0gSW50VmFyKCkKIGZsYXZvciA9IFN0cmluZ1ZhcigpCkBAIC05NiwxMiArOTYsMTIgQEAKIFJhZGlvYnV0dG9uX2J1dHRvbiA9IG1ha2VQb2xpdGljYWxQYXJ0aWVzKHBhcnR5KQogUmFkaW9idXR0b25fYnV0dG9uMiA9IG1ha2VGbGF2b3JzKGZsYXZvcikKIAotIyBmaW5hbGx5LCBpbnN0YWxsIHRoZSBidXR0b25zIGluIHRoZSBtZW51IGJhci4gCisjIGZpbmFsbHksIGluc3RhbGwgdGhlIGJ1dHRvbnMgaW4gdGhlIG1lbnUgYmFyLgogIyBUaGlzIGFsbG93cyBmb3Igc2Nhbm5pbmcgZnJvbSBvbmUgbWVudWJ1dHRvbiB0byB0aGUgbmV4dC4KIG1CYXIudGtfbWVudUJhcihSYWRpb2J1dHRvbl9idXR0b24sIFJhZGlvYnV0dG9uX2J1dHRvbjIpCiAKIGIgPSBCdXR0b24ocm9vdCwgdGV4dD0icHJpbnQgcGFydHkgYW5kIGZsYXZvciIsIGZvcmVncm91bmQ9InJlZCIsCi0JICAgY29tbWFuZD1wcmludFN0dWZmKQorICAgICAgICAgICBjb21tYW5kPXByaW50U3R1ZmYpCiBiLnBhY2soc2lkZT1UT1ApCiAKIHJvb3QudGl0bGUoJ21lbnUgZGVtbycpCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC93aW5kb3ctY3JlYXRpb24tbW9yZS5weSBiL0RlbW8vdGtpbnRlci9tYXR0L3dpbmRvdy1jcmVhdGlvbi1tb3JlLnB5CmluZGV4IDQ5MjAyN2EuLmViMGViNmYgMTAwNjQ0Ci0tLSBhL0RlbW8vdGtpbnRlci9tYXR0L3dpbmRvdy1jcmVhdGlvbi1tb3JlLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L3dpbmRvdy1jcmVhdGlvbi1tb3JlLnB5CkBAIC01LDMxICs1LDMxIEBACiAKIGNsYXNzIFRlc3QoRnJhbWUpOgogICAgIGRlZiBwcmludGl0KHNlbGYpOgotCXByaW50ICJoaSIKKyAgICAgICAgcHJpbnQgImhpIgogCiAgICAgZGVmIG1ha2VXaW5kb3coc2VsZik6Ci0JZnJlZCA9IFRvcGxldmVsKCkKLQlmcmVkLmxhYmVsID0gQnV0dG9uKGZyZWQsCi0JCQkgICAgdGV4dD0iVGhpcyBpcyB3aW5kb3cgbnVtYmVyICVkLiIgJSBzZWxmLndpbmRvd251bSwgCi0JCQkgICAgY29tbWFuZD1zZWxmLm1ha2VXaW5kb3cpCi0JZnJlZC5sYWJlbC5wYWNrKCkKLQlzZWxmLndpbmRvd251bSA9IHNlbGYud2luZG93bnVtICsgMQorICAgICAgICBmcmVkID0gVG9wbGV2ZWwoKQorICAgICAgICBmcmVkLmxhYmVsID0gQnV0dG9uKGZyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iVGhpcyBpcyB3aW5kb3cgbnVtYmVyICVkLiIgJSBzZWxmLndpbmRvd251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYubWFrZVdpbmRvdykKKyAgICAgICAgZnJlZC5sYWJlbC5wYWNrKCkKKyAgICAgICAgc2VsZi53aW5kb3dudW0gPSBzZWxmLndpbmRvd251bSArIDEKIAogICAgIGRlZiBjcmVhdGVXaWRnZXRzKHNlbGYpOgotCXNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywgCi0JCQkgICBjb21tYW5kPXNlbGYucXVpdCkKLQlzZWxmLlFVSVQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5RVUlUID0gQnV0dG9uKHNlbGYsIHRleHQ9J1FVSVQnLCBmb3JlZ3JvdW5kPSdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIHNlbGYuUVVJVC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RIKQogCi0JIyBhIGhlbGxvIGJ1dHRvbgotCXNlbGYuaGlfdGhlcmUgPSBCdXR0b24oc2VsZiwgdGV4dD0nTWFrZSBhIE5ldyBXaW5kb3cnLCAKLQkJCSAgICAgICBjb21tYW5kPXNlbGYubWFrZVdpbmRvdykKLQlzZWxmLmhpX3RoZXJlLnBhY2soc2lkZT1MRUZUKQorICAgICAgICAjIGEgaGVsbG8gYnV0dG9uCisgICAgICAgIHNlbGYuaGlfdGhlcmUgPSBCdXR0b24oc2VsZiwgdGV4dD0nTWFrZSBhIE5ldyBXaW5kb3cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5tYWtlV2luZG93KQorICAgICAgICBzZWxmLmhpX3RoZXJlLnBhY2soc2lkZT1MRUZUKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKLQlGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCi0JUGFjay5jb25maWcoc2VsZikKLQlzZWxmLndpbmRvd251bSA9IDAgCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBQYWNrLmNvbmZpZyhzZWxmKQorICAgICAgICBzZWxmLndpbmRvd251bSA9IDAKKyAgICAgICAgc2VsZi5jcmVhdGVXaWRnZXRzKCkKIAogdGVzdCA9IFRlc3QoKQogdGVzdC5tYWlubG9vcCgpCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvbWF0dC93aW5kb3ctY3JlYXRpb24tc2ltcGxlLnB5IGIvRGVtby90a2ludGVyL21hdHQvd2luZG93LWNyZWF0aW9uLXNpbXBsZS5weQppbmRleCA5NjlmZWZiLi5jOTkwZWQ5IDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvbWF0dC93aW5kb3ctY3JlYXRpb24tc2ltcGxlLnB5CisrKyBiL0RlbW8vdGtpbnRlci9tYXR0L3dpbmRvdy1jcmVhdGlvbi1zaW1wbGUucHkKQEAgLTQsMjggKzQsMjggQEAKIAogY2xhc3MgVGVzdChGcmFtZSk6CiAgICAgZGVmIHByaW50aXQoc2VsZik6Ci0JcHJpbnQgImhpIgorICAgICAgICBwcmludCAiaGkiCiAKICAgICBkZWYgbWFrZVdpbmRvdyhzZWxmKToKLQlmcmVkID0gVG9wbGV2ZWwoKQotCWZyZWQubGFiZWwgPSBMYWJlbChmcmVkLCB0ZXh0PSJIZXJlJ3MgYSBuZXcgd2luZG93IikKLQlmcmVkLmxhYmVsLnBhY2soKQorICAgICAgICBmcmVkID0gVG9wbGV2ZWwoKQorICAgICAgICBmcmVkLmxhYmVsID0gTGFiZWwoZnJlZCwgdGV4dD0iSGVyZSdzIGEgbmV3IHdpbmRvdyIpCisgICAgICAgIGZyZWQubGFiZWwucGFjaygpCiAKICAgICBkZWYgY3JlYXRlV2lkZ2V0cyhzZWxmKToKLQlzZWxmLlFVSVQgPSBCdXR0b24oc2VsZiwgdGV4dD0nUVVJVCcsIGZvcmVncm91bmQ9J3JlZCcsIAotCQkJICAgY29tbWFuZD1zZWxmLnF1aXQpCi0JCi0Jc2VsZi5RVUlULnBhY2soc2lkZT1MRUZULCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuUVVJVCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRVUlUJywgZm9yZWdyb3VuZD0ncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5xdWl0KQogCi0JIyBhIGhlbGxvIGJ1dHRvbgotCXNlbGYuaGlfdGhlcmUgPSBCdXR0b24oc2VsZiwgdGV4dD0nTWFrZSBhIE5ldyBXaW5kb3cnLCAKLQkJCSAgICAgICBjb21tYW5kPXNlbGYubWFrZVdpbmRvdykKLQlzZWxmLmhpX3RoZXJlLnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLlFVSVQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCkKKworICAgICAgICAjIGEgaGVsbG8gYnV0dG9uCisgICAgICAgIHNlbGYuaGlfdGhlcmUgPSBCdXR0b24oc2VsZiwgdGV4dD0nTWFrZSBhIE5ldyBXaW5kb3cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5tYWtlV2luZG93KQorICAgICAgICBzZWxmLmhpX3RoZXJlLnBhY2soc2lkZT1MRUZUKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKLQlGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCi0JUGFjay5jb25maWcoc2VsZikKLQlzZWxmLmNyZWF0ZVdpZGdldHMoKQorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIFBhY2suY29uZmlnKHNlbGYpCisgICAgICAgIHNlbGYuY3JlYXRlV2lkZ2V0cygpCiAKIHRlc3QgPSBUZXN0KCkKIHRlc3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL21hdHQvd2luZG93LWNyZWF0aW9uLXctbG9jYXRpb24ucHkgYi9EZW1vL3RraW50ZXIvbWF0dC93aW5kb3ctY3JlYXRpb24tdy1sb2NhdGlvbi5weQppbmRleCAwZWM0ZTA5Li4zZjJiNWIwIDEwMDY0NAotLS0gYS9EZW1vL3RraW50ZXIvbWF0dC93aW5kb3ctY3JlYXRpb24tdy1sb2NhdGlvbi5weQorKysgYi9EZW1vL3RraW50ZXIvbWF0dC93aW5kb3ctY3JlYXRpb24tdy1sb2NhdGlvbi5weQpAQCAtMTcsMjkgKzE3LDI5IEBACiAKIGNsYXNzIFRlc3QoRnJhbWUpOgogICAgIGRlZiBtYWtlV2luZG93KHNlbGYsICphcmdzKToKLQlmcmVkID0gVG9wbGV2ZWwoKQorICAgICAgICBmcmVkID0gVG9wbGV2ZWwoKQogCi0JZnJlZC5sYWJlbCA9IENhbnZhcyAoZnJlZCwgd2lkdGg9IjJpIiwgaGVpZ2h0PSIyaSIpCisgICAgICAgIGZyZWQubGFiZWwgPSBDYW52YXMgKGZyZWQsIHdpZHRoPSIyaSIsIGhlaWdodD0iMmkiKQogCi0JZnJlZC5sYWJlbC5jcmVhdGVfbGluZSgiMCIsICIwIiwgIjJpIiwgIjJpIikKLQlmcmVkLmxhYmVsLmNyZWF0ZV9saW5lKCIwIiwgIjJpIiwgIjJpIiwgIjAiKQotCWZyZWQubGFiZWwucGFjaygpCisgICAgICAgIGZyZWQubGFiZWwuY3JlYXRlX2xpbmUoIjAiLCAiMCIsICIyaSIsICIyaSIpCisgICAgICAgIGZyZWQubGFiZWwuY3JlYXRlX2xpbmUoIjAiLCAiMmkiLCAiMmkiLCAiMCIpCisgICAgICAgIGZyZWQubGFiZWwucGFjaygpCiAKLQkjI2NlbnRlcldpbmRvdyhmcmVkLCBzZWxmLm1hc3RlcikKKyAgICAgICAgIyNjZW50ZXJXaW5kb3coZnJlZCwgc2VsZi5tYXN0ZXIpCiAKICAgICBkZWYgY3JlYXRlV2lkZ2V0cyhzZWxmKToKLQlzZWxmLlFVSVQgPSBRdWl0QnV0dG9uKHNlbGYpCi0Jc2VsZi5RVUlULnBhY2soc2lkZT1MRUZULCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuUVVJVCA9IFF1aXRCdXR0b24oc2VsZikKKyAgICAgICAgc2VsZi5RVUlULnBhY2soc2lkZT1MRUZULCBmaWxsPUJPVEgpCiAKLQlzZWxmLm1ha2VXaW5kb3cgPSBCdXR0b24oc2VsZiwgdGV4dD0nTWFrZSBhIE5ldyBXaW5kb3cnLAotCQkJCSB3aWR0aD01MCwgaGVpZ2h0PTIwLAotCQkJCSBjb21tYW5kPXNlbGYubWFrZVdpbmRvdykKLQlzZWxmLm1ha2VXaW5kb3cucGFjayhzaWRlPUxFRlQpCisgICAgICAgIHNlbGYubWFrZVdpbmRvdyA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdNYWtlIGEgTmV3IFdpbmRvdycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD01MCwgaGVpZ2h0PTIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLm1ha2VXaW5kb3cpCisgICAgICAgIHNlbGYubWFrZVdpbmRvdy5wYWNrKHNpZGU9TEVGVCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6Ci0JRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQotCVBhY2suY29uZmlnKHNlbGYpCi0Jc2VsZi5jcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBQYWNrLmNvbmZpZyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZVdpZGdldHMoKQogCiB0ZXN0ID0gVGVzdCgpCiB0ZXN0Lm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL0RlbW8veG1sL2VsZW1fY291bnQucHkgYi9EZW1vL3htbC9lbGVtX2NvdW50LnB5CmluZGV4IDQzMTYxOTkuLjdiNTMxODkgMTAwNjQ0Ci0tLSBhL0RlbW8veG1sL2VsZW1fY291bnQucHkKKysrIGIvRGVtby94bWwvZWxlbV9jb3VudC5weQpAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICBmb3IgcGFpciBpbiAgc2VsZi5fYXR0cl90eXBlcy5pdGVtcygpOgogICAgICAgICAgICAgcHJpbnQgIiUyMHMgJWQiICUgcGFpcgogCi0gICAgICAgICAgICAKKwogcGFyc2VyID0gbWFrZV9wYXJzZXIoKQogcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKEZhbmN5Q291bnRlcigpKQogcGFyc2VyLnBhcnNlKHN5cy5hcmd2WzFdKQpkaWZmIC0tZ2l0IGEvRGVtby94bWwvcm91bmR0cmlwLnB5IGIvRGVtby94bWwvcm91bmR0cmlwLnB5CmluZGV4IGU0MmJmMWIuLjhkN2Q0MzcgMTAwNjQ0Ci0tLSBhL0RlbW8veG1sL3JvdW5kdHJpcC5weQorKysgYi9EZW1vL3htbC9yb3VuZHRyaXAucHkKQEAgLTE2LDcgKzE2LDcgQEAKICAgICAgICAgc2VsZi5fb3V0ID0gb3V0CiAKICAgICAjIENvbnRlbnRIYW5kbGVyIG1ldGhvZHMKLSAgICAgICAgCisKICAgICBkZWYgc3RhcnREb2N1bWVudChzZWxmKToKICAgICAgICAgc2VsZi5fb3V0LndyaXRlKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+XG4nKQogCkBAIC0zNCw3ICszNCw3IEBACiAKICAgICBkZWYgaWdub3JhYmxlV2hpdGVzcGFjZShzZWxmLCBjb250ZW50KToKICAgICAgICAgc2VsZi5fb3V0LndyaXRlKGNvbnRlbnQpCi0gICAgICAgIAorCiAgICAgZGVmIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihzZWxmLCB0YXJnZXQsIGRhdGEpOgogICAgICAgICBzZWxmLl9vdXQud3JpdGUoJzw/JXMgJXM/PicgJSAodGFyZ2V0LCBkYXRhKSkKIApkaWZmIC0tZ2l0IGEvRGVtby94bWwvcnNzMmh0bWwucHkgYi9EZW1vL3htbC9yc3MyaHRtbC5weQppbmRleCBkZjVkMWM3Li4xNWM5ODkxIDEwMDY0NAotLS0gYS9EZW1vL3htbC9yc3MyaHRtbC5weQorKysgYi9EZW1vL3htbC9yc3MyaHRtbC5weQpAQCAtODAsNyArODAsNyBAQAogCiAgICAgICAgIGlmIG5hbWUgPT0gInJzcyI6CiAgICAgICAgICAgICBzZWxmLl9vdXQud3JpdGUoYm90dG9tKQotICAgICAgICAgICAgICAgIAorCiAgICAgZGVmIGNoYXJhY3RlcnMoc2VsZiwgY29udGVudCk6CiAgICAgICAgIHNlbGYuX3RleHQgPSBzZWxmLl90ZXh0ICsgY29udGVudAogCmRpZmYgLS1naXQgYS9EZW1vL3psaWIvbWluaWd6aXAucHkgYi9EZW1vL3psaWIvbWluaWd6aXAucHkKaW5kZXggZGM5OWQ5Yi4uZTI4MDFkZSAxMDA3NTUKLS0tIGEvRGVtby96bGliL21pbmlnemlwLnB5CisrKyBiL0RlbW8vemxpYi9taW5pZ3ppcC5weQpAQCAtOSw3ICs5LDcgQEAKICAgICBvdXRwdXQud3JpdGUoY2hyKHZhbHVlICYgMjU1KSkgOyB2YWx1ZT12YWx1ZSAvIDI1NgogICAgIG91dHB1dC53cml0ZShjaHIodmFsdWUgJiAyNTUpKSA7IHZhbHVlPXZhbHVlIC8gMjU2CiAgICAgb3V0cHV0LndyaXRlKGNocih2YWx1ZSAmIDI1NSkpCi0gICAgCisKIGRlZiByZWFkMzIoaW5wdXQpOgogICAgIHY9b3JkKGlucHV0LnJlYWQoMSkpCiAgICAgdj12KyAob3JkKGlucHV0LnJlYWQoMSkpPDw4ICkKQEAgLTE5LDkgKzE5LDkgQEAKIAogaW1wb3J0IHpsaWIsIHN5cwogaWYgbGVuKHN5cy5hcmd2KSE9MjoKLSAgIHByaW50ICdVc2FnZTogbWluaWd6aXAucHkgPGZpbGVuYW1lPicKLSAgIHByaW50ICcgIFRoZSBmaWxlIHdpbGwgYmUgY29tcHJlc3NlZCBvciBkZWNvbXByZXNzZWQuJwotICAgc3lzLmV4aXQoMCkKKyAgICBwcmludCAnVXNhZ2U6IG1pbmlnemlwLnB5IDxmaWxlbmFtZT4nCisgICAgcHJpbnQgJyAgVGhlIGZpbGUgd2lsbCBiZSBjb21wcmVzc2VkIG9yIGRlY29tcHJlc3NlZC4nCisgICAgc3lzLmV4aXQoMCkKIAogZmlsZW5hbWU9c3lzLmFyZ3ZbMV0KIGNvbXByZXNzaW5nPTEgOyBvdXRwdXRuYW1lPWZpbGVuYW1lKycuZ3onCkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYSBmbGFncywgYW5kIE9TIGJ5dGUuCiAgICAgaWYgZmxhZyAmIEZFWFRSQToKICAgICAgICAgIyBSZWFkICYgZGlzY2FyZCB0aGUgZXh0cmEgZmllbGQsIGlmIHByZXNlbnQKLSAgICAgICAgeGxlbj1vcmQoaW5wdXQucmVhZCgxKSkgICAgICAgICAKKyAgICAgICAgeGxlbj1vcmQoaW5wdXQucmVhZCgxKSkKICAgICAgICAgeGxlbj14bGVuKzI1NipvcmQoaW5wdXQucmVhZCgxKSkKICAgICAgICAgaW5wdXQucmVhZCh4bGVuKQogICAgIGlmIGZsYWcgJiBGTkFNRToKQEAgLTkyLDExICs5MiwxMSBAQAogICAgIGRlY29tcGRhdGE9ZGVjb21wb2JqLmZsdXNoKCkKICAgICBvdXRwdXQud3JpdGUoZGVjb21wZGF0YSkgOyBsZW5ndGg9bGVuZ3RoK2xlbihkZWNvbXBkYXRhKQogICAgIGNyY3ZhbD16bGliLmNyYzMyKGRlY29tcGRhdGEsIGNyY3ZhbCkKLSAgICAKKwogICAgICMgV2UndmUgcmVhZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBzbyB3ZSBoYXZlIHRvIHJld2luZCBpbiBvcmRlcgogICAgICMgdG8gcmVyZWFkIHRoZSA4IGJ5dGVzIGNvbnRhaW5pbmcgdGhlIENSQyBhbmQgdGhlIGZpbGUgc2l6ZS4gIFRoZQogICAgICMgZGVjb21wcmVzc29yIGlzIHNtYXJ0IGFuZCBrbm93cyB3aGVuIHRvIHN0b3AsIHNvIGZlZWRpbmcgaXQKLSAgICAjIGV4dHJhIGRhdGEgaXMgaGFybWxlc3MuICAKKyAgICAjIGV4dHJhIGRhdGEgaXMgaGFybWxlc3MuCiAgICAgaW5wdXQuc2VlaygtOCwgMikKICAgICBjcmMzMj1yZWFkMzIoaW5wdXQpCiAgICAgaXNpemU9cmVhZDMyKGlucHV0KQpAQCAtMTA0LDQgKzEwNCwzIEBACiAgICAgaWYgaXNpemUhPWxlbmd0aDogcHJpbnQgJ0luY29ycmVjdCBsZW5ndGggb2YgZGF0YSBwcm9kdWNlZCcKIAogaW5wdXQuY2xvc2UoKSA7IG91dHB1dC5jbG9zZSgpCi0KZGlmZiAtLWdpdCBhL0RlbW8vemxpYi96bGliZGVtby5weSBiL0RlbW8vemxpYi96bGliZGVtby5weQppbmRleCA3YzU2ZTNlLi41YTBhYjYzIDEwMDc1NQotLS0gYS9EZW1vL3psaWIvemxpYmRlbW8ucHkKKysrIGIvRGVtby96bGliL3psaWJkZW1vLnB5CkBAIC00LDcgKzQsNyBAQAogaWYgbGVuKHN5cy5hcmd2KT4xOiBmaWxlbmFtZT1zeXMuYXJndlsxXQogZWxzZTogZmlsZW5hbWU9J3psaWJkZW1vLnB5JwogcHJpbnQgJ1JlYWRpbmcnLCBmaWxlbmFtZQotZj1vcGVuKGZpbGVuYW1lLCAncicpCQkjIEdldCB0aGUgZGF0YSB0byBjb21wcmVzcworZj1vcGVuKGZpbGVuYW1lLCAncicpICAgICAgICAgICAjIEdldCB0aGUgZGF0YSB0byBjb21wcmVzcwogcz1mLnJlYWQoKQogZi5jbG9zZSgpCiAKQEAgLTI0LDcgKzI0LDcgQEAKIGNvbXB0ZXh0PWRlY29tcD0nJwogZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHMpLCBjaHVuayk6CiAgICAgY29tcHRleHQ9Y29tcHRleHQrY29tcHJlc3Nvci5jb21wcmVzcyhzW2k6aStjaHVua10pCi1jb21wdGV4dD1jb21wdGV4dCtjb21wcmVzc29yLmZsdXNoKCkJIyBEb24ndCBmb3JnZXQgdG8gY2FsbCBmbHVzaCgpISEKK2NvbXB0ZXh0PWNvbXB0ZXh0K2NvbXByZXNzb3IuZmx1c2goKSAgICAjIERvbid0IGZvcmdldCB0byBjYWxsIGZsdXNoKCkhIQogCiBmb3IgaSBpbiByYW5nZSgwLCBsZW4oY29tcHRleHQpLCBjaHVuayk6CiAgICAgZGVjb21wPWRlY29tcCtkZWNvbXByZXNzb3IuZGVjb21wcmVzcyhjb21wdGV4dFtpOmkrY2h1bmtdKQpAQCAtMzMsNCArMzMsMyBAQAogcHJpbnQgJ1Byb2dyZXNzaXZlIGNvbXByZXNzaW9uIChsZXZlbCA5KTonCiBwcmludCAnICAgIE9yaWdpbmFsOicsIGxlbihzKSwgJ0NvbXByZXNzZWQ6JywgbGVuKGNvbXB0ZXh0KSwKIHByaW50ICdVbmNvbXByZXNzZWQ6JywgbGVuKGRlY29tcCkKLQpkaWZmIC0tZ2l0IGEvTGliL190aHJlYWRpbmdfbG9jYWwucHkgYi9MaWIvX3RocmVhZGluZ19sb2NhbC5weQppbmRleCAyMDljMDM1Li5jOTBmZGUwIDEwMDY0NAotLS0gYS9MaWIvX3RocmVhZGluZ19sb2NhbC5weQorKysgYi9MaWIvX3RocmVhZGluZ19sb2NhbC5weQpAQCAtODEsNyArODEsNyBAQAogICAyCiAKIGFuIGluaXRpYWwgY29sb3I6Ci0gICAgCisKICAgPj4+IG15ZGF0YS5jb2xvcgogICAncmVkJwogICA+Pj4gZGVsIG15ZGF0YS5jb2xvcgpAQCAtMjE2LDcgKzIxNiw3IEBACiAgICAgICAgICAgICAgICAgIyBpZiBlbnVtZXJhdGUgZmFpbHMsIGFzIGl0IHNlZW1zIHRvIGRvIGR1cmluZwogICAgICAgICAgICAgICAgICMgc2h1dGRvd24sIHdlJ2xsIHNraXAgY2xlYW51cCB1bmRlciB0aGUgYXNzdW1wdGlvbgogICAgICAgICAgICAgICAgICMgdGhhdCB0aGVyZSBpcyBub3RoaW5nIHRvIGNsZWFuIHVwCi0gICAgICAgICAgICAgICAgcmV0dXJuIAorICAgICAgICAgICAgICAgIHJldHVybgogCiAgICAgICAgICAgICBmb3IgdGhyZWFkIGluIHRocmVhZHM6CiAgICAgICAgICAgICAgICAgdHJ5OgpAQCAtMjI4LDcgKzIyOCw3IEBACiAgICAgICAgICAgICAgICAgaWYga2V5IGluIF9fZGljdF9fOgogICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgX19kaWN0X19ba2V5XQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6IAorICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzICMgZGlkbid0IGhhdmUgYW55dGhpbmcgaW4gdGhpcyB0aHJlYWQKIAogICAgICAgICByZXR1cm4gX19kZWxfXwpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jb3JlLnB5IGIvTGliL2FzeW5jb3JlLnB5CmluZGV4IDVmNjAyMTkuLjRmYjEyZjEgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY29yZS5weQorKysgYi9MaWIvYXN5bmNvcmUucHkKQEAgLTI2OCw3ICsyNjgsNyBAQAogICAgICAgICAgICAgICAgIHJldXNlX2NvbnN0YW50ID0gc29ja2V0LlNPX0VYQ0xVU0lWRUFERFJVU0UKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmV1c2VfY29uc3RhbnQgPSBzb2NrZXQuU09fUkVVU0VBRERSCi0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgIHNlbGYuc29ja2V0LnNldHNvY2tvcHQoCiAgICAgICAgICAgICAgICAgc29ja2V0LlNPTF9TT0NLRVQsIHJldXNlX2NvbnN0YW50LAogICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsCkBAIC0yNzYsNyArMjc2LDcgQEAKICAgICAgICAgICAgICAgICApCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CiAgICAgICAgICAgICBwYXNzCi0gICAgICAgIAorCiAgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICMgcHJlZGljYXRlcyBmb3Igc2VsZWN0KCkKICAgICAjIHRoZXNlIGFyZSB1c2VkIGFzIGZpbHRlcnMgZm9yIHRoZSBsaXN0cyBvZiBzb2NrZXRzCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5CmluZGV4IDA5NTcxYWIuLjE1NTcwNWQgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5CkBAIC0zMDEsNyArMzAxLDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHR4biA9IE5vbmUKICAgICAgICAgYyA9IHNlbGYuZC5jdXJzb3IodHhuPXR4bikKLSAgICAgICAgCisKICAgICAgICAgcmVjID0gYy5maXJzdCgpCiAgICAgICAgIGNvdW50ID0gMAogICAgICAgICB3aGlsZSByZWMgaXMgbm90IE5vbmU6CkBAIC0zMTgsNyArMzE4LDcgQEAKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZXhwZWN0ZWQgREJOb3RGb3VuZEVycm9yIikKICAgICAgICAgICAgIGFzc2VydCBjLmdldF9jdXJyZW50X3NpemUoKSA9PSBsZW4oYy5jdXJyZW50KClbMV0pLCAiJXMgIT0gbGVuKCVyKSIgJSAoYy5nZXRfY3VycmVudF9zaXplKCksIGMuY3VycmVudCgpWzFdKQotICAgICAgICAKKwogICAgICAgICBhc3NlcnQgY291bnQgPT0gc2VsZi5fbnVtS2V5cwogCiAKQEAgLTM1MSw3ICszNTEsNyBAQAogICAgICAgICByZWMgPSBjLnNldCgnZW1wdHkgdmFsdWUnKQogICAgICAgICBhc3NlcnQgcmVjWzFdID09ICcnCiAgICAgICAgIGFzc2VydCBjLmdldF9jdXJyZW50X3NpemUoKSA9PSAwCi0gICAgICAgIAorCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG4gPSBjLnNldCgnYmFkIGtleScpCiAgICAgICAgIGV4Y2VwdCBkYi5EQk5vdEZvdW5kRXJyb3IsIHZhbDoKZGlmZiAtLWdpdCBhL0xpYi9jZ2l0Yi5weSBiL0xpYi9jZ2l0Yi5weQppbmRleCBkMjg3MDAxLi5kYjQ2YjI1IDEwMDY0NAotLS0gYS9MaWIvY2dpdGIucHkKKysrIGIvTGliL2NnaXRiLnB5CkBAIC00MiwxMyArNDIsMTMgQEAKICAgICAgICAgcmV0dXJuICc8c21hbGw+JyArIHRleHQgKyAnPC9zbWFsbD4nCiAgICAgZWxzZToKICAgICAgICAgcmV0dXJuICcnCi0gICAgCisKIGRlZiBzdHJvbmcodGV4dCk6CiAgICAgaWYgdGV4dDoKICAgICAgICAgcmV0dXJuICc8c3Ryb25nPicgKyB0ZXh0ICsgJzwvc3Ryb25nPicKICAgICBlbHNlOgogICAgICAgICByZXR1cm4gJycKLSAgICAKKwogZGVmIGdyZXkodGV4dCk6CiAgICAgaWYgdGV4dDoKICAgICAgICAgcmV0dXJuICc8Zm9udCBjb2xvcj0iIzkwOTA5MCI+JyArIHRleHQgKyAnPC9mb250PicKZGlmZiAtLWdpdCBhL0xpYi9jdXJzZXMvX19pbml0X18ucHkgYi9MaWIvY3Vyc2VzL19faW5pdF9fLnB5CmluZGV4IDE4MzhkZTguLmFiYTU0MGIgMTAwNjQ0Ci0tLSBhL0xpYi9jdXJzZXMvX19pbml0X18ucHkKKysrIGIvTGliL2N1cnNlcy9fX2luaXRfXy5weQpAQCAtNyw3ICs3LDcgQEAKICAgIGZyb20gY3Vyc2VzIGltcG9ydCB0ZXh0cGFkCiAgICBjdXJzZXMuaW5pdHdpbigpCiAgICAuLi4KLSAgIAorCiAiIiIKIAogX19yZXZpc2lvbl9fID0gIiRJZCQiCkBAIC0yOSwxMyArMjksMTMgQEAKICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBfY3Vyc2VzLl9fZGljdF9fLml0ZW1zKCk6CiAgICAgICAgIGlmIGtleVswOjRdID09ICdBQ1NfJyBvciBrZXkgaW4gKCdMSU5FUycsICdDT0xTJyk6CiAgICAgICAgICAgICBzZXRhdHRyKGN1cnNlcywga2V5LCB2YWx1ZSkKLSAgICAKKwogICAgIHJldHVybiBzdGRzY3IKIAogIyBUaGlzIGlzIGEgc2ltaWxhciB3cmFwcGVyIGZvciBzdGFydF9jb2xvcigpLCB3aGljaCBhZGRzIHRoZSBDT0xPUlMgYW5kCiAjIENPTE9SX1BBSVJTIHZhcmlhYmxlcyB3aGljaCBhcmUgb25seSBhdmFpbGFibGUgYWZ0ZXIgc3RhcnRfY29sb3IoKSBpcwogIyBjYWxsZWQuCi0gCisKIGRlZiBzdGFydF9jb2xvcigpOgogICAgIGltcG9ydCBfY3Vyc2VzLCBjdXJzZXMKICAgICByZXR2YWwgPSBfY3Vyc2VzLnN0YXJ0X2NvbG9yKCkKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgY3Vyc2VzLkNPTE9SUyA9IF9jdXJzZXMuQ09MT1JTCiAgICAgaWYgaGFzYXR0cihfY3Vyc2VzLCAnQ09MT1JfUEFJUlMnKToKICAgICAgICAgY3Vyc2VzLkNPTE9SX1BBSVJTID0gX2N1cnNlcy5DT0xPUl9QQUlSUwotICAgIHJldHVybiByZXR2YWwgCisgICAgcmV0dXJuIHJldHZhbAogCiAjIEltcG9ydCBQeXRob24gaGFzX2tleSgpIGltcGxlbWVudGF0aW9uIGlmIF9jdXJzZXMgZG9lc24ndCBjb250YWluIGhhc19rZXkoKQogCkBAIC01MSw0ICs1MSwzIEBACiAgICAgaGFzX2tleQogZXhjZXB0IE5hbWVFcnJvcjoKICAgICBmcm9tIGhhc19rZXkgaW1wb3J0IGhhc19rZXkKLQpkaWZmIC0tZ2l0IGEvTGliL2N1cnNlcy9oYXNfa2V5LnB5IGIvTGliL2N1cnNlcy9oYXNfa2V5LnB5CmluZGV4IDA5ODc5NTIuLjYwYjdiZTkgMTAwNjQ0Ci0tLSBhL0xpYi9jdXJzZXMvaGFzX2tleS5weQorKysgYi9MaWIvY3Vyc2VzL2hhc19rZXkucHkKQEAgLTgsMTU0ICs4LDE1NCBAQAogIyBUYWJsZSBtYXBwaW5nIGN1cnNlcyBrZXlzIHRvIHRoZSB0ZXJtaW5mbyBjYXBhYmlsaXR5IG5hbWUKIAogX2NhcGFiaWxpdHlfbmFtZXMgPSB7Ci0gICAgX2N1cnNlcy5LRVlfQTE6ICdrYTEnLCAKLSAgICBfY3Vyc2VzLktFWV9BMzogJ2thMycsIAotICAgIF9jdXJzZXMuS0VZX0IyOiAna2IyJywgCi0gICAgX2N1cnNlcy5LRVlfQkFDS1NQQUNFOiAna2JzJywgCi0gICAgX2N1cnNlcy5LRVlfQkVHOiAna2JlZycsIAotICAgIF9jdXJzZXMuS0VZX0JUQUI6ICdrY2J0JywgCi0gICAgX2N1cnNlcy5LRVlfQzE6ICdrYzEnLCAKLSAgICBfY3Vyc2VzLktFWV9DMzogJ2tjMycsIAotICAgIF9jdXJzZXMuS0VZX0NBTkNFTDogJ2tjYW4nLCAKLSAgICBfY3Vyc2VzLktFWV9DQVRBQjogJ2t0YmMnLCAKLSAgICBfY3Vyc2VzLktFWV9DTEVBUjogJ2tjbHInLCAKLSAgICBfY3Vyc2VzLktFWV9DTE9TRTogJ2tjbG8nLCAKLSAgICBfY3Vyc2VzLktFWV9DT01NQU5EOiAna2NtZCcsIAotICAgIF9jdXJzZXMuS0VZX0NPUFk6ICdrY3B5JywgCi0gICAgX2N1cnNlcy5LRVlfQ1JFQVRFOiAna2NydCcsIAotICAgIF9jdXJzZXMuS0VZX0NUQUI6ICdrY3RhYicsIAotICAgIF9jdXJzZXMuS0VZX0RDOiAna2RjaDEnLCAKLSAgICBfY3Vyc2VzLktFWV9ETDogJ2tkbDEnLCAKLSAgICBfY3Vyc2VzLktFWV9ET1dOOiAna2N1ZDEnLCAKLSAgICBfY3Vyc2VzLktFWV9FSUM6ICdrcm1pcicsIAotICAgIF9jdXJzZXMuS0VZX0VORDogJ2tlbmQnLCAKLSAgICBfY3Vyc2VzLktFWV9FTlRFUjogJ2tlbnQnLCAKLSAgICBfY3Vyc2VzLktFWV9FT0w6ICdrZWwnLCAKLSAgICBfY3Vyc2VzLktFWV9FT1M6ICdrZWQnLCAKLSAgICBfY3Vyc2VzLktFWV9FWElUOiAna2V4dCcsIAotICAgIF9jdXJzZXMuS0VZX0YwOiAna2YwJywgCi0gICAgX2N1cnNlcy5LRVlfRjE6ICdrZjEnLCAKLSAgICBfY3Vyc2VzLktFWV9GMTA6ICdrZjEwJywgCi0gICAgX2N1cnNlcy5LRVlfRjExOiAna2YxMScsIAotICAgIF9jdXJzZXMuS0VZX0YxMjogJ2tmMTInLCAKLSAgICBfY3Vyc2VzLktFWV9GMTM6ICdrZjEzJywgCi0gICAgX2N1cnNlcy5LRVlfRjE0OiAna2YxNCcsIAotICAgIF9jdXJzZXMuS0VZX0YxNTogJ2tmMTUnLCAKLSAgICBfY3Vyc2VzLktFWV9GMTY6ICdrZjE2JywgCi0gICAgX2N1cnNlcy5LRVlfRjE3OiAna2YxNycsIAotICAgIF9jdXJzZXMuS0VZX0YxODogJ2tmMTgnLCAKLSAgICBfY3Vyc2VzLktFWV9GMTk6ICdrZjE5JywgCi0gICAgX2N1cnNlcy5LRVlfRjI6ICdrZjInLCAKLSAgICBfY3Vyc2VzLktFWV9GMjA6ICdrZjIwJywgCi0gICAgX2N1cnNlcy5LRVlfRjIxOiAna2YyMScsIAotICAgIF9jdXJzZXMuS0VZX0YyMjogJ2tmMjInLCAKLSAgICBfY3Vyc2VzLktFWV9GMjM6ICdrZjIzJywgCi0gICAgX2N1cnNlcy5LRVlfRjI0OiAna2YyNCcsIAotICAgIF9jdXJzZXMuS0VZX0YyNTogJ2tmMjUnLCAKLSAgICBfY3Vyc2VzLktFWV9GMjY6ICdrZjI2JywgCi0gICAgX2N1cnNlcy5LRVlfRjI3OiAna2YyNycsIAotICAgIF9jdXJzZXMuS0VZX0YyODogJ2tmMjgnLCAKLSAgICBfY3Vyc2VzLktFWV9GMjk6ICdrZjI5JywgCi0gICAgX2N1cnNlcy5LRVlfRjM6ICdrZjMnLCAKLSAgICBfY3Vyc2VzLktFWV9GMzA6ICdrZjMwJywgCi0gICAgX2N1cnNlcy5LRVlfRjMxOiAna2YzMScsIAotICAgIF9jdXJzZXMuS0VZX0YzMjogJ2tmMzInLCAKLSAgICBfY3Vyc2VzLktFWV9GMzM6ICdrZjMzJywgCi0gICAgX2N1cnNlcy5LRVlfRjM0OiAna2YzNCcsIAotICAgIF9jdXJzZXMuS0VZX0YzNTogJ2tmMzUnLCAKLSAgICBfY3Vyc2VzLktFWV9GMzY6ICdrZjM2JywgCi0gICAgX2N1cnNlcy5LRVlfRjM3OiAna2YzNycsIAotICAgIF9jdXJzZXMuS0VZX0YzODogJ2tmMzgnLCAKLSAgICBfY3Vyc2VzLktFWV9GMzk6ICdrZjM5JywgCi0gICAgX2N1cnNlcy5LRVlfRjQ6ICdrZjQnLCAKLSAgICBfY3Vyc2VzLktFWV9GNDA6ICdrZjQwJywgCi0gICAgX2N1cnNlcy5LRVlfRjQxOiAna2Y0MScsIAotICAgIF9jdXJzZXMuS0VZX0Y0MjogJ2tmNDInLCAKLSAgICBfY3Vyc2VzLktFWV9GNDM6ICdrZjQzJywgCi0gICAgX2N1cnNlcy5LRVlfRjQ0OiAna2Y0NCcsIAotICAgIF9jdXJzZXMuS0VZX0Y0NTogJ2tmNDUnLCAKLSAgICBfY3Vyc2VzLktFWV9GNDY6ICdrZjQ2JywgCi0gICAgX2N1cnNlcy5LRVlfRjQ3OiAna2Y0NycsIAotICAgIF9jdXJzZXMuS0VZX0Y0ODogJ2tmNDgnLCAKLSAgICBfY3Vyc2VzLktFWV9GNDk6ICdrZjQ5JywgCi0gICAgX2N1cnNlcy5LRVlfRjU6ICdrZjUnLCAKLSAgICBfY3Vyc2VzLktFWV9GNTA6ICdrZjUwJywgCi0gICAgX2N1cnNlcy5LRVlfRjUxOiAna2Y1MScsIAotICAgIF9jdXJzZXMuS0VZX0Y1MjogJ2tmNTInLCAKLSAgICBfY3Vyc2VzLktFWV9GNTM6ICdrZjUzJywgCi0gICAgX2N1cnNlcy5LRVlfRjU0OiAna2Y1NCcsIAotICAgIF9jdXJzZXMuS0VZX0Y1NTogJ2tmNTUnLCAKLSAgICBfY3Vyc2VzLktFWV9GNTY6ICdrZjU2JywgCi0gICAgX2N1cnNlcy5LRVlfRjU3OiAna2Y1NycsIAotICAgIF9jdXJzZXMuS0VZX0Y1ODogJ2tmNTgnLCAKLSAgICBfY3Vyc2VzLktFWV9GNTk6ICdrZjU5JywgCi0gICAgX2N1cnNlcy5LRVlfRjY6ICdrZjYnLCAKLSAgICBfY3Vyc2VzLktFWV9GNjA6ICdrZjYwJywgCi0gICAgX2N1cnNlcy5LRVlfRjYxOiAna2Y2MScsIAotICAgIF9jdXJzZXMuS0VZX0Y2MjogJ2tmNjInLCAKLSAgICBfY3Vyc2VzLktFWV9GNjM6ICdrZjYzJywgCi0gICAgX2N1cnNlcy5LRVlfRjc6ICdrZjcnLCAKLSAgICBfY3Vyc2VzLktFWV9GODogJ2tmOCcsIAotICAgIF9jdXJzZXMuS0VZX0Y5OiAna2Y5JywgCi0gICAgX2N1cnNlcy5LRVlfRklORDogJ2tmbmQnLCAKLSAgICBfY3Vyc2VzLktFWV9IRUxQOiAna2hscCcsIAotICAgIF9jdXJzZXMuS0VZX0hPTUU6ICdraG9tZScsIAotICAgIF9jdXJzZXMuS0VZX0lDOiAna2ljaDEnLCAKLSAgICBfY3Vyc2VzLktFWV9JTDogJ2tpbDEnLCAKLSAgICBfY3Vyc2VzLktFWV9MRUZUOiAna2N1YjEnLCAKLSAgICBfY3Vyc2VzLktFWV9MTDogJ2tsbCcsIAotICAgIF9jdXJzZXMuS0VZX01BUks6ICdrbXJrJywgCi0gICAgX2N1cnNlcy5LRVlfTUVTU0FHRTogJ2ttc2cnLCAKLSAgICBfY3Vyc2VzLktFWV9NT1ZFOiAna21vdicsIAotICAgIF9jdXJzZXMuS0VZX05FWFQ6ICdrbnh0JywgCi0gICAgX2N1cnNlcy5LRVlfTlBBR0U6ICdrbnAnLCAKLSAgICBfY3Vyc2VzLktFWV9PUEVOOiAna29wbicsIAotICAgIF9jdXJzZXMuS0VZX09QVElPTlM6ICdrb3B0JywgCi0gICAgX2N1cnNlcy5LRVlfUFBBR0U6ICdrcHAnLCAKLSAgICBfY3Vyc2VzLktFWV9QUkVWSU9VUzogJ2twcnYnLCAKLSAgICBfY3Vyc2VzLktFWV9QUklOVDogJ2twcnQnLCAKLSAgICBfY3Vyc2VzLktFWV9SRURPOiAna3JkbycsIAotICAgIF9jdXJzZXMuS0VZX1JFRkVSRU5DRTogJ2tyZWYnLCAKLSAgICBfY3Vyc2VzLktFWV9SRUZSRVNIOiAna3JmcicsIAotICAgIF9jdXJzZXMuS0VZX1JFUExBQ0U6ICdrcnBsJywgCi0gICAgX2N1cnNlcy5LRVlfUkVTVEFSVDogJ2tyc3QnLCAKLSAgICBfY3Vyc2VzLktFWV9SRVNVTUU6ICdrcmVzJywgCi0gICAgX2N1cnNlcy5LRVlfUklHSFQ6ICdrY3VmMScsIAotICAgIF9jdXJzZXMuS0VZX1NBVkU6ICdrc2F2JywgCi0gICAgX2N1cnNlcy5LRVlfU0JFRzogJ2tCRUcnLCAKLSAgICBfY3Vyc2VzLktFWV9TQ0FOQ0VMOiAna0NBTicsIAotICAgIF9jdXJzZXMuS0VZX1NDT01NQU5EOiAna0NNRCcsIAotICAgIF9jdXJzZXMuS0VZX1NDT1BZOiAna0NQWScsIAotICAgIF9jdXJzZXMuS0VZX1NDUkVBVEU6ICdrQ1JUJywgCi0gICAgX2N1cnNlcy5LRVlfU0RDOiAna0RDJywgCi0gICAgX2N1cnNlcy5LRVlfU0RMOiAna0RMJywgCi0gICAgX2N1cnNlcy5LRVlfU0VMRUNUOiAna3NsdCcsIAotICAgIF9jdXJzZXMuS0VZX1NFTkQ6ICdrRU5EJywgCi0gICAgX2N1cnNlcy5LRVlfU0VPTDogJ2tFT0wnLCAKLSAgICBfY3Vyc2VzLktFWV9TRVhJVDogJ2tFWFQnLCAKLSAgICBfY3Vyc2VzLktFWV9TRjogJ2tpbmQnLCAKLSAgICBfY3Vyc2VzLktFWV9TRklORDogJ2tGTkQnLCAKLSAgICBfY3Vyc2VzLktFWV9TSEVMUDogJ2tITFAnLCAKLSAgICBfY3Vyc2VzLktFWV9TSE9NRTogJ2tIT00nLCAKLSAgICBfY3Vyc2VzLktFWV9TSUM6ICdrSUMnLCAKLSAgICBfY3Vyc2VzLktFWV9TTEVGVDogJ2tMRlQnLCAKLSAgICBfY3Vyc2VzLktFWV9TTUVTU0FHRTogJ2tNU0cnLCAKLSAgICBfY3Vyc2VzLktFWV9TTU9WRTogJ2tNT1YnLCAKLSAgICBfY3Vyc2VzLktFWV9TTkVYVDogJ2tOWFQnLCAKLSAgICBfY3Vyc2VzLktFWV9TT1BUSU9OUzogJ2tPUFQnLCAKLSAgICBfY3Vyc2VzLktFWV9TUFJFVklPVVM6ICdrUFJWJywgCi0gICAgX2N1cnNlcy5LRVlfU1BSSU5UOiAna1BSVCcsIAotICAgIF9jdXJzZXMuS0VZX1NSOiAna3JpJywgCi0gICAgX2N1cnNlcy5LRVlfU1JFRE86ICdrUkRPJywgCi0gICAgX2N1cnNlcy5LRVlfU1JFUExBQ0U6ICdrUlBMJywgCi0gICAgX2N1cnNlcy5LRVlfU1JJR0hUOiAna1JJVCcsIAotICAgIF9jdXJzZXMuS0VZX1NSU1VNRTogJ2tSRVMnLCAKLSAgICBfY3Vyc2VzLktFWV9TU0FWRTogJ2tTQVYnLCAKLSAgICBfY3Vyc2VzLktFWV9TU1VTUEVORDogJ2tTUEQnLCAKLSAgICBfY3Vyc2VzLktFWV9TVEFCOiAna2h0cycsIAotICAgIF9jdXJzZXMuS0VZX1NVTkRPOiAna1VORCcsIAotICAgIF9jdXJzZXMuS0VZX1NVU1BFTkQ6ICdrc3BkJywgCi0gICAgX2N1cnNlcy5LRVlfVU5ETzogJ2t1bmQnLCAKKyAgICBfY3Vyc2VzLktFWV9BMTogJ2thMScsCisgICAgX2N1cnNlcy5LRVlfQTM6ICdrYTMnLAorICAgIF9jdXJzZXMuS0VZX0IyOiAna2IyJywKKyAgICBfY3Vyc2VzLktFWV9CQUNLU1BBQ0U6ICdrYnMnLAorICAgIF9jdXJzZXMuS0VZX0JFRzogJ2tiZWcnLAorICAgIF9jdXJzZXMuS0VZX0JUQUI6ICdrY2J0JywKKyAgICBfY3Vyc2VzLktFWV9DMTogJ2tjMScsCisgICAgX2N1cnNlcy5LRVlfQzM6ICdrYzMnLAorICAgIF9jdXJzZXMuS0VZX0NBTkNFTDogJ2tjYW4nLAorICAgIF9jdXJzZXMuS0VZX0NBVEFCOiAna3RiYycsCisgICAgX2N1cnNlcy5LRVlfQ0xFQVI6ICdrY2xyJywKKyAgICBfY3Vyc2VzLktFWV9DTE9TRTogJ2tjbG8nLAorICAgIF9jdXJzZXMuS0VZX0NPTU1BTkQ6ICdrY21kJywKKyAgICBfY3Vyc2VzLktFWV9DT1BZOiAna2NweScsCisgICAgX2N1cnNlcy5LRVlfQ1JFQVRFOiAna2NydCcsCisgICAgX2N1cnNlcy5LRVlfQ1RBQjogJ2tjdGFiJywKKyAgICBfY3Vyc2VzLktFWV9EQzogJ2tkY2gxJywKKyAgICBfY3Vyc2VzLktFWV9ETDogJ2tkbDEnLAorICAgIF9jdXJzZXMuS0VZX0RPV046ICdrY3VkMScsCisgICAgX2N1cnNlcy5LRVlfRUlDOiAna3JtaXInLAorICAgIF9jdXJzZXMuS0VZX0VORDogJ2tlbmQnLAorICAgIF9jdXJzZXMuS0VZX0VOVEVSOiAna2VudCcsCisgICAgX2N1cnNlcy5LRVlfRU9MOiAna2VsJywKKyAgICBfY3Vyc2VzLktFWV9FT1M6ICdrZWQnLAorICAgIF9jdXJzZXMuS0VZX0VYSVQ6ICdrZXh0JywKKyAgICBfY3Vyc2VzLktFWV9GMDogJ2tmMCcsCisgICAgX2N1cnNlcy5LRVlfRjE6ICdrZjEnLAorICAgIF9jdXJzZXMuS0VZX0YxMDogJ2tmMTAnLAorICAgIF9jdXJzZXMuS0VZX0YxMTogJ2tmMTEnLAorICAgIF9jdXJzZXMuS0VZX0YxMjogJ2tmMTInLAorICAgIF9jdXJzZXMuS0VZX0YxMzogJ2tmMTMnLAorICAgIF9jdXJzZXMuS0VZX0YxNDogJ2tmMTQnLAorICAgIF9jdXJzZXMuS0VZX0YxNTogJ2tmMTUnLAorICAgIF9jdXJzZXMuS0VZX0YxNjogJ2tmMTYnLAorICAgIF9jdXJzZXMuS0VZX0YxNzogJ2tmMTcnLAorICAgIF9jdXJzZXMuS0VZX0YxODogJ2tmMTgnLAorICAgIF9jdXJzZXMuS0VZX0YxOTogJ2tmMTknLAorICAgIF9jdXJzZXMuS0VZX0YyOiAna2YyJywKKyAgICBfY3Vyc2VzLktFWV9GMjA6ICdrZjIwJywKKyAgICBfY3Vyc2VzLktFWV9GMjE6ICdrZjIxJywKKyAgICBfY3Vyc2VzLktFWV9GMjI6ICdrZjIyJywKKyAgICBfY3Vyc2VzLktFWV9GMjM6ICdrZjIzJywKKyAgICBfY3Vyc2VzLktFWV9GMjQ6ICdrZjI0JywKKyAgICBfY3Vyc2VzLktFWV9GMjU6ICdrZjI1JywKKyAgICBfY3Vyc2VzLktFWV9GMjY6ICdrZjI2JywKKyAgICBfY3Vyc2VzLktFWV9GMjc6ICdrZjI3JywKKyAgICBfY3Vyc2VzLktFWV9GMjg6ICdrZjI4JywKKyAgICBfY3Vyc2VzLktFWV9GMjk6ICdrZjI5JywKKyAgICBfY3Vyc2VzLktFWV9GMzogJ2tmMycsCisgICAgX2N1cnNlcy5LRVlfRjMwOiAna2YzMCcsCisgICAgX2N1cnNlcy5LRVlfRjMxOiAna2YzMScsCisgICAgX2N1cnNlcy5LRVlfRjMyOiAna2YzMicsCisgICAgX2N1cnNlcy5LRVlfRjMzOiAna2YzMycsCisgICAgX2N1cnNlcy5LRVlfRjM0OiAna2YzNCcsCisgICAgX2N1cnNlcy5LRVlfRjM1OiAna2YzNScsCisgICAgX2N1cnNlcy5LRVlfRjM2OiAna2YzNicsCisgICAgX2N1cnNlcy5LRVlfRjM3OiAna2YzNycsCisgICAgX2N1cnNlcy5LRVlfRjM4OiAna2YzOCcsCisgICAgX2N1cnNlcy5LRVlfRjM5OiAna2YzOScsCisgICAgX2N1cnNlcy5LRVlfRjQ6ICdrZjQnLAorICAgIF9jdXJzZXMuS0VZX0Y0MDogJ2tmNDAnLAorICAgIF9jdXJzZXMuS0VZX0Y0MTogJ2tmNDEnLAorICAgIF9jdXJzZXMuS0VZX0Y0MjogJ2tmNDInLAorICAgIF9jdXJzZXMuS0VZX0Y0MzogJ2tmNDMnLAorICAgIF9jdXJzZXMuS0VZX0Y0NDogJ2tmNDQnLAorICAgIF9jdXJzZXMuS0VZX0Y0NTogJ2tmNDUnLAorICAgIF9jdXJzZXMuS0VZX0Y0NjogJ2tmNDYnLAorICAgIF9jdXJzZXMuS0VZX0Y0NzogJ2tmNDcnLAorICAgIF9jdXJzZXMuS0VZX0Y0ODogJ2tmNDgnLAorICAgIF9jdXJzZXMuS0VZX0Y0OTogJ2tmNDknLAorICAgIF9jdXJzZXMuS0VZX0Y1OiAna2Y1JywKKyAgICBfY3Vyc2VzLktFWV9GNTA6ICdrZjUwJywKKyAgICBfY3Vyc2VzLktFWV9GNTE6ICdrZjUxJywKKyAgICBfY3Vyc2VzLktFWV9GNTI6ICdrZjUyJywKKyAgICBfY3Vyc2VzLktFWV9GNTM6ICdrZjUzJywKKyAgICBfY3Vyc2VzLktFWV9GNTQ6ICdrZjU0JywKKyAgICBfY3Vyc2VzLktFWV9GNTU6ICdrZjU1JywKKyAgICBfY3Vyc2VzLktFWV9GNTY6ICdrZjU2JywKKyAgICBfY3Vyc2VzLktFWV9GNTc6ICdrZjU3JywKKyAgICBfY3Vyc2VzLktFWV9GNTg6ICdrZjU4JywKKyAgICBfY3Vyc2VzLktFWV9GNTk6ICdrZjU5JywKKyAgICBfY3Vyc2VzLktFWV9GNjogJ2tmNicsCisgICAgX2N1cnNlcy5LRVlfRjYwOiAna2Y2MCcsCisgICAgX2N1cnNlcy5LRVlfRjYxOiAna2Y2MScsCisgICAgX2N1cnNlcy5LRVlfRjYyOiAna2Y2MicsCisgICAgX2N1cnNlcy5LRVlfRjYzOiAna2Y2MycsCisgICAgX2N1cnNlcy5LRVlfRjc6ICdrZjcnLAorICAgIF9jdXJzZXMuS0VZX0Y4OiAna2Y4JywKKyAgICBfY3Vyc2VzLktFWV9GOTogJ2tmOScsCisgICAgX2N1cnNlcy5LRVlfRklORDogJ2tmbmQnLAorICAgIF9jdXJzZXMuS0VZX0hFTFA6ICdraGxwJywKKyAgICBfY3Vyc2VzLktFWV9IT01FOiAna2hvbWUnLAorICAgIF9jdXJzZXMuS0VZX0lDOiAna2ljaDEnLAorICAgIF9jdXJzZXMuS0VZX0lMOiAna2lsMScsCisgICAgX2N1cnNlcy5LRVlfTEVGVDogJ2tjdWIxJywKKyAgICBfY3Vyc2VzLktFWV9MTDogJ2tsbCcsCisgICAgX2N1cnNlcy5LRVlfTUFSSzogJ2ttcmsnLAorICAgIF9jdXJzZXMuS0VZX01FU1NBR0U6ICdrbXNnJywKKyAgICBfY3Vyc2VzLktFWV9NT1ZFOiAna21vdicsCisgICAgX2N1cnNlcy5LRVlfTkVYVDogJ2tueHQnLAorICAgIF9jdXJzZXMuS0VZX05QQUdFOiAna25wJywKKyAgICBfY3Vyc2VzLktFWV9PUEVOOiAna29wbicsCisgICAgX2N1cnNlcy5LRVlfT1BUSU9OUzogJ2tvcHQnLAorICAgIF9jdXJzZXMuS0VZX1BQQUdFOiAna3BwJywKKyAgICBfY3Vyc2VzLktFWV9QUkVWSU9VUzogJ2twcnYnLAorICAgIF9jdXJzZXMuS0VZX1BSSU5UOiAna3BydCcsCisgICAgX2N1cnNlcy5LRVlfUkVETzogJ2tyZG8nLAorICAgIF9jdXJzZXMuS0VZX1JFRkVSRU5DRTogJ2tyZWYnLAorICAgIF9jdXJzZXMuS0VZX1JFRlJFU0g6ICdrcmZyJywKKyAgICBfY3Vyc2VzLktFWV9SRVBMQUNFOiAna3JwbCcsCisgICAgX2N1cnNlcy5LRVlfUkVTVEFSVDogJ2tyc3QnLAorICAgIF9jdXJzZXMuS0VZX1JFU1VNRTogJ2tyZXMnLAorICAgIF9jdXJzZXMuS0VZX1JJR0hUOiAna2N1ZjEnLAorICAgIF9jdXJzZXMuS0VZX1NBVkU6ICdrc2F2JywKKyAgICBfY3Vyc2VzLktFWV9TQkVHOiAna0JFRycsCisgICAgX2N1cnNlcy5LRVlfU0NBTkNFTDogJ2tDQU4nLAorICAgIF9jdXJzZXMuS0VZX1NDT01NQU5EOiAna0NNRCcsCisgICAgX2N1cnNlcy5LRVlfU0NPUFk6ICdrQ1BZJywKKyAgICBfY3Vyc2VzLktFWV9TQ1JFQVRFOiAna0NSVCcsCisgICAgX2N1cnNlcy5LRVlfU0RDOiAna0RDJywKKyAgICBfY3Vyc2VzLktFWV9TREw6ICdrREwnLAorICAgIF9jdXJzZXMuS0VZX1NFTEVDVDogJ2tzbHQnLAorICAgIF9jdXJzZXMuS0VZX1NFTkQ6ICdrRU5EJywKKyAgICBfY3Vyc2VzLktFWV9TRU9MOiAna0VPTCcsCisgICAgX2N1cnNlcy5LRVlfU0VYSVQ6ICdrRVhUJywKKyAgICBfY3Vyc2VzLktFWV9TRjogJ2tpbmQnLAorICAgIF9jdXJzZXMuS0VZX1NGSU5EOiAna0ZORCcsCisgICAgX2N1cnNlcy5LRVlfU0hFTFA6ICdrSExQJywKKyAgICBfY3Vyc2VzLktFWV9TSE9NRTogJ2tIT00nLAorICAgIF9jdXJzZXMuS0VZX1NJQzogJ2tJQycsCisgICAgX2N1cnNlcy5LRVlfU0xFRlQ6ICdrTEZUJywKKyAgICBfY3Vyc2VzLktFWV9TTUVTU0FHRTogJ2tNU0cnLAorICAgIF9jdXJzZXMuS0VZX1NNT1ZFOiAna01PVicsCisgICAgX2N1cnNlcy5LRVlfU05FWFQ6ICdrTlhUJywKKyAgICBfY3Vyc2VzLktFWV9TT1BUSU9OUzogJ2tPUFQnLAorICAgIF9jdXJzZXMuS0VZX1NQUkVWSU9VUzogJ2tQUlYnLAorICAgIF9jdXJzZXMuS0VZX1NQUklOVDogJ2tQUlQnLAorICAgIF9jdXJzZXMuS0VZX1NSOiAna3JpJywKKyAgICBfY3Vyc2VzLktFWV9TUkVETzogJ2tSRE8nLAorICAgIF9jdXJzZXMuS0VZX1NSRVBMQUNFOiAna1JQTCcsCisgICAgX2N1cnNlcy5LRVlfU1JJR0hUOiAna1JJVCcsCisgICAgX2N1cnNlcy5LRVlfU1JTVU1FOiAna1JFUycsCisgICAgX2N1cnNlcy5LRVlfU1NBVkU6ICdrU0FWJywKKyAgICBfY3Vyc2VzLktFWV9TU1VTUEVORDogJ2tTUEQnLAorICAgIF9jdXJzZXMuS0VZX1NUQUI6ICdraHRzJywKKyAgICBfY3Vyc2VzLktFWV9TVU5ETzogJ2tVTkQnLAorICAgIF9jdXJzZXMuS0VZX1NVU1BFTkQ6ICdrc3BkJywKKyAgICBfY3Vyc2VzLktFWV9VTkRPOiAna3VuZCcsCiAgICAgX2N1cnNlcy5LRVlfVVA6ICdrY3V1MScKICAgICB9CiAKQEAgLTE5MCw1ICsxOTAsMyBAQAogICAgIGZpbmFsbHk6CiAgICAgICAgIF9jdXJzZXMuZW5kd2luKCkKICAgICAgICAgZm9yIGkgaW4gTDogcHJpbnQgaQotICAgICAgICAKLSAgICAKZGlmZiAtLWdpdCBhL0xpYi9jdXJzZXMvcGFuZWwucHkgYi9MaWIvY3Vyc2VzL3BhbmVsLnB5CmluZGV4IDJjODZkNGMuLmFhY2NhODUgMTAwNjQ0Ci0tLSBhL0xpYi9jdXJzZXMvcGFuZWwucHkKKysrIGIvTGliL2N1cnNlcy9wYW5lbC5weQpAQCAtNiw0ICs2LDMgQEAKIF9fcmV2aXNpb25fXyA9ICIkSWQkIgogCiBmcm9tIF9jdXJzZXNfcGFuZWwgaW1wb3J0ICoKLQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weQppbmRleCBkNWIzMDk2Li41NWJhYmU2IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weQpAQCAtNjgsNyArNjgsNyBAQAogICAgICAgICBpbXBvcnQgemlwZmlsZQogICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgemlwZmlsZSA9IE5vbmUKLSAgICAgICAgCisKICAgICB6aXBfZmlsZW5hbWUgPSBiYXNlX25hbWUgKyAiLnppcCIKICAgICBta3BhdGgob3MucGF0aC5kaXJuYW1lKHppcF9maWxlbmFtZSksIGRyeV9ydW49ZHJ5X3J1bikKIApAQCAtNzksNyArNzksNyBAQAogICAgICAgICAgICAgemlwb3B0aW9ucyA9ICItciIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHppcG9wdGlvbnMgPSAiLXJxIgotICAgICAgICAKKwogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzcGF3bihbInppcCIsIHppcG9wdGlvbnMsIHppcF9maWxlbmFtZSwgYmFzZV9kaXJdLAogICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1kcnlfcnVuKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9iY3BwY29tcGlsZXIucHkgYi9MaWIvZGlzdHV0aWxzL2JjcHBjb21waWxlci5weQppbmRleCBiMDM2MGEyLi5mOTk1ZTM2IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2JjcHBjb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL2JjcHBjb21waWxlci5weQpAQCAtODUsNyArODUsNyBAQAogICAgIGRlZiBjb21waWxlKHNlbGYsIHNvdXJjZXMsCiAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1Ob25lLCBtYWNyb3M9Tm9uZSwgaW5jbHVkZV9kaXJzPU5vbmUsIGRlYnVnPTAsCiAgICAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLCBkZXBlbmRzPU5vbmUpOgotICAgICAgICAKKwogICAgICAgICBtYWNyb3MsIG9iamVjdHMsIGV4dHJhX3Bvc3RhcmdzLCBwcF9vcHRzLCBidWlsZCA9IFwKICAgICAgICAgICAgICAgICBzZWxmLl9zZXR1cF9jb21waWxlKG91dHB1dF9kaXIsIG1hY3JvcywgaW5jbHVkZV9kaXJzLCBzb3VyY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcywgZXh0cmFfcG9zdGFyZ3MpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2Njb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvY2NvbXBpbGVyLnB5CmluZGV4IGViZDkzYzIuLmEzYjFmZmEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY2NvbXBpbGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY2NvbXBpbGVyLnB5CkBAIC02ODUsNyArNjg1LDcgQEAKIAogICAgICAgICAjIEEgY29uY3JldGUgY29tcGlsZXIgY2xhc3MgY2FuIGVpdGhlciBvdmVycmlkZSB0aGlzIG1ldGhvZAogICAgICAgICAjIGVudGlyZWx5IG9yIGltcGxlbWVudCBfY29tcGlsZSgpLgotICAgICAgICAKKwogICAgICAgICBtYWNyb3MsIG9iamVjdHMsIGV4dHJhX3Bvc3RhcmdzLCBwcF9vcHRzLCBidWlsZCA9IFwKICAgICAgICAgICAgICAgICBzZWxmLl9zZXR1cF9jb21waWxlKG91dHB1dF9kaXIsIG1hY3JvcywgaW5jbHVkZV9kaXJzLCBzb3VyY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcywgZXh0cmFfcG9zdGFyZ3MpCkBAIC03MDMsNyArNzAzLDcgQEAKIAogICAgIGRlZiBfY29tcGlsZShzZWxmLCBvYmosIHNyYywgZXh0LCBjY19hcmdzLCBleHRyYV9wb3N0YXJncywgcHBfb3B0cyk6CiAgICAgICAgICIiIkNvbXBpbGUgJ3NyYycgdG8gcHJvZHVjdCAnb2JqJy4iIiIKLSAgICAgICAgCisKICAgICAgICAgIyBBIGNvbmNyZXRlIGNvbXBpbGVyIGNsYXNzIHRoYXQgZG9lcyBub3Qgb3ZlcnJpZGUgY29tcGlsZSgpCiAgICAgICAgICMgc2hvdWxkIGltcGxlbWVudCBfY29tcGlsZSgpLgogICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NtZC5weSBiL0xpYi9kaXN0dXRpbHMvY21kLnB5CmluZGV4IDkzNjI0MTAuLmJlOGU4MjYgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY21kLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY21kLnB5CkBAIC03OSw3ICs3OSw3IEBACiAgICAgICAgICMgdmVyYm9zZSBpcyBsYXJnZWx5IGlnbm9yZWQsIGJ1dCBuZWVkcyB0byBiZSBzZXQgZm9yCiAgICAgICAgICMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKEkgdGhpbmspPwogICAgICAgICBzZWxmLnZlcmJvc2UgPSBkaXN0LnZlcmJvc2UKLSAgICAgICAgCisKICAgICAgICAgIyBTb21lIGNvbW1hbmRzIGRlZmluZSBhICdzZWxmLmZvcmNlJyBvcHRpb24gdG8gaWdub3JlIGZpbGUKICAgICAgICAgIyB0aW1lc3RhbXBzLCBidXQgbWV0aG9kcyBkZWZpbmVkICpoZXJlKiBhc3N1bWUgdGhhdAogICAgICAgICAjICdzZWxmLmZvcmNlJyBleGlzdHMgZm9yIGFsbCBjb21tYW5kcy4gIFNvIGRlZmluZSBpdCBoZXJlCkBAIC0xMDAsNyArMTAwLDcgQEAKIAogCiAgICAgIyBYWFggQSBtb3JlIGV4cGxpY2l0IHdheSB0byBjdXN0b21pemUgZHJ5X3J1biB3b3VsZCBiZSBiZXR0ZXIuCi0gICAgCisKICAgICBkZWYgX19nZXRhdHRyX18gKHNlbGYsIGF0dHIpOgogICAgICAgICBpZiBhdHRyID09ICdkcnlfcnVuJzoKICAgICAgICAgICAgIG15dmFsID0gZ2V0YXR0cihzZWxmLCAiXyIgKyBhdHRyKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0LnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0LnB5CmluZGV4IDdjNjA2ZmYuLjRlY2E5YzMgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3QucHkKQEAgLTc4LDcgKzc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgJ3dpbmluc3QnOiAoJ2JkaXN0X3dpbmluc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2luZG93cyBleGVjdXRhYmxlIGluc3RhbGxlciIpLAogICAgICAgICAgICAgICAgICAgICAgICAnemlwJzogICAoJ2JkaXN0X2R1bWInLCAiWklQIGZpbGUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIydwa2d0b29sJzogKCdiZGlzdF9wa2d0b29sJywgCisgICAgICAgICAgICAgICAgICAgICAgICMncGtndG9vbCc6ICgnYmRpc3RfcGtndG9vbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAiU29sYXJpcyBwa2d0b29sIGRpc3RyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAjJ3NkdXgnOiAgKCdiZGlzdF9zZHV4JywgIkhQLVVYIHN3aW5zdGFsbCBkZXBvdCIpLAogICAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X2R1bWIucHkKaW5kZXggOGVlM2E1Yy4uM2RiMzMyZCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X2R1bWIucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X2R1bWIucHkKQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKICAgICAgICAgc2VsZi5za2lwX2J1aWxkID0gMAogICAgICAgICBzZWxmLnJlbGF0aXZlID0gMAotICAgICAgICAKKwogICAgICMgaW5pdGlhbGl6ZV9vcHRpb25zKCkKIAogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5CmluZGV4IDdjNTkzYWQuLmQ5MWMwODkgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgIyB3ZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHB5YyBvciBweW8gZmlsZXMKICAgICAgICAgaW5zdGFsbF9saWIuY29tcGlsZSA9IDAKICAgICAgICAgaW5zdGFsbF9saWIub3B0aW1pemUgPSAwCi0gICAgICAgIAorCiAgICAgICAgICMgSWYgd2UgYXJlIGJ1aWxkaW5nIGFuIGluc3RhbGxlciBmb3IgYSBQeXRob24gdmVyc2lvbiBvdGhlcgogICAgICAgICAjIHRoYW4gdGhlIG9uZSB3ZSBhcmUgY3VycmVudGx5IHJ1bm5pbmcsIHRoZW4gd2UgbmVlZCB0byBlbnN1cmUKICAgICAgICAgIyBvdXIgYnVpbGRfbGliIHJlZmxlY3RzIHRoZSBvdGhlciBQeXRob24gdmVyc2lvbiByYXRoZXIgdGhhbiBvdXJzLgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkKaW5kZXggMGMzNzc2OC4uMDRjZDc0MiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CkBAIC0xNzMsNyArMTczLDcgQEAKICAgICAgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAnUEMnKSkKICAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAnUENCdWlsZCcpKQogCi0gICAgICAgICMgT1MvMiAoRU1YKSBkb2Vzbid0IHN1cHBvcnQgRGVidWcgdnMgUmVsZWFzZSBidWlsZHMsIGJ1dCBoYXMgdGhlIAorICAgICAgICAjIE9TLzIgKEVNWCkgZG9lc24ndCBzdXBwb3J0IERlYnVnIHZzIFJlbGVhc2UgYnVpbGRzLCBidXQgaGFzIHRoZQogICAgICAgICAjIGltcG9ydCBsaWJyYXJpZXMgaW4gaXRzICJDb25maWciIHN1YmRpcmVjdG9yeQogICAgICAgICBpZiBvcy5uYW1lID09ICdvczInOgogICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsICdDb25maWcnKSkKQEAgLTYzNiw3ICs2MzYsNyBAQAogICAgICAgICAgICAgIyBFTVgvR0NDIHJlcXVpcmVzIHRoZSBweXRob24gbGlicmFyeSBleHBsaWNpdGx5LCBhbmQgSQogICAgICAgICAgICAgIyBiZWxpZXZlIFZBQ1BQIGRvZXMgYXMgd2VsbCAodGhvdWdoIG5vdCBjb25maXJtZWQpIC0gQUlNIEFwcjAxCiAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICJweXRob24lZCVkIgotICAgICAgICAgICAgIyBkZWJ1ZyB2ZXJzaW9ucyBvZiB0aGUgbWFpbiBETEwgYXJlbid0IHN1cHBvcnRlZCwgYXQgbGVhc3QgCisgICAgICAgICAgICAjIGRlYnVnIHZlcnNpb25zIG9mIHRoZSBtYWluIERMTCBhcmVuJ3Qgc3VwcG9ydGVkLCBhdCBsZWFzdAogICAgICAgICAgICAgIyBub3QgYXQgdGhpcyB0aW1lIC0gQUlNIEFwcjAxCiAgICAgICAgICAgICAjaWYgc2VsZi5kZWJ1ZzoKICAgICAgICAgICAgICMgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZSArICdfZCcKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9zY3JpcHRzLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3NjcmlwdHMucHkKaW5kZXggMTY1YTAwOS4uZTBmY2MyMyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3NjcmlwdHMucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3NjcmlwdHMucHkKQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgICAgICBvdXRmID0gb3BlbihvdXRmaWxlLCAidyIpCiAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzeXNjb25maWcucHl0aG9uX2J1aWxkOgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0Zi53cml0ZSgiIyElcyVzXG4iICUgCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRmLndyaXRlKCIjISVzJXNcbiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY3V0YWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X2ludGVycCkpCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CmluZGV4IDNjMzZlZGUuLjE3NWY3ODUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CkBAIC01MzcsNyArNTM3LDcgQEAKICAgICAgICAgICAgIG5vdCAoc2VsZi5wYXRoX2ZpbGUgYW5kIHNlbGYuaW5zdGFsbF9wYXRoX2ZpbGUpIGFuZAogICAgICAgICAgICAgaW5zdGFsbF9saWIgbm90IGluIHN5c19wYXRoKToKICAgICAgICAgICAgIGxvZy5kZWJ1ZygoIm1vZHVsZXMgaW5zdGFsbGVkIHRvICclcycsIHdoaWNoIGlzIG5vdCBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICJQeXRob24ncyBtb2R1bGUgc2VhcmNoIHBhdGggKHN5cy5wYXRoKSAtLSAiIAorICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uJ3MgbW9kdWxlIHNlYXJjaCBwYXRoIChzeXMucGF0aCkgLS0gIgogICAgICAgICAgICAgICAgICAgICAgICAieW91J2xsIGhhdmUgdG8gY2hhbmdlIHRoZSBzZWFyY2ggcGF0aCB5b3Vyc2VsZiIpLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfbGliKQogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHkKaW5kZXggOGUzNDdjZS4uODEwNGNlMCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weQpAQCAtMjg2LDQgKzI4NiwzIEBACiAgICAgICAgIGlmIHNlbGYuc2hvd19yZXNwb25zZToKICAgICAgICAgICAgIHByaW50ICctJyo3NSwgZGF0YSwgJy0nKjc1CiAgICAgICAgIHJldHVybiByZXN1bHQKLQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb3JlLnB5IGIvTGliL2Rpc3R1dGlscy9jb3JlLnB5CmluZGV4IGZiYTQ2M2MuLmZlZjI5MWYgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29yZS5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvcmUucHkKQEAgLTIzOSw0ICsyMzksMyBAQAogICAgIHJldHVybiBfc2V0dXBfZGlzdHJpYnV0aW9uCiAKICMgcnVuX3NldHVwICgpCi0KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHkKaW5kZXggMDEwMWJhZS4uYTk2MjAwNyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHkKQEAgLTc1LDcgKzc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzLCBkZXRhaWxzKSkKICAgICAgICAgaWYgc3RhdHVzIGlzIG5vdCBDT05GSUdfSF9PSzoKICAgICAgICAgICAgIHNlbGYud2FybigKLSAgICAgICAgICAgICAgICAiUHl0aG9uJ3MgcHljb25maWcuaCBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCB5b3VyIGNvbXBpbGVyLiAiIAorICAgICAgICAgICAgICAgICJQeXRob24ncyBweWNvbmZpZy5oIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHlvdXIgY29tcGlsZXIuICIKICAgICAgICAgICAgICAgICAiUmVhc29uOiAlcy4gIgogICAgICAgICAgICAgICAgICJDb21waWxpbmcgbWF5IGZhaWwgYmVjYXVzZSBvZiB1bmRlZmluZWQgcHJlcHJvY2Vzc29yIG1hY3Jvcy4iCiAgICAgICAgICAgICAgICAgJSBkZXRhaWxzKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9kZWJ1Zy5weSBiL0xpYi9kaXN0dXRpbHMvZGVidWcucHkKaW5kZXggZTE5NWViZC4uMmE4N2ViNSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9kZWJ1Zy5weQorKysgYi9MaWIvZGlzdHV0aWxzL2RlYnVnLnB5CkBAIC03LDQgKzcsMyBAQAogIyBJZiBESVNUVVRJTFNfREVCVUcgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLCB3ZSBydW4gaW4KICMgZGVidWcgbW9kZS4KIERFQlVHID0gb3MuZW52aXJvbi5nZXQoJ0RJU1RVVElMU19ERUJVRycpCi0KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvZGlyX3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL2Rpcl91dGlsLnB5CmluZGV4IGU0NzliNjIuLjc3ZjY0YzQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvZGlyX3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy9kaXJfdXRpbC5weQpAQCAtMjI1LDQgKzIyNSwzIEBACiAgICAgICAgIGlmIHBhdGhbMDoxXSA9PSBvcy5zZXA6CiAgICAgICAgICAgICBwYXRoID0gZHJpdmUgKyBwYXRoWzE6XQogICAgICAgICByZXR1cm4gcGF0aAotCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2Rpc3QucHkgYi9MaWIvZGlzdHV0aWxzL2Rpc3QucHkKaW5kZXggN2QwYTdiYS4uYjRkZDBiOSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9kaXN0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvZGlzdC5weQpAQCAtMjMxLDcgKzIzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBuZXdyZXEuYXBwZW5kKChwa2csIExvb3NlVmVyc2lvbih2ZXIpKSkKICAgICAgICAgICAgICAgICBhdHRyc1sncmVxdWlyZXMnXSA9IG5ld3JlcQogCi0gICAgICAgICAgICAjIEJ1aWxkIHVwIHRoZSBwcm92aWRlcyBvYmplY3QuIElmIHRoZSBzZXR1cCgpIGhhcyBubyAKKyAgICAgICAgICAgICMgQnVpbGQgdXAgdGhlIHByb3ZpZGVzIG9iamVjdC4gSWYgdGhlIHNldHVwKCkgaGFzIG5vCiAgICAgICAgICAgICAjIHByb3ZpZGVzIGxpbmUsIHdlIHVzZSBwYWNrYWdlcyBvciBtb2R1bGVzIGFuZCB0aGUgdmVyc2lvbgogICAgICAgICAgICAgIyB0byBzeW50aGVzaXNlIHRoZSBwcm92aWRlcy4gSWYgbm8gdmVyc2lvbiBpcyBwcm92aWRlZCAobm8KICAgICAgICAgICAgICMgcHVuIGludGVuZGVkKSB3ZSBkb24ndCBoYXZlIGEgcHJvdmlkZXMgZW50cnkgYXQgYWxsLgpAQCAtMTEzNyw3ICsxMTM3LDcgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuZG93bmxvYWRfdXJsIG9yICJVTktOT1dOIgogCiAgICAgZGVmIGdldF9yZXF1aXJlcyhzZWxmKToKLSAgICAgICAgcmV0dXJuIFsgJyVzJXMlcyclKHgsICh5IGFuZCAnLScpIG9yICcnLCB5IG9yICcnKSAKKyAgICAgICAgcmV0dXJuIFsgJyVzJXMlcyclKHgsICh5IGFuZCAnLScpIG9yICcnLCB5IG9yICcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHgseSBpbiBzZWxmLnJlcXVpcmVzIF0KIAogICAgIGRlZiBnZXRfcHJvdmlkZXMoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvZmlsZV91dGlsLnB5CmluZGV4IGUyMzBjZTUuLmUyYjFjNTEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvZmlsZV91dGlsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvZmlsZV91dGlsLnB5CkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIChlcnJubywgZXJyc3RyKToKICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IsIFwKICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGRlbGV0ZSAnJXMnOiAlcyIgJSAoZHN0LCBlcnJzdHIpCi0gICAgICAgIAorCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGZkc3QgPSBvcGVuKGRzdCwgJ3diJykKICAgICAgICAgZXhjZXB0IG9zLmVycm9yLCAoZXJybm8sIGVycnN0cik6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5IGIvTGliL2Rpc3R1dGlscy9maWxlbGlzdC5weQppbmRleCAwODcyZTk2Li41NjZkODdhIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvZmlsZWxpc3QucHkKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5jbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIHByZWZpeD1kaXIpOgogICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcycgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlciBkaXJlY3RvcnkgJyVzJyIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVyIGRpcmVjdG9yeSAnJXMnIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIGRpcikKIAogICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWV4Y2x1ZGUnOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9sb2cucHkgYi9MaWIvZGlzdHV0aWxzL2xvZy5weQppbmRleCAwMTQyMGRhLi4wMjRlN2MyIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2xvZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL2xvZy5weQpAQCAtMjgsMTYgKzI4LDE2IEBACiAKICAgICBkZWYgZGVidWcoc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgIHNlbGYuX2xvZyhERUJVRywgbXNnLCBhcmdzKQotICAgIAorCiAgICAgZGVmIGluZm8oc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgIHNlbGYuX2xvZyhJTkZPLCBtc2csIGFyZ3MpCi0gICAgCisKICAgICBkZWYgd2FybihzZWxmLCBtc2csICphcmdzKToKICAgICAgICAgc2VsZi5fbG9nKFdBUk4sIG1zZywgYXJncykKLSAgICAKKwogICAgIGRlZiBlcnJvcihzZWxmLCBtc2csICphcmdzKToKICAgICAgICAgc2VsZi5fbG9nKEVSUk9SLCBtc2csIGFyZ3MpCi0gICAgCisKICAgICBkZWYgZmF0YWwoc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgIHNlbGYuX2xvZyhGQVRBTCwgbXNnLCBhcmdzKQogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL21zdmNjb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5CmluZGV4IDE0NDFlYTAuLjE2ODg4MWEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgICAgIGlmIGQ6CiAgICAgICAgICAgICAgICAgc2VsZi5tYWNyb3NbIiQoJXMpIiAlIG1hY3JvXSA9IGRba2V5XQogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgIAorCiAgICAgZGVmIGxvYWRfbWFjcm9zKHNlbGYsIHZlcnNpb24pOgogICAgICAgICB2c2Jhc2UgPSByIlNvZnR3YXJlXE1pY3Jvc29mdFxWaXN1YWxTdHVkaW9cJTAuMWYiICUgdmVyc2lvbgogICAgICAgICBzZWxmLnNldF9tYWNybygiVkNJbnN0YWxsRGlyIiwgdnNiYXNlICsgciJcU2V0dXBcVkMiLCAicHJvZHVjdGRpciIpCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICAgICAgcmV0dXJuIG1ham9yVmVyc2lvbiArIG1pbm9yVmVyc2lvbgogICAgICMgZWxzZSB3ZSBkb24ndCBrbm93IHdoYXQgdmVyc2lvbiBvZiB0aGUgY29tcGlsZXIgdGhpcyBpcwogICAgIHJldHVybiBOb25lCi0gICAgCisKIAogY2xhc3MgTVNWQ0NvbXBpbGVyIChDQ29tcGlsZXIpIDoKICAgICAiIiJDb25jcmV0ZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIHRvIE1pY3Jvc29mdCBWaXN1YWwgQysrLApAQCAtNTI1LDcgKzUyNSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGZuCiAKICAgICAgICAgcmV0dXJuIGV4ZQotICAgIAorCiAgICAgZGVmIGdldF9tc3ZjX3BhdGhzKHNlbGYsIHBhdGgsIHBsYXRmb3JtPSd4ODYnKToKICAgICAgICAgIiIiR2V0IGEgbGlzdCBvZiBkZXZzdHVkaW8gZGlyZWN0b3JpZXMgKGluY2x1ZGUsIGxpYiBvciBwYXRoKS4KIApAQCAtNTc2LDQgKzU3NiwzIEBACiAgICAgICAgICAgICBwID0gc2VsZi5nZXRfbXN2Y19wYXRocyhuYW1lKQogICAgICAgICBpZiBwOgogICAgICAgICAgICAgb3MuZW52aXJvbltuYW1lXSA9IHN0cmluZy5qb2luKHAsICc7JykKLQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9zcGF3bi5weSBiL0xpYi9kaXN0dXRpbHMvc3Bhd24ucHkKaW5kZXggNjczOTFlOC4uYTg5Yjg4YyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9zcGF3bi5weQorKysgYi9MaWIvZGlzdHV0aWxzL3NwYXduLnB5CkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgI2NtZCA9IF9udF9xdW90ZV9hcmdzKGNtZCkKICAgICBpZiBzZWFyY2hfcGF0aDoKICAgICAgICAgIyBlaXRoZXIgd2UgZmluZCBvbmUgb3IgaXQgc3RheXMgdGhlIHNhbWUKLSAgICAgICAgZXhlY3V0YWJsZSA9IGZpbmRfZXhlY3V0YWJsZShleGVjdXRhYmxlKSBvciBleGVjdXRhYmxlIAorICAgICAgICBleGVjdXRhYmxlID0gZmluZF9leGVjdXRhYmxlKGV4ZWN1dGFibGUpIG9yIGV4ZWN1dGFibGUKICAgICBsb2cuaW5mbyhzdHJpbmcuam9pbihbZXhlY3V0YWJsZV0gKyBjbWRbMTpdLCAnICcpKQogICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAjIHNwYXdudiBmb3IgT1MvMiBFTVggcmVxdWlyZXMgYSBmdWxsIHBhdGggdG8gdGhlIC5leGUKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5IGIvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKaW5kZXggYzkxMmExNS4uMGE0ZTE0YyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKQEAgLTM2Nyw3ICszNjcsNyBAQAogICAgICAgICAgICAgbXlfbXNnID0gKCckTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIG1pc21hdGNoOiBub3cgIiVzIiBidXQgIiVzIiBkdXJpbmcgY29uZmlndXJlJwogICAgICAgICAgICAgICAgICUgKGN1cl90YXJnZXQsIGNmZ190YXJnZXQpKQogICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihteV9tc2cpCi0gICAgICAgIAorCiAgICAgIyBPbiBBSVgsIHRoZXJlIGFyZSB3cm9uZyBwYXRocyB0byB0aGUgbGlua2VyIHNjcmlwdHMgaW4gdGhlIE1ha2VmaWxlCiAgICAgIyAtLSB0aGVzZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIFB5dGhvbiBzb3VyY2UsIGJ1dCB3aGVuIGluc3RhbGxlZAogICAgICMgdGhlIHNjcmlwdHMgYXJlIGluIGFub3RoZXIgZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5CmluZGV4IDExZWNiOWYuLjI0Y2JjYjUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHkKQEAgLTIwNiw3ICsyMDYsNyBAQAogICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybVs6NV0gPT0gImhwLXV4IjoKICAgICAgICAgICAgIHJldHVybiAiK3MgLUwiICsgZGlyCiAgICAgICAgIGVsaWYgY29tcGlsZXJbOjNdID09ICJnY2MiIG9yIGNvbXBpbGVyWzozXSA9PSAiZysrIjoKLSAgICAgICAgICByZXR1cm4gIi1XbCwtUiIgKyBkaXIKKyAgICAgICAgICAgIHJldHVybiAiLVdsLC1SIiArIGRpcgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuICItUiIgKyBkaXIKIApAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgIHNoYXJlZF9mID0gc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKGxpYiwgbGliX3R5cGU9J3NoYXJlZCcpCiAgICAgICAgIGR5bGliX2YgPSBzZWxmLmxpYnJhcnlfZmlsZW5hbWUobGliLCBsaWJfdHlwZT0nZHlsaWInKQogICAgICAgICBzdGF0aWNfZiA9IHNlbGYubGlicmFyeV9maWxlbmFtZShsaWIsIGxpYl90eXBlPSdzdGF0aWMnKQotICAgICAgICAKKwogICAgICAgICBmb3IgZGlyIGluIGRpcnM6CiAgICAgICAgICAgICBzaGFyZWQgPSBvcy5wYXRoLmpvaW4oZGlyLCBzaGFyZWRfZikKICAgICAgICAgICAgIGR5bGliID0gb3MucGF0aC5qb2luKGRpciwgZHlsaWJfZikKQEAgLTIzMiw2ICsyMzIsNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBzaGFyZWQKICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3RhdGljKToKICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljCi0gICAgICAgICAgICAKKwogICAgICAgICAjIE9vcHMsIGRpZG4ndCBmaW5kIGl0IGluICphbnkqIG9mICdkaXJzJwogICAgICAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy91dGlsLnB5IGIvTGliL2Rpc3R1dGlscy91dGlsLnB5CmluZGV4IDEyNzc1ZDYuLjM4N2U5YmQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3V0aWwucHkKQEAgLTMwMCw3ICszMDAsNyBAQAogCiBkZWYgc3RydG9ib29sICh2YWwpOgogICAgICIiIkNvbnZlcnQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdHJ1dGggdG8gdHJ1ZSAoMSkgb3IgZmFsc2UgKDApLgotICAgIAorCiAgICAgVHJ1ZSB2YWx1ZXMgYXJlICd5JywgJ3llcycsICd0JywgJ3RydWUnLCAnb24nLCBhbmQgJzEnOyBmYWxzZSB2YWx1ZXMKICAgICBhcmUgJ24nLCAnbm8nLCAnZicsICdmYWxzZScsICdvZmYnLCBhbmQgJzAnLiAgUmFpc2VzIFZhbHVlRXJyb3IgaWYKICAgICAndmFsJyBpcyBhbnl0aGluZyBlbHNlLgpkaWZmIC0tZ2l0IGEvTGliL2R1bW15X3RocmVhZGluZy5weSBiL0xpYi9kdW1teV90aHJlYWRpbmcucHkKaW5kZXggNGQwYjc0NC4uNDhmN2M0YyAxMDA2NDQKLS0tIGEvTGliL2R1bW15X3RocmVhZGluZy5weQorKysgYi9MaWIvZHVtbXlfdGhyZWFkaW5nLnB5CkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgIGhlbGRfX3RocmVhZGluZ19sb2NhbCA9IHN5c19tb2R1bGVzWydfdGhyZWFkaW5nX2xvY2FsJ10KICAgICAgICAgaG9sZGluZ19fdGhyZWFkaW5nX2xvY2FsID0gVHJ1ZQogICAgICAgICBkZWwgc3lzX21vZHVsZXNbJ190aHJlYWRpbmdfbG9jYWwnXQotICAgICAgICAKKwogICAgIGltcG9ydCB0aHJlYWRpbmcKICAgICAjIE5lZWQgYSBjb3B5IG9mIHRoZSBjb2RlIGtlcHQgc29tZXdoZXJlLi4uCiAgICAgc3lzX21vZHVsZXNbJ19kdW1teV90aHJlYWRpbmcnXSA9IHN5c19tb2R1bGVzWyd0aHJlYWRpbmcnXQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvUGFyYS5weSBiL0xpYi9saWItb2xkL1BhcmEucHkKaW5kZXggMmU2YWE0Yy4uMmZkOGRjNiAxMDA2NDQKLS0tIGEvTGliL2xpYi1vbGQvUGFyYS5weQorKysgYi9MaWIvbGliLW9sZC9QYXJhLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBUZXh0IGZvcm1hdHRpbmcgYWJzdHJhY3Rpb25zIAorIyBUZXh0IGZvcm1hdHRpbmcgYWJzdHJhY3Rpb25zCiAjIE5vdGUgLS0gdGhpcyBtb2R1bGUgaXMgb2Jzb2xldGUsIGl0J3MgdG9vIHNsb3cgYW55d2F5CiAKIApAQCAtMTQsMzMwICsxNCwzMzAgQEAKICMgZGlmZmVyZW50IHNjcmVlbiBsb2NhdGlvbnMuICBPbmNlIHJlbmRlcmVkLCBpdCBjYW4gYmUgcXVlcmllZAogIyBmb3IgbW91c2UgaGl0cywgYW5kIHBhcnRzIG9mIHRoZSB0ZXh0IGNhbiBiZSBoaWdobGlnaHRlZAogY2xhc3MgUGFyYToKLQkjCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlzZWxmLndvcmRzID0gW10gIyBUaGUgd29yZHMKLQkJc2VsZi5qdXN0ID0gJ2wnICMgSnVzdGlmaWNhdGlvbjogJ2wnLCAncicsICdscicgb3IgJ2MnCi0JCXNlbGYuaW5kZW50X2xlZnQgPSBzZWxmLmluZGVudF9yaWdodCA9IHNlbGYuaW5kZW50X2hhbmcgPSAwCi0JCSMgRmluYWwgbGF5LW91dCBwYXJhbWV0ZXJzLCBtYXkgY2hhbmdlCi0JCXNlbGYubGVmdCA9IHNlbGYudG9wID0gc2VsZi5yaWdodCA9IHNlbGYuYm90dG9tID0gXAotCQkJc2VsZi53aWR0aCA9IHNlbGYuaGVpZ2h0ID0gc2VsZi5saW5lcyA9IE5vbmUKLQkjCi0JIyBBZGQgYSB3b3JkLCBjb21wdXRpbmcgc2l6ZSBpbmZvcm1hdGlvbiBmb3IgaXQuCi0JIyBXb3JkcyBtYXkgYWxzbyBiZSBhZGRlZCBtYW51YWxseSBieSBhcHBlbmRpbmcgdG8gc2VsZi53b3JkcwotCSMgRWFjaCB3b3JkIHNob3VsZCBiZSBhIDctdHVwbGU6Ci0JIyAoZm9udCwgdGV4dCwgd2lkdGgsIHNwYWNlLCBzdHJldGNoLCBhc2NlbnQsIGRlc2NlbnQpCi0JZGVmIGFkZHdvcmQoc2VsZiwgZCwgZm9udCwgdGV4dCwgc3BhY2UsIHN0cmV0Y2gpOgotCQlpZiBmb250IGlzIG5vdCBOb25lOgotCQkJZC5zZXRmb250KGZvbnQpCi0JCXdpZHRoID0gZC50ZXh0d2lkdGgodGV4dCkKLQkJYXNjZW50ID0gZC5iYXNlbGluZSgpCi0JCWRlc2NlbnQgPSBkLmxpbmVoZWlnaHQoKSAtIGFzY2VudAotCQlzcHcgPSBkLnRleHR3aWR0aCgnICcpCi0JCXNwYWNlID0gc3BhY2UgKiBzcHcKLQkJc3RyZXRjaCA9IHN0cmV0Y2ggKiBzcHcKLQkJdHVwbGUgPSAoZm9udCwgdGV4dCwgd2lkdGgsIHNwYWNlLCBzdHJldGNoLCBhc2NlbnQsIGRlc2NlbnQpCi0JCXNlbGYud29yZHMuYXBwZW5kKHR1cGxlKQotCSMKLQkjIEhvb2tzIHRvIGJlZ2luIGFuZCBlbmQgYW5jaG9ycyAtLSBpbnNlcnQgbnVtYmVycyBpbiB0aGUgd29yZCBsaXN0IQotCWRlZiBiZ25fYW5jaG9yKHNlbGYsIGlkKToKLQkJc2VsZi53b3Jkcy5hcHBlbmQoaWQpCi0JIwotCWRlZiBlbmRfYW5jaG9yKHNlbGYsIGlkKToKLQkJc2VsZi53b3Jkcy5hcHBlbmQoMCkKLQkjCi0JIyBSZXR1cm4gdGhlIHRvdGFsIGxlbmd0aCAod2lkdGgpIG9mIHRoZSB0ZXh0IGFkZGVkIHNvIGZhciwgaW4gcGl4ZWxzCi0JZGVmIGdldGxlbmd0aChzZWxmKToKLQkJdG90YWwgPSAwCi0JCWZvciB3b3JkIGluIHNlbGYud29yZHM6Ci0JCQlpZiB0eXBlKHdvcmQpIGlzIG5vdCBJbnQ6Ci0JCQkJdG90YWwgPSB0b3RhbCArIHdvcmRbMl0gKyB3b3JkWzNdCi0JCXJldHVybiB0b3RhbAotCSMKLQkjIFRhYiB0byBhIGdpdmVuIHBvc2l0aW9uIChyZWxhdGl2ZSB0byB0aGUgY3VycmVudCBsZWZ0IGluZGVudCk6Ci0JIyByZW1vdmUgYWxsIHN0cmV0Y2gsIGFkZCBmaXhlZCBzcGFjZSB1cCB0byB0aGUgbmV3IGluZGVudC4KLQkjIElmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGFscmVhZHkgYXQgdGhlIHRhYiBzdG9wLAotCSMgZG9uJ3QgYWRkIGFueSBuZXcgc3BhY2UgKGJ1dCBzdGlsbCByZW1vdmUgdGhlIHN0cmV0Y2gpCi0JZGVmIHRhYnRvKHNlbGYsIHRhYik6Ci0JCXRvdGFsID0gMAotCQlhcywgZGUgPSAxLCAwCi0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLndvcmRzKSk6Ci0JCQl3b3JkID0gc2VsZi53b3Jkc1tpXQotCQkJaWYgdHlwZSh3b3JkKSBpcyBJbnQ6IGNvbnRpbnVlCi0JCQkoZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUpID0gd29yZAotCQkJc2VsZi53b3Jkc1tpXSA9IChmbywgdGUsIHdpLCBzcCwgMCwgYXMsIGRlKQotCQkJdG90YWwgPSB0b3RhbCArIHdpICsgc3AKLQkJaWYgdG90YWwgPCB0YWI6Ci0JCQlzZWxmLndvcmRzLmFwcGVuZCgoTm9uZSwgJycsIDAsIHRhYi10b3RhbCwgMCwgYXMsIGRlKSkKLQkjCi0JIyBNYWtlIGEgaGFuZ2luZyB0YWc6IHRhYiB0byBoYW5nLCBpbmNyZW1lbnQgaW5kZW50X2xlZnQgYnkgaGFuZywKLQkjIGFuZCByZXNldCBpbmRlbnRfaGFuZyB0byAtaGFuZwotCWRlZiBtYWtlaGFuZ2luZ3RhZyhzZWxmLCBoYW5nKToKLQkJc2VsZi50YWJ0byhoYW5nKQotCQlzZWxmLmluZGVudF9sZWZ0ID0gc2VsZi5pbmRlbnRfbGVmdCArIGhhbmcKLQkJc2VsZi5pbmRlbnRfaGFuZyA9IC1oYW5nCi0JIwotCSMgRGVjaWRlIHdoZXJlIHRoZSBsaW5lIGJyZWFrcyB3aWxsIGJlIGdpdmVuIHNvbWUgc2NyZWVuIHdpZHRoCi0JZGVmIGxheW91dChzZWxmLCBsaW5ld2lkdGgpOgotCQlzZWxmLndpZHRoID0gbGluZXdpZHRoCi0JCWhlaWdodCA9IDAKLQkJc2VsZi5saW5lcyA9IGxpbmVzID0gW10KLQkJYXZhaWwxID0gc2VsZi53aWR0aCAtIHNlbGYuaW5kZW50X2xlZnQgLSBzZWxmLmluZGVudF9yaWdodAotCQlhdmFpbCA9IGF2YWlsMSAtIHNlbGYuaW5kZW50X2hhbmcKLQkJd29yZHMgPSBzZWxmLndvcmRzCi0JCWkgPSAwCi0JCW4gPSBsZW4od29yZHMpCi0JCWxhc3Rmb250ID0gTm9uZQotCQl3aGlsZSBpIDwgbjoKLQkJCWZpcnN0Zm9udCA9IGxhc3Rmb250Ci0JCQljaGFyY291bnQgPSAwCi0JCQl3aWR0aCA9IDAKLQkJCXN0cmV0Y2ggPSAwCi0JCQlhc2NlbnQgPSAwCi0JCQlkZXNjZW50ID0gMAotCQkJbHNwID0gMAotCQkJaiA9IGkKLQkJCXdoaWxlIGkgPCBuOgotCQkJCXdvcmQgPSB3b3Jkc1tpXQotCQkJCWlmIHR5cGUod29yZCkgaXMgSW50OgotCQkJCQlpZiB3b3JkID4gMCBhbmQgd2lkdGggPj0gYXZhaWw6Ci0JCQkJCQlicmVhawotCQkJCQlpID0gaSsxCi0JCQkJCWNvbnRpbnVlCi0JCQkJZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUgPSB3b3JkCi0JCQkJaWYgd2lkdGggKyB3aSA+IGF2YWlsIGFuZCB3aWR0aCA+IDAgYW5kIHdpID4gMDoKLQkJCQkJYnJlYWsKLQkJCQlpZiBmbyBpcyBub3QgTm9uZToKLQkJCQkJbGFzdGZvbnQgPSBmbwotCQkJCQlpZiB3aWR0aCA9PSAwOgotCQkJCQkJZmlyc3Rmb250ID0gZm8KLQkJCQljaGFyY291bnQgPSBjaGFyY291bnQgKyBsZW4odGUpICsgKHNwID4gMCkKLQkJCQl3aWR0aCA9IHdpZHRoICsgd2kgKyBzcAotCQkJCWxzcCA9IHNwCi0JCQkJc3RyZXRjaCA9IHN0cmV0Y2ggKyBzdAotCQkJCWxzdCA9IHN0Ci0JCQkJYXNjZW50ID0gbWF4KGFzY2VudCwgYXMpCi0JCQkJZGVzY2VudCA9IG1heChkZXNjZW50LCBkZSkKLQkJCQlpID0gaSsxCi0JCQl3aGlsZSBpID4gaiBhbmQgdHlwZSh3b3Jkc1tpLTFdKSBpcyBJbnQgYW5kIFwKLQkJCQl3b3Jkc1tpLTFdID4gMDogaSA9IGktMQotCQkJd2lkdGggPSB3aWR0aCAtIGxzcAotCQkJaWYgaSA8IG46Ci0JCQkJc3RyZXRjaCA9IHN0cmV0Y2ggLSBsc3QKLQkJCWVsc2U6Ci0JCQkJc3RyZXRjaCA9IDAKLQkJCXR1cGxlID0gaS1qLCBmaXJzdGZvbnQsIGNoYXJjb3VudCwgd2lkdGgsIHN0cmV0Y2gsIFwKLQkJCQlhc2NlbnQsIGRlc2NlbnQKLQkJCWxpbmVzLmFwcGVuZCh0dXBsZSkKLQkJCWhlaWdodCA9IGhlaWdodCArIGFzY2VudCArIGRlc2NlbnQKLQkJCWF2YWlsID0gYXZhaWwxCi0JCXNlbGYuaGVpZ2h0ID0gaGVpZ2h0Ci0JIwotCSMgQ2FsbCBhIGZ1bmN0aW9uIGZvciBhbGwgd29yZHMgaW4gYSBsaW5lCi0JZGVmIHZpc2l0KHNlbGYsIHdvcmRmdW5jLCBhbmNob3JmdW5jKToKLQkJYXZhaWwxID0gc2VsZi53aWR0aCAtIHNlbGYuaW5kZW50X2xlZnQgLSBzZWxmLmluZGVudF9yaWdodAotCQlhdmFpbCA9IGF2YWlsMSAtIHNlbGYuaW5kZW50X2hhbmcKLQkJdiA9IHNlbGYudG9wCi0JCWkgPSAwCi0JCWZvciB0dXBsZSBpbiBzZWxmLmxpbmVzOgotCQkJd29yZGNvdW50LCBmaXJzdGZvbnQsIGNoYXJjb3VudCwgd2lkdGgsIHN0cmV0Y2gsIFwKLQkJCQlhc2NlbnQsIGRlc2NlbnQgPSB0dXBsZQotCQkJaCA9IHNlbGYubGVmdCArIHNlbGYuaW5kZW50X2xlZnQKLQkJCWlmIGkgPT0gMDogaCA9IGggKyBzZWxmLmluZGVudF9oYW5nCi0JCQlleHRyYSA9IDAKLQkJCWlmIHNlbGYuanVzdCA9PSAncic6IGggPSBoICsgYXZhaWwgLSB3aWR0aAotCQkJZWxpZiBzZWxmLmp1c3QgPT0gJ2MnOiBoID0gaCArIChhdmFpbCAtIHdpZHRoKSAvIDIKLQkJCWVsaWYgc2VsZi5qdXN0ID09ICdscicgYW5kIHN0cmV0Y2ggPiAwOgotCQkJCWV4dHJhID0gYXZhaWwgLSB3aWR0aAotCQkJdjIgPSB2ICsgYXNjZW50ICsgZGVzY2VudAotCQkJZm9yIGogaW4gcmFuZ2UoaSwgaSt3b3JkY291bnQpOgotCQkJCXdvcmQgPSBzZWxmLndvcmRzW2pdCi0JCQkJaWYgdHlwZSh3b3JkKSBpcyBJbnQ6Ci0JCQkJCW9rID0gYW5jaG9yZnVuYyhzZWxmLCB0dXBsZSwgd29yZCwgXAotCQkJCQkJCWgsIHYpCi0JCQkJCWlmIG9rIGlzIG5vdCBOb25lOiByZXR1cm4gb2sKLQkJCQkJY29udGludWUKLQkJCQlmbywgdGUsIHdpLCBzcCwgc3QsIGFzLCBkZSA9IHdvcmQKLQkJCQlpZiBleHRyYSA+IDAgYW5kIHN0cmV0Y2ggPiAwOgotCQkJCQlleCA9IGV4dHJhICogc3QgLyBzdHJldGNoCi0JCQkJCWV4dHJhID0gZXh0cmEgLSBleAotCQkJCQlzdHJldGNoID0gc3RyZXRjaCAtIHN0Ci0JCQkJZWxzZToKLQkJCQkJZXggPSAwCi0JCQkJaDIgPSBoICsgd2kgKyBzcCArIGV4Ci0JCQkJb2sgPSB3b3JkZnVuYyhzZWxmLCB0dXBsZSwgd29yZCwgaCwgdiwgXAotCQkJCQloMiwgdjIsIChqPT1pKSwgKGo9PWkrd29yZGNvdW50LTEpKQotCQkJCWlmIG9rIGlzIG5vdCBOb25lOiByZXR1cm4gb2sKLQkJCQloID0gaDIKLQkJCXYgPSB2MgotCQkJaSA9IGkgKyB3b3JkY291bnQKLQkJCWF2YWlsID0gYXZhaWwxCi0JIwotCSMgUmVuZGVyIGEgcGFyYWdyYXBoIGluICJkcmF3aW5nIG9iamVjdCIgZCwgdXNpbmcgdGhlIHJlY3RhbmdsZQotCSMgZ2l2ZW4gYnkgKGxlZnQsIHRvcCwgcmlnaHQpIHdpdGggYW4gdW5zcGVjaWZpZWQgYm90dG9tLgotCSMgUmV0dXJuIHRoZSBjb21wdXRlZCBib3R0b20gb2YgdGhlIHRleHQuCi0JZGVmIHJlbmRlcihzZWxmLCBkLCBsZWZ0LCB0b3AsIHJpZ2h0KToKLQkJaWYgc2VsZi53aWR0aCAhPSByaWdodC1sZWZ0OgotCQkJc2VsZi5sYXlvdXQocmlnaHQtbGVmdCkKLQkJc2VsZi5sZWZ0ID0gbGVmdAotCQlzZWxmLnRvcCA9IHRvcAotCQlzZWxmLnJpZ2h0ID0gcmlnaHQKLQkJc2VsZi5ib3R0b20gPSBzZWxmLnRvcCArIHNlbGYuaGVpZ2h0Ci0JCXNlbGYuYW5jaG9yaWQgPSAwCi0JCXRyeToKLQkJCXNlbGYuZCA9IGQKLQkJCXNlbGYudmlzaXQoc2VsZi5fX2NsYXNzX18uX3JlbmRlcndvcmQsIFwKLQkJCQkgICBzZWxmLl9fY2xhc3NfXy5fcmVuZGVyYW5jaG9yKQotCQlmaW5hbGx5OgotCQkJc2VsZi5kID0gTm9uZQotCQlyZXR1cm4gc2VsZi5ib3R0b20KLQkjCi0JZGVmIF9yZW5kZXJ3b3JkKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2LCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6Ci0JCWlmIHdvcmRbMF0gaXMgbm90IE5vbmU6IHNlbGYuZC5zZXRmb250KHdvcmRbMF0pCi0JCWJhc2VsaW5lID0gdiArIHR1cGxlWzVdCi0JCXNlbGYuZC50ZXh0KChoLCBiYXNlbGluZSAtIHdvcmRbNV0pLCB3b3JkWzFdKQotCQlpZiBzZWxmLmFuY2hvcmlkID4gMDoKLQkJCXNlbGYuZC5saW5lKChoLCBiYXNlbGluZSsyKSwgKGgyLCBiYXNlbGluZSsyKSkKLQkjCi0JZGVmIF9yZW5kZXJhbmNob3Ioc2VsZiwgdHVwbGUsIHdvcmQsIGgsIHYpOgotCQlzZWxmLmFuY2hvcmlkID0gd29yZAotCSMKLQkjIFJldHVybiB3aGljaCBhbmNob3Iocykgd2FzIGhpdCBieSB0aGUgbW91c2UKLQlkZWYgaGl0Y2hlY2soc2VsZiwgbW91c2VoLCBtb3VzZXYpOgotCQlzZWxmLm1vdXNlaCA9IG1vdXNlaAotCQlzZWxmLm1vdXNldiA9IG1vdXNldgotCQlzZWxmLmFuY2hvcmlkID0gMAotCQlzZWxmLmhpdHMgPSBbXQotCQlzZWxmLnZpc2l0KHNlbGYuX19jbGFzc19fLl9oaXRjaGVja3dvcmQsIFwKLQkJCSAgIHNlbGYuX19jbGFzc19fLl9oaXRjaGVja2FuY2hvcikKLQkJcmV0dXJuIHNlbGYuaGl0cwotCSMKLQlkZWYgX2hpdGNoZWNrd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaCwgdiwgaDIsIHYyLCBpc2ZpcnN0LCBpc2xhc3QpOgotCQlpZiBzZWxmLmFuY2hvcmlkID4gMCBhbmQgaCA8PSBzZWxmLm1vdXNlaCA8PSBoMiBhbmQgXAotCQkJdiA8PSBzZWxmLm1vdXNldiA8PSB2MjoKLQkJCXNlbGYuaGl0cy5hcHBlbmQoc2VsZi5hbmNob3JpZCkKLQkjCi0JZGVmIF9oaXRjaGVja2FuY2hvcihzZWxmLCB0dXBsZSwgd29yZCwgaCwgdik6Ci0JCXNlbGYuYW5jaG9yaWQgPSB3b3JkCi0JIwotCSMgUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGFuY2hvciBpZCBpcyBwcmVzZW50Ci0JZGVmIGhhc2FuY2hvcihzZWxmLCBpZCk6Ci0JCXJldHVybiBpZCBpbiBzZWxmLndvcmRzIG9yIC1pZCBpbiBzZWxmLndvcmRzCi0JIwotCSMgRXh0cmFjdCB0aGUgcmF3IHRleHQgZnJvbSB0aGUgd29yZCBsaXN0LCBzdWJzdGl0dXRpbmcgb25lIHNwYWNlCi0JIyBmb3Igbm9uLWVtcHR5IGludGVyLXdvcmQgc3BhY2UsIGFuZCB0ZXJtaW5hdGluZyB3aXRoICdcbicKLQlkZWYgZXh0cmFjdChzZWxmKToKLQkJdGV4dCA9ICcnCi0JCWZvciB3IGluIHNlbGYud29yZHM6Ci0JCQlpZiB0eXBlKHcpIGlzIG5vdCBJbnQ6Ci0JCQkJd29yZCA9IHdbMV0KLQkJCQlpZiB3WzNdOiB3b3JkID0gd29yZCArICcgJwotCQkJCXRleHQgPSB0ZXh0ICsgd29yZAotCQlyZXR1cm4gdGV4dCArICdcbicKLQkjCi0JIyBSZXR1cm4gd2hpY2ggY2hhcmFjdGVyIHBvc2l0aW9uIHdhcyBoaXQgYnkgdGhlIG1vdXNlLCBhcwotCSMgYW4gb2Zmc2V0IGluIHRoZSBlbnRpcmUgdGV4dCBhcyByZXR1cm5lZCBieSBleHRyYWN0KCkuCi0JIyBSZXR1cm4gTm9uZSBpZiB0aGUgbW91c2Ugd2FzIG5vdCBpbiB0aGlzIHBhcmFncmFwaAotCWRlZiB3aGVyZWlzKHNlbGYsIGQsIG1vdXNlaCwgbW91c2V2KToKLQkJaWYgbW91c2V2IDwgc2VsZi50b3Agb3IgbW91c2V2ID4gc2VsZi5ib3R0b206Ci0JCQlyZXR1cm4gTm9uZQotCQlzZWxmLm1vdXNlaCA9IG1vdXNlaAotCQlzZWxmLm1vdXNldiA9IG1vdXNldgotCQlzZWxmLmxhc3Rmb250ID0gTm9uZQotCQlzZWxmLmNoYXJjb3VudCA9IDAKLQkJdHJ5OgotCQkJc2VsZi5kID0gZAotCQkJcmV0dXJuIHNlbGYudmlzaXQoc2VsZi5fX2NsYXNzX18uX3doZXJlaXN3b3JkLCBcCi0JCQkJCSAgc2VsZi5fX2NsYXNzX18uX3doZXJlaXNhbmNob3IpCi0JCWZpbmFsbHk6Ci0JCQlzZWxmLmQgPSBOb25lCi0JIwotCWRlZiBfd2hlcmVpc3dvcmQoc2VsZiwgdHVwbGUsIHdvcmQsIGgxLCB2MSwgaDIsIHYyLCBpc2ZpcnN0LCBpc2xhc3QpOgotCQlmbywgdGUsIHdpLCBzcCwgc3QsIGFzLCBkZSA9IHdvcmQKLQkJaWYgZm8gaXMgbm90IE5vbmU6IHNlbGYubGFzdGZvbnQgPSBmbwotCQloID0gaDEKLQkJaWYgaXNmaXJzdDogaDEgPSAwCi0JCWlmIGlzbGFzdDogaDIgPSA5OTk5OTkKLQkJaWYgbm90ICh2MSA8PSBzZWxmLm1vdXNldiA8PSB2MiBhbmQgaDEgPD0gc2VsZi5tb3VzZWggPD0gaDIpOgotCQkJc2VsZi5jaGFyY291bnQgPSBzZWxmLmNoYXJjb3VudCArIGxlbih0ZSkgKyAoc3AgPiAwKQotCQkJcmV0dXJuCi0JCWlmIHNlbGYubGFzdGZvbnQgaXMgbm90IE5vbmU6Ci0JCQlzZWxmLmQuc2V0Zm9udChzZWxmLmxhc3Rmb250KQotCQljYyA9IDAKLQkJZm9yIGMgaW4gdGU6Ci0JCQljdyA9IHNlbGYuZC50ZXh0d2lkdGgoYykKLQkJCWlmIHNlbGYubW91c2VoIDw9IGggKyBjdy8yOgotCQkJCXJldHVybiBzZWxmLmNoYXJjb3VudCArIGNjCi0JCQljYyA9IGNjKzEKLQkJCWggPSBoK2N3Ci0JCXNlbGYuY2hhcmNvdW50ID0gc2VsZi5jaGFyY291bnQgKyBjYwotCQlpZiBzZWxmLm1vdXNlaCA8PSAoaCtoMikgLyAyOgotCQkJcmV0dXJuIHNlbGYuY2hhcmNvdW50Ci0JCWVsc2U6Ci0JCQlyZXR1cm4gc2VsZi5jaGFyY291bnQgKyAxCi0JIwotCWRlZiBfd2hlcmVpc2FuY2hvcihzZWxmLCB0dXBsZSwgd29yZCwgaCwgdik6Ci0JCXBhc3MKLQkjCi0JIyBSZXR1cm4gc2NyZWVuIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gcG9zaXRpb24gaW4gcGFyYWdyYXBoLgotCSMgUmV0dXJuIHR1cGxlIChoLCB2dG9wLCB2YmFzZWxpbmUsIHZib3R0b20pLgotCSMgVGhpcyBpcyBtb3JlIG9yIGxlc3MgdGhlIGludmVyc2Ugb2Ygd2hlcmVpcygpCi0JZGVmIHNjcmVlbnBvcyhzZWxmLCBkLCBwb3MpOgotCQlpZiBwb3MgPCAwOgotCQkJYXNjZW50LCBkZXNjZW50ID0gc2VsZi5saW5lc1swXVs1OjddCi0JCQlyZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnRvcCwgc2VsZi50b3AgKyBhc2NlbnQsIFwKLQkJCQlzZWxmLnRvcCArIGFzY2VudCArIGRlc2NlbnQKLQkJc2VsZi5wb3MgPSBwb3MKLQkJc2VsZi5sYXN0Zm9udCA9IE5vbmUKLQkJdHJ5OgotCQkJc2VsZi5kID0gZAotCQkJb2sgPSBzZWxmLnZpc2l0KHNlbGYuX19jbGFzc19fLl9zY3JlZW5wb3N3b3JkLCBcCi0JCQkJCXNlbGYuX19jbGFzc19fLl9zY3JlZW5wb3NhbmNob3IpCi0JCWZpbmFsbHk6Ci0JCQlzZWxmLmQgPSBOb25lCi0JCWlmIG9rIGlzIE5vbmU6Ci0JCQlhc2NlbnQsIGRlc2NlbnQgPSBzZWxmLmxpbmVzWy0xXVs1OjddCi0JCQlvayA9IHNlbGYucmlnaHQsIHNlbGYuYm90dG9tIC0gYXNjZW50IC0gZGVzY2VudCwgXAotCQkJCXNlbGYuYm90dG9tIC0gZGVzY2VudCwgc2VsZi5ib3R0b20KLQkJcmV0dXJuIG9rCi0JIwotCWRlZiBfc2NyZWVucG9zd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaDEsIHYxLCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6Ci0JCWZvLCB0ZSwgd2ksIHNwLCBzdCwgYXMsIGRlID0gd29yZAotCQlpZiBmbyBpcyBub3QgTm9uZTogc2VsZi5sYXN0Zm9udCA9IGZvCi0JCWNjID0gbGVuKHRlKSArIChzcCA+IDApCi0JCWlmIHNlbGYucG9zID4gY2M6Ci0JCQlzZWxmLnBvcyA9IHNlbGYucG9zIC0gY2MKLQkJCXJldHVybgotCQlpZiBzZWxmLnBvcyA8IGNjOgotCQkJc2VsZi5kLnNldGZvbnQoc2VsZi5sYXN0Zm9udCkKLQkJCWggPSBoMSArIHNlbGYuZC50ZXh0d2lkdGgodGVbOnNlbGYucG9zXSkKLQkJZWxzZToKLQkJCWggPSBoMgotCQlhc2NlbnQsIGRlc2NlbnQgPSB0dXBsZVs1OjddCi0JCXJldHVybiBoLCB2MSwgdjErYXNjZW50LCB2MgotCSMKLQlkZWYgX3NjcmVlbnBvc2FuY2hvcihzZWxmLCB0dXBsZSwgd29yZCwgaCwgdik6Ci0JCXBhc3MKLQkjCi0JIyBJbnZlcnQgdGhlIHN0cmV0Y2ggb2YgdGV4dCBiZXR3ZWVuIHBvczEgYW5kIHBvczIuCi0JIyBJZiBwb3MxIGlzIE5vbmUsIHRoZSBiZWdpbm5pbmcgaXMgaW1wbGllZDsKLQkjIGlmIHBvczIgaXMgTm9uZSwgdGhlIGVuZCBpcyBpbXBsaWVkLgotCSMgVW5kb2VzIGl0cyBvd24gZWZmZWN0IHdoZW4gY2FsbGVkIGFnYWluIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzCi0JZGVmIGludmVydChzZWxmLCBkLCBwb3MxLCBwb3MyKToKLQkJaWYgcG9zMSBpcyBOb25lOgotCQkJcG9zMSA9IHNlbGYubGVmdCwgc2VsZi50b3AsIHNlbGYudG9wLCBzZWxmLnRvcAotCQllbHNlOgotCQkJcG9zMSA9IHNlbGYuc2NyZWVucG9zKGQsIHBvczEpCi0JCWlmIHBvczIgaXMgTm9uZToKLQkJCXBvczIgPSBzZWxmLnJpZ2h0LCBzZWxmLmJvdHRvbSxzZWxmLmJvdHRvbSxzZWxmLmJvdHRvbQotCQllbHNlOgotCQkJcG9zMiA9IHNlbGYuc2NyZWVucG9zKGQsIHBvczIpCi0JCWgxLCB0b3AxLCBiYXNlbGluZTEsIGJvdHRvbTEgPSBwb3MxCi0JCWgyLCB0b3AyLCBiYXNlbGluZTIsIGJvdHRvbTIgPSBwb3MyCi0JCWlmIGJvdHRvbTEgPD0gdG9wMjoKLQkJCWQuaW52ZXJ0KChoMSwgdG9wMSksIChzZWxmLnJpZ2h0LCBib3R0b20xKSkKLQkJCWgxID0gc2VsZi5sZWZ0Ci0JCQlpZiBib3R0b20xIDwgdG9wMjoKLQkJCQlkLmludmVydCgoaDEsIGJvdHRvbTEpLCAoc2VsZi5yaWdodCwgdG9wMikpCi0JCQl0b3AxLCBib3R0b20xID0gdG9wMiwgYm90dG9tMgotCQlkLmludmVydCgoaDEsIHRvcDEpLCAoaDIsIGJvdHRvbTIpKQorICAgICMKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYud29yZHMgPSBbXSAjIFRoZSB3b3JkcworICAgICAgICBzZWxmLmp1c3QgPSAnbCcgIyBKdXN0aWZpY2F0aW9uOiAnbCcsICdyJywgJ2xyJyBvciAnYycKKyAgICAgICAgc2VsZi5pbmRlbnRfbGVmdCA9IHNlbGYuaW5kZW50X3JpZ2h0ID0gc2VsZi5pbmRlbnRfaGFuZyA9IDAKKyAgICAgICAgIyBGaW5hbCBsYXktb3V0IHBhcmFtZXRlcnMsIG1heSBjaGFuZ2UKKyAgICAgICAgc2VsZi5sZWZ0ID0gc2VsZi50b3AgPSBzZWxmLnJpZ2h0ID0gc2VsZi5ib3R0b20gPSBcCisgICAgICAgICAgICAgICAgc2VsZi53aWR0aCA9IHNlbGYuaGVpZ2h0ID0gc2VsZi5saW5lcyA9IE5vbmUKKyAgICAjCisgICAgIyBBZGQgYSB3b3JkLCBjb21wdXRpbmcgc2l6ZSBpbmZvcm1hdGlvbiBmb3IgaXQuCisgICAgIyBXb3JkcyBtYXkgYWxzbyBiZSBhZGRlZCBtYW51YWxseSBieSBhcHBlbmRpbmcgdG8gc2VsZi53b3JkcworICAgICMgRWFjaCB3b3JkIHNob3VsZCBiZSBhIDctdHVwbGU6CisgICAgIyAoZm9udCwgdGV4dCwgd2lkdGgsIHNwYWNlLCBzdHJldGNoLCBhc2NlbnQsIGRlc2NlbnQpCisgICAgZGVmIGFkZHdvcmQoc2VsZiwgZCwgZm9udCwgdGV4dCwgc3BhY2UsIHN0cmV0Y2gpOgorICAgICAgICBpZiBmb250IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZC5zZXRmb250KGZvbnQpCisgICAgICAgIHdpZHRoID0gZC50ZXh0d2lkdGgodGV4dCkKKyAgICAgICAgYXNjZW50ID0gZC5iYXNlbGluZSgpCisgICAgICAgIGRlc2NlbnQgPSBkLmxpbmVoZWlnaHQoKSAtIGFzY2VudAorICAgICAgICBzcHcgPSBkLnRleHR3aWR0aCgnICcpCisgICAgICAgIHNwYWNlID0gc3BhY2UgKiBzcHcKKyAgICAgICAgc3RyZXRjaCA9IHN0cmV0Y2ggKiBzcHcKKyAgICAgICAgdHVwbGUgPSAoZm9udCwgdGV4dCwgd2lkdGgsIHNwYWNlLCBzdHJldGNoLCBhc2NlbnQsIGRlc2NlbnQpCisgICAgICAgIHNlbGYud29yZHMuYXBwZW5kKHR1cGxlKQorICAgICMKKyAgICAjIEhvb2tzIHRvIGJlZ2luIGFuZCBlbmQgYW5jaG9ycyAtLSBpbnNlcnQgbnVtYmVycyBpbiB0aGUgd29yZCBsaXN0IQorICAgIGRlZiBiZ25fYW5jaG9yKHNlbGYsIGlkKToKKyAgICAgICAgc2VsZi53b3Jkcy5hcHBlbmQoaWQpCisgICAgIworICAgIGRlZiBlbmRfYW5jaG9yKHNlbGYsIGlkKToKKyAgICAgICAgc2VsZi53b3Jkcy5hcHBlbmQoMCkKKyAgICAjCisgICAgIyBSZXR1cm4gdGhlIHRvdGFsIGxlbmd0aCAod2lkdGgpIG9mIHRoZSB0ZXh0IGFkZGVkIHNvIGZhciwgaW4gcGl4ZWxzCisgICAgZGVmIGdldGxlbmd0aChzZWxmKToKKyAgICAgICAgdG90YWwgPSAwCisgICAgICAgIGZvciB3b3JkIGluIHNlbGYud29yZHM6CisgICAgICAgICAgICBpZiB0eXBlKHdvcmQpIGlzIG5vdCBJbnQ6CisgICAgICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIHdvcmRbMl0gKyB3b3JkWzNdCisgICAgICAgIHJldHVybiB0b3RhbAorICAgICMKKyAgICAjIFRhYiB0byBhIGdpdmVuIHBvc2l0aW9uIChyZWxhdGl2ZSB0byB0aGUgY3VycmVudCBsZWZ0IGluZGVudCk6CisgICAgIyByZW1vdmUgYWxsIHN0cmV0Y2gsIGFkZCBmaXhlZCBzcGFjZSB1cCB0byB0aGUgbmV3IGluZGVudC4KKyAgICAjIElmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGFscmVhZHkgYXQgdGhlIHRhYiBzdG9wLAorICAgICMgZG9uJ3QgYWRkIGFueSBuZXcgc3BhY2UgKGJ1dCBzdGlsbCByZW1vdmUgdGhlIHN0cmV0Y2gpCisgICAgZGVmIHRhYnRvKHNlbGYsIHRhYik6CisgICAgICAgIHRvdGFsID0gMAorICAgICAgICBhcywgZGUgPSAxLCAwCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLndvcmRzKSk6CisgICAgICAgICAgICB3b3JkID0gc2VsZi53b3Jkc1tpXQorICAgICAgICAgICAgaWYgdHlwZSh3b3JkKSBpcyBJbnQ6IGNvbnRpbnVlCisgICAgICAgICAgICAoZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUpID0gd29yZAorICAgICAgICAgICAgc2VsZi53b3Jkc1tpXSA9IChmbywgdGUsIHdpLCBzcCwgMCwgYXMsIGRlKQorICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIHdpICsgc3AKKyAgICAgICAgaWYgdG90YWwgPCB0YWI6CisgICAgICAgICAgICBzZWxmLndvcmRzLmFwcGVuZCgoTm9uZSwgJycsIDAsIHRhYi10b3RhbCwgMCwgYXMsIGRlKSkKKyAgICAjCisgICAgIyBNYWtlIGEgaGFuZ2luZyB0YWc6IHRhYiB0byBoYW5nLCBpbmNyZW1lbnQgaW5kZW50X2xlZnQgYnkgaGFuZywKKyAgICAjIGFuZCByZXNldCBpbmRlbnRfaGFuZyB0byAtaGFuZworICAgIGRlZiBtYWtlaGFuZ2luZ3RhZyhzZWxmLCBoYW5nKToKKyAgICAgICAgc2VsZi50YWJ0byhoYW5nKQorICAgICAgICBzZWxmLmluZGVudF9sZWZ0ID0gc2VsZi5pbmRlbnRfbGVmdCArIGhhbmcKKyAgICAgICAgc2VsZi5pbmRlbnRfaGFuZyA9IC1oYW5nCisgICAgIworICAgICMgRGVjaWRlIHdoZXJlIHRoZSBsaW5lIGJyZWFrcyB3aWxsIGJlIGdpdmVuIHNvbWUgc2NyZWVuIHdpZHRoCisgICAgZGVmIGxheW91dChzZWxmLCBsaW5ld2lkdGgpOgorICAgICAgICBzZWxmLndpZHRoID0gbGluZXdpZHRoCisgICAgICAgIGhlaWdodCA9IDAKKyAgICAgICAgc2VsZi5saW5lcyA9IGxpbmVzID0gW10KKyAgICAgICAgYXZhaWwxID0gc2VsZi53aWR0aCAtIHNlbGYuaW5kZW50X2xlZnQgLSBzZWxmLmluZGVudF9yaWdodAorICAgICAgICBhdmFpbCA9IGF2YWlsMSAtIHNlbGYuaW5kZW50X2hhbmcKKyAgICAgICAgd29yZHMgPSBzZWxmLndvcmRzCisgICAgICAgIGkgPSAwCisgICAgICAgIG4gPSBsZW4od29yZHMpCisgICAgICAgIGxhc3Rmb250ID0gTm9uZQorICAgICAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgICAgIGZpcnN0Zm9udCA9IGxhc3Rmb250CisgICAgICAgICAgICBjaGFyY291bnQgPSAwCisgICAgICAgICAgICB3aWR0aCA9IDAKKyAgICAgICAgICAgIHN0cmV0Y2ggPSAwCisgICAgICAgICAgICBhc2NlbnQgPSAwCisgICAgICAgICAgICBkZXNjZW50ID0gMAorICAgICAgICAgICAgbHNwID0gMAorICAgICAgICAgICAgaiA9IGkKKyAgICAgICAgICAgIHdoaWxlIGkgPCBuOgorICAgICAgICAgICAgICAgIHdvcmQgPSB3b3Jkc1tpXQorICAgICAgICAgICAgICAgIGlmIHR5cGUod29yZCkgaXMgSW50OgorICAgICAgICAgICAgICAgICAgICBpZiB3b3JkID4gMCBhbmQgd2lkdGggPj0gYXZhaWw6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUgPSB3b3JkCisgICAgICAgICAgICAgICAgaWYgd2lkdGggKyB3aSA+IGF2YWlsIGFuZCB3aWR0aCA+IDAgYW5kIHdpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBmbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbGFzdGZvbnQgPSBmbworICAgICAgICAgICAgICAgICAgICBpZiB3aWR0aCA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rmb250ID0gZm8KKyAgICAgICAgICAgICAgICBjaGFyY291bnQgPSBjaGFyY291bnQgKyBsZW4odGUpICsgKHNwID4gMCkKKyAgICAgICAgICAgICAgICB3aWR0aCA9IHdpZHRoICsgd2kgKyBzcAorICAgICAgICAgICAgICAgIGxzcCA9IHNwCisgICAgICAgICAgICAgICAgc3RyZXRjaCA9IHN0cmV0Y2ggKyBzdAorICAgICAgICAgICAgICAgIGxzdCA9IHN0CisgICAgICAgICAgICAgICAgYXNjZW50ID0gbWF4KGFzY2VudCwgYXMpCisgICAgICAgICAgICAgICAgZGVzY2VudCA9IG1heChkZXNjZW50LCBkZSkKKyAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICB3aGlsZSBpID4gaiBhbmQgdHlwZSh3b3Jkc1tpLTFdKSBpcyBJbnQgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgd29yZHNbaS0xXSA+IDA6IGkgPSBpLTEKKyAgICAgICAgICAgIHdpZHRoID0gd2lkdGggLSBsc3AKKyAgICAgICAgICAgIGlmIGkgPCBuOgorICAgICAgICAgICAgICAgIHN0cmV0Y2ggPSBzdHJldGNoIC0gbHN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0cmV0Y2ggPSAwCisgICAgICAgICAgICB0dXBsZSA9IGktaiwgZmlyc3Rmb250LCBjaGFyY291bnQsIHdpZHRoLCBzdHJldGNoLCBcCisgICAgICAgICAgICAgICAgICAgIGFzY2VudCwgZGVzY2VudAorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHR1cGxlKQorICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ICsgYXNjZW50ICsgZGVzY2VudAorICAgICAgICAgICAgYXZhaWwgPSBhdmFpbDEKKyAgICAgICAgc2VsZi5oZWlnaHQgPSBoZWlnaHQKKyAgICAjCisgICAgIyBDYWxsIGEgZnVuY3Rpb24gZm9yIGFsbCB3b3JkcyBpbiBhIGxpbmUKKyAgICBkZWYgdmlzaXQoc2VsZiwgd29yZGZ1bmMsIGFuY2hvcmZ1bmMpOgorICAgICAgICBhdmFpbDEgPSBzZWxmLndpZHRoIC0gc2VsZi5pbmRlbnRfbGVmdCAtIHNlbGYuaW5kZW50X3JpZ2h0CisgICAgICAgIGF2YWlsID0gYXZhaWwxIC0gc2VsZi5pbmRlbnRfaGFuZworICAgICAgICB2ID0gc2VsZi50b3AKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIHR1cGxlIGluIHNlbGYubGluZXM6CisgICAgICAgICAgICB3b3JkY291bnQsIGZpcnN0Zm9udCwgY2hhcmNvdW50LCB3aWR0aCwgc3RyZXRjaCwgXAorICAgICAgICAgICAgICAgICAgICBhc2NlbnQsIGRlc2NlbnQgPSB0dXBsZQorICAgICAgICAgICAgaCA9IHNlbGYubGVmdCArIHNlbGYuaW5kZW50X2xlZnQKKyAgICAgICAgICAgIGlmIGkgPT0gMDogaCA9IGggKyBzZWxmLmluZGVudF9oYW5nCisgICAgICAgICAgICBleHRyYSA9IDAKKyAgICAgICAgICAgIGlmIHNlbGYuanVzdCA9PSAncic6IGggPSBoICsgYXZhaWwgLSB3aWR0aAorICAgICAgICAgICAgZWxpZiBzZWxmLmp1c3QgPT0gJ2MnOiBoID0gaCArIChhdmFpbCAtIHdpZHRoKSAvIDIKKyAgICAgICAgICAgIGVsaWYgc2VsZi5qdXN0ID09ICdscicgYW5kIHN0cmV0Y2ggPiAwOgorICAgICAgICAgICAgICAgIGV4dHJhID0gYXZhaWwgLSB3aWR0aAorICAgICAgICAgICAgdjIgPSB2ICsgYXNjZW50ICsgZGVzY2VudAorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSwgaSt3b3JkY291bnQpOgorICAgICAgICAgICAgICAgIHdvcmQgPSBzZWxmLndvcmRzW2pdCisgICAgICAgICAgICAgICAgaWYgdHlwZSh3b3JkKSBpcyBJbnQ6CisgICAgICAgICAgICAgICAgICAgIG9rID0gYW5jaG9yZnVuYyhzZWxmLCB0dXBsZSwgd29yZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgdikKKyAgICAgICAgICAgICAgICAgICAgaWYgb2sgaXMgbm90IE5vbmU6IHJldHVybiBvaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZvLCB0ZSwgd2ksIHNwLCBzdCwgYXMsIGRlID0gd29yZAorICAgICAgICAgICAgICAgIGlmIGV4dHJhID4gMCBhbmQgc3RyZXRjaCA+IDA6CisgICAgICAgICAgICAgICAgICAgIGV4ID0gZXh0cmEgKiBzdCAvIHN0cmV0Y2gKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSBleHRyYSAtIGV4CisgICAgICAgICAgICAgICAgICAgIHN0cmV0Y2ggPSBzdHJldGNoIC0gc3QKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBleCA9IDAKKyAgICAgICAgICAgICAgICBoMiA9IGggKyB3aSArIHNwICsgZXgKKyAgICAgICAgICAgICAgICBvayA9IHdvcmRmdW5jKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2LCBcCisgICAgICAgICAgICAgICAgICAgICAgICBoMiwgdjIsIChqPT1pKSwgKGo9PWkrd29yZGNvdW50LTEpKQorICAgICAgICAgICAgICAgIGlmIG9rIGlzIG5vdCBOb25lOiByZXR1cm4gb2sKKyAgICAgICAgICAgICAgICBoID0gaDIKKyAgICAgICAgICAgIHYgPSB2MgorICAgICAgICAgICAgaSA9IGkgKyB3b3JkY291bnQKKyAgICAgICAgICAgIGF2YWlsID0gYXZhaWwxCisgICAgIworICAgICMgUmVuZGVyIGEgcGFyYWdyYXBoIGluICJkcmF3aW5nIG9iamVjdCIgZCwgdXNpbmcgdGhlIHJlY3RhbmdsZQorICAgICMgZ2l2ZW4gYnkgKGxlZnQsIHRvcCwgcmlnaHQpIHdpdGggYW4gdW5zcGVjaWZpZWQgYm90dG9tLgorICAgICMgUmV0dXJuIHRoZSBjb21wdXRlZCBib3R0b20gb2YgdGhlIHRleHQuCisgICAgZGVmIHJlbmRlcihzZWxmLCBkLCBsZWZ0LCB0b3AsIHJpZ2h0KToKKyAgICAgICAgaWYgc2VsZi53aWR0aCAhPSByaWdodC1sZWZ0OgorICAgICAgICAgICAgc2VsZi5sYXlvdXQocmlnaHQtbGVmdCkKKyAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdAorICAgICAgICBzZWxmLnRvcCA9IHRvcAorICAgICAgICBzZWxmLnJpZ2h0ID0gcmlnaHQKKyAgICAgICAgc2VsZi5ib3R0b20gPSBzZWxmLnRvcCArIHNlbGYuaGVpZ2h0CisgICAgICAgIHNlbGYuYW5jaG9yaWQgPSAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZCA9IGQKKyAgICAgICAgICAgIHNlbGYudmlzaXQoc2VsZi5fX2NsYXNzX18uX3JlbmRlcndvcmQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX3JlbmRlcmFuY2hvcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuZCA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuYm90dG9tCisgICAgIworICAgIGRlZiBfcmVuZGVyd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaCwgdiwgaDIsIHYyLCBpc2ZpcnN0LCBpc2xhc3QpOgorICAgICAgICBpZiB3b3JkWzBdIGlzIG5vdCBOb25lOiBzZWxmLmQuc2V0Zm9udCh3b3JkWzBdKQorICAgICAgICBiYXNlbGluZSA9IHYgKyB0dXBsZVs1XQorICAgICAgICBzZWxmLmQudGV4dCgoaCwgYmFzZWxpbmUgLSB3b3JkWzVdKSwgd29yZFsxXSkKKyAgICAgICAgaWYgc2VsZi5hbmNob3JpZCA+IDA6CisgICAgICAgICAgICBzZWxmLmQubGluZSgoaCwgYmFzZWxpbmUrMiksIChoMiwgYmFzZWxpbmUrMikpCisgICAgIworICAgIGRlZiBfcmVuZGVyYW5jaG9yKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2KToKKyAgICAgICAgc2VsZi5hbmNob3JpZCA9IHdvcmQKKyAgICAjCisgICAgIyBSZXR1cm4gd2hpY2ggYW5jaG9yKHMpIHdhcyBoaXQgYnkgdGhlIG1vdXNlCisgICAgZGVmIGhpdGNoZWNrKHNlbGYsIG1vdXNlaCwgbW91c2V2KToKKyAgICAgICAgc2VsZi5tb3VzZWggPSBtb3VzZWgKKyAgICAgICAgc2VsZi5tb3VzZXYgPSBtb3VzZXYKKyAgICAgICAgc2VsZi5hbmNob3JpZCA9IDAKKyAgICAgICAgc2VsZi5oaXRzID0gW10KKyAgICAgICAgc2VsZi52aXNpdChzZWxmLl9fY2xhc3NfXy5faGl0Y2hlY2t3b3JkLCBcCisgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX2hpdGNoZWNrYW5jaG9yKQorICAgICAgICByZXR1cm4gc2VsZi5oaXRzCisgICAgIworICAgIGRlZiBfaGl0Y2hlY2t3b3JkKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2LCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6CisgICAgICAgIGlmIHNlbGYuYW5jaG9yaWQgPiAwIGFuZCBoIDw9IHNlbGYubW91c2VoIDw9IGgyIGFuZCBcCisgICAgICAgICAgICAgICAgdiA8PSBzZWxmLm1vdXNldiA8PSB2MjoKKyAgICAgICAgICAgIHNlbGYuaGl0cy5hcHBlbmQoc2VsZi5hbmNob3JpZCkKKyAgICAjCisgICAgZGVmIF9oaXRjaGVja2FuY2hvcihzZWxmLCB0dXBsZSwgd29yZCwgaCwgdik6CisgICAgICAgIHNlbGYuYW5jaG9yaWQgPSB3b3JkCisgICAgIworICAgICMgUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGFuY2hvciBpZCBpcyBwcmVzZW50CisgICAgZGVmIGhhc2FuY2hvcihzZWxmLCBpZCk6CisgICAgICAgIHJldHVybiBpZCBpbiBzZWxmLndvcmRzIG9yIC1pZCBpbiBzZWxmLndvcmRzCisgICAgIworICAgICMgRXh0cmFjdCB0aGUgcmF3IHRleHQgZnJvbSB0aGUgd29yZCBsaXN0LCBzdWJzdGl0dXRpbmcgb25lIHNwYWNlCisgICAgIyBmb3Igbm9uLWVtcHR5IGludGVyLXdvcmQgc3BhY2UsIGFuZCB0ZXJtaW5hdGluZyB3aXRoICdcbicKKyAgICBkZWYgZXh0cmFjdChzZWxmKToKKyAgICAgICAgdGV4dCA9ICcnCisgICAgICAgIGZvciB3IGluIHNlbGYud29yZHM6CisgICAgICAgICAgICBpZiB0eXBlKHcpIGlzIG5vdCBJbnQ6CisgICAgICAgICAgICAgICAgd29yZCA9IHdbMV0KKyAgICAgICAgICAgICAgICBpZiB3WzNdOiB3b3JkID0gd29yZCArICcgJworICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgd29yZAorICAgICAgICByZXR1cm4gdGV4dCArICdcbicKKyAgICAjCisgICAgIyBSZXR1cm4gd2hpY2ggY2hhcmFjdGVyIHBvc2l0aW9uIHdhcyBoaXQgYnkgdGhlIG1vdXNlLCBhcworICAgICMgYW4gb2Zmc2V0IGluIHRoZSBlbnRpcmUgdGV4dCBhcyByZXR1cm5lZCBieSBleHRyYWN0KCkuCisgICAgIyBSZXR1cm4gTm9uZSBpZiB0aGUgbW91c2Ugd2FzIG5vdCBpbiB0aGlzIHBhcmFncmFwaAorICAgIGRlZiB3aGVyZWlzKHNlbGYsIGQsIG1vdXNlaCwgbW91c2V2KToKKyAgICAgICAgaWYgbW91c2V2IDwgc2VsZi50b3Agb3IgbW91c2V2ID4gc2VsZi5ib3R0b206CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBzZWxmLm1vdXNlaCA9IG1vdXNlaAorICAgICAgICBzZWxmLm1vdXNldiA9IG1vdXNldgorICAgICAgICBzZWxmLmxhc3Rmb250ID0gTm9uZQorICAgICAgICBzZWxmLmNoYXJjb3VudCA9IDAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kID0gZAorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmlzaXQoc2VsZi5fX2NsYXNzX18uX3doZXJlaXN3b3JkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fd2hlcmVpc2FuY2hvcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuZCA9IE5vbmUKKyAgICAjCisgICAgZGVmIF93aGVyZWlzd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaDEsIHYxLCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6CisgICAgICAgIGZvLCB0ZSwgd2ksIHNwLCBzdCwgYXMsIGRlID0gd29yZAorICAgICAgICBpZiBmbyBpcyBub3QgTm9uZTogc2VsZi5sYXN0Zm9udCA9IGZvCisgICAgICAgIGggPSBoMQorICAgICAgICBpZiBpc2ZpcnN0OiBoMSA9IDAKKyAgICAgICAgaWYgaXNsYXN0OiBoMiA9IDk5OTk5OQorICAgICAgICBpZiBub3QgKHYxIDw9IHNlbGYubW91c2V2IDw9IHYyIGFuZCBoMSA8PSBzZWxmLm1vdXNlaCA8PSBoMik6CisgICAgICAgICAgICBzZWxmLmNoYXJjb3VudCA9IHNlbGYuY2hhcmNvdW50ICsgbGVuKHRlKSArIChzcCA+IDApCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5sYXN0Zm9udCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZC5zZXRmb250KHNlbGYubGFzdGZvbnQpCisgICAgICAgIGNjID0gMAorICAgICAgICBmb3IgYyBpbiB0ZToKKyAgICAgICAgICAgIGN3ID0gc2VsZi5kLnRleHR3aWR0aChjKQorICAgICAgICAgICAgaWYgc2VsZi5tb3VzZWggPD0gaCArIGN3LzI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcmNvdW50ICsgY2MKKyAgICAgICAgICAgIGNjID0gY2MrMQorICAgICAgICAgICAgaCA9IGgrY3cKKyAgICAgICAgc2VsZi5jaGFyY291bnQgPSBzZWxmLmNoYXJjb3VudCArIGNjCisgICAgICAgIGlmIHNlbGYubW91c2VoIDw9IChoK2gyKSAvIDI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jaGFyY291bnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNoYXJjb3VudCArIDEKKyAgICAjCisgICAgZGVmIF93aGVyZWlzYW5jaG9yKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2KToKKyAgICAgICAgcGFzcworICAgICMKKyAgICAjIFJldHVybiBzY3JlZW4gcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byBwb3NpdGlvbiBpbiBwYXJhZ3JhcGguCisgICAgIyBSZXR1cm4gdHVwbGUgKGgsIHZ0b3AsIHZiYXNlbGluZSwgdmJvdHRvbSkuCisgICAgIyBUaGlzIGlzIG1vcmUgb3IgbGVzcyB0aGUgaW52ZXJzZSBvZiB3aGVyZWlzKCkKKyAgICBkZWYgc2NyZWVucG9zKHNlbGYsIGQsIHBvcyk6CisgICAgICAgIGlmIHBvcyA8IDA6CisgICAgICAgICAgICBhc2NlbnQsIGRlc2NlbnQgPSBzZWxmLmxpbmVzWzBdWzU6N10KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYudG9wLCBzZWxmLnRvcCArIGFzY2VudCwgXAorICAgICAgICAgICAgICAgICAgICBzZWxmLnRvcCArIGFzY2VudCArIGRlc2NlbnQKKyAgICAgICAgc2VsZi5wb3MgPSBwb3MKKyAgICAgICAgc2VsZi5sYXN0Zm9udCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kID0gZAorICAgICAgICAgICAgb2sgPSBzZWxmLnZpc2l0KHNlbGYuX19jbGFzc19fLl9zY3JlZW5wb3N3b3JkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX3NjcmVlbnBvc2FuY2hvcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuZCA9IE5vbmUKKyAgICAgICAgaWYgb2sgaXMgTm9uZToKKyAgICAgICAgICAgIGFzY2VudCwgZGVzY2VudCA9IHNlbGYubGluZXNbLTFdWzU6N10KKyAgICAgICAgICAgIG9rID0gc2VsZi5yaWdodCwgc2VsZi5ib3R0b20gLSBhc2NlbnQgLSBkZXNjZW50LCBcCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYm90dG9tIC0gZGVzY2VudCwgc2VsZi5ib3R0b20KKyAgICAgICAgcmV0dXJuIG9rCisgICAgIworICAgIGRlZiBfc2NyZWVucG9zd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaDEsIHYxLCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6CisgICAgICAgIGZvLCB0ZSwgd2ksIHNwLCBzdCwgYXMsIGRlID0gd29yZAorICAgICAgICBpZiBmbyBpcyBub3QgTm9uZTogc2VsZi5sYXN0Zm9udCA9IGZvCisgICAgICAgIGNjID0gbGVuKHRlKSArIChzcCA+IDApCisgICAgICAgIGlmIHNlbGYucG9zID4gY2M6CisgICAgICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zIC0gY2MKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnBvcyA8IGNjOgorICAgICAgICAgICAgc2VsZi5kLnNldGZvbnQoc2VsZi5sYXN0Zm9udCkKKyAgICAgICAgICAgIGggPSBoMSArIHNlbGYuZC50ZXh0d2lkdGgodGVbOnNlbGYucG9zXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGggPSBoMgorICAgICAgICBhc2NlbnQsIGRlc2NlbnQgPSB0dXBsZVs1OjddCisgICAgICAgIHJldHVybiBoLCB2MSwgdjErYXNjZW50LCB2MgorICAgICMKKyAgICBkZWYgX3NjcmVlbnBvc2FuY2hvcihzZWxmLCB0dXBsZSwgd29yZCwgaCwgdik6CisgICAgICAgIHBhc3MKKyAgICAjCisgICAgIyBJbnZlcnQgdGhlIHN0cmV0Y2ggb2YgdGV4dCBiZXR3ZWVuIHBvczEgYW5kIHBvczIuCisgICAgIyBJZiBwb3MxIGlzIE5vbmUsIHRoZSBiZWdpbm5pbmcgaXMgaW1wbGllZDsKKyAgICAjIGlmIHBvczIgaXMgTm9uZSwgdGhlIGVuZCBpcyBpbXBsaWVkLgorICAgICMgVW5kb2VzIGl0cyBvd24gZWZmZWN0IHdoZW4gY2FsbGVkIGFnYWluIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzCisgICAgZGVmIGludmVydChzZWxmLCBkLCBwb3MxLCBwb3MyKToKKyAgICAgICAgaWYgcG9zMSBpcyBOb25lOgorICAgICAgICAgICAgcG9zMSA9IHNlbGYubGVmdCwgc2VsZi50b3AsIHNlbGYudG9wLCBzZWxmLnRvcAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcG9zMSA9IHNlbGYuc2NyZWVucG9zKGQsIHBvczEpCisgICAgICAgIGlmIHBvczIgaXMgTm9uZToKKyAgICAgICAgICAgIHBvczIgPSBzZWxmLnJpZ2h0LCBzZWxmLmJvdHRvbSxzZWxmLmJvdHRvbSxzZWxmLmJvdHRvbQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcG9zMiA9IHNlbGYuc2NyZWVucG9zKGQsIHBvczIpCisgICAgICAgIGgxLCB0b3AxLCBiYXNlbGluZTEsIGJvdHRvbTEgPSBwb3MxCisgICAgICAgIGgyLCB0b3AyLCBiYXNlbGluZTIsIGJvdHRvbTIgPSBwb3MyCisgICAgICAgIGlmIGJvdHRvbTEgPD0gdG9wMjoKKyAgICAgICAgICAgIGQuaW52ZXJ0KChoMSwgdG9wMSksIChzZWxmLnJpZ2h0LCBib3R0b20xKSkKKyAgICAgICAgICAgIGgxID0gc2VsZi5sZWZ0CisgICAgICAgICAgICBpZiBib3R0b20xIDwgdG9wMjoKKyAgICAgICAgICAgICAgICBkLmludmVydCgoaDEsIGJvdHRvbTEpLCAoc2VsZi5yaWdodCwgdG9wMikpCisgICAgICAgICAgICB0b3AxLCBib3R0b20xID0gdG9wMiwgYm90dG9tMgorICAgICAgICBkLmludmVydCgoaDEsIHRvcDEpLCAoaDIsIGJvdHRvbTIpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvYWRkcGFjay5weSBiL0xpYi9saWItb2xkL2FkZHBhY2sucHkKaW5kZXggM2QwOTIzNi4uMmZiMjYwMSAxMDA2NDQKLS0tIGEvTGliL2xpYi1vbGQvYWRkcGFjay5weQorKysgYi9MaWIvbGliLW9sZC9hZGRwYWNrLnB5CkBAIC0zMywzNSArMzMsMzUgQEAKICMKICMgSWYgbm8gZGlyZWN0b3J5IGlzIGZvdW5kLCBJbXBvcnRFcnJvciBpcyByYWlzZWQuCiAKLV9wYWNrcyA9IHt9CQkJCSMge3BhY2s6IFtwYXRobmFtZSwgLi4uXSwgLi4ufQorX3BhY2tzID0ge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMge3BhY2s6IFtwYXRobmFtZSwgLi4uXSwgLi4ufQogCiBkZWYgYWRkcGFjayhwYWNrLCAqbG9jYXRpb25zKToKLQlpbXBvcnQgb3MKLQlpZiBvcy5wYXRoLmlzYWJzKHBhY2spOgotCQliYXNlID0gb3MucGF0aC5iYXNlbmFtZShwYWNrKQotCWVsc2U6Ci0JCWJhc2UgPSBwYWNrCi0JaWYgX3BhY2tzLmhhc19rZXkoYmFzZSk6Ci0JCXJldHVybgotCWltcG9ydCBzeXMKLQlwYXRoID0gW10KLQlmb3IgbG9jIGluIF9mbGF0dGVuKGxvY2F0aW9ucykgKyBzeXMucGF0aDoKLQkJZm4gPSBvcy5wYXRoLmpvaW4obG9jLCBiYXNlKQotCQlpZiBmbiBub3QgaW4gcGF0aCBhbmQgb3MucGF0aC5pc2Rpcihmbik6Ci0JCQlwYXRoLmFwcGVuZChmbikKLQlpZiBwYWNrICE9IGJhc2UgYW5kIHBhY2sgbm90IGluIHBhdGggYW5kIG9zLnBhdGguaXNkaXIocGFjayk6Ci0JCXBhdGguYXBwZW5kKHBhY2spCi0JaWYgbm90IHBhdGg6IHJhaXNlIEltcG9ydEVycm9yLCAncGFja2FnZSAnICsgcGFjayArICcgbm90IGZvdW5kJwotCV9wYWNrc1tiYXNlXSA9IHBhdGgKLQlmb3IgZm4gaW4gcGF0aDoKLQkJaWYgZm4gbm90IGluIHN5cy5wYXRoOgotCQkJc3lzLnBhdGguYXBwZW5kKGZuKQorICAgIGltcG9ydCBvcworICAgIGlmIG9zLnBhdGguaXNhYnMocGFjayk6CisgICAgICAgIGJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lKHBhY2spCisgICAgZWxzZToKKyAgICAgICAgYmFzZSA9IHBhY2sKKyAgICBpZiBfcGFja3MuaGFzX2tleShiYXNlKToKKyAgICAgICAgcmV0dXJuCisgICAgaW1wb3J0IHN5cworICAgIHBhdGggPSBbXQorICAgIGZvciBsb2MgaW4gX2ZsYXR0ZW4obG9jYXRpb25zKSArIHN5cy5wYXRoOgorICAgICAgICBmbiA9IG9zLnBhdGguam9pbihsb2MsIGJhc2UpCisgICAgICAgIGlmIGZuIG5vdCBpbiBwYXRoIGFuZCBvcy5wYXRoLmlzZGlyKGZuKToKKyAgICAgICAgICAgIHBhdGguYXBwZW5kKGZuKQorICAgIGlmIHBhY2sgIT0gYmFzZSBhbmQgcGFjayBub3QgaW4gcGF0aCBhbmQgb3MucGF0aC5pc2RpcihwYWNrKToKKyAgICAgICAgcGF0aC5hcHBlbmQocGFjaykKKyAgICBpZiBub3QgcGF0aDogcmFpc2UgSW1wb3J0RXJyb3IsICdwYWNrYWdlICcgKyBwYWNrICsgJyBub3QgZm91bmQnCisgICAgX3BhY2tzW2Jhc2VdID0gcGF0aAorICAgIGZvciBmbiBpbiBwYXRoOgorICAgICAgICBpZiBmbiBub3QgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQoZm4pCiAKIGRlZiBfZmxhdHRlbihsb2NhdGlvbnMpOgotCWxvY3MgPSBbXQotCWZvciBsb2MgaW4gbG9jYXRpb25zOgotCQlpZiB0eXBlKGxvYykgPT0gdHlwZSgnJyk6Ci0JCQlsb2NzLmFwcGVuZChsb2MpCi0JCWVsc2U6Ci0JCQlsb2NzID0gbG9jcyArIF9mbGF0dGVuKGxvYykKLQlyZXR1cm4gbG9jcworICAgIGxvY3MgPSBbXQorICAgIGZvciBsb2MgaW4gbG9jYXRpb25zOgorICAgICAgICBpZiB0eXBlKGxvYykgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICBsb2NzLmFwcGVuZChsb2MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2NzID0gbG9jcyArIF9mbGF0dGVuKGxvYykKKyAgICByZXR1cm4gbG9jcwpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvY29kZWhhY2sucHkgYi9MaWIvbGliLW9sZC9jb2RlaGFjay5weQppbmRleCAyNDgyMDViLi4wYjVlM2ExIDEwMDY0NAotLS0gYS9MaWIvbGliLW9sZC9jb2RlaGFjay5weQorKysgYi9MaWIvbGliLW9sZC9jb2RlaGFjay5weQpAQCAtMzYsNDYgKzM2LDQ2IEBACiBfbmFtZWNhY2hlID0ge30gIyBUaGUgY2FjaGUKIAogZGVmIGdldGNvZGVuYW1lKGNvKToKLQl0cnk6Ci0JCXJldHVybiBjby5jb19uYW1lCi0JZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotCQlwYXNzCi0Ja2V5ID0gYGNvYCAjIGFyYml0cmFyeSBidXQgdW5pcXVlbHkgaWRlbnRpZnlpbmcgc3RyaW5nCi0JaWYgX25hbWVjYWNoZS5oYXNfa2V5KGtleSk6IHJldHVybiBfbmFtZWNhY2hlW2tleV0KLQlmaWxlbmFtZSA9IGNvLmNvX2ZpbGVuYW1lCi0JY29kZSA9IGNvLmNvX2NvZGUKLQluYW1lID0gJycKLQlpZiBvcmQoY29kZVswXSkgPT0gU0VUX0xJTkVOTzoKLQkJbGluZW5vID0gb3JkKGNvZGVbMV0pIHwgb3JkKGNvZGVbMl0pIDw8IDgKLQkJbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCi0JCXdvcmRzID0gbGluZS5zcGxpdCgpCi0JCWlmIGxlbih3b3JkcykgPj0gMiBhbmQgd29yZHNbMF0gaW4gKCdkZWYnLCAnY2xhc3MnKToKLQkJCW5hbWUgPSB3b3Jkc1sxXQotCQkJZm9yIGkgaW4gcmFuZ2UobGVuKG5hbWUpKToKLQkJCQlpZiBuYW1lW2ldIG5vdCBpbiBpZGVudGNoYXJzOgotCQkJCQluYW1lID0gbmFtZVs6aV0KLQkJCQkJYnJlYWsKLQlfbmFtZWNhY2hlW2tleV0gPSBuYW1lCi0JcmV0dXJuIG5hbWUKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBjby5jb19uYW1lCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBwYXNzCisgICAga2V5ID0gYGNvYCAjIGFyYml0cmFyeSBidXQgdW5pcXVlbHkgaWRlbnRpZnlpbmcgc3RyaW5nCisgICAgaWYgX25hbWVjYWNoZS5oYXNfa2V5KGtleSk6IHJldHVybiBfbmFtZWNhY2hlW2tleV0KKyAgICBmaWxlbmFtZSA9IGNvLmNvX2ZpbGVuYW1lCisgICAgY29kZSA9IGNvLmNvX2NvZGUKKyAgICBuYW1lID0gJycKKyAgICBpZiBvcmQoY29kZVswXSkgPT0gU0VUX0xJTkVOTzoKKyAgICAgICAgbGluZW5vID0gb3JkKGNvZGVbMV0pIHwgb3JkKGNvZGVbMl0pIDw8IDgKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCisgICAgICAgIGlmIGxlbih3b3JkcykgPj0gMiBhbmQgd29yZHNbMF0gaW4gKCdkZWYnLCAnY2xhc3MnKToKKyAgICAgICAgICAgIG5hbWUgPSB3b3Jkc1sxXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKG5hbWUpKToKKyAgICAgICAgICAgICAgICBpZiBuYW1lW2ldIG5vdCBpbiBpZGVudGNoYXJzOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs6aV0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBfbmFtZWNhY2hlW2tleV0gPSBuYW1lCisgICAgcmV0dXJuIG5hbWUKIAogIyBVc2UgdGhlIGFib3ZlIHJvdXRpbmUgdG8gZmluZCBhIGZ1bmN0aW9uJ3MgbmFtZS4KIAogZGVmIGdldGZ1bmNuYW1lKGZ1bmMpOgotCXRyeToKLQkJcmV0dXJuIGZ1bmMuZnVuY19uYW1lCi0JZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotCQlwYXNzCi0JcmV0dXJuIGdldGNvZGVuYW1lKGZ1bmMuZnVuY19jb2RlKQorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGZ1bmMuZnVuY19uYW1lCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIGdldGNvZGVuYW1lKGZ1bmMuZnVuY19jb2RlKQogCiAjIEEgcGFydCBvZiB0aGUgYWJvdmUgY29kZSB0byBleHRyYWN0IGp1c3QgdGhlIGxpbmUgbnVtYmVyIGZyb20gYSBjb2RlIG9iamVjdC4KIAogZGVmIGdldGxpbmVubyhjbyk6Ci0JdHJ5OgotCQlyZXR1cm4gY28uY29fZmlyc3RsaW5lbm8KLQlleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0JCXBhc3MKLQljb2RlID0gY28uY29fY29kZQotCWlmIG9yZChjb2RlWzBdKSA9PSBTRVRfTElORU5POgotCQlyZXR1cm4gb3JkKGNvZGVbMV0pIHwgb3JkKGNvZGVbMl0pIDw8IDgKLQllbHNlOgotCQlyZXR1cm4gLTEKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBjby5jb19maXJzdGxpbmVubworICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGNvZGUgPSBjby5jb19jb2RlCisgICAgaWYgb3JkKGNvZGVbMF0pID09IFNFVF9MSU5FTk86CisgICAgICAgIHJldHVybiBvcmQoY29kZVsxXSkgfCBvcmQoY29kZVsyXSkgPDwgOAorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAtMQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvZHVtcC5weSBiL0xpYi9saWItb2xkL2R1bXAucHkKaW5kZXggZWM4OTViNy4uNjBiZGJhOCAxMDA2NDQKLS0tIGEvTGliL2xpYi1vbGQvZHVtcC5weQorKysgYi9MaWIvbGliLW9sZC9kdW1wLnB5CkBAIC0yMyw0MSArMjMsNDEgQEAKICMgRHVtcCBhIHdob2xlIHN5bWJvbCB0YWJsZQogIwogZGVmIGR1bXBzeW10YWIoZGljdCk6Ci0JZm9yIGtleSBpbiBkaWN0LmtleXMoKToKLQkJZHVtcHZhcihrZXksIGRpY3Rba2V5XSkKKyAgICBmb3Iga2V5IGluIGRpY3Qua2V5cygpOgorICAgICAgICBkdW1wdmFyKGtleSwgZGljdFtrZXldKQogCiAjIER1bXAgYSBzaW5nbGUgdmFyaWFibGUKICMKIGRlZiBkdW1wdmFyKG5hbWUsIHgpOgotCWltcG9ydCBzeXMKLQl0ID0gdHlwZSh4KQotCWlmIHQgPT0gdHlwZSh7fSk6Ci0JCXByaW50IG5hbWUsICc9IHt9JwotCQlmb3Iga2V5IGluIHgua2V5cygpOgotCQkJaXRlbSA9IHhba2V5XQotCQkJaWYgbm90IHByaW50YWJsZShpdGVtKToKLQkJCQlwcmludCAnIycsCi0JCQlwcmludCBuYW1lLCAnWycsIGBrZXlgLCAnXSA9JywgYGl0ZW1gCi0JZWxpZiB0IGluICh0eXBlKCcnKSwgdHlwZSgwKSwgdHlwZSgwLjApLCB0eXBlKFtdKSwgdHlwZSgoKSkpOgotCQlpZiBub3QgcHJpbnRhYmxlKHgpOgotCQkJcHJpbnQgJyMnLAotCQlwcmludCBuYW1lLCAnPScsIGB4YAotCWVsaWYgdCA9PSB0eXBlKHN5cyk6Ci0JCXByaW50ICdpbXBvcnQnLCBuYW1lLCAnIycsIHgKLQllbHNlOgotCQlwcmludCAnIycsIG5hbWUsICc9JywgeAorICAgIGltcG9ydCBzeXMKKyAgICB0ID0gdHlwZSh4KQorICAgIGlmIHQgPT0gdHlwZSh7fSk6CisgICAgICAgIHByaW50IG5hbWUsICc9IHt9JworICAgICAgICBmb3Iga2V5IGluIHgua2V5cygpOgorICAgICAgICAgICAgaXRlbSA9IHhba2V5XQorICAgICAgICAgICAgaWYgbm90IHByaW50YWJsZShpdGVtKToKKyAgICAgICAgICAgICAgICBwcmludCAnIycsCisgICAgICAgICAgICBwcmludCBuYW1lLCAnWycsIGBrZXlgLCAnXSA9JywgYGl0ZW1gCisgICAgZWxpZiB0IGluICh0eXBlKCcnKSwgdHlwZSgwKSwgdHlwZSgwLjApLCB0eXBlKFtdKSwgdHlwZSgoKSkpOgorICAgICAgICBpZiBub3QgcHJpbnRhYmxlKHgpOgorICAgICAgICAgICAgcHJpbnQgJyMnLAorICAgICAgICBwcmludCBuYW1lLCAnPScsIGB4YAorICAgIGVsaWYgdCA9PSB0eXBlKHN5cyk6CisgICAgICAgIHByaW50ICdpbXBvcnQnLCBuYW1lLCAnIycsIHgKKyAgICBlbHNlOgorICAgICAgICBwcmludCAnIycsIG5hbWUsICc9JywgeAogCiAjIGNoZWNrIGlmIGEgdmFsdWUgaXMgcHJpbnRhYmxlIGluIGEgd2F5IHRoYXQgY2FuIGJlIHJlYWQgYmFjayB3aXRoIGlucHV0KCkKICMKIGRlZiBwcmludGFibGUoeCk6Ci0JdCA9IHR5cGUoeCkKLQlpZiB0IGluICh0eXBlKCcnKSwgdHlwZSgwKSwgdHlwZSgwLjApKToKLQkJcmV0dXJuIDEKLQlpZiB0IGluICh0eXBlKFtdKSwgdHlwZSgoKSkpOgotCQlmb3IgaXRlbSBpbiB4OgotCQkJaWYgbm90IHByaW50YWJsZShpdGVtKToKLQkJCQlyZXR1cm4gMAotCQlyZXR1cm4gMQotCWlmIHggPT0ge306Ci0JCXJldHVybiAxCi0JcmV0dXJuIDAKKyAgICB0ID0gdHlwZSh4KQorICAgIGlmIHQgaW4gKHR5cGUoJycpLCB0eXBlKDApLCB0eXBlKDAuMCkpOgorICAgICAgICByZXR1cm4gMQorICAgIGlmIHQgaW4gKHR5cGUoW10pLCB0eXBlKCgpKSk6CisgICAgICAgIGZvciBpdGVtIGluIHg6CisgICAgICAgICAgICBpZiBub3QgcHJpbnRhYmxlKGl0ZW0pOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiAxCisgICAgaWYgeCA9PSB7fToKKyAgICAgICAgcmV0dXJuIDEKKyAgICByZXR1cm4gMApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvZmluZC5weSBiL0xpYi9saWItb2xkL2ZpbmQucHkKaW5kZXggY2NkOWZkYi4uMzlhZDc3MSAxMDA2NDQKLS0tIGEvTGliL2xpYi1vbGQvZmluZC5weQorKysgYi9MaWIvbGliLW9sZC9maW5kLnB5CkBAIC02LDIxICs2LDIxIEBACiBfcHJ1bmUgPSBbJygqKSddCiAKIGRlZiBmaW5kKHBhdHRlcm4sIGRpciA9IG9zLmN1cmRpcik6Ci0JbGlzdCA9IFtdCi0JbmFtZXMgPSBvcy5saXN0ZGlyKGRpcikKLQluYW1lcy5zb3J0KCkKLQlmb3IgbmFtZSBpbiBuYW1lczoKLQkJaWYgbmFtZSBpbiAob3MuY3VyZGlyLCBvcy5wYXJkaXIpOgotCQkJY29udGludWUKLQkJZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCBuYW1lKQotCQlpZiBmbm1hdGNoLmZubWF0Y2gobmFtZSwgcGF0dGVybik6Ci0JCQlsaXN0LmFwcGVuZChmdWxsbmFtZSkKLQkJaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhmdWxsbmFtZSk6Ci0JCQlmb3IgcCBpbiBfcHJ1bmU6Ci0JCQkJaWYgZm5tYXRjaC5mbm1hdGNoKG5hbWUsIHApOgotCQkJCQlpZiBfZGVidWc6IHByaW50ICJza2lwIiwgYGZ1bGxuYW1lYAotCQkJCQlicmVhawotCQkJZWxzZToKLQkJCQlpZiBfZGVidWc6IHByaW50ICJkZXNjZW5kIGludG8iLCBgZnVsbG5hbWVgCi0JCQkJbGlzdCA9IGxpc3QgKyBmaW5kKHBhdHRlcm4sIGZ1bGxuYW1lKQotCXJldHVybiBsaXN0CisgICAgbGlzdCA9IFtdCisgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcikKKyAgICBuYW1lcy5zb3J0KCkKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgaWYgbmFtZSBpbiAob3MuY3VyZGlyLCBvcy5wYXJkaXIpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCBuYW1lKQorICAgICAgICBpZiBmbm1hdGNoLmZubWF0Y2gobmFtZSwgcGF0dGVybik6CisgICAgICAgICAgICBsaXN0LmFwcGVuZChmdWxsbmFtZSkKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhmdWxsbmFtZSk6CisgICAgICAgICAgICBmb3IgcCBpbiBfcHJ1bmU6CisgICAgICAgICAgICAgICAgaWYgZm5tYXRjaC5mbm1hdGNoKG5hbWUsIHApOgorICAgICAgICAgICAgICAgICAgICBpZiBfZGVidWc6IHByaW50ICJza2lwIiwgYGZ1bGxuYW1lYAorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBfZGVidWc6IHByaW50ICJkZXNjZW5kIGludG8iLCBgZnVsbG5hbWVgCisgICAgICAgICAgICAgICAgbGlzdCA9IGxpc3QgKyBmaW5kKHBhdHRlcm4sIGZ1bGxuYW1lKQorICAgIHJldHVybiBsaXN0CmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9mbXQucHkgYi9MaWIvbGliLW9sZC9mbXQucHkKaW5kZXggZGZlYTk4Ny4uOTk3ZDM3YSAxMDA2NDQKLS0tIGEvTGliL2xpYi1vbGQvZm10LnB5CisrKyBiL0xpYi9saWItb2xkL2ZtdC5weQpAQCAtMTIsOTYgKzEyLDk2IEBACiAKICMgRm9ybWF0dGVyIGJhY2stZW5kIHRvIGRvIG5vdGhpbmcgYXQgYWxsIHdpdGggdGhlIHBhcmFncmFwaHMKIGNsYXNzIE51bGxCYWNrRW5kOgotCSMKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCXBhc3MKLQkjCi0JZGVmIGFkZHBhcmEoc2VsZiwgcCk6Ci0JCXBhc3MKLQkjCi0JZGVmIGJnbl9hbmNob3Ioc2VsZiwgaWQpOgotCQlwYXNzCi0JIwotCWRlZiBlbmRfYW5jaG9yKHNlbGYsIGlkKToKLQkJcGFzcworICAgICMKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKyAgICAjCisgICAgZGVmIGFkZHBhcmEoc2VsZiwgcCk6CisgICAgICAgIHBhc3MKKyAgICAjCisgICAgZGVmIGJnbl9hbmNob3Ioc2VsZiwgaWQpOgorICAgICAgICBwYXNzCisgICAgIworICAgIGRlZiBlbmRfYW5jaG9yKHNlbGYsIGlkKToKKyAgICAgICAgcGFzcwogCiAKICMgRm9ybWF0dGVyIGJhY2stZW5kIHRvIGNvbGxlY3QgdGhlIHBhcmFncmFwaHMgaW4gYSBsaXN0CiBjbGFzcyBTYXZpbmdCYWNrRW5kKE51bGxCYWNrRW5kKToKLQkjCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlzZWxmLnBhcmFsaXN0ID0gW10KLQkjCi0JZGVmIGFkZHBhcmEoc2VsZiwgcCk6Ci0JCXNlbGYucGFyYWxpc3QuYXBwZW5kKHApCi0JIwotCWRlZiBoaXRjaGVjayhzZWxmLCBoLCB2KToKLQkJaGl0cyA9IFtdCi0JCWZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0JCQlpZiBwLnRvcCA8PSB2IDw9IHAuYm90dG9tOgotCQkJCWZvciBpZCBpbiBwLmhpdGNoZWNrKGgsIHYpOgotCQkJCQlpZiBpZCBub3QgaW4gaGl0czoKLQkJCQkJCWhpdHMuYXBwZW5kKGlkKQotCQlyZXR1cm4gaGl0cwotCSMKLQlkZWYgZXh0cmFjdChzZWxmKToKLQkJdGV4dCA9ICcnCi0JCWZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0JCQl0ZXh0ID0gdGV4dCArIChwLmV4dHJhY3QoKSkKLQkJcmV0dXJuIHRleHQKLQkjCi0JZGVmIGV4dHJhY3RwYXJ0KHNlbGYsIGxvbmcxLCBsb25nMik6Ci0JCWlmIGxvbmcxID4gbG9uZzI6IGxvbmcxLCBsb25nMiA9IGxvbmcyLCBsb25nMQotCQlwYXJhMSwgcG9zMSA9IGxvbmcxCi0JCXBhcmEyLCBwb3MyID0gbG9uZzIKLQkJdGV4dCA9ICcnCi0JCXdoaWxlIHBhcmExIDwgcGFyYTI6Ci0JCQlwdGV4dCA9IHNlbGYucGFyYWxpc3RbcGFyYTFdLmV4dHJhY3QoKQotCQkJdGV4dCA9IHRleHQgKyBwdGV4dFtwb3MxOl0KLQkJCXBvczEgPSAwCi0JCQlwYXJhMSA9IHBhcmExICsgMQotCQlwdGV4dCA9IHNlbGYucGFyYWxpc3RbcGFyYTJdLmV4dHJhY3QoKQotCQlyZXR1cm4gdGV4dCArIHB0ZXh0W3BvczE6cG9zMl0KLQkjCi0JZGVmIHdoZXJlaXMoc2VsZiwgZCwgaCwgdik6Ci0JCXRvdGFsID0gMAotCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5wYXJhbGlzdCkpOgotCQkJcCA9IHNlbGYucGFyYWxpc3RbaV0KLQkJCXJlc3VsdCA9IHAud2hlcmVpcyhkLCBoLCB2KQotCQkJaWYgcmVzdWx0IGlzIG5vdCBOb25lOgotCQkJCXJldHVybiBpLCByZXN1bHQKLQkJcmV0dXJuIE5vbmUKLQkjCi0JZGVmIHJvdW5kdG93b3JkcyhzZWxmLCBsb25nMSwgbG9uZzIpOgotCQlpLCBvZmZzZXQgPSBsb25nMQotCQl0ZXh0ID0gc2VsZi5wYXJhbGlzdFtpXS5leHRyYWN0KCkKLQkJd2hpbGUgb2Zmc2V0ID4gMCBhbmQgdGV4dFtvZmZzZXQtMV0gIT0gJyAnOiBvZmZzZXQgPSBvZmZzZXQtMQotCQlsb25nMSA9IGksIG9mZnNldAotCQkjCi0JCWksIG9mZnNldCA9IGxvbmcyCi0JCXRleHQgPSBzZWxmLnBhcmFsaXN0W2ldLmV4dHJhY3QoKQotCQluID0gbGVuKHRleHQpCi0JCXdoaWxlIG9mZnNldCA8IG4tMSBhbmQgdGV4dFtvZmZzZXRdICE9ICcgJzogb2Zmc2V0ID0gb2Zmc2V0KzEKLQkJbG9uZzIgPSBpLCBvZmZzZXQKLQkJIwotCQlyZXR1cm4gbG9uZzEsIGxvbmcyCi0JIwotCWRlZiByb3VuZHRvcGFyYWdyYXBocyhzZWxmLCBsb25nMSwgbG9uZzIpOgotCQlsb25nMSA9IGxvbmcxWzBdLCAwCi0JCWxvbmcyID0gbG9uZzJbMF0sIGxlbihzZWxmLnBhcmFsaXN0W2xvbmcyWzBdXS5leHRyYWN0KCkpCi0JCXJldHVybiBsb25nMSwgbG9uZzIKKyAgICAjCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnBhcmFsaXN0ID0gW10KKyAgICAjCisgICAgZGVmIGFkZHBhcmEoc2VsZiwgcCk6CisgICAgICAgIHNlbGYucGFyYWxpc3QuYXBwZW5kKHApCisgICAgIworICAgIGRlZiBoaXRjaGVjayhzZWxmLCBoLCB2KToKKyAgICAgICAgaGl0cyA9IFtdCisgICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6CisgICAgICAgICAgICBpZiBwLnRvcCA8PSB2IDw9IHAuYm90dG9tOgorICAgICAgICAgICAgICAgIGZvciBpZCBpbiBwLmhpdGNoZWNrKGgsIHYpOgorICAgICAgICAgICAgICAgICAgICBpZiBpZCBub3QgaW4gaGl0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpdHMuYXBwZW5kKGlkKQorICAgICAgICByZXR1cm4gaGl0cworICAgICMKKyAgICBkZWYgZXh0cmFjdChzZWxmKToKKyAgICAgICAgdGV4dCA9ICcnCisgICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dCArIChwLmV4dHJhY3QoKSkKKyAgICAgICAgcmV0dXJuIHRleHQKKyAgICAjCisgICAgZGVmIGV4dHJhY3RwYXJ0KHNlbGYsIGxvbmcxLCBsb25nMik6CisgICAgICAgIGlmIGxvbmcxID4gbG9uZzI6IGxvbmcxLCBsb25nMiA9IGxvbmcyLCBsb25nMQorICAgICAgICBwYXJhMSwgcG9zMSA9IGxvbmcxCisgICAgICAgIHBhcmEyLCBwb3MyID0gbG9uZzIKKyAgICAgICAgdGV4dCA9ICcnCisgICAgICAgIHdoaWxlIHBhcmExIDwgcGFyYTI6CisgICAgICAgICAgICBwdGV4dCA9IHNlbGYucGFyYWxpc3RbcGFyYTFdLmV4dHJhY3QoKQorICAgICAgICAgICAgdGV4dCA9IHRleHQgKyBwdGV4dFtwb3MxOl0KKyAgICAgICAgICAgIHBvczEgPSAwCisgICAgICAgICAgICBwYXJhMSA9IHBhcmExICsgMQorICAgICAgICBwdGV4dCA9IHNlbGYucGFyYWxpc3RbcGFyYTJdLmV4dHJhY3QoKQorICAgICAgICByZXR1cm4gdGV4dCArIHB0ZXh0W3BvczE6cG9zMl0KKyAgICAjCisgICAgZGVmIHdoZXJlaXMoc2VsZiwgZCwgaCwgdik6CisgICAgICAgIHRvdGFsID0gMAorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5wYXJhbGlzdCkpOgorICAgICAgICAgICAgcCA9IHNlbGYucGFyYWxpc3RbaV0KKyAgICAgICAgICAgIHJlc3VsdCA9IHAud2hlcmVpcyhkLCBoLCB2KQorICAgICAgICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBpLCByZXN1bHQKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAjCisgICAgZGVmIHJvdW5kdG93b3JkcyhzZWxmLCBsb25nMSwgbG9uZzIpOgorICAgICAgICBpLCBvZmZzZXQgPSBsb25nMQorICAgICAgICB0ZXh0ID0gc2VsZi5wYXJhbGlzdFtpXS5leHRyYWN0KCkKKyAgICAgICAgd2hpbGUgb2Zmc2V0ID4gMCBhbmQgdGV4dFtvZmZzZXQtMV0gIT0gJyAnOiBvZmZzZXQgPSBvZmZzZXQtMQorICAgICAgICBsb25nMSA9IGksIG9mZnNldAorICAgICAgICAjCisgICAgICAgIGksIG9mZnNldCA9IGxvbmcyCisgICAgICAgIHRleHQgPSBzZWxmLnBhcmFsaXN0W2ldLmV4dHJhY3QoKQorICAgICAgICBuID0gbGVuKHRleHQpCisgICAgICAgIHdoaWxlIG9mZnNldCA8IG4tMSBhbmQgdGV4dFtvZmZzZXRdICE9ICcgJzogb2Zmc2V0ID0gb2Zmc2V0KzEKKyAgICAgICAgbG9uZzIgPSBpLCBvZmZzZXQKKyAgICAgICAgIworICAgICAgICByZXR1cm4gbG9uZzEsIGxvbmcyCisgICAgIworICAgIGRlZiByb3VuZHRvcGFyYWdyYXBocyhzZWxmLCBsb25nMSwgbG9uZzIpOgorICAgICAgICBsb25nMSA9IGxvbmcxWzBdLCAwCisgICAgICAgIGxvbmcyID0gbG9uZzJbMF0sIGxlbihzZWxmLnBhcmFsaXN0W2xvbmcyWzBdXS5leHRyYWN0KCkpCisgICAgICAgIHJldHVybiBsb25nMSwgbG9uZzIKIAogCiAjIEZvcm1hdHRlciBiYWNrLWVuZCB0byBzZW5kIHRoZSB0ZXh0IGRpcmVjdGx5IHRvIHRoZSBkcmF3aW5nIG9iamVjdAogY2xhc3MgV3JpdGluZ0JhY2tFbmQoTnVsbEJhY2tFbmQpOgotCSMKLQlkZWYgX19pbml0X18oc2VsZiwgZCwgd2lkdGgpOgotCQlzZWxmLmQgPSBkCi0JCXNlbGYud2lkdGggPSB3aWR0aAotCQlzZWxmLmxpbmVubyA9IDAKLQkjCi0JZGVmIGFkZHBhcmEoc2VsZiwgcCk6Ci0JCXNlbGYubGluZW5vID0gcC5yZW5kZXIoc2VsZi5kLCAwLCBzZWxmLmxpbmVubywgc2VsZi53aWR0aCkKKyAgICAjCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGQsIHdpZHRoKToKKyAgICAgICAgc2VsZi5kID0gZAorICAgICAgICBzZWxmLndpZHRoID0gd2lkdGgKKyAgICAgICAgc2VsZi5saW5lbm8gPSAwCisgICAgIworICAgIGRlZiBhZGRwYXJhKHNlbGYsIHApOgorICAgICAgICBzZWxmLmxpbmVubyA9IHAucmVuZGVyKHNlbGYuZCwgMCwgc2VsZi5saW5lbm8sIHNlbGYud2lkdGgpCiAKIAogIyBBIGZvcm1hdHRlciByZWNlaXZlcyBhIHN0cmVhbSBvZiBmb3JtYXR0aW5nIGluc3RydWN0aW9ucyBhbmQgYXNzZW1ibGVzCkBAIC0xMjUsMTkyICsxMjUsMTkyIEBACiAjIG5lZWR2c3BhY2UobmxpbmVzKQogIyBhZGR3b3JkKHdvcmQsIG5zcGFjZXMpCiBjbGFzcyBCYXNlRm9ybWF0dGVyOgotCSMKLQlkZWYgX19pbml0X18oc2VsZiwgZCwgYik6Ci0JCSMgRHJhd2luZyBvYmplY3QgdXNlZCBmb3IgdGV4dCBtZWFzdXJlbWVudHMKLQkJc2VsZi5kID0gZAotCQkjCi0JCSMgQmFja0VuZCBvYmplY3QgcmVjZWl2aW5nIGNvbXBsZXRlZCBwYXJhZ3JhcGhzCi0JCXNlbGYuYiA9IGIKLQkJIwotCQkjIFBhcmFtZXRlcnMgb2YgdGhlIGZvcm1hdHRpbmcgbW9kZWwKLQkJc2VsZi5sZWZ0aW5kZW50ID0gMAotCQlzZWxmLmp1c3QgPSAnbCcKLQkJc2VsZi5mb250ID0gTm9uZQotCQlzZWxmLmJsYW5rbGluZXMgPSAwCi0JCSMKLQkJIyBQYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSB0aGUgY3VycmVudCBmb250Ci0JCXNlbGYuc3BhY2UgPSBkLnRleHR3aWR0aCgnICcpCi0JCXNlbGYubGluZSA9IGQubGluZWhlaWdodCgpCi0JCXNlbGYuYXNjZW50ID0gZC5iYXNlbGluZSgpCi0JCXNlbGYuZGVzY2VudCA9IHNlbGYubGluZSAtIHNlbGYuYXNjZW50Ci0JCSMKLQkJIyBQYXJhbWV0ZXIgZGVyaXZlZCBmcm9tIHRoZSBkZWZhdWx0IGZvbnQKLQkJc2VsZi5uX3NwYWNlID0gc2VsZi5zcGFjZQotCQkjCi0JCSMgQ3VycmVudCBwYXJhZ3JhcGggYmVpbmcgYnVpbHQKLQkJc2VsZi5wYXJhID0gTm9uZQotCQlzZWxmLm5vc3BhY2UgPSAxCi0JCSMKLQkJIyBGb250IHRvIHNldCBvbiB0aGUgbmV4dCB3b3JkCi0JCXNlbGYubmV4dGZvbnQgPSBOb25lCi0JIwotCWRlZiBuZXdwYXJhKHNlbGYpOgotCQlyZXR1cm4gUGFyYS5QYXJhKCkKLQkjCi0JZGVmIHNldGZvbnQoc2VsZiwgZm9udCk6Ci0JCWlmIGZvbnQgaXMgTm9uZTogcmV0dXJuCi0JCXNlbGYuZm9udCA9IHNlbGYubmV4dGZvbnQgPSBmb250Ci0JCWQgPSBzZWxmLmQKLQkJZC5zZXRmb250KGZvbnQpCi0JCXNlbGYuc3BhY2UgPSBkLnRleHR3aWR0aCgnICcpCi0JCXNlbGYubGluZSA9IGQubGluZWhlaWdodCgpCi0JCXNlbGYuYXNjZW50ID0gZC5iYXNlbGluZSgpCi0JCXNlbGYuZGVzY2VudCA9IHNlbGYubGluZSAtIHNlbGYuYXNjZW50Ci0JIwotCWRlZiBzZXRsZWZ0aW5kZW50KHNlbGYsIG5zcGFjZXMpOgotCQlzZWxmLmxlZnRpbmRlbnQgPSBpbnQoc2VsZi5uX3NwYWNlICogbnNwYWNlcykKLQkJaWYgc2VsZi5wYXJhOgotCQkJaGFuZyA9IHNlbGYubGVmdGluZGVudCAtIHNlbGYucGFyYS5pbmRlbnRfbGVmdAotCQkJaWYgaGFuZyA+IDAgYW5kIHNlbGYucGFyYS5nZXRsZW5ndGgoKSA8PSBoYW5nOgotCQkJCXNlbGYucGFyYS5tYWtlaGFuZ2luZ3RhZyhoYW5nKQotCQkJCXNlbGYubm9zcGFjZSA9IDEKLQkJCWVsc2U6Ci0JCQkJc2VsZi5mbHVzaCgpCi0JIwotCWRlZiBzZXRyaWdodGluZGVudChzZWxmLCBuc3BhY2VzKToKLQkJc2VsZi5yaWdodGluZGVudCA9IGludChzZWxmLm5fc3BhY2UgKiBuc3BhY2VzKQotCQlpZiBzZWxmLnBhcmE6Ci0JCQlzZWxmLnBhcmEuaW5kZW50X3JpZ2h0ID0gc2VsZi5yaWdodGluZGVudAotCQkJc2VsZi5mbHVzaCgpCi0JIwotCWRlZiBzZXRqdXN0KHNlbGYsIGp1c3QpOgotCQlzZWxmLmp1c3QgPSBqdXN0Ci0JCWlmIHNlbGYucGFyYToKLQkJCXNlbGYucGFyYS5qdXN0ID0gc2VsZi5qdXN0Ci0JIwotCWRlZiBmbHVzaChzZWxmKToKLQkJaWYgc2VsZi5wYXJhOgotCQkJc2VsZi5iLmFkZHBhcmEoc2VsZi5wYXJhKQotCQkJc2VsZi5wYXJhID0gTm9uZQotCQkJaWYgc2VsZi5mb250IGlzIG5vdCBOb25lOgotCQkJCXNlbGYuZC5zZXRmb250KHNlbGYuZm9udCkKLQkJc2VsZi5ub3NwYWNlID0gMQotCSMKLQlkZWYgdnNwYWNlKHNlbGYsIG5saW5lcyk6Ci0JCXNlbGYuZmx1c2goKQotCQlpZiBubGluZXMgPiAwOgotCQkJc2VsZi5wYXJhID0gc2VsZi5uZXdwYXJhKCkKLQkJCXR1cGxlID0gTm9uZSwgJycsIDAsIDAsIDAsIGludChubGluZXMqc2VsZi5saW5lKSwgMAotCQkJc2VsZi5wYXJhLndvcmRzLmFwcGVuZCh0dXBsZSkKLQkJCXNlbGYuZmx1c2goKQotCQkJc2VsZi5ibGFua2xpbmVzID0gc2VsZi5ibGFua2xpbmVzICsgbmxpbmVzCi0JIwotCWRlZiBuZWVkdnNwYWNlKHNlbGYsIG5saW5lcyk6Ci0JCXNlbGYuZmx1c2goKSAjIEp1c3QgdG8gYmUgc3VyZQotCQlpZiBubGluZXMgPiBzZWxmLmJsYW5rbGluZXM6Ci0JCQlzZWxmLnZzcGFjZShubGluZXMgLSBzZWxmLmJsYW5rbGluZXMpCi0JIwotCWRlZiBhZGR3b3JkKHNlbGYsIHRleHQsIHNwYWNlKToKLQkJaWYgc2VsZi5ub3NwYWNlIGFuZCBub3QgdGV4dDoKLQkJCXJldHVybgotCQlzZWxmLm5vc3BhY2UgPSAwCi0JCXNlbGYuYmxhbmtsaW5lcyA9IDAKLQkJaWYgbm90IHNlbGYucGFyYToKLQkJCXNlbGYucGFyYSA9IHNlbGYubmV3cGFyYSgpCi0JCQlzZWxmLnBhcmEuaW5kZW50X2xlZnQgPSBzZWxmLmxlZnRpbmRlbnQKLQkJCXNlbGYucGFyYS5qdXN0ID0gc2VsZi5qdXN0Ci0JCQlzZWxmLm5leHRmb250ID0gc2VsZi5mb250Ci0JCXNwYWNlID0gaW50KHNwYWNlICogc2VsZi5zcGFjZSkKLQkJc2VsZi5wYXJhLndvcmRzLmFwcGVuZCgoc2VsZi5uZXh0Zm9udCwgdGV4dCwKLQkJCXNlbGYuZC50ZXh0d2lkdGgodGV4dCksIHNwYWNlLCBzcGFjZSwKLQkJCXNlbGYuYXNjZW50LCBzZWxmLmRlc2NlbnQpKQotCQlzZWxmLm5leHRmb250ID0gTm9uZQotCSMKLQlkZWYgYmduX2FuY2hvcihzZWxmLCBpZCk6Ci0JCWlmIG5vdCBzZWxmLnBhcmE6Ci0JCQlzZWxmLm5vc3BhY2UgPSAwCi0JCQlzZWxmLmFkZHdvcmQoJycsIDApCi0JCXNlbGYucGFyYS5iZ25fYW5jaG9yKGlkKQotCSMKLQlkZWYgZW5kX2FuY2hvcihzZWxmLCBpZCk6Ci0JCWlmIG5vdCBzZWxmLnBhcmE6Ci0JCQlzZWxmLm5vc3BhY2UgPSAwCi0JCQlzZWxmLmFkZHdvcmQoJycsIDApCi0JCXNlbGYucGFyYS5lbmRfYW5jaG9yKGlkKQorICAgICMKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZCwgYik6CisgICAgICAgICMgRHJhd2luZyBvYmplY3QgdXNlZCBmb3IgdGV4dCBtZWFzdXJlbWVudHMKKyAgICAgICAgc2VsZi5kID0gZAorICAgICAgICAjCisgICAgICAgICMgQmFja0VuZCBvYmplY3QgcmVjZWl2aW5nIGNvbXBsZXRlZCBwYXJhZ3JhcGhzCisgICAgICAgIHNlbGYuYiA9IGIKKyAgICAgICAgIworICAgICAgICAjIFBhcmFtZXRlcnMgb2YgdGhlIGZvcm1hdHRpbmcgbW9kZWwKKyAgICAgICAgc2VsZi5sZWZ0aW5kZW50ID0gMAorICAgICAgICBzZWxmLmp1c3QgPSAnbCcKKyAgICAgICAgc2VsZi5mb250ID0gTm9uZQorICAgICAgICBzZWxmLmJsYW5rbGluZXMgPSAwCisgICAgICAgICMKKyAgICAgICAgIyBQYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSB0aGUgY3VycmVudCBmb250CisgICAgICAgIHNlbGYuc3BhY2UgPSBkLnRleHR3aWR0aCgnICcpCisgICAgICAgIHNlbGYubGluZSA9IGQubGluZWhlaWdodCgpCisgICAgICAgIHNlbGYuYXNjZW50ID0gZC5iYXNlbGluZSgpCisgICAgICAgIHNlbGYuZGVzY2VudCA9IHNlbGYubGluZSAtIHNlbGYuYXNjZW50CisgICAgICAgICMKKyAgICAgICAgIyBQYXJhbWV0ZXIgZGVyaXZlZCBmcm9tIHRoZSBkZWZhdWx0IGZvbnQKKyAgICAgICAgc2VsZi5uX3NwYWNlID0gc2VsZi5zcGFjZQorICAgICAgICAjCisgICAgICAgICMgQ3VycmVudCBwYXJhZ3JhcGggYmVpbmcgYnVpbHQKKyAgICAgICAgc2VsZi5wYXJhID0gTm9uZQorICAgICAgICBzZWxmLm5vc3BhY2UgPSAxCisgICAgICAgICMKKyAgICAgICAgIyBGb250IHRvIHNldCBvbiB0aGUgbmV4dCB3b3JkCisgICAgICAgIHNlbGYubmV4dGZvbnQgPSBOb25lCisgICAgIworICAgIGRlZiBuZXdwYXJhKHNlbGYpOgorICAgICAgICByZXR1cm4gUGFyYS5QYXJhKCkKKyAgICAjCisgICAgZGVmIHNldGZvbnQoc2VsZiwgZm9udCk6CisgICAgICAgIGlmIGZvbnQgaXMgTm9uZTogcmV0dXJuCisgICAgICAgIHNlbGYuZm9udCA9IHNlbGYubmV4dGZvbnQgPSBmb250CisgICAgICAgIGQgPSBzZWxmLmQKKyAgICAgICAgZC5zZXRmb250KGZvbnQpCisgICAgICAgIHNlbGYuc3BhY2UgPSBkLnRleHR3aWR0aCgnICcpCisgICAgICAgIHNlbGYubGluZSA9IGQubGluZWhlaWdodCgpCisgICAgICAgIHNlbGYuYXNjZW50ID0gZC5iYXNlbGluZSgpCisgICAgICAgIHNlbGYuZGVzY2VudCA9IHNlbGYubGluZSAtIHNlbGYuYXNjZW50CisgICAgIworICAgIGRlZiBzZXRsZWZ0aW5kZW50KHNlbGYsIG5zcGFjZXMpOgorICAgICAgICBzZWxmLmxlZnRpbmRlbnQgPSBpbnQoc2VsZi5uX3NwYWNlICogbnNwYWNlcykKKyAgICAgICAgaWYgc2VsZi5wYXJhOgorICAgICAgICAgICAgaGFuZyA9IHNlbGYubGVmdGluZGVudCAtIHNlbGYucGFyYS5pbmRlbnRfbGVmdAorICAgICAgICAgICAgaWYgaGFuZyA+IDAgYW5kIHNlbGYucGFyYS5nZXRsZW5ndGgoKSA8PSBoYW5nOgorICAgICAgICAgICAgICAgIHNlbGYucGFyYS5tYWtlaGFuZ2luZ3RhZyhoYW5nKQorICAgICAgICAgICAgICAgIHNlbGYubm9zcGFjZSA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgIworICAgIGRlZiBzZXRyaWdodGluZGVudChzZWxmLCBuc3BhY2VzKToKKyAgICAgICAgc2VsZi5yaWdodGluZGVudCA9IGludChzZWxmLm5fc3BhY2UgKiBuc3BhY2VzKQorICAgICAgICBpZiBzZWxmLnBhcmE6CisgICAgICAgICAgICBzZWxmLnBhcmEuaW5kZW50X3JpZ2h0ID0gc2VsZi5yaWdodGluZGVudAorICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgIworICAgIGRlZiBzZXRqdXN0KHNlbGYsIGp1c3QpOgorICAgICAgICBzZWxmLmp1c3QgPSBqdXN0CisgICAgICAgIGlmIHNlbGYucGFyYToKKyAgICAgICAgICAgIHNlbGYucGFyYS5qdXN0ID0gc2VsZi5qdXN0CisgICAgIworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wYXJhOgorICAgICAgICAgICAgc2VsZi5iLmFkZHBhcmEoc2VsZi5wYXJhKQorICAgICAgICAgICAgc2VsZi5wYXJhID0gTm9uZQorICAgICAgICAgICAgaWYgc2VsZi5mb250IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuZC5zZXRmb250KHNlbGYuZm9udCkKKyAgICAgICAgc2VsZi5ub3NwYWNlID0gMQorICAgICMKKyAgICBkZWYgdnNwYWNlKHNlbGYsIG5saW5lcyk6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBpZiBubGluZXMgPiAwOgorICAgICAgICAgICAgc2VsZi5wYXJhID0gc2VsZi5uZXdwYXJhKCkKKyAgICAgICAgICAgIHR1cGxlID0gTm9uZSwgJycsIDAsIDAsIDAsIGludChubGluZXMqc2VsZi5saW5lKSwgMAorICAgICAgICAgICAgc2VsZi5wYXJhLndvcmRzLmFwcGVuZCh0dXBsZSkKKyAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5ibGFua2xpbmVzID0gc2VsZi5ibGFua2xpbmVzICsgbmxpbmVzCisgICAgIworICAgIGRlZiBuZWVkdnNwYWNlKHNlbGYsIG5saW5lcyk6CisgICAgICAgIHNlbGYuZmx1c2goKSAjIEp1c3QgdG8gYmUgc3VyZQorICAgICAgICBpZiBubGluZXMgPiBzZWxmLmJsYW5rbGluZXM6CisgICAgICAgICAgICBzZWxmLnZzcGFjZShubGluZXMgLSBzZWxmLmJsYW5rbGluZXMpCisgICAgIworICAgIGRlZiBhZGR3b3JkKHNlbGYsIHRleHQsIHNwYWNlKToKKyAgICAgICAgaWYgc2VsZi5ub3NwYWNlIGFuZCBub3QgdGV4dDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm5vc3BhY2UgPSAwCisgICAgICAgIHNlbGYuYmxhbmtsaW5lcyA9IDAKKyAgICAgICAgaWYgbm90IHNlbGYucGFyYToKKyAgICAgICAgICAgIHNlbGYucGFyYSA9IHNlbGYubmV3cGFyYSgpCisgICAgICAgICAgICBzZWxmLnBhcmEuaW5kZW50X2xlZnQgPSBzZWxmLmxlZnRpbmRlbnQKKyAgICAgICAgICAgIHNlbGYucGFyYS5qdXN0ID0gc2VsZi5qdXN0CisgICAgICAgICAgICBzZWxmLm5leHRmb250ID0gc2VsZi5mb250CisgICAgICAgIHNwYWNlID0gaW50KHNwYWNlICogc2VsZi5zcGFjZSkKKyAgICAgICAgc2VsZi5wYXJhLndvcmRzLmFwcGVuZCgoc2VsZi5uZXh0Zm9udCwgdGV4dCwKKyAgICAgICAgICAgICAgICBzZWxmLmQudGV4dHdpZHRoKHRleHQpLCBzcGFjZSwgc3BhY2UsCisgICAgICAgICAgICAgICAgc2VsZi5hc2NlbnQsIHNlbGYuZGVzY2VudCkpCisgICAgICAgIHNlbGYubmV4dGZvbnQgPSBOb25lCisgICAgIworICAgIGRlZiBiZ25fYW5jaG9yKHNlbGYsIGlkKToKKyAgICAgICAgaWYgbm90IHNlbGYucGFyYToKKyAgICAgICAgICAgIHNlbGYubm9zcGFjZSA9IDAKKyAgICAgICAgICAgIHNlbGYuYWRkd29yZCgnJywgMCkKKyAgICAgICAgc2VsZi5wYXJhLmJnbl9hbmNob3IoaWQpCisgICAgIworICAgIGRlZiBlbmRfYW5jaG9yKHNlbGYsIGlkKToKKyAgICAgICAgaWYgbm90IHNlbGYucGFyYToKKyAgICAgICAgICAgIHNlbGYubm9zcGFjZSA9IDAKKyAgICAgICAgICAgIHNlbGYuYWRkd29yZCgnJywgMCkKKyAgICAgICAgc2VsZi5wYXJhLmVuZF9hbmNob3IoaWQpCiAKIAogIyBNZWFzdXJpbmcgb2JqZWN0IGZvciBtZWFzdXJpbmcgdGV4dCBhcyB2aWV3ZWQgb24gYSB0dHkKIGNsYXNzIE51bGxNZWFzdXJlcjoKLQkjCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlwYXNzCi0JIwotCWRlZiBzZXRmb250KHNlbGYsIGZvbnQpOgotCQlwYXNzCi0JIwotCWRlZiB0ZXh0d2lkdGgoc2VsZiwgdGV4dCk6Ci0JCXJldHVybiBsZW4odGV4dCkKLQkjCi0JZGVmIGxpbmVoZWlnaHQoc2VsZik6Ci0JCXJldHVybiAxCi0JIwotCWRlZiBiYXNlbGluZShzZWxmKToKLQkJcmV0dXJuIDAKKyAgICAjCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisgICAgIworICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnQpOgorICAgICAgICBwYXNzCisgICAgIworICAgIGRlZiB0ZXh0d2lkdGgoc2VsZiwgdGV4dCk6CisgICAgICAgIHJldHVybiBsZW4odGV4dCkKKyAgICAjCisgICAgZGVmIGxpbmVoZWlnaHQoc2VsZik6CisgICAgICAgIHJldHVybiAxCisgICAgIworICAgIGRlZiBiYXNlbGluZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKIAogCiAjIERyYXdpbmcgb2JqZWN0IGZvciB3cml0aW5nIHBsYWluIEFTQ0lJIHRleHQgdG8gYSBmaWxlCiBjbGFzcyBGaWxlV3JpdGVyOgotCSMKLQlkZWYgX19pbml0X18oc2VsZiwgZnApOgotCQlzZWxmLmZwID0gZnAKLQkJc2VsZi5saW5lbm8sIHNlbGYuY29sbm8gPSAwLCAwCi0JIwotCWRlZiBzZXRmb250KHNlbGYsIGZvbnQpOgotCQlwYXNzCi0JIwotCWRlZiB0ZXh0KHNlbGYsIChoLCB2KSwgc3RyKToKLQkJaWYgbm90IHN0cjogcmV0dXJuCi0JCWlmICdcbicgaW4gc3RyOgotCQkJcmFpc2UgVmFsdWVFcnJvciwgJ2NhblwndCB3cml0ZSBcXG4nCi0JCXdoaWxlIHNlbGYubGluZW5vIDwgdjoKLQkJCXNlbGYuZnAud3JpdGUoJ1xuJykKLQkJCXNlbGYuY29sbm8sIHNlbGYubGluZW5vID0gMCwgc2VsZi5saW5lbm8gKyAxCi0JCXdoaWxlIHNlbGYubGluZW5vID4gdjoKLQkJCSMgWFhYIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgotCQkJc2VsZi5mcC53cml0ZSgnXDAzM1tBJykgIyBBTlNJIHVwIGFycm93Ci0JCQlzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vIC0gMQotCQlpZiBzZWxmLmNvbG5vIDwgaDoKLQkJCXNlbGYuZnAud3JpdGUoJyAnICogKGggLSBzZWxmLmNvbG5vKSkKLQkJZWxpZiBzZWxmLmNvbG5vID4gaDoKLQkJCXNlbGYuZnAud3JpdGUoJ1xiJyAqIChzZWxmLmNvbG5vIC0gaCkpCi0JCXNlbGYuY29sbm8gPSBoCi0JCXNlbGYuZnAud3JpdGUoc3RyKQotCQlzZWxmLmNvbG5vID0gaCArIGxlbihzdHIpCisgICAgIworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCk6CisgICAgICAgIHNlbGYuZnAgPSBmcAorICAgICAgICBzZWxmLmxpbmVubywgc2VsZi5jb2xubyA9IDAsIDAKKyAgICAjCisgICAgZGVmIHNldGZvbnQoc2VsZiwgZm9udCk6CisgICAgICAgIHBhc3MKKyAgICAjCisgICAgZGVmIHRleHQoc2VsZiwgKGgsIHYpLCBzdHIpOgorICAgICAgICBpZiBub3Qgc3RyOiByZXR1cm4KKyAgICAgICAgaWYgJ1xuJyBpbiBzdHI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnY2FuXCd0IHdyaXRlIFxcbicKKyAgICAgICAgd2hpbGUgc2VsZi5saW5lbm8gPCB2OgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnXG4nKQorICAgICAgICAgICAgc2VsZi5jb2xubywgc2VsZi5saW5lbm8gPSAwLCBzZWxmLmxpbmVubyArIDEKKyAgICAgICAgd2hpbGUgc2VsZi5saW5lbm8gPiB2OgorICAgICAgICAgICAgIyBYWFggVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCisgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCdcMDMzW0EnKSAjIEFOU0kgdXAgYXJyb3cKKyAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gLSAxCisgICAgICAgIGlmIHNlbGYuY29sbm8gPCBoOgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnICcgKiAoaCAtIHNlbGYuY29sbm8pKQorICAgICAgICBlbGlmIHNlbGYuY29sbm8gPiBoOgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnXGInICogKHNlbGYuY29sbm8gLSBoKSkKKyAgICAgICAgc2VsZi5jb2xubyA9IGgKKyAgICAgICAgc2VsZi5mcC53cml0ZShzdHIpCisgICAgICAgIHNlbGYuY29sbm8gPSBoICsgbGVuKHN0cikKIAogCiAjIEZvcm1hdHRpbmcgY2xhc3MgdG8gZG8gbm90aGluZyBhdCBhbGwgd2l0aCB0aGUgZGF0YQogY2xhc3MgTnVsbEZvcm1hdHRlcihCYXNlRm9ybWF0dGVyKToKLQkjCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlkID0gTnVsbE1lYXN1cmVyKCkKLQkJYiA9IE51bGxCYWNrRW5kKCkKLQkJQmFzZUZvcm1hdHRlci5fX2luaXRfXyhzZWxmLCBkLCBiKQorICAgICMKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGQgPSBOdWxsTWVhc3VyZXIoKQorICAgICAgICBiID0gTnVsbEJhY2tFbmQoKQorICAgICAgICBCYXNlRm9ybWF0dGVyLl9faW5pdF9fKHNlbGYsIGQsIGIpCiAKIAogIyBGb3JtYXR0aW5nIGNsYXNzIHRvIHdyaXRlIGRpcmVjdGx5IHRvIGEgZmlsZQogY2xhc3MgV3JpdGluZ0Zvcm1hdHRlcihCYXNlRm9ybWF0dGVyKToKLQkjCi0JZGVmIF9faW5pdF9fKHNlbGYsIGZwLCB3aWR0aCk6Ci0JCWRtID0gTnVsbE1lYXN1cmVyKCkKLQkJZHcgPSBGaWxlV3JpdGVyKGZwKQotCQliID0gV3JpdGluZ0JhY2tFbmQoZHcsIHdpZHRoKQotCQlCYXNlRm9ybWF0dGVyLl9faW5pdF9fKHNlbGYsIGRtLCBiKQotCQlzZWxmLmJsYW5rbGluZXMgPSAxCi0JIwotCSMgU3VwcHJlc3MgbXVsdGlwbGUgYmxhbmsgbGluZXMKLQlkZWYgbmVlZHZzcGFjZShzZWxmLCBubGluZXMpOgotCQlCYXNlRm9ybWF0dGVyLm5lZWR2c3BhY2Uoc2VsZiwgbWluKDEsIG5saW5lcykpCisgICAgIworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgd2lkdGgpOgorICAgICAgICBkbSA9IE51bGxNZWFzdXJlcigpCisgICAgICAgIGR3ID0gRmlsZVdyaXRlcihmcCkKKyAgICAgICAgYiA9IFdyaXRpbmdCYWNrRW5kKGR3LCB3aWR0aCkKKyAgICAgICAgQmFzZUZvcm1hdHRlci5fX2luaXRfXyhzZWxmLCBkbSwgYikKKyAgICAgICAgc2VsZi5ibGFua2xpbmVzID0gMQorICAgICMKKyAgICAjIFN1cHByZXNzIG11bHRpcGxlIGJsYW5rIGxpbmVzCisgICAgZGVmIG5lZWR2c3BhY2Uoc2VsZiwgbmxpbmVzKToKKyAgICAgICAgQmFzZUZvcm1hdHRlci5uZWVkdnNwYWNlKHNlbGYsIG1pbigxLCBubGluZXMpKQogCiAKICMgQSAiRnVubnlGb3JtYXR0ZXIiIHdyaXRlcyBBU0NJSSB0ZXh0IHdpdGggYSB0d2lzdDogKmJvbGQgd29yZHMqLApAQCAtMzIwLDEwICszMjAsMTAgQEAKICMgTW9yZW92ZXIsIGlmIHRoZSBmb250IGlzIGluIHVwcGVyIGNhc2UsIHRoZSB0ZXh0IGlzIGNvbnZlcnRlZCB0bwogIyBVUFBFUiBDQVNFLgogY2xhc3MgRnVubnlGb3JtYXR0ZXIoV3JpdGluZ0Zvcm1hdHRlcik6Ci0JIwotCWRlZiBmbHVzaChzZWxmKToKLQkJaWYgc2VsZi5wYXJhOiBmaW5hbGl6ZShzZWxmLnBhcmEpCi0JCVdyaXRpbmdGb3JtYXR0ZXIuZmx1c2goc2VsZikKKyAgICAjCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBhcmE6IGZpbmFsaXplKHNlbGYucGFyYSkKKyAgICAgICAgV3JpdGluZ0Zvcm1hdHRlci5mbHVzaChzZWxmKQogCiAKICMgU3Vycm91bmRzICpib2xkIHdvcmRzKiBhbmQgX2l0YWxpYyB0ZXh0XyBpbiBhIHBhcmFncmFwaCB3aXRoCkBAIC0zMzQsMzMgKzMzNCwzMyBAQAogY2xvc2VjaGFyID0gXAogICAgIHsnYic6JyonLCAnaSc6J18nLCAndSc6J18nLCAncSc6J1wnJywgJ0InOicqJywgJ0knOidfJywgJ1UnOidfJywgJ1EnOidcJyd9CiBkZWYgZmluYWxpemUocGFyYSk6Ci0Jb2xkZm9udCA9IGN1cmZvbnQgPSAncicKLQlwYXJhLndvcmRzLmFwcGVuZCgoJ3InLCAnJywgMCwgMCwgMCwgMCkpICMgdGVtcG9yYXJ5LCBkZWxldGVkIGF0IGVuZAotCWZvciBpIGluIHJhbmdlKGxlbihwYXJhLndvcmRzKSk6Ci0JCWZvLCB0ZSwgd2kgPSBwYXJhLndvcmRzW2ldWzozXQotCQlpZiBmbyBpcyBub3QgTm9uZTogY3VyZm9udCA9IGZvCi0JCWlmIGN1cmZvbnQgIT0gb2xkZm9udDoKLQkJCWlmIGNsb3NlY2hhci5oYXNfa2V5KG9sZGZvbnQpOgotCQkJCWMgPSBjbG9zZWNoYXJbb2xkZm9udF0KLQkJCQlqID0gaS0xCi0JCQkJd2hpbGUgaiA+IDAgYW5kIHBhcmEud29yZHNbal1bMV0gPT0gJyc6IGogPSBqLTEKLQkJCQlmbzEsIHRlMSwgd2kxID0gcGFyYS53b3Jkc1tqXVs6M10KLQkJCQl0ZTEgPSB0ZTEgKyBjCi0JCQkJd2kxID0gd2kxICsgbGVuKGMpCi0JCQkJcGFyYS53b3Jkc1tqXSA9IChmbzEsIHRlMSwgd2kxKSArIFwKLQkJCQkJcGFyYS53b3Jkc1tqXVszOl0KLQkJCWlmIG9wZW5jaGFyLmhhc19rZXkoY3VyZm9udCkgYW5kIHRlOgotCQkJCWMgPSBvcGVuY2hhcltjdXJmb250XQotCQkJCXRlID0gYyArIHRlCi0JCQkJd2kgPSBsZW4oYykgKyB3aQotCQkJCXBhcmEud29yZHNbaV0gPSAoZm8sIHRlLCB3aSkgKyBcCi0JCQkJCXBhcmEud29yZHNbaV1bMzpdCi0JCQlpZiB0ZTogb2xkZm9udCA9IGN1cmZvbnQKLQkJCWVsc2U6IG9sZGZvbnQgPSAncicKLQkJaWYgY3VyZm9udCBpbiBzdHJpbmcudXBwZXJjYXNlOgotCQkJdGUgPSBzdHJpbmcudXBwZXIodGUpCi0JCQlwYXJhLndvcmRzW2ldID0gKGZvLCB0ZSwgd2kpICsgcGFyYS53b3Jkc1tpXVszOl0KLQlkZWwgcGFyYS53b3Jkc1stMV0KKyAgICBvbGRmb250ID0gY3VyZm9udCA9ICdyJworICAgIHBhcmEud29yZHMuYXBwZW5kKCgncicsICcnLCAwLCAwLCAwLCAwKSkgIyB0ZW1wb3JhcnksIGRlbGV0ZWQgYXQgZW5kCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHBhcmEud29yZHMpKToKKyAgICAgICAgZm8sIHRlLCB3aSA9IHBhcmEud29yZHNbaV1bOjNdCisgICAgICAgIGlmIGZvIGlzIG5vdCBOb25lOiBjdXJmb250ID0gZm8KKyAgICAgICAgaWYgY3VyZm9udCAhPSBvbGRmb250OgorICAgICAgICAgICAgaWYgY2xvc2VjaGFyLmhhc19rZXkob2xkZm9udCk6CisgICAgICAgICAgICAgICAgYyA9IGNsb3NlY2hhcltvbGRmb250XQorICAgICAgICAgICAgICAgIGogPSBpLTEKKyAgICAgICAgICAgICAgICB3aGlsZSBqID4gMCBhbmQgcGFyYS53b3Jkc1tqXVsxXSA9PSAnJzogaiA9IGotMQorICAgICAgICAgICAgICAgIGZvMSwgdGUxLCB3aTEgPSBwYXJhLndvcmRzW2pdWzozXQorICAgICAgICAgICAgICAgIHRlMSA9IHRlMSArIGMKKyAgICAgICAgICAgICAgICB3aTEgPSB3aTEgKyBsZW4oYykKKyAgICAgICAgICAgICAgICBwYXJhLndvcmRzW2pdID0gKGZvMSwgdGUxLCB3aTEpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYS53b3Jkc1tqXVszOl0KKyAgICAgICAgICAgIGlmIG9wZW5jaGFyLmhhc19rZXkoY3VyZm9udCkgYW5kIHRlOgorICAgICAgICAgICAgICAgIGMgPSBvcGVuY2hhcltjdXJmb250XQorICAgICAgICAgICAgICAgIHRlID0gYyArIHRlCisgICAgICAgICAgICAgICAgd2kgPSBsZW4oYykgKyB3aQorICAgICAgICAgICAgICAgIHBhcmEud29yZHNbaV0gPSAoZm8sIHRlLCB3aSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhLndvcmRzW2ldWzM6XQorICAgICAgICAgICAgaWYgdGU6IG9sZGZvbnQgPSBjdXJmb250CisgICAgICAgICAgICBlbHNlOiBvbGRmb250ID0gJ3InCisgICAgICAgIGlmIGN1cmZvbnQgaW4gc3RyaW5nLnVwcGVyY2FzZToKKyAgICAgICAgICAgIHRlID0gc3RyaW5nLnVwcGVyKHRlKQorICAgICAgICAgICAgcGFyYS53b3Jkc1tpXSA9IChmbywgdGUsIHdpKSArIHBhcmEud29yZHNbaV1bMzpdCisgICAgZGVsIHBhcmEud29yZHNbLTFdCiAKIAogIyBGb3JtYXR0ZXIgYmFjay1lbmQgdG8gZHJhdyB0aGUgdGV4dCBpbiBhIHdpbmRvdy4KQEAgLTM2OCwyNTYgKzM2OCwyNTYgQEAKICMgdG8gbWluaW1pemUgdGhlIGRlbGF5IGJlZm9yZSB0aGUgdXNlciBzZWVzIGFueXRoaW5nLgogIyBUaGlzIG1hbmFnZXMgdGhlIGVudGlyZSAiZG9jdW1lbnQiIG9mIHRoZSB3aW5kb3cuCiBjbGFzcyBTdGR3aW5CYWNrRW5kKFNhdmluZ0JhY2tFbmQpOgotCSMKLQlkZWYgX19pbml0X18oc2VsZiwgd2luZG93LCBkcmF3bm93KToKLQkJc2VsZi53aW5kb3cgPSB3aW5kb3cKLQkJc2VsZi5kcmF3bm93ID0gZHJhd25vdwotCQlzZWxmLndpZHRoID0gd2luZG93LmdldHdpbnNpemUoKVswXQotCQlzZWxmLnNlbGVjdGlvbiA9IE5vbmUKLQkJc2VsZi5oZWlnaHQgPSAwCi0JCXdpbmRvdy5zZXRvcmlnaW4oMCwgMCkKLQkJd2luZG93LnNldGRvY3NpemUoMCwgMCkKLQkJc2VsZi5kID0gd2luZG93LmJlZ2luZHJhd2luZygpCi0JCVNhdmluZ0JhY2tFbmQuX19pbml0X18oc2VsZikKLQkjCi0JZGVmIGZpbmlzaChzZWxmKToKLQkJc2VsZi5kLmNsb3NlKCkKLQkJc2VsZi5kID0gTm9uZQotCQlzZWxmLndpbmRvdy5zZXRkb2NzaXplKDAsIHNlbGYuaGVpZ2h0KQotCSMKLQlkZWYgYWRkcGFyYShzZWxmLCBwKToKLQkJc2VsZi5wYXJhbGlzdC5hcHBlbmQocCkKLQkJaWYgc2VsZi5kcmF3bm93OgotCQkJc2VsZi5oZWlnaHQgPSBcCi0JCQkJcC5yZW5kZXIoc2VsZi5kLCAwLCBzZWxmLmhlaWdodCwgc2VsZi53aWR0aCkKLQkJZWxzZToKLQkJCXAubGF5b3V0KHNlbGYud2lkdGgpCi0JCQlwLmxlZnQgPSAwCi0JCQlwLnRvcCA9IHNlbGYuaGVpZ2h0Ci0JCQlwLnJpZ2h0ID0gc2VsZi53aWR0aAotCQkJcC5ib3R0b20gPSBzZWxmLmhlaWdodCArIHAuaGVpZ2h0Ci0JCQlzZWxmLmhlaWdodCA9IHAuYm90dG9tCi0JIwotCWRlZiByZXNpemUoc2VsZik6Ci0JCXNlbGYud2luZG93LmNoYW5nZSgoMCwgMCksIChzZWxmLndpZHRoLCBzZWxmLmhlaWdodCkpCi0JCXNlbGYud2lkdGggPSBzZWxmLndpbmRvdy5nZXR3aW5zaXplKClbMF0KLQkJc2VsZi5oZWlnaHQgPSAwCi0JCWZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0JCQlwLmxheW91dChzZWxmLndpZHRoKQotCQkJcC5sZWZ0ID0gMAotCQkJcC50b3AgPSBzZWxmLmhlaWdodAotCQkJcC5yaWdodCA9IHNlbGYud2lkdGgKLQkJCXAuYm90dG9tID0gc2VsZi5oZWlnaHQgKyBwLmhlaWdodAotCQkJc2VsZi5oZWlnaHQgPSBwLmJvdHRvbQotCQlzZWxmLndpbmRvdy5jaGFuZ2UoKDAsIDApLCAoc2VsZi53aWR0aCwgc2VsZi5oZWlnaHQpKQotCQlzZWxmLndpbmRvdy5zZXRkb2NzaXplKDAsIHNlbGYuaGVpZ2h0KQotCSMKLQlkZWYgcmVkcmF3KHNlbGYsIGFyZWEpOgotCQlkID0gc2VsZi53aW5kb3cuYmVnaW5kcmF3aW5nKCkKLQkJKGxlZnQsIHRvcCksIChyaWdodCwgYm90dG9tKSA9IGFyZWEKLQkJZC5lcmFzZShhcmVhKQotCQlkLmNsaXByZWN0KGFyZWEpCi0JCWZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0JCQlpZiB0b3AgPCBwLmJvdHRvbSBhbmQgcC50b3AgPCBib3R0b206Ci0JCQkJdiA9IHAucmVuZGVyKGQsIHAubGVmdCwgcC50b3AsIHAucmlnaHQpCi0JCWlmIHNlbGYuc2VsZWN0aW9uOgotCQkJc2VsZi5pbnZlcnQoZCwgc2VsZi5zZWxlY3Rpb24pCi0JCWQuY2xvc2UoKQotCSMKLQlkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIG5ldyk6Ci0JCWlmIG5ldzoKLQkJCWxvbmcxLCBsb25nMiA9IG5ldwotCQkJcG9zMSA9IGxvbmcxWzozXQotCQkJcG9zMiA9IGxvbmcyWzozXQotCQkJbmV3ID0gcG9zMSwgcG9zMgotCQlpZiBuZXcgIT0gc2VsZi5zZWxlY3Rpb246Ci0JCQlkID0gc2VsZi53aW5kb3cuYmVnaW5kcmF3aW5nKCkKLQkJCWlmIHNlbGYuc2VsZWN0aW9uOgotCQkJCXNlbGYuaW52ZXJ0KGQsIHNlbGYuc2VsZWN0aW9uKQotCQkJaWYgbmV3OgotCQkJCXNlbGYuaW52ZXJ0KGQsIG5ldykKLQkJCWQuY2xvc2UoKQotCQkJc2VsZi5zZWxlY3Rpb24gPSBuZXcKLQkjCi0JZGVmIGdldHNlbGVjdGlvbihzZWxmKToKLQkJcmV0dXJuIHNlbGYuc2VsZWN0aW9uCi0JIwotCWRlZiBleHRyYWN0c2VsZWN0aW9uKHNlbGYpOgotCQlpZiBzZWxmLnNlbGVjdGlvbjoKLQkJCWEsIGIgPSBzZWxmLnNlbGVjdGlvbgotCQkJcmV0dXJuIHNlbGYuZXh0cmFjdHBhcnQoYSwgYikKLQkJZWxzZToKLQkJCXJldHVybiBOb25lCi0JIwotCWRlZiBpbnZlcnQoc2VsZiwgZCwgcmVnaW9uKToKLQkJbG9uZzEsIGxvbmcyID0gcmVnaW9uCi0JCWlmIGxvbmcxID4gbG9uZzI6IGxvbmcxLCBsb25nMiA9IGxvbmcyLCBsb25nMQotCQlwYXJhMSwgcG9zMSA9IGxvbmcxCi0JCXBhcmEyLCBwb3MyID0gbG9uZzIKLQkJd2hpbGUgcGFyYTEgPCBwYXJhMjoKLQkJCXNlbGYucGFyYWxpc3RbcGFyYTFdLmludmVydChkLCBwb3MxLCBOb25lKQotCQkJcG9zMSA9IE5vbmUKLQkJCXBhcmExID0gcGFyYTEgKyAxCi0JCXNlbGYucGFyYWxpc3RbcGFyYTJdLmludmVydChkLCBwb3MxLCBwb3MyKQotCSMKLQlkZWYgc2VhcmNoKHNlbGYsIHByb2cpOgotCQlpbXBvcnQgcmUsIHN0cmluZwotCQlpZiB0eXBlKHByb2cpIGlzIHR5cGUoJycpOgotCQkJcHJvZyA9IHJlLmNvbXBpbGUoc3RyaW5nLmxvd2VyKHByb2cpKQotCQlpZiBzZWxmLnNlbGVjdGlvbjoKLQkJCWlvbGQgPSBzZWxmLnNlbGVjdGlvblswXVswXQotCQllbHNlOgotCQkJaW9sZCA9IC0xCi0JCWhpdCA9IE5vbmUKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYucGFyYWxpc3QpKToKLQkJCWlmIGkgPT0gaW9sZCBvciBpIDwgaW9sZCBhbmQgaGl0OgotCQkJCWNvbnRpbnVlCi0JCQlwID0gc2VsZi5wYXJhbGlzdFtpXQotCQkJdGV4dCA9IHN0cmluZy5sb3dlcihwLmV4dHJhY3QoKSkKLQkJCW1hdGNoID0gcHJvZy5zZWFyY2godGV4dCkKLQkJCWlmIG1hdGNoOgotCQkJCWEsIGIgPSBtYXRjaC5ncm91cCgwKQotCQkJCWxvbmcxID0gaSwgYQotCQkJCWxvbmcyID0gaSwgYgotCQkJCWhpdCA9IGxvbmcxLCBsb25nMgotCQkJCWlmIGkgPiBpb2xkOgotCQkJCQlicmVhawotCQlpZiBoaXQ6Ci0JCQlzZWxmLnNldHNlbGVjdGlvbihoaXQpCi0JCQlpID0gaGl0WzBdWzBdCi0JCQlwID0gc2VsZi5wYXJhbGlzdFtpXQotCQkJc2VsZi53aW5kb3cuc2hvdygocC5sZWZ0LCBwLnRvcCksIChwLnJpZ2h0LCBwLmJvdHRvbSkpCi0JCQlyZXR1cm4gMQotCQllbHNlOgotCQkJcmV0dXJuIDAKLQkjCi0JZGVmIHNob3dhbmNob3Ioc2VsZiwgaWQpOgotCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5wYXJhbGlzdCkpOgotCQkJcCA9IHNlbGYucGFyYWxpc3RbaV0KLQkJCWlmIHAuaGFzYW5jaG9yKGlkKToKLQkJCQlsb25nMSA9IGksIDAKLQkJCQlsb25nMiA9IGksIGxlbihwLmV4dHJhY3QoKSkKLQkJCQloaXQgPSBsb25nMSwgbG9uZzIKLQkJCQlzZWxmLnNldHNlbGVjdGlvbihoaXQpCi0JCQkJc2VsZi53aW5kb3cuc2hvdygKLQkJCQkJKHAubGVmdCwgcC50b3ApLCAocC5yaWdodCwgcC5ib3R0b20pKQotCQkJCWJyZWFrCisgICAgIworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aW5kb3csIGRyYXdub3cpOgorICAgICAgICBzZWxmLndpbmRvdyA9IHdpbmRvdworICAgICAgICBzZWxmLmRyYXdub3cgPSBkcmF3bm93CisgICAgICAgIHNlbGYud2lkdGggPSB3aW5kb3cuZ2V0d2luc2l6ZSgpWzBdCisgICAgICAgIHNlbGYuc2VsZWN0aW9uID0gTm9uZQorICAgICAgICBzZWxmLmhlaWdodCA9IDAKKyAgICAgICAgd2luZG93LnNldG9yaWdpbigwLCAwKQorICAgICAgICB3aW5kb3cuc2V0ZG9jc2l6ZSgwLCAwKQorICAgICAgICBzZWxmLmQgPSB3aW5kb3cuYmVnaW5kcmF3aW5nKCkKKyAgICAgICAgU2F2aW5nQmFja0VuZC5fX2luaXRfXyhzZWxmKQorICAgICMKKyAgICBkZWYgZmluaXNoKHNlbGYpOgorICAgICAgICBzZWxmLmQuY2xvc2UoKQorICAgICAgICBzZWxmLmQgPSBOb25lCisgICAgICAgIHNlbGYud2luZG93LnNldGRvY3NpemUoMCwgc2VsZi5oZWlnaHQpCisgICAgIworICAgIGRlZiBhZGRwYXJhKHNlbGYsIHApOgorICAgICAgICBzZWxmLnBhcmFsaXN0LmFwcGVuZChwKQorICAgICAgICBpZiBzZWxmLmRyYXdub3c6CisgICAgICAgICAgICBzZWxmLmhlaWdodCA9IFwKKyAgICAgICAgICAgICAgICAgICAgcC5yZW5kZXIoc2VsZi5kLCAwLCBzZWxmLmhlaWdodCwgc2VsZi53aWR0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHAubGF5b3V0KHNlbGYud2lkdGgpCisgICAgICAgICAgICBwLmxlZnQgPSAwCisgICAgICAgICAgICBwLnRvcCA9IHNlbGYuaGVpZ2h0CisgICAgICAgICAgICBwLnJpZ2h0ID0gc2VsZi53aWR0aAorICAgICAgICAgICAgcC5ib3R0b20gPSBzZWxmLmhlaWdodCArIHAuaGVpZ2h0CisgICAgICAgICAgICBzZWxmLmhlaWdodCA9IHAuYm90dG9tCisgICAgIworICAgIGRlZiByZXNpemUoc2VsZik6CisgICAgICAgIHNlbGYud2luZG93LmNoYW5nZSgoMCwgMCksIChzZWxmLndpZHRoLCBzZWxmLmhlaWdodCkpCisgICAgICAgIHNlbGYud2lkdGggPSBzZWxmLndpbmRvdy5nZXR3aW5zaXplKClbMF0KKyAgICAgICAgc2VsZi5oZWlnaHQgPSAwCisgICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6CisgICAgICAgICAgICBwLmxheW91dChzZWxmLndpZHRoKQorICAgICAgICAgICAgcC5sZWZ0ID0gMAorICAgICAgICAgICAgcC50b3AgPSBzZWxmLmhlaWdodAorICAgICAgICAgICAgcC5yaWdodCA9IHNlbGYud2lkdGgKKyAgICAgICAgICAgIHAuYm90dG9tID0gc2VsZi5oZWlnaHQgKyBwLmhlaWdodAorICAgICAgICAgICAgc2VsZi5oZWlnaHQgPSBwLmJvdHRvbQorICAgICAgICBzZWxmLndpbmRvdy5jaGFuZ2UoKDAsIDApLCAoc2VsZi53aWR0aCwgc2VsZi5oZWlnaHQpKQorICAgICAgICBzZWxmLndpbmRvdy5zZXRkb2NzaXplKDAsIHNlbGYuaGVpZ2h0KQorICAgICMKKyAgICBkZWYgcmVkcmF3KHNlbGYsIGFyZWEpOgorICAgICAgICBkID0gc2VsZi53aW5kb3cuYmVnaW5kcmF3aW5nKCkKKyAgICAgICAgKGxlZnQsIHRvcCksIChyaWdodCwgYm90dG9tKSA9IGFyZWEKKyAgICAgICAgZC5lcmFzZShhcmVhKQorICAgICAgICBkLmNsaXByZWN0KGFyZWEpCisgICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6CisgICAgICAgICAgICBpZiB0b3AgPCBwLmJvdHRvbSBhbmQgcC50b3AgPCBib3R0b206CisgICAgICAgICAgICAgICAgdiA9IHAucmVuZGVyKGQsIHAubGVmdCwgcC50b3AsIHAucmlnaHQpCisgICAgICAgIGlmIHNlbGYuc2VsZWN0aW9uOgorICAgICAgICAgICAgc2VsZi5pbnZlcnQoZCwgc2VsZi5zZWxlY3Rpb24pCisgICAgICAgIGQuY2xvc2UoKQorICAgICMKKyAgICBkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIG5ldyk6CisgICAgICAgIGlmIG5ldzoKKyAgICAgICAgICAgIGxvbmcxLCBsb25nMiA9IG5ldworICAgICAgICAgICAgcG9zMSA9IGxvbmcxWzozXQorICAgICAgICAgICAgcG9zMiA9IGxvbmcyWzozXQorICAgICAgICAgICAgbmV3ID0gcG9zMSwgcG9zMgorICAgICAgICBpZiBuZXcgIT0gc2VsZi5zZWxlY3Rpb246CisgICAgICAgICAgICBkID0gc2VsZi53aW5kb3cuYmVnaW5kcmF3aW5nKCkKKyAgICAgICAgICAgIGlmIHNlbGYuc2VsZWN0aW9uOgorICAgICAgICAgICAgICAgIHNlbGYuaW52ZXJ0KGQsIHNlbGYuc2VsZWN0aW9uKQorICAgICAgICAgICAgaWYgbmV3OgorICAgICAgICAgICAgICAgIHNlbGYuaW52ZXJ0KGQsIG5ldykKKyAgICAgICAgICAgIGQuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5zZWxlY3Rpb24gPSBuZXcKKyAgICAjCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VsZWN0aW9uCisgICAgIworICAgIGRlZiBleHRyYWN0c2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnNlbGVjdGlvbjoKKyAgICAgICAgICAgIGEsIGIgPSBzZWxmLnNlbGVjdGlvbgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXh0cmFjdHBhcnQoYSwgYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgIworICAgIGRlZiBpbnZlcnQoc2VsZiwgZCwgcmVnaW9uKToKKyAgICAgICAgbG9uZzEsIGxvbmcyID0gcmVnaW9uCisgICAgICAgIGlmIGxvbmcxID4gbG9uZzI6IGxvbmcxLCBsb25nMiA9IGxvbmcyLCBsb25nMQorICAgICAgICBwYXJhMSwgcG9zMSA9IGxvbmcxCisgICAgICAgIHBhcmEyLCBwb3MyID0gbG9uZzIKKyAgICAgICAgd2hpbGUgcGFyYTEgPCBwYXJhMjoKKyAgICAgICAgICAgIHNlbGYucGFyYWxpc3RbcGFyYTFdLmludmVydChkLCBwb3MxLCBOb25lKQorICAgICAgICAgICAgcG9zMSA9IE5vbmUKKyAgICAgICAgICAgIHBhcmExID0gcGFyYTEgKyAxCisgICAgICAgIHNlbGYucGFyYWxpc3RbcGFyYTJdLmludmVydChkLCBwb3MxLCBwb3MyKQorICAgICMKKyAgICBkZWYgc2VhcmNoKHNlbGYsIHByb2cpOgorICAgICAgICBpbXBvcnQgcmUsIHN0cmluZworICAgICAgICBpZiB0eXBlKHByb2cpIGlzIHR5cGUoJycpOgorICAgICAgICAgICAgcHJvZyA9IHJlLmNvbXBpbGUoc3RyaW5nLmxvd2VyKHByb2cpKQorICAgICAgICBpZiBzZWxmLnNlbGVjdGlvbjoKKyAgICAgICAgICAgIGlvbGQgPSBzZWxmLnNlbGVjdGlvblswXVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW9sZCA9IC0xCisgICAgICAgIGhpdCA9IE5vbmUKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYucGFyYWxpc3QpKToKKyAgICAgICAgICAgIGlmIGkgPT0gaW9sZCBvciBpIDwgaW9sZCBhbmQgaGl0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBwID0gc2VsZi5wYXJhbGlzdFtpXQorICAgICAgICAgICAgdGV4dCA9IHN0cmluZy5sb3dlcihwLmV4dHJhY3QoKSkKKyAgICAgICAgICAgIG1hdGNoID0gcHJvZy5zZWFyY2godGV4dCkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIGEsIGIgPSBtYXRjaC5ncm91cCgwKQorICAgICAgICAgICAgICAgIGxvbmcxID0gaSwgYQorICAgICAgICAgICAgICAgIGxvbmcyID0gaSwgYgorICAgICAgICAgICAgICAgIGhpdCA9IGxvbmcxLCBsb25nMgorICAgICAgICAgICAgICAgIGlmIGkgPiBpb2xkOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBoaXQ6CisgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihoaXQpCisgICAgICAgICAgICBpID0gaGl0WzBdWzBdCisgICAgICAgICAgICBwID0gc2VsZi5wYXJhbGlzdFtpXQorICAgICAgICAgICAgc2VsZi53aW5kb3cuc2hvdygocC5sZWZ0LCBwLnRvcCksIChwLnJpZ2h0LCBwLmJvdHRvbSkpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAjCisgICAgZGVmIHNob3dhbmNob3Ioc2VsZiwgaWQpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5wYXJhbGlzdCkpOgorICAgICAgICAgICAgcCA9IHNlbGYucGFyYWxpc3RbaV0KKyAgICAgICAgICAgIGlmIHAuaGFzYW5jaG9yKGlkKToKKyAgICAgICAgICAgICAgICBsb25nMSA9IGksIDAKKyAgICAgICAgICAgICAgICBsb25nMiA9IGksIGxlbihwLmV4dHJhY3QoKSkKKyAgICAgICAgICAgICAgICBoaXQgPSBsb25nMSwgbG9uZzIKKyAgICAgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihoaXQpCisgICAgICAgICAgICAgICAgc2VsZi53aW5kb3cuc2hvdygKKyAgICAgICAgICAgICAgICAgICAgICAgIChwLmxlZnQsIHAudG9wKSwgKHAucmlnaHQsIHAuYm90dG9tKSkKKyAgICAgICAgICAgICAgICBicmVhawogCiAKICMgR0wgZXh0ZW5zaW9ucwogCiBjbGFzcyBHTEZvbnRDYWNoZToKLQkjCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlzZWxmLnJlc2V0KCkKLQkJc2VsZi5zZXRmb250KCcnKQotCSMKLQlkZWYgcmVzZXQoc2VsZik6Ci0JCXNlbGYuZm9udGtleSA9IE5vbmUKLQkJc2VsZi5mb250aGFuZGxlID0gTm9uZQotCQlzZWxmLmZvbnRpbmZvID0gTm9uZQotCQlzZWxmLmZvbnRjYWNoZSA9IHt9Ci0JIwotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5yZXNldCgpCi0JIwotCWRlZiBzZXRmb250KHNlbGYsIGZvbnRrZXkpOgotCQlpZiBmb250a2V5ID09ICcnOgotCQkJZm9udGtleSA9ICdUaW1lcy1Sb21hbiAxMicKLQkJZWxpZiAnICcgbm90IGluIGZvbnRrZXk6Ci0JCQlmb250a2V5ID0gZm9udGtleSArICcgMTInCi0JCWlmIGZvbnRrZXkgPT0gc2VsZi5mb250a2V5OgotCQkJcmV0dXJuCi0JCWlmIHNlbGYuZm9udGNhY2hlLmhhc19rZXkoZm9udGtleSk6Ci0JCQloYW5kbGUgPSBzZWxmLmZvbnRjYWNoZVtmb250a2V5XQotCQllbHNlOgotCQkJaW1wb3J0IHN0cmluZwotCQkJaSA9IHN0cmluZy5pbmRleChmb250a2V5LCAnICcpCi0JCQluYW1lLCBzaXplc3RyID0gZm9udGtleVs6aV0sIGZvbnRrZXlbaTpdCi0JCQlzaXplID0gZXZhbChzaXplc3RyKQotCQkJa2V5MSA9IG5hbWUgKyAnIDEnCi0JCQlrZXkgPSBuYW1lICsgJyAnICsgYHNpemVgCi0JCQkjIE5CIGtleSBtYXkgZGlmZmVyIGZyb20gZm9udGtleSEKLQkJCWlmIHNlbGYuZm9udGNhY2hlLmhhc19rZXkoa2V5KToKLQkJCQloYW5kbGUgPSBzZWxmLmZvbnRjYWNoZVtrZXldCi0JCQllbHNlOgotCQkJCWlmIHNlbGYuZm9udGNhY2hlLmhhc19rZXkoa2V5MSk6Ci0JCQkJCWhhbmRsZSA9IHNlbGYuZm9udGNhY2hlW2tleTFdCi0JCQkJZWxzZToKLQkJCQkJaW1wb3J0IGZtCi0JCQkJCWhhbmRsZSA9IGZtLmZpbmRmb250KG5hbWUpCi0JCQkJCXNlbGYuZm9udGNhY2hlW2tleTFdID0gaGFuZGxlCi0JCQkJaGFuZGxlID0gaGFuZGxlLnNjYWxlZm9udChzaXplKQotCQkJCXNlbGYuZm9udGNhY2hlW2ZvbnRrZXldID0gXAotCQkJCQlzZWxmLmZvbnRjYWNoZVtrZXldID0gaGFuZGxlCi0JCXNlbGYuZm9udGtleSA9IGZvbnRrZXkKLQkJaWYgc2VsZi5mb250aGFuZGxlICE9IGhhbmRsZToKLQkJCXNlbGYuZm9udGhhbmRsZSA9IGhhbmRsZQotCQkJc2VsZi5mb250aW5mbyA9IGhhbmRsZS5nZXRmb250aW5mbygpCi0JCQloYW5kbGUuc2V0Zm9udCgpCisgICAgIworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIHNlbGYuc2V0Zm9udCgnJykKKyAgICAjCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmZvbnRrZXkgPSBOb25lCisgICAgICAgIHNlbGYuZm9udGhhbmRsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5mb250aW5mbyA9IE5vbmUKKyAgICAgICAgc2VsZi5mb250Y2FjaGUgPSB7fQorICAgICMKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICMKKyAgICBkZWYgc2V0Zm9udChzZWxmLCBmb250a2V5KToKKyAgICAgICAgaWYgZm9udGtleSA9PSAnJzoKKyAgICAgICAgICAgIGZvbnRrZXkgPSAnVGltZXMtUm9tYW4gMTInCisgICAgICAgIGVsaWYgJyAnIG5vdCBpbiBmb250a2V5OgorICAgICAgICAgICAgZm9udGtleSA9IGZvbnRrZXkgKyAnIDEyJworICAgICAgICBpZiBmb250a2V5ID09IHNlbGYuZm9udGtleToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmZvbnRjYWNoZS5oYXNfa2V5KGZvbnRrZXkpOgorICAgICAgICAgICAgaGFuZGxlID0gc2VsZi5mb250Y2FjaGVbZm9udGtleV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGltcG9ydCBzdHJpbmcKKyAgICAgICAgICAgIGkgPSBzdHJpbmcuaW5kZXgoZm9udGtleSwgJyAnKQorICAgICAgICAgICAgbmFtZSwgc2l6ZXN0ciA9IGZvbnRrZXlbOmldLCBmb250a2V5W2k6XQorICAgICAgICAgICAgc2l6ZSA9IGV2YWwoc2l6ZXN0cikKKyAgICAgICAgICAgIGtleTEgPSBuYW1lICsgJyAxJworICAgICAgICAgICAga2V5ID0gbmFtZSArICcgJyArIGBzaXplYAorICAgICAgICAgICAgIyBOQiBrZXkgbWF5IGRpZmZlciBmcm9tIGZvbnRrZXkhCisgICAgICAgICAgICBpZiBzZWxmLmZvbnRjYWNoZS5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICAgICAgaGFuZGxlID0gc2VsZi5mb250Y2FjaGVba2V5XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZvbnRjYWNoZS5oYXNfa2V5KGtleTEpOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSBzZWxmLmZvbnRjYWNoZVtrZXkxXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBmbQorICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSBmbS5maW5kZm9udChuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZvbnRjYWNoZVtrZXkxXSA9IGhhbmRsZQorICAgICAgICAgICAgICAgIGhhbmRsZSA9IGhhbmRsZS5zY2FsZWZvbnQoc2l6ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmZvbnRjYWNoZVtmb250a2V5XSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9udGNhY2hlW2tleV0gPSBoYW5kbGUKKyAgICAgICAgc2VsZi5mb250a2V5ID0gZm9udGtleQorICAgICAgICBpZiBzZWxmLmZvbnRoYW5kbGUgIT0gaGFuZGxlOgorICAgICAgICAgICAgc2VsZi5mb250aGFuZGxlID0gaGFuZGxlCisgICAgICAgICAgICBzZWxmLmZvbnRpbmZvID0gaGFuZGxlLmdldGZvbnRpbmZvKCkKKyAgICAgICAgICAgIGhhbmRsZS5zZXRmb250KCkKIAogCiBjbGFzcyBHTE1lYXN1cmVyKEdMRm9udENhY2hlKToKLQkjCi0JZGVmIHRleHR3aWR0aChzZWxmLCB0ZXh0KToKLQkJcmV0dXJuIHNlbGYuZm9udGhhbmRsZS5nZXRzdHJ3aWR0aCh0ZXh0KQotCSMKLQlkZWYgYmFzZWxpbmUoc2VsZik6Ci0JCXJldHVybiBzZWxmLmZvbnRpbmZvWzZdIC0gc2VsZi5mb250aW5mb1szXQotCSMKLQlkZWYgbGluZWhlaWdodChzZWxmKToKLQkJcmV0dXJuIHNlbGYuZm9udGluZm9bNl0KKyAgICAjCisgICAgZGVmIHRleHR3aWR0aChzZWxmLCB0ZXh0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuZm9udGhhbmRsZS5nZXRzdHJ3aWR0aCh0ZXh0KQorICAgICMKKyAgICBkZWYgYmFzZWxpbmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmZvbnRpbmZvWzZdIC0gc2VsZi5mb250aW5mb1szXQorICAgICMKKyAgICBkZWYgbGluZWhlaWdodChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZm9udGluZm9bNl0KIAogCiBjbGFzcyBHTFdyaXRlcihHTEZvbnRDYWNoZSk6Ci0JIwotCSMgTk9URVM6Ci0JIyAoMSkgVXNlIGdsLm9ydGhvMiB0byB1c2UgWCBwaXhlbCBjb29yZGluYXRlcyEKLQkjCi0JZGVmIHRleHQoc2VsZiwgKGgsIHYpLCB0ZXh0KToKLQkJaW1wb3J0IGdsLCBmbQotCQlnbC5jbW92MmkoaCwgdiArIHNlbGYuZm9udGluZm9bNl0gLSBzZWxmLmZvbnRpbmZvWzNdKQotCQlmbS5wcnN0cih0ZXh0KQotCSMKLQlkZWYgc2V0Zm9udChzZWxmLCBmb250a2V5KToKLQkJb2xkaGFuZGxlID0gc2VsZi5mb250aGFuZGxlCi0JCUdMRm9udENhY2hlLnNldGZvbnQoZm9udGtleSkKLQkJaWYgc2VsZi5mb250aGFuZGxlICE9IG9sZGhhbmRsZToKLQkJCWhhbmRsZS5zZXRmb250KCkKKyAgICAjCisgICAgIyBOT1RFUzoKKyAgICAjICgxKSBVc2UgZ2wub3J0aG8yIHRvIHVzZSBYIHBpeGVsIGNvb3JkaW5hdGVzIQorICAgICMKKyAgICBkZWYgdGV4dChzZWxmLCAoaCwgdiksIHRleHQpOgorICAgICAgICBpbXBvcnQgZ2wsIGZtCisgICAgICAgIGdsLmNtb3YyaShoLCB2ICsgc2VsZi5mb250aW5mb1s2XSAtIHNlbGYuZm9udGluZm9bM10pCisgICAgICAgIGZtLnByc3RyKHRleHQpCisgICAgIworICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnRrZXkpOgorICAgICAgICBvbGRoYW5kbGUgPSBzZWxmLmZvbnRoYW5kbGUKKyAgICAgICAgR0xGb250Q2FjaGUuc2V0Zm9udChmb250a2V5KQorICAgICAgICBpZiBzZWxmLmZvbnRoYW5kbGUgIT0gb2xkaGFuZGxlOgorICAgICAgICAgICAgaGFuZGxlLnNldGZvbnQoKQogCiAKIGNsYXNzIEdMTWVhc3VyZXJXcml0ZXIoR0xNZWFzdXJlciwgR0xXcml0ZXIpOgotCXBhc3MKKyAgICBwYXNzCiAKIAogY2xhc3MgR0xCYWNrRW5kKFNhdmluZ0JhY2tFbmQpOgotCSMKLQlkZWYgX19pbml0X18oc2VsZiwgd2lkKToKLQkJaW1wb3J0IGdsCi0JCWdsLndpbnNldCh3aWQpCi0JCXNlbGYud2lkID0gd2lkCi0JCXNlbGYud2lkdGggPSBnbC5nZXRzaXplKClbMV0KLQkJc2VsZi5oZWlnaHQgPSAwCi0JCXNlbGYuZCA9IEdMTWVhc3VyZXJXcml0ZXIoKQotCQlTYXZpbmdCYWNrRW5kLl9faW5pdF9fKHNlbGYpCi0JIwotCWRlZiBmaW5pc2goc2VsZik6Ci0JCXBhc3MKLQkjCi0JZGVmIGFkZHBhcmEoc2VsZiwgcCk6Ci0JCXNlbGYucGFyYWxpc3QuYXBwZW5kKHApCi0JCXNlbGYuaGVpZ2h0ID0gcC5yZW5kZXIoc2VsZi5kLCAwLCBzZWxmLmhlaWdodCwgc2VsZi53aWR0aCkKLQkjCi0JZGVmIHJlZHJhdyhzZWxmKToKLQkJaW1wb3J0IGdsCi0JCWdsLndpbnNldChzZWxmLndpZCkKLQkJd2lkdGggPSBnbC5nZXRzaXplKClbMV0KLQkJaWYgd2lkdGggIT0gc2VsZi53aWR0aDoKLQkJCXNldGRvY3NpemUgPSAxCi0JCQlzZWxmLndpZHRoID0gd2lkdGgKLQkJCWZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0JCQkJcC50b3AgPSBwLmJvdHRvbSA9IE5vbmUKLQkJZCA9IHNlbGYuZAotCQl2ID0gMAotCQlmb3IgcCBpbiBzZWxmLnBhcmFsaXN0OgotCQkJdiA9IHAucmVuZGVyKGQsIDAsIHYsIHdpZHRoKQorICAgICMKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2lkKToKKyAgICAgICAgaW1wb3J0IGdsCisgICAgICAgIGdsLndpbnNldCh3aWQpCisgICAgICAgIHNlbGYud2lkID0gd2lkCisgICAgICAgIHNlbGYud2lkdGggPSBnbC5nZXRzaXplKClbMV0KKyAgICAgICAgc2VsZi5oZWlnaHQgPSAwCisgICAgICAgIHNlbGYuZCA9IEdMTWVhc3VyZXJXcml0ZXIoKQorICAgICAgICBTYXZpbmdCYWNrRW5kLl9faW5pdF9fKHNlbGYpCisgICAgIworICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHBhc3MKKyAgICAjCisgICAgZGVmIGFkZHBhcmEoc2VsZiwgcCk6CisgICAgICAgIHNlbGYucGFyYWxpc3QuYXBwZW5kKHApCisgICAgICAgIHNlbGYuaGVpZ2h0ID0gcC5yZW5kZXIoc2VsZi5kLCAwLCBzZWxmLmhlaWdodCwgc2VsZi53aWR0aCkKKyAgICAjCisgICAgZGVmIHJlZHJhdyhzZWxmKToKKyAgICAgICAgaW1wb3J0IGdsCisgICAgICAgIGdsLndpbnNldChzZWxmLndpZCkKKyAgICAgICAgd2lkdGggPSBnbC5nZXRzaXplKClbMV0KKyAgICAgICAgaWYgd2lkdGggIT0gc2VsZi53aWR0aDoKKyAgICAgICAgICAgIHNldGRvY3NpemUgPSAxCisgICAgICAgICAgICBzZWxmLndpZHRoID0gd2lkdGgKKyAgICAgICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6CisgICAgICAgICAgICAgICAgcC50b3AgPSBwLmJvdHRvbSA9IE5vbmUKKyAgICAgICAgZCA9IHNlbGYuZAorICAgICAgICB2ID0gMAorICAgICAgICBmb3IgcCBpbiBzZWxmLnBhcmFsaXN0OgorICAgICAgICAgICAgdiA9IHAucmVuZGVyKGQsIDAsIHYsIHdpZHRoKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvZ3JlcC5weSBiL0xpYi9saWItb2xkL2dyZXAucHkKaW5kZXggYmRlZmJlNi4uMjkyNjc0NiAxMDA2NDQKLS0tIGEvTGliL2xpYi1vbGQvZ3JlcC5weQorKysgYi9MaWIvbGliLW9sZC9ncmVwLnB5CkBAIC04LDcyICs4LDcyIEBACiBvcHRfc2hvd19saW5lbm8gPSAxCiAKIGRlZiBncmVwKHBhdCwgKmZpbGVzKToKLQlyZXR1cm4gZ2dyZXAoUkVfU1lOVEFYX0dSRVAsIHBhdCwgZmlsZXMpCisgICAgcmV0dXJuIGdncmVwKFJFX1NZTlRBWF9HUkVQLCBwYXQsIGZpbGVzKQogCiBkZWYgZWdyZXAocGF0LCAqZmlsZXMpOgotCXJldHVybiBnZ3JlcChSRV9TWU5UQVhfRUdSRVAsIHBhdCwgZmlsZXMpCisgICAgcmV0dXJuIGdncmVwKFJFX1NZTlRBWF9FR1JFUCwgcGF0LCBmaWxlcykKIAogZGVmIGVtZ3JlcChwYXQsICpmaWxlcyk6Ci0JcmV0dXJuIGdncmVwKFJFX1NZTlRBWF9FTUFDUywgcGF0LCBmaWxlcykKKyAgICByZXR1cm4gZ2dyZXAoUkVfU1lOVEFYX0VNQUNTLCBwYXQsIGZpbGVzKQogCiBkZWYgZ2dyZXAoc3ludGF4LCBwYXQsIGZpbGVzKToKLQlpZiBsZW4oZmlsZXMpID09IDEgYW5kIHR5cGUoZmlsZXNbMF0pID09IHR5cGUoW10pOgotCQlmaWxlcyA9IGZpbGVzWzBdCi0JZ2xvYmFsIG9wdF9zaG93X2ZpbGVuYW1lCi0Jb3B0X3Nob3dfZmlsZW5hbWUgPSAobGVuKGZpbGVzKSAhPSAxKQotCXN5bnRheCA9IHJlZ2V4LnNldF9zeW50YXgoc3ludGF4KQotCXRyeToKLQkJcHJvZyA9IHJlZ2V4LmNvbXBpbGUocGF0KQotCWZpbmFsbHk6Ci0JCXN5bnRheCA9IHJlZ2V4LnNldF9zeW50YXgoc3ludGF4KQotCWZvciBmaWxlbmFtZSBpbiBmaWxlczoKLQkJZnAgPSBvcGVuKGZpbGVuYW1lLCAncicpCi0JCWxpbmVubyA9IDAKLQkJd2hpbGUgMToKLQkJCWxpbmUgPSBmcC5yZWFkbGluZSgpCi0JCQlpZiBub3QgbGluZTogYnJlYWsKLQkJCWxpbmVubyA9IGxpbmVubyArIDEKLQkJCWlmIHByb2cuc2VhcmNoKGxpbmUpID49IDA6Ci0JCQkJc2hvd2xpbmUoZmlsZW5hbWUsIGxpbmVubywgbGluZSwgcHJvZykKLQkJZnAuY2xvc2UoKQorICAgIGlmIGxlbihmaWxlcykgPT0gMSBhbmQgdHlwZShmaWxlc1swXSkgPT0gdHlwZShbXSk6CisgICAgICAgIGZpbGVzID0gZmlsZXNbMF0KKyAgICBnbG9iYWwgb3B0X3Nob3dfZmlsZW5hbWUKKyAgICBvcHRfc2hvd19maWxlbmFtZSA9IChsZW4oZmlsZXMpICE9IDEpCisgICAgc3ludGF4ID0gcmVnZXguc2V0X3N5bnRheChzeW50YXgpCisgICAgdHJ5OgorICAgICAgICBwcm9nID0gcmVnZXguY29tcGlsZShwYXQpCisgICAgZmluYWxseToKKyAgICAgICAgc3ludGF4ID0gcmVnZXguc2V0X3N5bnRheChzeW50YXgpCisgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgorICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICdyJykKKyAgICAgICAgbGluZW5vID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICAgICAgbGluZW5vID0gbGluZW5vICsgMQorICAgICAgICAgICAgaWYgcHJvZy5zZWFyY2gobGluZSkgPj0gMDoKKyAgICAgICAgICAgICAgICBzaG93bGluZShmaWxlbmFtZSwgbGluZW5vLCBsaW5lLCBwcm9nKQorICAgICAgICBmcC5jbG9zZSgpCiAKIGRlZiBwZ3JlcChwYXQsICpmaWxlcyk6Ci0JaWYgbGVuKGZpbGVzKSA9PSAxIGFuZCB0eXBlKGZpbGVzWzBdKSA9PSB0eXBlKFtdKToKLQkJZmlsZXMgPSBmaWxlc1swXQotCWdsb2JhbCBvcHRfc2hvd19maWxlbmFtZQotCW9wdF9zaG93X2ZpbGVuYW1lID0gKGxlbihmaWxlcykgIT0gMSkKLQlpbXBvcnQgcmUKLQlwcm9nID0gcmUuY29tcGlsZShwYXQpCi0JZm9yIGZpbGVuYW1lIGluIGZpbGVzOgotCQlmcCA9IG9wZW4oZmlsZW5hbWUsICdyJykKLQkJbGluZW5vID0gMAotCQl3aGlsZSAxOgotCQkJbGluZSA9IGZwLnJlYWRsaW5lKCkKLQkJCWlmIG5vdCBsaW5lOiBicmVhawotCQkJbGluZW5vID0gbGluZW5vICsgMQotCQkJaWYgcHJvZy5zZWFyY2gobGluZSk6Ci0JCQkJc2hvd2xpbmUoZmlsZW5hbWUsIGxpbmVubywgbGluZSwgcHJvZykKLQkJZnAuY2xvc2UoKQorICAgIGlmIGxlbihmaWxlcykgPT0gMSBhbmQgdHlwZShmaWxlc1swXSkgPT0gdHlwZShbXSk6CisgICAgICAgIGZpbGVzID0gZmlsZXNbMF0KKyAgICBnbG9iYWwgb3B0X3Nob3dfZmlsZW5hbWUKKyAgICBvcHRfc2hvd19maWxlbmFtZSA9IChsZW4oZmlsZXMpICE9IDEpCisgICAgaW1wb3J0IHJlCisgICAgcHJvZyA9IHJlLmNvbXBpbGUocGF0KQorICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlczoKKyAgICAgICAgZnAgPSBvcGVuKGZpbGVuYW1lLCAncicpCisgICAgICAgIGxpbmVubyA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgICAgIGlmIHByb2cuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgICAgIHNob3dsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIGxpbmUsIHByb2cpCisgICAgICAgIGZwLmNsb3NlKCkKIAogZGVmIHNob3dsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIGxpbmUsIHByb2cpOgotCWlmIGxpbmVbLTE6XSA9PSAnXG4nOiBsaW5lID0gbGluZVs6LTFdCi0JaWYgb3B0X3Nob3dfbGluZW5vOgotCQlwcmVmaXggPSBgbGluZW5vYC5yanVzdCgzKSArICc6ICcKLQllbHNlOgotCQlwcmVmaXggPSAnJwotCWlmIG9wdF9zaG93X2ZpbGVuYW1lOgotCQlwcmVmaXggPSBmaWxlbmFtZSArICc6ICcgKyBwcmVmaXgKLQlwcmludCBwcmVmaXggKyBsaW5lCi0JaWYgb3B0X3Nob3dfd2hlcmU6Ci0JCXN0YXJ0LCBlbmQgPSBwcm9nLnJlZ3MoKVswXQotCQlsaW5lID0gbGluZVs6c3RhcnRdCi0JCWlmICdcdCcgbm90IGluIGxpbmU6Ci0JCQlwcmVmaXggPSAnICcgKiAobGVuKHByZWZpeCkgKyBzdGFydCkKLQkJZWxzZToKLQkJCXByZWZpeCA9ICcgJyAqIGxlbihwcmVmaXgpCi0JCQlmb3IgYyBpbiBsaW5lOgotCQkJCWlmIGMgIT0gJ1x0JzogYyA9ICcgJwotCQkJCXByZWZpeCA9IHByZWZpeCArIGMKLQkJaWYgc3RhcnQgPT0gZW5kOiBwcmVmaXggPSBwcmVmaXggKyAnXFwnCi0JCWVsc2U6IHByZWZpeCA9IHByZWZpeCArICdeJyooZW5kLXN0YXJ0KQotCQlwcmludCBwcmVmaXgKKyAgICBpZiBsaW5lWy0xOl0gPT0gJ1xuJzogbGluZSA9IGxpbmVbOi0xXQorICAgIGlmIG9wdF9zaG93X2xpbmVubzoKKyAgICAgICAgcHJlZml4ID0gYGxpbmVub2Aucmp1c3QoMykgKyAnOiAnCisgICAgZWxzZToKKyAgICAgICAgcHJlZml4ID0gJycKKyAgICBpZiBvcHRfc2hvd19maWxlbmFtZToKKyAgICAgICAgcHJlZml4ID0gZmlsZW5hbWUgKyAnOiAnICsgcHJlZml4CisgICAgcHJpbnQgcHJlZml4ICsgbGluZQorICAgIGlmIG9wdF9zaG93X3doZXJlOgorICAgICAgICBzdGFydCwgZW5kID0gcHJvZy5yZWdzKClbMF0KKyAgICAgICAgbGluZSA9IGxpbmVbOnN0YXJ0XQorICAgICAgICBpZiAnXHQnIG5vdCBpbiBsaW5lOgorICAgICAgICAgICAgcHJlZml4ID0gJyAnICogKGxlbihwcmVmaXgpICsgc3RhcnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmVmaXggPSAnICcgKiBsZW4ocHJlZml4KQorICAgICAgICAgICAgZm9yIGMgaW4gbGluZToKKyAgICAgICAgICAgICAgICBpZiBjICE9ICdcdCc6IGMgPSAnICcKKyAgICAgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXggKyBjCisgICAgICAgIGlmIHN0YXJ0ID09IGVuZDogcHJlZml4ID0gcHJlZml4ICsgJ1xcJworICAgICAgICBlbHNlOiBwcmVmaXggPSBwcmVmaXggKyAnXicqKGVuZC1zdGFydCkKKyAgICAgICAgcHJpbnQgcHJlZml4CmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9sb2NrZmlsZS5weSBiL0xpYi9saWItb2xkL2xvY2tmaWxlLnB5CmluZGV4IDNhYWVhYzAuLmNkZTliNDggMTAwNjQ0Ci0tLSBhL0xpYi9saWItb2xkL2xvY2tmaWxlLnB5CisrKyBiL0xpYi9saWItb2xkL2xvY2tmaWxlLnB5CkBAIC0xLDE1ICsxLDE1IEBACiBpbXBvcnQgc3RydWN0LCBmY250bAogCiBkZWYgd3JpdGVsb2NrKGYpOgotCV9sb2NrKGYsIGZjbnRsLkZfV1JMQ0spCisgICAgX2xvY2soZiwgZmNudGwuRl9XUkxDSykKIAogZGVmIHJlYWRsb2NrKGYpOgotCV9sb2NrKGYsIGZjbnRsLkZfUkRMQ0spCisgICAgX2xvY2soZiwgZmNudGwuRl9SRExDSykKIAogZGVmIHVubG9jayhmKToKLQlfbG9jayhmLCBmY250bC5GX1VOTENLKQorICAgIF9sb2NrKGYsIGZjbnRsLkZfVU5MQ0spCiAKIGRlZiBfbG9jayhmLCBvcCk6Ci0JZHVtbXkgPSBmY250bC5mY250bChmLmZpbGVubygpLCBmY250bC5GX1NFVExLVywKLQkJCSAgICBzdHJ1Y3QucGFjaygnMmg4bCcsIG9wLAotCQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICBkdW1teSA9IGZjbnRsLmZjbnRsKGYuZmlsZW5vKCksIGZjbnRsLkZfU0VUTEtXLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LnBhY2soJzJoOGwnLCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvbmV3ZGlyLnB5IGIvTGliL2xpYi1vbGQvbmV3ZGlyLnB5CmluZGV4IDkzN2M0OWUuLjM1NmJlY2MgMTAwNjQ0Ci0tLSBhL0xpYi9saWItb2xkL25ld2Rpci5weQorKysgYi9MaWIvbGliLW9sZC9uZXdkaXIucHkKQEAgLTUsNjkgKzUsNjkgQEAKICMgdGhlIGN1cnJlbnQgbG9jYWwgbmFtZSBzcGFjZSBieSBkZWZhdWx0CiAKIGRlZiBsaXN0YXR0cnMoeCk6Ci0JdHJ5OgotCQlkaWN0a2V5cyA9IHguX19kaWN0X18ua2V5cygpCi0JZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKLQkJZGljdGtleXMgPSBbXQotCSMKLQl0cnk6Ci0JCW1ldGhvZHMgPSB4Ll9fbWV0aG9kc19fCi0JZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKLQkJbWV0aG9kcyA9IFtdCi0JIwotCXRyeToKLQkJbWVtYmVycyA9IHguX19tZW1iZXJzX18KLQlleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgotCQltZW1iZXJzID0gW10KLQkjCi0JdHJ5OgotCQl0aGVfY2xhc3MgPSB4Ll9fY2xhc3NfXwotCWV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6Ci0JCXRoZV9jbGFzcyA9IE5vbmUKLQkjCi0JdHJ5OgotCQliYXNlcyA9IHguX19iYXNlc19fCi0JZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKLQkJYmFzZXMgPSAoKQotCSMKLQl0b3RhbCA9IGRpY3RrZXlzICsgbWV0aG9kcyArIG1lbWJlcnMKLQlpZiB0aGVfY2xhc3M6Ci0JCSMgSXQncyBhIGNsYXNzIGluc3RhY2U7IGFkZCB0aGUgY2xhc3MncyBhdHRyaWJ1dGVzCi0JCSMgdGhhdCBhcmUgZnVuY3Rpb25zIChtZXRob2RzKS4uLgotCQljbGFzc19hdHRycyA9IGxpc3RhdHRycyh0aGVfY2xhc3MpCi0JCWNsYXNzX21ldGhvZHMgPSBbXQotCQlmb3IgbmFtZSBpbiBjbGFzc19hdHRyczoKLQkJCWlmIGlzX2Z1bmN0aW9uKGdldGF0dHIodGhlX2NsYXNzLCBuYW1lKSk6Ci0JCQkJY2xhc3NfbWV0aG9kcy5hcHBlbmQobmFtZSkKLQkJdG90YWwgPSB0b3RhbCArIGNsYXNzX21ldGhvZHMKLQllbGlmIGJhc2VzOgotCQkjIEl0J3MgYSBkZXJpdmVkIGNsYXNzOyBhZGQgdGhlIGJhc2UgY2xhc3MgYXR0cmlidXRlcwotCQlmb3IgYmFzZSBpbiBiYXNlczoKLQkJCWJhc2VfYXR0cnMgPSBsaXN0YXR0cnMoYmFzZSkKLQkJCXRvdGFsID0gdG90YWwgKyBiYXNlX2F0dHJzCi0JdG90YWwuc29ydCgpCi0JcmV0dXJuIHRvdGFsCi0JaSA9IDAKLQl3aGlsZSBpKzEgPCBsZW4odG90YWwpOgotCQlpZiB0b3RhbFtpXSA9PSB0b3RhbFtpKzFdOgotCQkJZGVsIHRvdGFsW2krMV0KLQkJZWxzZToKLQkJCWkgPSBpKzEKLQlyZXR1cm4gdG90YWwKKyAgICB0cnk6CisgICAgICAgIGRpY3RrZXlzID0geC5fX2RpY3RfXy5rZXlzKCkKKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICBkaWN0a2V5cyA9IFtdCisgICAgIworICAgIHRyeToKKyAgICAgICAgbWV0aG9kcyA9IHguX19tZXRob2RzX18KKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICBtZXRob2RzID0gW10KKyAgICAjCisgICAgdHJ5OgorICAgICAgICBtZW1iZXJzID0geC5fX21lbWJlcnNfXworICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgIG1lbWJlcnMgPSBbXQorICAgICMKKyAgICB0cnk6CisgICAgICAgIHRoZV9jbGFzcyA9IHguX19jbGFzc19fCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgdGhlX2NsYXNzID0gTm9uZQorICAgICMKKyAgICB0cnk6CisgICAgICAgIGJhc2VzID0geC5fX2Jhc2VzX18KKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICBiYXNlcyA9ICgpCisgICAgIworICAgIHRvdGFsID0gZGljdGtleXMgKyBtZXRob2RzICsgbWVtYmVycworICAgIGlmIHRoZV9jbGFzczoKKyAgICAgICAgIyBJdCdzIGEgY2xhc3MgaW5zdGFjZTsgYWRkIHRoZSBjbGFzcydzIGF0dHJpYnV0ZXMKKyAgICAgICAgIyB0aGF0IGFyZSBmdW5jdGlvbnMgKG1ldGhvZHMpLi4uCisgICAgICAgIGNsYXNzX2F0dHJzID0gbGlzdGF0dHJzKHRoZV9jbGFzcykKKyAgICAgICAgY2xhc3NfbWV0aG9kcyA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIGNsYXNzX2F0dHJzOgorICAgICAgICAgICAgaWYgaXNfZnVuY3Rpb24oZ2V0YXR0cih0aGVfY2xhc3MsIG5hbWUpKToKKyAgICAgICAgICAgICAgICBjbGFzc19tZXRob2RzLmFwcGVuZChuYW1lKQorICAgICAgICB0b3RhbCA9IHRvdGFsICsgY2xhc3NfbWV0aG9kcworICAgIGVsaWYgYmFzZXM6CisgICAgICAgICMgSXQncyBhIGRlcml2ZWQgY2xhc3M7IGFkZCB0aGUgYmFzZSBjbGFzcyBhdHRyaWJ1dGVzCisgICAgICAgIGZvciBiYXNlIGluIGJhc2VzOgorICAgICAgICAgICAgYmFzZV9hdHRycyA9IGxpc3RhdHRycyhiYXNlKQorICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIGJhc2VfYXR0cnMKKyAgICB0b3RhbC5zb3J0KCkKKyAgICByZXR1cm4gdG90YWwKKyAgICBpID0gMAorICAgIHdoaWxlIGkrMSA8IGxlbih0b3RhbCk6CisgICAgICAgIGlmIHRvdGFsW2ldID09IHRvdGFsW2krMV06CisgICAgICAgICAgICBkZWwgdG90YWxbaSsxXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaSA9IGkrMQorICAgIHJldHVybiB0b3RhbAogCiAKICMgSGVscGVyIHRvIHJlY29nbml6ZSBmdW5jdGlvbnMKIAogZGVmIGlzX2Z1bmN0aW9uKHgpOgotCXJldHVybiB0eXBlKHgpID09IHR5cGUoaXNfZnVuY3Rpb24pCisgICAgcmV0dXJuIHR5cGUoeCkgPT0gdHlwZShpc19mdW5jdGlvbikKIAogCiAjIEFwcHJveGltYXRpb24gb2YgYnVpbHRpbiBkaXIoKTsgYnV0IG5vdGUgdGhhdCB0aGlzIGxpc3RzIHRoZSB1c2VyJ3MKICMgdmFyaWFibGVzIGJ5IGRlZmF1bHQsIG5vdCB0aGUgY3VycmVudCBsb2NhbCBuYW1lIHNwYWNlLgogCiBkZWYgZGlyKHggPSBOb25lKToKLQlpZiB4IGlzIG5vdCBOb25lOgotCQlyZXR1cm4gbGlzdGF0dHJzKHgpCi0JZWxzZToKLQkJaW1wb3J0IF9fbWFpbl9fCi0JCXJldHVybiBsaXN0YXR0cnMoX19tYWluX18pCisgICAgaWYgeCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIGxpc3RhdHRycyh4KQorICAgIGVsc2U6CisgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICByZXR1cm4gbGlzdGF0dHJzKF9fbWFpbl9fKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvcGFja21haWwucHkgYi9MaWIvbGliLW9sZC9wYWNrbWFpbC5weQppbmRleCA5YzJiNTY2Li5lNTY5MTA4IDEwMDY0NAotLS0gYS9MaWIvbGliLW9sZC9wYWNrbWFpbC5weQorKysgYi9MaWIvbGliLW9sZC9wYWNrbWFpbC5weQpAQCAtOCwxMDQgKzgsMTA0IEBACiAKICMgUHJpbnQgaGVscAogZGVmIGhlbHAoKToKLQlwcmludCAnQWxsIGZucyBoYXZlIGEgZmlsZSBvcGVuIGZvciB3cml0aW5nIGFzIGZpcnN0IHBhcmFtZXRlcicKLQlwcmludCAncGFjayhmLCBmdWxsbmFtZSwgbmFtZSk6IHBhY2sgZnVsbG5hbWUgYXMgbmFtZScKLQlwcmludCAncGFja3NvbWUoZiwgZGlyZWN0b3J5LCBuYW1lbGlzdCk6IHNlbGVjdGVkIGZpbGVzIGZyb20gZGlyZWN0b3J5JwotCXByaW50ICdwYWNrYWxsKGYsIGRpcmVjdG9yeSk6IHBhY2sgYWxsIGZpbGVzIGZyb20gZGlyZWN0b3J5JwotCXByaW50ICdwYWNrbm90b2xkZXIoZiwgZGlyZWN0b3J5LCBuYW1lKTogcGFjayBhbGwgZmlsZXMgZnJvbSBkaXJlY3RvcnknCi0JcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXJlIG5vdCBvbGRlciB0aGFuIGEgZmlsZSB0aGVyZScKLQlwcmludCAncGFja3RyZWUoZiwgZGlyZWN0b3J5KTogcGFjayBlbnRpcmUgZGlyZWN0b3J5IHRyZWUnCisgICAgcHJpbnQgJ0FsbCBmbnMgaGF2ZSBhIGZpbGUgb3BlbiBmb3Igd3JpdGluZyBhcyBmaXJzdCBwYXJhbWV0ZXInCisgICAgcHJpbnQgJ3BhY2soZiwgZnVsbG5hbWUsIG5hbWUpOiBwYWNrIGZ1bGxuYW1lIGFzIG5hbWUnCisgICAgcHJpbnQgJ3BhY2tzb21lKGYsIGRpcmVjdG9yeSwgbmFtZWxpc3QpOiBzZWxlY3RlZCBmaWxlcyBmcm9tIGRpcmVjdG9yeScKKyAgICBwcmludCAncGFja2FsbChmLCBkaXJlY3RvcnkpOiBwYWNrIGFsbCBmaWxlcyBmcm9tIGRpcmVjdG9yeScKKyAgICBwcmludCAncGFja25vdG9sZGVyKGYsIGRpcmVjdG9yeSwgbmFtZSk6IHBhY2sgYWxsIGZpbGVzIGZyb20gZGlyZWN0b3J5JworICAgIHByaW50ICcgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGFyZSBub3Qgb2xkZXIgdGhhbiBhIGZpbGUgdGhlcmUnCisgICAgcHJpbnQgJ3BhY2t0cmVlKGYsIGRpcmVjdG9yeSk6IHBhY2sgZW50aXJlIGRpcmVjdG9yeSB0cmVlJwogCiAjIFBhY2sgb25lIGZpbGUKIGRlZiBwYWNrKG91dGZwLCBmaWxlLCBuYW1lKToKLQlmcCA9IG9wZW4oZmlsZSwgJ3InKQotCW91dGZwLndyaXRlKCdlY2hvICcgKyBuYW1lICsgJ1xuJykKLQlvdXRmcC53cml0ZSgnc2VkICJzL15YLy8iID4iJyArIG5hbWUgKyAnIiA8PCIhIlxuJykKLQl3aGlsZSAxOgotCQlsaW5lID0gZnAucmVhZGxpbmUoKQotCQlpZiBub3QgbGluZTogYnJlYWsKLQkJaWYgbGluZVstMTpdICE9ICdcbic6Ci0JCQlsaW5lID0gbGluZSArICdcbicKLQkJb3V0ZnAud3JpdGUoJ1gnICsgbGluZSkKLQlvdXRmcC53cml0ZSgnIVxuJykKLQlmcC5jbG9zZSgpCisgICAgZnAgPSBvcGVuKGZpbGUsICdyJykKKyAgICBvdXRmcC53cml0ZSgnZWNobyAnICsgbmFtZSArICdcbicpCisgICAgb3V0ZnAud3JpdGUoJ3NlZCAicy9eWC8vIiA+IicgKyBuYW1lICsgJyIgPDwiISJcbicpCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgIGlmIGxpbmVbLTE6XSAhPSAnXG4nOgorICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAnXG4nCisgICAgICAgIG91dGZwLndyaXRlKCdYJyArIGxpbmUpCisgICAgb3V0ZnAud3JpdGUoJyFcbicpCisgICAgZnAuY2xvc2UoKQogCiAjIFBhY2sgc29tZSBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5CiBkZWYgcGFja3NvbWUob3V0ZnAsIGRpcm5hbWUsIG5hbWVzKToKLQlmb3IgbmFtZSBpbiBuYW1lczoKLQkJcHJpbnQgbmFtZQotCQlmaWxlID0gb3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpCi0JCXBhY2sob3V0ZnAsIGZpbGUsIG5hbWUpCisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIHByaW50IG5hbWUKKyAgICAgICAgZmlsZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKQorICAgICAgICBwYWNrKG91dGZwLCBmaWxlLCBuYW1lKQogCiAjIFBhY2sgYWxsIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkKIGRlZiBwYWNrYWxsKG91dGZwLCBkaXJuYW1lKToKLQluYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKLQl0cnk6Ci0JICAgIG5hbWVzLnJlbW92ZSgnLicpCi0JZXhjZXB0OgotCSAgICBwYXNzCi0JdHJ5OgotCSAgICBuYW1lcy5yZW1vdmUoJy4uJykKLQlleGNlcHQ6Ci0JICAgIHBhc3MKLQluYW1lcy5zb3J0KCkKLQlwYWNrc29tZShvdXRmcCwgZGlybmFtZSwgbmFtZXMpCisgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCisgICAgdHJ5OgorICAgICAgICBuYW1lcy5yZW1vdmUoJy4nKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworICAgIHRyeToKKyAgICAgICAgbmFtZXMucmVtb3ZlKCcuLicpCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisgICAgbmFtZXMuc29ydCgpCisgICAgcGFja3NvbWUob3V0ZnAsIGRpcm5hbWUsIG5hbWVzKQogCiAjIFBhY2sgYWxsIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkgdGhhdCBhcmUgbm90IG9sZGVyIHRoYW4gYSBnaXZlIG9uZQogZGVmIHBhY2tub3RvbGRlcihvdXRmcCwgZGlybmFtZSwgb2xkZXN0KToKLQluYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKLQl0cnk6Ci0JICAgIG5hbWVzLnJlbW92ZSgnLicpCi0JZXhjZXB0OgotCSAgICBwYXNzCi0JdHJ5OgotCSAgICBuYW1lcy5yZW1vdmUoJy4uJykKLQlleGNlcHQ6Ci0JICAgIHBhc3MKLQlvbGRlc3QgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgb2xkZXN0KQotCXN0ID0gb3Muc3RhdChvbGRlc3QpCi0JbXRpbWUgPSBzdFtTVF9NVElNRV0KLQl0b2RvID0gW10KLQlmb3IgbmFtZSBpbiBuYW1lczoKLQkJcHJpbnQgbmFtZSwgJy4uLicsCi0JCXN0ID0gb3Muc3RhdChvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkpCi0JCWlmIHN0W1NUX01USU1FXSA+PSBtdGltZToKLQkJCXByaW50ICdZZXMuJwotCQkJdG9kby5hcHBlbmQobmFtZSkKLQkJZWxzZToKLQkJCXByaW50ICdOby4nCi0JdG9kby5zb3J0KCkKLQlwYWNrc29tZShvdXRmcCwgZGlybmFtZSwgdG9kbykKKyAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKKyAgICB0cnk6CisgICAgICAgIG5hbWVzLnJlbW92ZSgnLicpCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgICBuYW1lcy5yZW1vdmUoJy4uJykKKyAgICBleGNlcHQ6CisgICAgICAgIHBhc3MKKyAgICBvbGRlc3QgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgb2xkZXN0KQorICAgIHN0ID0gb3Muc3RhdChvbGRlc3QpCisgICAgbXRpbWUgPSBzdFtTVF9NVElNRV0KKyAgICB0b2RvID0gW10KKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgcHJpbnQgbmFtZSwgJy4uLicsCisgICAgICAgIHN0ID0gb3Muc3RhdChvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkpCisgICAgICAgIGlmIHN0W1NUX01USU1FXSA+PSBtdGltZToKKyAgICAgICAgICAgIHByaW50ICdZZXMuJworICAgICAgICAgICAgdG9kby5hcHBlbmQobmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdOby4nCisgICAgdG9kby5zb3J0KCkKKyAgICBwYWNrc29tZShvdXRmcCwgZGlybmFtZSwgdG9kbykKIAogIyBQYWNrIGEgd2hvbGUgdHJlZSAobm8gZXhjZXB0aW9ucykKIGRlZiBwYWNrdHJlZShvdXRmcCwgZGlybmFtZSk6Ci0JcHJpbnQgJ3BhY2t0cmVlJywgZGlybmFtZQotCW91dGZwLndyaXRlKCdta2RpciAnICsgdW5peGZpeChkaXJuYW1lKSArICdcbicpCi0JbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCi0JdHJ5OgotCSAgICBuYW1lcy5yZW1vdmUoJy4nKQotCWV4Y2VwdDoKLQkgICAgcGFzcwotCXRyeToKLQkgICAgbmFtZXMucmVtb3ZlKCcuLicpCi0JZXhjZXB0OgotCSAgICBwYXNzCi0Jc3ViZGlycyA9IFtdCi0JZm9yIG5hbWUgaW4gbmFtZXM6Ci0JCWZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpCi0JCWlmIG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpOgotCQkJc3ViZGlycy5hcHBlbmQoZnVsbG5hbWUpCi0JCWVsc2U6Ci0JCQlwcmludCAncGFjaycsIGZ1bGxuYW1lCi0JCQlwYWNrKG91dGZwLCBmdWxsbmFtZSwgdW5peGZpeChmdWxsbmFtZSkpCi0JZm9yIHN1YmRpcm5hbWUgaW4gc3ViZGlyczoKLQkJcGFja3RyZWUob3V0ZnAsIHN1YmRpcm5hbWUpCisgICAgcHJpbnQgJ3BhY2t0cmVlJywgZGlybmFtZQorICAgIG91dGZwLndyaXRlKCdta2RpciAnICsgdW5peGZpeChkaXJuYW1lKSArICdcbicpCisgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCisgICAgdHJ5OgorICAgICAgICBuYW1lcy5yZW1vdmUoJy4nKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworICAgIHRyeToKKyAgICAgICAgbmFtZXMucmVtb3ZlKCcuLicpCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisgICAgc3ViZGlycyA9IFtdCisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpOgorICAgICAgICAgICAgc3ViZGlycy5hcHBlbmQoZnVsbG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAncGFjaycsIGZ1bGxuYW1lCisgICAgICAgICAgICBwYWNrKG91dGZwLCBmdWxsbmFtZSwgdW5peGZpeChmdWxsbmFtZSkpCisgICAgZm9yIHN1YmRpcm5hbWUgaW4gc3ViZGlyczoKKyAgICAgICAgcGFja3RyZWUob3V0ZnAsIHN1YmRpcm5hbWUpCiAKIGRlZiB1bml4Zml4KG5hbWUpOgotCWNvbXBzID0gbmFtZS5zcGxpdChvcy5zZXApCi0JcmVzID0gJycKLQlmb3IgY29tcCBpbiBjb21wczoKLQkJaWYgY29tcDoKLQkJCWlmIHJlczogcmVzID0gcmVzICsgJy8nCi0JCQlyZXMgPSByZXMgKyBjb21wCi0JcmV0dXJuIHJlcworICAgIGNvbXBzID0gbmFtZS5zcGxpdChvcy5zZXApCisgICAgcmVzID0gJycKKyAgICBmb3IgY29tcCBpbiBjb21wczoKKyAgICAgICAgaWYgY29tcDoKKyAgICAgICAgICAgIGlmIHJlczogcmVzID0gcmVzICsgJy8nCisgICAgICAgICAgICByZXMgPSByZXMgKyBjb21wCisgICAgcmV0dXJuIHJlcwpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvcG9seS5weSBiL0xpYi9saWItb2xkL3BvbHkucHkKaW5kZXggZjg5YmQxNC4uZmU2YTFkYyAxMDA2NDQKLS0tIGEvTGliL2xpYi1vbGQvcG9seS5weQorKysgYi9MaWIvbGliLW9sZC9wb2x5LnB5CkBAIC02LDQ3ICs2LDQ3IEBACiAjIHRha2VuIG91dCBieSBub3JtYWxpemUoKS4KIAogZGVmIG5vcm1hbGl6ZShwKTogIyBTdHJpcCB1bm5lY2Vzc2FyeSB6ZXJvIGNvZWZmaWNpZW50cwotCW4gPSBsZW4ocCkKLQl3aGlsZSBuOgotCQlpZiBwW24tMV06IHJldHVybiBwWzpuXQotCQluID0gbi0xCi0JcmV0dXJuIFtdCisgICAgbiA9IGxlbihwKQorICAgIHdoaWxlIG46CisgICAgICAgIGlmIHBbbi0xXTogcmV0dXJuIHBbOm5dCisgICAgICAgIG4gPSBuLTEKKyAgICByZXR1cm4gW10KIAogZGVmIHBsdXMoYSwgYik6Ci0JaWYgbGVuKGEpIDwgbGVuKGIpOiBhLCBiID0gYiwgYSAjIG1ha2Ugc3VyZSBhIGlzIHRoZSBsb25nZXN0Ci0JcmVzID0gYVs6XSAjIG1ha2UgYSBjb3B5Ci0JZm9yIGkgaW4gcmFuZ2UobGVuKGIpKToKLQkJcmVzW2ldID0gcmVzW2ldICsgYltpXQotCXJldHVybiBub3JtYWxpemUocmVzKQorICAgIGlmIGxlbihhKSA8IGxlbihiKTogYSwgYiA9IGIsIGEgIyBtYWtlIHN1cmUgYSBpcyB0aGUgbG9uZ2VzdAorICAgIHJlcyA9IGFbOl0gIyBtYWtlIGEgY29weQorICAgIGZvciBpIGluIHJhbmdlKGxlbihiKSk6CisgICAgICAgIHJlc1tpXSA9IHJlc1tpXSArIGJbaV0KKyAgICByZXR1cm4gbm9ybWFsaXplKHJlcykKIAogZGVmIG1pbnVzKGEsIGIpOgotCW5lZ19iID0gbWFwKGxhbWJkYSB4OiAteCwgYls6XSkKLQlyZXR1cm4gcGx1cyhhLCBuZWdfYikKKyAgICBuZWdfYiA9IG1hcChsYW1iZGEgeDogLXgsIGJbOl0pCisgICAgcmV0dXJuIHBsdXMoYSwgbmVnX2IpCiAKIGRlZiBvbmUocG93ZXIsIGNvZWZmKTogIyBSZXByZXNlbnRhdGlvbiBvZiBjb2VmZiAqIHgqKnBvd2VyCi0JcmVzID0gW10KLQlmb3IgaSBpbiByYW5nZShwb3dlcik6IHJlcy5hcHBlbmQoMCkKLQlyZXR1cm4gcmVzICsgW2NvZWZmXQorICAgIHJlcyA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UocG93ZXIpOiByZXMuYXBwZW5kKDApCisgICAgcmV0dXJuIHJlcyArIFtjb2VmZl0KIAogZGVmIHRpbWVzKGEsIGIpOgotCXJlcyA9IFtdCi0JZm9yIGkgaW4gcmFuZ2UobGVuKGEpKToKLQkJZm9yIGogaW4gcmFuZ2UobGVuKGIpKToKLQkJCXJlcyA9IHBsdXMocmVzLCBvbmUoaStqLCBhW2ldKmJbal0pKQotCXJldHVybiByZXMKKyAgICByZXMgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKGxlbihhKSk6CisgICAgICAgIGZvciBqIGluIHJhbmdlKGxlbihiKSk6CisgICAgICAgICAgICByZXMgPSBwbHVzKHJlcywgb25lKGkraiwgYVtpXSpiW2pdKSkKKyAgICByZXR1cm4gcmVzCiAKIGRlZiBwb3dlcihhLCBuKTogIyBSYWlzZSBwb2x5bm9taWFsIGEgdG8gdGhlIHBvc2l0aXZlIGludGVncmFsIHBvd2VyIG4KLQlpZiBuID09IDA6IHJldHVybiBbMV0KLQlpZiBuID09IDE6IHJldHVybiBhCi0JaWYgbi8yKjIgPT0gbjoKLQkJYiA9IHBvd2VyKGEsIG4vMikKLQkJcmV0dXJuIHRpbWVzKGIsIGIpCi0JcmV0dXJuIHRpbWVzKHBvd2VyKGEsIG4tMSksIGEpCisgICAgaWYgbiA9PSAwOiByZXR1cm4gWzFdCisgICAgaWYgbiA9PSAxOiByZXR1cm4gYQorICAgIGlmIG4vMioyID09IG46CisgICAgICAgIGIgPSBwb3dlcihhLCBuLzIpCisgICAgICAgIHJldHVybiB0aW1lcyhiLCBiKQorICAgIHJldHVybiB0aW1lcyhwb3dlcihhLCBuLTEpLCBhKQogCiBkZWYgZGVyKGEpOiAjIEZpcnN0IGRlcml2YXRpdmUKLQlyZXMgPSBhWzE6XQotCWZvciBpIGluIHJhbmdlKGxlbihyZXMpKToKLQkJcmVzW2ldID0gcmVzW2ldICogKGkrMSkKLQlyZXR1cm4gcmVzCisgICAgcmVzID0gYVsxOl0KKyAgICBmb3IgaSBpbiByYW5nZShsZW4ocmVzKSk6CisgICAgICAgIHJlc1tpXSA9IHJlc1tpXSAqIChpKzEpCisgICAgcmV0dXJuIHJlcwogCiAjIENvbXB1dGluZyBhIHByaW1pdGl2ZSBmdW5jdGlvbiB3b3VsZCByZXF1aXJlIHJhdGlvbmFsIGFyaXRobWV0aWMuLi4KZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL3JhbmQucHkgYi9MaWIvbGliLW9sZC9yYW5kLnB5CmluZGV4IGMyOTlkMGEuLmE1NTdiNjkgMTAwNjQ0Ci0tLSBhL0xpYi9saWItb2xkL3JhbmQucHkKKysrIGIvTGliL2xpYi1vbGQvcmFuZC5weQpAQCAtNCwxMCArNCwxMCBAQAogaW1wb3J0IHdocmFuZG9tCiAKIGRlZiBzcmFuZChzZWVkKToKLQl3aHJhbmRvbS5zZWVkKHNlZWQlMjU2LCBzZWVkLzI1NiUyNTYsIHNlZWQvNjU1MzYlMjU2KQorICAgIHdocmFuZG9tLnNlZWQoc2VlZCUyNTYsIHNlZWQvMjU2JTI1Niwgc2VlZC82NTUzNiUyNTYpCiAKIGRlZiByYW5kKCk6Ci0JcmV0dXJuIGludCh3aHJhbmRvbS5yYW5kb20oKSAqIDMyNzY4LjApICUgMzI3NjgKKyAgICByZXR1cm4gaW50KHdocmFuZG9tLnJhbmRvbSgpICogMzI3NjguMCkgJSAzMjc2OAogCiBkZWYgY2hvaWNlKHNlcSk6Ci0JcmV0dXJuIHNlcVtyYW5kKCkgJSBsZW4oc2VxKV0KKyAgICByZXR1cm4gc2VxW3JhbmQoKSAlIGxlbihzZXEpXQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvdGIucHkgYi9MaWIvbGliLW9sZC90Yi5weQppbmRleCA1Nzg1MWFhLi45MDYzNTU5IDEwMDY0NAotLS0gYS9MaWIvbGliLW9sZC90Yi5weQorKysgYi9MaWIvbGliLW9sZC90Yi5weQpAQCAtMTIsMTY2ICsxMiwxNjYgQEAKIGRlZiB0YigpOiBwcmludHRiKHN5cy5sYXN0X3RyYWNlYmFjaykKIAogZGVmIGJyb3dzZXIodGIpOgotCWlmIG5vdCB0YjoKLQkJcHJpbnQgJ05vIHRyYWNlYmFjay4nCi0JCXJldHVybgotCXRibGlzdCA9IFtdCi0Jd2hpbGUgdGI6Ci0JCXRibGlzdC5hcHBlbmQodGIpCi0JCXRiID0gdGIudGJfbmV4dAotCXB0ciA9IGxlbih0Ymxpc3QpLTEKLQl0YiA9IHRibGlzdFtwdHJdCi0Jd2hpbGUgMToKLQkJaWYgdGIgIT0gdGJsaXN0W3B0cl06Ci0JCQl0YiA9IHRibGlzdFtwdHJdCi0JCQlwcmludCBgcHRyYCArICc6JywKLQkJCXByaW50dGJoZWFkZXIodGIpCi0JCXRyeToKLQkJCWxpbmUgPSByYXdfaW5wdXQoJ1RCOiAnKQotCQlleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0JCQlwcmludCAnXG5bSW50ZXJydXB0ZWRdJwotCQkJYnJlYWsKLQkJZXhjZXB0IEVPRkVycm9yOgotCQkJcHJpbnQgJ1xuW0VPRl0nCi0JCQlicmVhawotCQljbWQgPSBsaW5lLnN0cmlwKCkKLQkJaWYgY21kOgotCQkJaWYgY21kID09ICdxdWl0JzoKLQkJCQlicmVhawotCQkJZWxpZiBjbWQgPT0gJ2xpc3QnOgotCQkJCWJyb3dzZXJsaXN0KHRiKQotCQkJZWxpZiBjbWQgPT0gJ3VwJzoKLQkJCQlpZiBwdHItMSA+PSAwOiBwdHIgPSBwdHItMQotCQkJCWVsc2U6IHByaW50ICdCb3R0b20gb2Ygc3RhY2suJwotCQkJZWxpZiBjbWQgPT0gJ2Rvd24nOgotCQkJCWlmIHB0cisxIDwgbGVuKHRibGlzdCk6IHB0ciA9IHB0cisxCi0JCQkJZWxzZTogcHJpbnQgJ1RvcCBvZiBzdGFjay4nCi0JCQllbGlmIGNtZCA9PSAnbG9jYWxzJzoKLQkJCQlwcmludHN5bWJvbHModGIudGJfZnJhbWUuZl9sb2NhbHMpCi0JCQllbGlmIGNtZCA9PSAnZ2xvYmFscyc6Ci0JCQkJcHJpbnRzeW1ib2xzKHRiLnRiX2ZyYW1lLmZfZ2xvYmFscykKLQkJCWVsaWYgY21kIGluICgnPycsICdoZWxwJyk6Ci0JCQkJYnJvd3NlcmhlbHAoKQotCQkJZWxzZToKLQkJCQlicm93c2VyZXhlYyh0YiwgY21kKQorICAgIGlmIG5vdCB0YjoKKyAgICAgICAgcHJpbnQgJ05vIHRyYWNlYmFjay4nCisgICAgICAgIHJldHVybgorICAgIHRibGlzdCA9IFtdCisgICAgd2hpbGUgdGI6CisgICAgICAgIHRibGlzdC5hcHBlbmQodGIpCisgICAgICAgIHRiID0gdGIudGJfbmV4dAorICAgIHB0ciA9IGxlbih0Ymxpc3QpLTEKKyAgICB0YiA9IHRibGlzdFtwdHJdCisgICAgd2hpbGUgMToKKyAgICAgICAgaWYgdGIgIT0gdGJsaXN0W3B0cl06CisgICAgICAgICAgICB0YiA9IHRibGlzdFtwdHJdCisgICAgICAgICAgICBwcmludCBgcHRyYCArICc6JywKKyAgICAgICAgICAgIHByaW50dGJoZWFkZXIodGIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmUgPSByYXdfaW5wdXQoJ1RCOiAnKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwcmludCAnXG5bSW50ZXJydXB0ZWRdJworICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcHJpbnQgJ1xuW0VPRl0nCisgICAgICAgICAgICBicmVhaworICAgICAgICBjbWQgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgaWYgY21kOgorICAgICAgICAgICAgaWYgY21kID09ICdxdWl0JzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ2xpc3QnOgorICAgICAgICAgICAgICAgIGJyb3dzZXJsaXN0KHRiKQorICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ3VwJzoKKyAgICAgICAgICAgICAgICBpZiBwdHItMSA+PSAwOiBwdHIgPSBwdHItMQorICAgICAgICAgICAgICAgIGVsc2U6IHByaW50ICdCb3R0b20gb2Ygc3RhY2suJworICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ2Rvd24nOgorICAgICAgICAgICAgICAgIGlmIHB0cisxIDwgbGVuKHRibGlzdCk6IHB0ciA9IHB0cisxCisgICAgICAgICAgICAgICAgZWxzZTogcHJpbnQgJ1RvcCBvZiBzdGFjay4nCisgICAgICAgICAgICBlbGlmIGNtZCA9PSAnbG9jYWxzJzoKKyAgICAgICAgICAgICAgICBwcmludHN5bWJvbHModGIudGJfZnJhbWUuZl9sb2NhbHMpCisgICAgICAgICAgICBlbGlmIGNtZCA9PSAnZ2xvYmFscyc6CisgICAgICAgICAgICAgICAgcHJpbnRzeW1ib2xzKHRiLnRiX2ZyYW1lLmZfZ2xvYmFscykKKyAgICAgICAgICAgIGVsaWYgY21kIGluICgnPycsICdoZWxwJyk6CisgICAgICAgICAgICAgICAgYnJvd3NlcmhlbHAoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicm93c2VyZXhlYyh0YiwgY21kKQogCiBkZWYgYnJvd3Nlcmxpc3QodGIpOgotCWZpbGVuYW1lID0gdGIudGJfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCi0JbGluZW5vID0gdGIudGJfbGluZW5vCi0JbGFzdCA9IGxpbmVubwotCWZpcnN0ID0gbWF4KDEsIGxhc3QtMTApCi0JZm9yIGkgaW4gcmFuZ2UoZmlyc3QsIGxhc3QrMSk6Ci0JCWlmIGkgPT0gbGluZW5vOiBwcmVmaXggPSAnKioqJyArIGBpYC5yanVzdCg0KSArICc6JwotCQllbHNlOiBwcmVmaXggPSBgaWAucmp1c3QoNykgKyAnOicKLQkJbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBpKQotCQlpZiBsaW5lWy0xOl0gPT0gJ1xuJzogbGluZSA9IGxpbmVbOi0xXQotCQlwcmludCBwcmVmaXggKyBsaW5lCisgICAgZmlsZW5hbWUgPSB0Yi50Yl9mcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICBsaW5lbm8gPSB0Yi50Yl9saW5lbm8KKyAgICBsYXN0ID0gbGluZW5vCisgICAgZmlyc3QgPSBtYXgoMSwgbGFzdC0xMCkKKyAgICBmb3IgaSBpbiByYW5nZShmaXJzdCwgbGFzdCsxKToKKyAgICAgICAgaWYgaSA9PSBsaW5lbm86IHByZWZpeCA9ICcqKionICsgYGlgLnJqdXN0KDQpICsgJzonCisgICAgICAgIGVsc2U6IHByZWZpeCA9IGBpYC5yanVzdCg3KSArICc6JworICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGkpCisgICAgICAgIGlmIGxpbmVbLTE6XSA9PSAnXG4nOiBsaW5lID0gbGluZVs6LTFdCisgICAgICAgIHByaW50IHByZWZpeCArIGxpbmUKIAogZGVmIGJyb3dzZXJleGVjKHRiLCBjbWQpOgotCWxvY2FscyA9IHRiLnRiX2ZyYW1lLmZfbG9jYWxzCi0JZ2xvYmFscyA9IHRiLnRiX2ZyYW1lLmZfZ2xvYmFscwotCXRyeToKLQkJZXhlYyBjbWQrJ1xuJyBpbiBnbG9iYWxzLCBsb2NhbHMKLQlleGNlcHQ6Ci0JCXQsIHYgPSBzeXMuZXhjX2luZm8oKVs6Ml0KLQkJcHJpbnQgJyoqKiBFeGNlcHRpb246JywKLQkJaWYgdHlwZSh0KSBpcyB0eXBlKCcnKToKLQkJCXByaW50IHQsCi0JCWVsc2U6Ci0JCQlwcmludCB0Ll9fbmFtZV9fLAotCQlpZiB2IGlzIG5vdCBOb25lOgotCQkJcHJpbnQgJzonLCB2LAotCQlwcmludAotCQlwcmludCAnVHlwZSBoZWxwIHRvIGdldCBoZWxwLicKKyAgICBsb2NhbHMgPSB0Yi50Yl9mcmFtZS5mX2xvY2FscworICAgIGdsb2JhbHMgPSB0Yi50Yl9mcmFtZS5mX2dsb2JhbHMKKyAgICB0cnk6CisgICAgICAgIGV4ZWMgY21kKydcbicgaW4gZ2xvYmFscywgbG9jYWxzCisgICAgZXhjZXB0OgorICAgICAgICB0LCB2ID0gc3lzLmV4Y19pbmZvKClbOjJdCisgICAgICAgIHByaW50ICcqKiogRXhjZXB0aW9uOicsCisgICAgICAgIGlmIHR5cGUodCkgaXMgdHlwZSgnJyk6CisgICAgICAgICAgICBwcmludCB0LAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgdC5fX25hbWVfXywKKyAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50ICc6JywgdiwKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgJ1R5cGUgaGVscCB0byBnZXQgaGVscC4nCiAKIGRlZiBicm93c2VyaGVscCgpOgotCXByaW50Ci0JcHJpbnQgJyAgICBUaGlzIGlzIHRoZSB0cmFjZWJhY2sgYnJvd3Nlci4gIENvbW1hbmRzIGFyZTonCi0JcHJpbnQgJyAgICAgICAgdXAgICAgICA6IG1vdmUgb25lIGxldmVsIHVwIGluIHRoZSBjYWxsIHN0YWNrJwotCXByaW50ICcgICAgICAgIGRvd24gICAgOiBtb3ZlIG9uZSBsZXZlbCBkb3duIGluIHRoZSBjYWxsIHN0YWNrJwotCXByaW50ICcgICAgICAgIGxvY2FscyAgOiBwcmludCBhbGwgbG9jYWwgdmFyaWFibGVzIGF0IHRoaXMgbGV2ZWwnCi0JcHJpbnQgJyAgICAgICAgZ2xvYmFscyA6IHByaW50IGFsbCBnbG9iYWwgdmFyaWFibGVzIGF0IHRoaXMgbGV2ZWwnCi0JcHJpbnQgJyAgICAgICAgbGlzdCAgICA6IGxpc3Qgc291cmNlIGNvZGUgYXJvdW5kIHRoZSBmYWlsdXJlJwotCXByaW50ICcgICAgICAgIGhlbHAgICAgOiBwcmludCBoZWxwICh3aGF0IHlvdSBhcmUgcmVhZGluZyBub3cpJwotCXByaW50ICcgICAgICAgIHF1aXQgICAgOiBiYWNrIHRvIGNvbW1hbmQgaW50ZXJwcmV0ZXInCi0JcHJpbnQgJyAgICBUeXBpbmcgYW55IG90aGVyIDEtbGluZSBzdGF0ZW1lbnQgd2lsbCBleGVjdXRlIGl0JwotCXByaW50ICcgICAgdXNpbmcgdGhlIGN1cnJlbnQgbGV2ZWxcJ3Mgc3ltYm9sIHRhYmxlcycKLQlwcmludAorICAgIHByaW50CisgICAgcHJpbnQgJyAgICBUaGlzIGlzIHRoZSB0cmFjZWJhY2sgYnJvd3Nlci4gIENvbW1hbmRzIGFyZTonCisgICAgcHJpbnQgJyAgICAgICAgdXAgICAgICA6IG1vdmUgb25lIGxldmVsIHVwIGluIHRoZSBjYWxsIHN0YWNrJworICAgIHByaW50ICcgICAgICAgIGRvd24gICAgOiBtb3ZlIG9uZSBsZXZlbCBkb3duIGluIHRoZSBjYWxsIHN0YWNrJworICAgIHByaW50ICcgICAgICAgIGxvY2FscyAgOiBwcmludCBhbGwgbG9jYWwgdmFyaWFibGVzIGF0IHRoaXMgbGV2ZWwnCisgICAgcHJpbnQgJyAgICAgICAgZ2xvYmFscyA6IHByaW50IGFsbCBnbG9iYWwgdmFyaWFibGVzIGF0IHRoaXMgbGV2ZWwnCisgICAgcHJpbnQgJyAgICAgICAgbGlzdCAgICA6IGxpc3Qgc291cmNlIGNvZGUgYXJvdW5kIHRoZSBmYWlsdXJlJworICAgIHByaW50ICcgICAgICAgIGhlbHAgICAgOiBwcmludCBoZWxwICh3aGF0IHlvdSBhcmUgcmVhZGluZyBub3cpJworICAgIHByaW50ICcgICAgICAgIHF1aXQgICAgOiBiYWNrIHRvIGNvbW1hbmQgaW50ZXJwcmV0ZXInCisgICAgcHJpbnQgJyAgICBUeXBpbmcgYW55IG90aGVyIDEtbGluZSBzdGF0ZW1lbnQgd2lsbCBleGVjdXRlIGl0JworICAgIHByaW50ICcgICAgdXNpbmcgdGhlIGN1cnJlbnQgbGV2ZWxcJ3Mgc3ltYm9sIHRhYmxlcycKKyAgICBwcmludAogCiBkZWYgcHJpbnR0Yih0Yik6Ci0Jd2hpbGUgdGI6Ci0JCXByaW50MXRiKHRiKQotCQl0YiA9IHRiLnRiX25leHQKKyAgICB3aGlsZSB0YjoKKyAgICAgICAgcHJpbnQxdGIodGIpCisgICAgICAgIHRiID0gdGIudGJfbmV4dAogCiBkZWYgcHJpbnQxdGIodGIpOgotCXByaW50dGJoZWFkZXIodGIpCi0JaWYgdGIudGJfZnJhbWUuZl9sb2NhbHMgaXMgbm90IHRiLnRiX2ZyYW1lLmZfZ2xvYmFsczoKLQkJcHJpbnRzeW1ib2xzKHRiLnRiX2ZyYW1lLmZfbG9jYWxzKQorICAgIHByaW50dGJoZWFkZXIodGIpCisgICAgaWYgdGIudGJfZnJhbWUuZl9sb2NhbHMgaXMgbm90IHRiLnRiX2ZyYW1lLmZfZ2xvYmFsczoKKyAgICAgICAgcHJpbnRzeW1ib2xzKHRiLnRiX2ZyYW1lLmZfbG9jYWxzKQogCiBkZWYgcHJpbnR0YmhlYWRlcih0Yik6Ci0JZmlsZW5hbWUgPSB0Yi50Yl9mcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKLQlsaW5lbm8gPSB0Yi50Yl9saW5lbm8KLQlpbmZvID0gJyInICsgZmlsZW5hbWUgKyAnIignICsgYGxpbmVub2AgKyAnKScKLQlsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKLQlpZiBsaW5lOgotCQlpbmZvID0gaW5mbyArICc6ICcgKyBsaW5lLnN0cmlwKCkKLQlwcmludCBpbmZvCisgICAgZmlsZW5hbWUgPSB0Yi50Yl9mcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICBsaW5lbm8gPSB0Yi50Yl9saW5lbm8KKyAgICBpbmZvID0gJyInICsgZmlsZW5hbWUgKyAnIignICsgYGxpbmVub2AgKyAnKScKKyAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICBpZiBsaW5lOgorICAgICAgICBpbmZvID0gaW5mbyArICc6ICcgKyBsaW5lLnN0cmlwKCkKKyAgICBwcmludCBpbmZvCiAKIGRlZiBwcmludHN5bWJvbHMoZCk6Ci0Ja2V5cyA9IGQua2V5cygpCi0Ja2V5cy5zb3J0KCkKLQlmb3IgbmFtZSBpbiBrZXlzOgotCQlwcmludCAnICAnICsgbmFtZS5sanVzdCgxMikgKyAnOicsCi0JCXByaW50b2JqZWN0KGRbbmFtZV0sIDQpCi0JCXByaW50CisgICAga2V5cyA9IGQua2V5cygpCisgICAga2V5cy5zb3J0KCkKKyAgICBmb3IgbmFtZSBpbiBrZXlzOgorICAgICAgICBwcmludCAnICAnICsgbmFtZS5sanVzdCgxMikgKyAnOicsCisgICAgICAgIHByaW50b2JqZWN0KGRbbmFtZV0sIDQpCisgICAgICAgIHByaW50CiAKIGRlZiBwcmludG9iamVjdCh2LCBtYXhsZXZlbCk6Ci0JaWYgdiBpcyBOb25lOgotCQlwcmludCAnTm9uZScsCi0JZWxpZiB0eXBlKHYpIGluICh0eXBlKDApLCB0eXBlKDAuMCkpOgotCQlwcmludCB2LAotCWVsaWYgdHlwZSh2KSBpcyB0eXBlKCcnKToKLQkJaWYgbGVuKHYpID4gMjA6Ci0JCQlwcmludCBgdls6MTddICsgJy4uLidgLAotCQllbHNlOgotCQkJcHJpbnQgYHZgLAotCWVsaWYgdHlwZSh2KSBpcyB0eXBlKCgpKToKLQkJcHJpbnQgJygnLAotCQlwcmludGxpc3QodiwgbWF4bGV2ZWwpCi0JCXByaW50ICcpJywKLQllbGlmIHR5cGUodikgaXMgdHlwZShbXSk6Ci0JCXByaW50ICdbJywKLQkJcHJpbnRsaXN0KHYsIG1heGxldmVsKQotCQlwcmludCAnXScsCi0JZWxpZiB0eXBlKHYpIGlzIHR5cGUoe30pOgotCQlwcmludCAneycsCi0JCXByaW50ZGljdCh2LCBtYXhsZXZlbCkKLQkJcHJpbnQgJ30nLAotCWVsc2U6Ci0JCXByaW50IHYsCisgICAgaWYgdiBpcyBOb25lOgorICAgICAgICBwcmludCAnTm9uZScsCisgICAgZWxpZiB0eXBlKHYpIGluICh0eXBlKDApLCB0eXBlKDAuMCkpOgorICAgICAgICBwcmludCB2LAorICAgIGVsaWYgdHlwZSh2KSBpcyB0eXBlKCcnKToKKyAgICAgICAgaWYgbGVuKHYpID4gMjA6CisgICAgICAgICAgICBwcmludCBgdls6MTddICsgJy4uLidgLAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgYHZgLAorICAgIGVsaWYgdHlwZSh2KSBpcyB0eXBlKCgpKToKKyAgICAgICAgcHJpbnQgJygnLAorICAgICAgICBwcmludGxpc3QodiwgbWF4bGV2ZWwpCisgICAgICAgIHByaW50ICcpJywKKyAgICBlbGlmIHR5cGUodikgaXMgdHlwZShbXSk6CisgICAgICAgIHByaW50ICdbJywKKyAgICAgICAgcHJpbnRsaXN0KHYsIG1heGxldmVsKQorICAgICAgICBwcmludCAnXScsCisgICAgZWxpZiB0eXBlKHYpIGlzIHR5cGUoe30pOgorICAgICAgICBwcmludCAneycsCisgICAgICAgIHByaW50ZGljdCh2LCBtYXhsZXZlbCkKKyAgICAgICAgcHJpbnQgJ30nLAorICAgIGVsc2U6CisgICAgICAgIHByaW50IHYsCiAKIGRlZiBwcmludGxpc3QodiwgbWF4bGV2ZWwpOgotCW4gPSBsZW4odikKLQlpZiBuID09IDA6IHJldHVybgotCWlmIG1heGxldmVsIDw9IDA6Ci0JCXByaW50ICcuLi4nLAotCQlyZXR1cm4KLQlmb3IgaSBpbiByYW5nZShtaW4oNiwgbikpOgotCQlwcmludG9iamVjdCh2W2ldLCBtYXhsZXZlbC0xKQotCQlpZiBpKzEgPCBuOiBwcmludCAnLCcsCi0JaWYgbiA+IDY6IHByaW50ICcuLi4nLAorICAgIG4gPSBsZW4odikKKyAgICBpZiBuID09IDA6IHJldHVybgorICAgIGlmIG1heGxldmVsIDw9IDA6CisgICAgICAgIHByaW50ICcuLi4nLAorICAgICAgICByZXR1cm4KKyAgICBmb3IgaSBpbiByYW5nZShtaW4oNiwgbikpOgorICAgICAgICBwcmludG9iamVjdCh2W2ldLCBtYXhsZXZlbC0xKQorICAgICAgICBpZiBpKzEgPCBuOiBwcmludCAnLCcsCisgICAgaWYgbiA+IDY6IHByaW50ICcuLi4nLAogCiBkZWYgcHJpbnRkaWN0KHYsIG1heGxldmVsKToKLQlrZXlzID0gdi5rZXlzKCkKLQluID0gbGVuKGtleXMpCi0JaWYgbiA9PSAwOiByZXR1cm4KLQlpZiBtYXhsZXZlbCA8PSAwOgotCQlwcmludCAnLi4uJywKLQkJcmV0dXJuCi0Ja2V5cy5zb3J0KCkKLQlmb3IgaSBpbiByYW5nZShtaW4oNiwgbikpOgotCQlrZXkgPSBrZXlzW2ldCi0JCXByaW50IGBrZXlgICsgJzonLAotCQlwcmludG9iamVjdCh2W2tleV0sIG1heGxldmVsLTEpCi0JCWlmIGkrMSA8IG46IHByaW50ICcsJywKLQlpZiBuID4gNjogcHJpbnQgJy4uLicsCisgICAga2V5cyA9IHYua2V5cygpCisgICAgbiA9IGxlbihrZXlzKQorICAgIGlmIG4gPT0gMDogcmV0dXJuCisgICAgaWYgbWF4bGV2ZWwgPD0gMDoKKyAgICAgICAgcHJpbnQgJy4uLicsCisgICAgICAgIHJldHVybgorICAgIGtleXMuc29ydCgpCisgICAgZm9yIGkgaW4gcmFuZ2UobWluKDYsIG4pKToKKyAgICAgICAga2V5ID0ga2V5c1tpXQorICAgICAgICBwcmludCBga2V5YCArICc6JywKKyAgICAgICAgcHJpbnRvYmplY3QodltrZXldLCBtYXhsZXZlbC0xKQorICAgICAgICBpZiBpKzEgPCBuOiBwcmludCAnLCcsCisgICAgaWYgbiA+IDY6IHByaW50ICcuLi4nLApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvdXRpbC5weSBiL0xpYi9saWItb2xkL3V0aWwucHkKaW5kZXggNmNiMTQzMy4uMTA0YWYxZSAxMDA2NDQKLS0tIGEvTGliL2xpYi1vbGQvdXRpbC5weQorKysgYi9MaWIvbGliLW9sZC91dGlsLnB5CkBAIC0xMCwxNiArMTAsMTYgQEAKICMgSWYgaXQgb2NjdXJzIG1vcmUgdGhhbiBvbmNlLCByZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2UuCiAjCiBkZWYgcmVtb3ZlKGl0ZW0sIGxpc3QpOgotCWlmIGl0ZW0gaW4gbGlzdDogbGlzdC5yZW1vdmUoaXRlbSkKKyAgICBpZiBpdGVtIGluIGxpc3Q6IGxpc3QucmVtb3ZlKGl0ZW0pCiAKIAogIyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhIGZpbGUncyBjb250ZW50cy4KICMKIGRlZiByZWFkZmlsZShmbik6Ci0JcmV0dXJuIHJlYWRvcGVuZmlsZShvcGVuKGZuLCAncicpKQorICAgIHJldHVybiByZWFkb3BlbmZpbGUob3BlbihmbiwgJ3InKSkKIAogCiAjIFJlYWQgYW4gb3BlbiBmaWxlIHVudGlsIEVPRi4KICMKIGRlZiByZWFkb3BlbmZpbGUoZnApOgotCXJldHVybiBmcC5yZWFkKCkKKyAgICByZXR1cm4gZnAucmVhZCgpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC96bW9kLnB5IGIvTGliL2xpYi1vbGQvem1vZC5weQppbmRleCA3MjU5YmY4Li41NWY0OWRmIDEwMDY0NAotLS0gYS9MaWIvbGliLW9sZC96bW9kLnB5CisrKyBiL0xpYi9saWItb2xkL3ptb2QucHkKQEAgLTEsNyArMSw3IEBACiAjIG1vZHVsZSAnem1vZCcKIAogIyBDb21wdXRlIHByb3BlcnRpZXMgb2YgbWF0aGVtYXRpY2FsICJmaWVsZHMiIGZvcm1lZCBieSB0YWtpbmcKLSMgWi9uICh0aGUgd2hvbGUgbnVtYmVycyBtb2R1bG8gc29tZSB3aG9sZSBudW1iZXIgbikgYW5kIGFuIAorIyBaL24gKHRoZSB3aG9sZSBudW1iZXJzIG1vZHVsbyBzb21lIHdob2xlIG51bWJlciBuKSBhbmQgYW4KICMgaXJyZWR1Y2libGUgcG9seW5vbWlhbCAoaS5lLiwgYSBwb2x5bm9taWFsIHdpdGggb25seSBjb21wbGV4IHplcm9zKSwKICMgZS5nLiwgWi81IGFuZCBYKioyICsgMi4KICMKQEAgLTMwLDY1ICszMCw2NSBAQAogIyBSZXR1cm4geCBtb2R1bG8geS4gIFJldHVybnMgPj0gMCBldmVuIGlmIHggPCAwLgogCiBkZWYgbW9kKHgsIHkpOgotCXJldHVybiBkaXZtb2QoeCwgeSlbMV0KKyAgICByZXR1cm4gZGl2bW9kKHgsIHkpWzFdCiAKIAogIyBOb3JtYWxpemUgYSBwb2x5bm9taWFsIG1vZHVsbyBuIGFuZCBtb2R1bG8gcC4KIAogZGVmIG5vcm0oYSwgbiwgcCk6Ci0JYSA9IHBvbHkubW9kdWxvKGEsIHApCi0JYSA9IGFbOl0KLQlmb3IgaSBpbiByYW5nZShsZW4oYSkpOiBhW2ldID0gbW9kKGFbaV0sIG4pCi0JYSA9IHBvbHkubm9ybWFsaXplKGEpCi0JcmV0dXJuIGEKKyAgICBhID0gcG9seS5tb2R1bG8oYSwgcCkKKyAgICBhID0gYVs6XQorICAgIGZvciBpIGluIHJhbmdlKGxlbihhKSk6IGFbaV0gPSBtb2QoYVtpXSwgbikKKyAgICBhID0gcG9seS5ub3JtYWxpemUoYSkKKyAgICByZXR1cm4gYQogCiAKICMgTWFrZSBhIGxpc3Qgb2YgYWxsIG5eZCBlbGVtZW50cyBvZiB0aGUgcHJvcG9zZWQgZmllbGQuCiAKIGRlZiBtYWtlX2FsbChtYXQpOgotCWFsbCA9IFtdCi0JZm9yIHJvdyBpbiBtYXQ6Ci0JCWZvciBhIGluIHJvdzoKLQkJCWFsbC5hcHBlbmQoYSkKLQlyZXR1cm4gYWxsCisgICAgYWxsID0gW10KKyAgICBmb3Igcm93IGluIG1hdDoKKyAgICAgICAgZm9yIGEgaW4gcm93OgorICAgICAgICAgICAgYWxsLmFwcGVuZChhKQorICAgIHJldHVybiBhbGwKIAogZGVmIG1ha2VfZWxlbWVudHMobiwgZCk6Ci0JaWYgZCA9PSAwOiByZXR1cm4gW3BvbHkub25lKDAsIDApXQotCXN1YiA9IG1ha2VfZWxlbWVudHMobiwgZC0xKQotCWFsbCA9IFtdCi0JZm9yIGEgaW4gc3ViOgotCQlmb3IgaSBpbiByYW5nZShuKToKLQkJCWFsbC5hcHBlbmQocG9seS5wbHVzKGEsIHBvbHkub25lKGQtMSwgaSkpKQotCXJldHVybiBhbGwKKyAgICBpZiBkID09IDA6IHJldHVybiBbcG9seS5vbmUoMCwgMCldCisgICAgc3ViID0gbWFrZV9lbGVtZW50cyhuLCBkLTEpCisgICAgYWxsID0gW10KKyAgICBmb3IgYSBpbiBzdWI6CisgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgYWxsLmFwcGVuZChwb2x5LnBsdXMoYSwgcG9seS5vbmUoZC0xLCBpKSkpCisgICAgcmV0dXJuIGFsbAogCiBkZWYgbWFrZV9pbnYoYWxsLCBuLCBwKToKLQl4ID0gcG9seS5vbmUoMSwgMSkKLQlpbnYgPSBbXQotCWZvciBhIGluIGFsbDoKLQkJaW52LmFwcGVuZChub3JtKHBvbHkudGltZXMoYSwgeCksIG4sIHApKQotCXJldHVybiBpbnYKKyAgICB4ID0gcG9seS5vbmUoMSwgMSkKKyAgICBpbnYgPSBbXQorICAgIGZvciBhIGluIGFsbDoKKyAgICAgICAgaW52LmFwcGVuZChub3JtKHBvbHkudGltZXMoYSwgeCksIG4sIHApKQorICAgIHJldHVybiBpbnYKIAogZGVmIGNoZWNrZmllbGQobiwgcCk6Ci0JYWxsID0gbWFrZV9lbGVtZW50cyhuLCBsZW4ocCktMSkKLQlpbnYgPSBtYWtlX2ludihhbGwsIG4sIHApCi0JYWxsMSA9IGFsbFs6XQotCWludjEgPSBpbnZbOl0KLQlhbGwxLnNvcnQoKQotCWludjEuc29ydCgpCi0JaWYgYWxsMSA9PSBpbnYxOiBwcmludCAnQklOR08hJwotCWVsc2U6Ci0JCXByaW50ICdTb3JyeTonLCBuLCBwCi0JCXByaW50IGFsbAotCQlwcmludCBpbnYKKyAgICBhbGwgPSBtYWtlX2VsZW1lbnRzKG4sIGxlbihwKS0xKQorICAgIGludiA9IG1ha2VfaW52KGFsbCwgbiwgcCkKKyAgICBhbGwxID0gYWxsWzpdCisgICAgaW52MSA9IGludls6XQorICAgIGFsbDEuc29ydCgpCisgICAgaW52MS5zb3J0KCkKKyAgICBpZiBhbGwxID09IGludjE6IHByaW50ICdCSU5HTyEnCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgJ1NvcnJ5OicsIG4sIHAKKyAgICAgICAgcHJpbnQgYWxsCisgICAgICAgIHByaW50IGludgogCiBkZWYgcmoocywgd2lkdGgpOgotCWlmIHR5cGUocykgaXMgbm90IHR5cGUoJycpOiBzID0gYHNgCi0JbiA9IGxlbihzKQotCWlmIG4gPj0gd2lkdGg6IHJldHVybiBzCi0JcmV0dXJuICcgJyood2lkdGggLSBuKSArIHMKKyAgICBpZiB0eXBlKHMpIGlzIG5vdCB0eXBlKCcnKTogcyA9IGBzYAorICAgIG4gPSBsZW4ocykKKyAgICBpZiBuID49IHdpZHRoOiByZXR1cm4gcworICAgIHJldHVybiAnICcqKHdpZHRoIC0gbikgKyBzCiAKIGRlZiBsaihzLCB3aWR0aCk6Ci0JaWYgdHlwZShzKSBpcyBub3QgdHlwZSgnJyk6IHMgPSBgc2AKLQluID0gbGVuKHMpCi0JaWYgbiA+PSB3aWR0aDogcmV0dXJuIHMKLQlyZXR1cm4gcyArICcgJyood2lkdGggLSBuKQorICAgIGlmIHR5cGUocykgaXMgbm90IHR5cGUoJycpOiBzID0gYHNgCisgICAgbiA9IGxlbihzKQorICAgIGlmIG4gPj0gd2lkdGg6IHJldHVybiBzCisgICAgcmV0dXJuIHMgKyAnICcqKHdpZHRoIC0gbikKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvVGl4LnB5IGIvTGliL2xpYi10ay9UaXgucHkKaW5kZXggZjE5YmY5Ny4uZWIzNDlkZCAxMDA3NTUKLS0tIGEvTGliL2xpYi10ay9UaXgucHkKKysrIGIvTGliL2xpYi10ay9UaXgucHkKQEAgLTExMDQsMTUgKzExMDQsMTUgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0KIAogICAgIGRlZiBwYWdlKHNlbGYsIG5hbWUpOgotICAgICAgIHJldHVybiBzZWxmLnN1YndpZGdldChuYW1lKQorICAgICAgICByZXR1cm4gc2VsZi5zdWJ3aWRnZXQobmFtZSkKIAogICAgIGRlZiBwYWdlcyhzZWxmKToKLSAgICAgICAjIENhbid0IGNhbGwgc3Vid2lkZ2V0c19hbGwgZGlyZWN0bHkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IC5uYmZyYW1lCi0gICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKLSAgICAgICByZXQgPSBbXQotICAgICAgIGZvciB4IGluIG5hbWVzOgotICAgICAgICAgICByZXQuYXBwZW5kKHNlbGYuc3Vid2lkZ2V0KHgpKQotICAgICAgIHJldHVybiByZXQKKyAgICAgICAgIyBDYW4ndCBjYWxsIHN1YndpZGdldHNfYWxsIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCAubmJmcmFtZQorICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYWdlcycpKQorICAgICAgICByZXQgPSBbXQorICAgICAgICBmb3IgeCBpbiBuYW1lczoKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc2VsZi5zdWJ3aWRnZXQoeCkpCisgICAgICAgIHJldHVybiByZXQKIAogICAgIGRlZiByYWlzZV9wYWdlKHNlbGYsIG5hbWUpOiAgICAgICAgICAgICAgIyByYWlzZSBpcyBhIHB5dGhvbiBrZXl3b3JkCiAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAncmFpc2UnLCBuYW1lKQpAQCAtMTczNyw3ICsxNzM3LDcgQEAKIAogY2xhc3MgX2R1bW15UGFuZWRXaW5kb3coUGFuZWRXaW5kb3csIFRpeFN1YldpZGdldCk6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgotICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIyBVdGlsaXR5IFJvdXRpbmVzICMjIwpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay9Ua2ludGVyLnB5IGIvTGliL2xpYi10ay9Ua2ludGVyLnB5CmluZGV4IDVhZDA2NWQuLjNmZmQyZGYgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvVGtpbnRlci5weQorKysgYi9MaWIvbGliLXRrL1RraW50ZXIucHkKQEAgLTE1NTcsNyArMTU1Nyw3IEBACiAgICAgICAgIHNlbGYuX3RrbG9hZGVkID0gMAogICAgICAgICAjIHRvIGF2b2lkIHJlY3Vyc2lvbnMgaW4gdGhlIGdldGF0dHIgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUsIHdlCiAgICAgICAgICMgZW5zdXJlIHRoYXQgc2VsZi50ayBpcyBhbHdheXMgX3NvbWV0aGluZ18uCi0gICAgICAgIHNlbGYudGsgPSBOb25lICAKKyAgICAgICAgc2VsZi50ayA9IE5vbmUKICAgICAgICAgaWYgYmFzZU5hbWUgaXMgTm9uZToKICAgICAgICAgICAgIGltcG9ydCBzeXMsIG9zCiAgICAgICAgICAgICBiYXNlTmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3RrRmlsZURpYWxvZy5weSBiL0xpYi9saWItdGsvdGtGaWxlRGlhbG9nLnB5CmluZGV4IGMyYzY2MWMuLmEzNWZlZWQgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvdGtGaWxlRGlhbG9nLnB5CisrKyBiL0xpYi9saWItdGsvdGtGaWxlRGlhbG9nLnB5CkBAIC0xMzEsOCArMTMxLDggQEAKIAogZGVmIGFza29wZW5maWxlbmFtZXMoKipvcHRpb25zKToKICAgICAiIiJBc2sgZm9yIG11bHRpcGxlIGZpbGVuYW1lcyB0byBvcGVuCi0gICAgCi0gICAgUmV0dXJucyBhIGxpc3Qgb2YgZmlsZW5hbWVzIG9yIGVtcHR5IGxpc3QgaWYgCisKKyAgICBSZXR1cm5zIGEgbGlzdCBvZiBmaWxlbmFtZXMgb3IgZW1wdHkgbGlzdCBpZgogICAgIGNhbmNlbCBidXR0b24gc2VsZWN0ZWQKICAgICAiIiIKICAgICBvcHRpb25zWyJtdWx0aXBsZSJdPTEKQEAgLTE1MSw4ICsxNTEsOCBAQAogZGVmIGFza29wZW5maWxlcyhtb2RlID0gInIiLCAqKm9wdGlvbnMpOgogICAgICIiIkFzayBmb3IgbXVsdGlwbGUgZmlsZW5hbWVzIGFuZCByZXR1cm4gdGhlIG9wZW4gZmlsZQogICAgIG9iamVjdHMKLSAgICAKLSAgICByZXR1cm5zIGEgbGlzdCBvZiBvcGVuIGZpbGUgb2JqZWN0cyBvciBhbiBlbXB0eSBsaXN0IGlmIAorCisgICAgcmV0dXJucyBhIGxpc3Qgb2Ygb3BlbiBmaWxlIG9iamVjdHMgb3IgYW4gZW1wdHkgbGlzdCBpZgogICAgIGNhbmNlbCBzZWxlY3RlZAogICAgICIiIgogCkBAIC0yMDQsNyArMjA0LDcgQEAKICAgICAgICAgZnA9b3BlbihvcGVuZmlsZW5hbWUsInIiKQogICAgICAgICBmcC5jbG9zZSgpCiAgICAgZXhjZXB0OgotICAgICAgICBwcmludCAiQ291bGQgbm90IG9wZW4gRmlsZTogIiAKKyAgICAgICAgcHJpbnQgIkNvdWxkIG5vdCBvcGVuIEZpbGU6ICIKICAgICAgICAgcHJpbnQgc3lzLmV4Y19pbmZvKClbMV0KIAogICAgIHByaW50ICJvcGVuIiwgb3BlbmZpbGVuYW1lLmVuY29kZShlbmMpCkBAIC0yMTMsNCArMjEzLDMgQEAKIAogICAgIHNhdmVhc2ZpbGVuYW1lPWFza3NhdmVhc2ZpbGVuYW1lKCkKICAgICBwcmludCAic2F2ZWFzIiwgc2F2ZWFzZmlsZW5hbWUuZW5jb2RlKGVuYykKLQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtYXRoZW9zL0lOLnB5IGIvTGliL3BsYXQtYXRoZW9zL0lOLnB5CmluZGV4IGEzODZhMjEuLjUzZjNkNTUgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LWF0aGVvcy9JTi5weQorKysgYi9MaWIvcGxhdC1hdGhlb3MvSU4ucHkKQEAgLTUwLDcgKzUwLDcgQEAKIAogZGVmIF9fUE1UKGFyZ3MpOiByZXR1cm4gYXJncwogCi1kZWYgX19QKGFyZ3MpOiByZXR1cm4gKCkJIAorZGVmIF9fUChhcmdzKTogcmV0dXJuICgpCiAKIGRlZiBfX1BNVChhcmdzKTogcmV0dXJuICgpCiAKQEAgLTYwLDcgKzYwLDcgQEAKIAogZGVmIF9fQVNNTkFNRShjbmFtZSk6IHJldHVybiBfX0FTTU5BTUUyIChfX1VTRVJfTEFCRUxfUFJFRklYX18sIGNuYW1lKQogCi1kZWYgX19hdHRyaWJ1dGVfXyh4eXopOiByZXR1cm4gIAorZGVmIF9fYXR0cmlidXRlX18oeHl6KTogcmV0dXJuCiAKIF9fVVNFX0VYVEVSTl9JTkxJTkVTID0gMQogCkBAIC05NDIsNCArOTQyLDMgQEAKIGRlZiBJTjZfSVNfQUREUl9NQ19PUkdMT0NBTChhKTogcmV0dXJuIFwKIAogZGVmIElONl9JU19BRERSX01DX0dMT0JBTChhKTogcmV0dXJuIFwKLQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtYXRoZW9zL1RZUEVTLnB5IGIvTGliL3BsYXQtYXRoZW9zL1RZUEVTLnB5CmluZGV4IDgxNjYxMDguLjMxNGNhNzMgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LWF0aGVvcy9UWVBFUy5weQorKysgYi9MaWIvcGxhdC1hdGhlb3MvVFlQRVMucHkKQEAgLTUwLDcgKzUwLDcgQEAKIAogZGVmIF9fUE1UKGFyZ3MpOiByZXR1cm4gYXJncwogCi1kZWYgX19QKGFyZ3MpOiByZXR1cm4gKCkJIAorZGVmIF9fUChhcmdzKTogcmV0dXJuICgpCiAKIGRlZiBfX1BNVChhcmdzKTogcmV0dXJuICgpCiAKQEAgLTYwLDcgKzYwLDcgQEAKIAogZGVmIF9fQVNNTkFNRShjbmFtZSk6IHJldHVybiBfX0FTTU5BTUUyIChfX1VTRVJfTEFCRUxfUFJFRklYX18sIGNuYW1lKQogCi1kZWYgX19hdHRyaWJ1dGVfXyh4eXopOiByZXR1cm4gIAorZGVmIF9fYXR0cmlidXRlX18oeHl6KTogcmV0dXJuCiAKIF9fVVNFX0VYVEVSTl9JTkxJTkVTID0gMQogCkBAIC0xNDAsNCArMTQwLDMgQEAKIGRlZiBtYWpvcihkZXYpOiByZXR1cm4gKCAoKCAgKGRldikgPj4gOCkgJiAweGZmKSkKIAogZGVmIG1pbm9yKGRldik6IHJldHVybiAoICgoZGV2KSAmIDB4ZmYpKQotCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1iZW9zNS9JTi5weSBiL0xpYi9wbGF0LWJlb3M1L0lOLnB5CmluZGV4IDE4NzhhODUuLjM2MmNiNDEgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LWJlb3M1L0lOLnB5CisrKyBiL0xpYi9wbGF0LWJlb3M1L0lOLnB5CkBAIC0zMjQsNCArMzI0LDQgQEAKIE5GREJJVFMgPSAzMgogZGVmIF9GRE1TS05PKGZkKTogcmV0dXJuICgoZmQpIC8gTkZEQklUUykKIAotZGVmIF9GREJJVE5PKGZkKTogcmV0dXJuICgoZmQpICUgTkZEQklUUykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitkZWYgX0ZEQklUTk8oZmQpOiByZXR1cm4gKChmZCkgJSBORkRCSVRTKQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDUvQUwucHkgYi9MaWIvcGxhdC1pcml4NS9BTC5weQppbmRleCBlZDE3Y2RlLi5lYzk0MWEyIDEwMDc1NQotLS0gYS9MaWIvcGxhdC1pcml4NS9BTC5weQorKysgYi9MaWIvcGxhdC1pcml4NS9BTC5weQpAQCAtMSw2MSArMSw2MSBAQAotUkFURV80ODAwMCAJPSA0ODAwMAotUkFURV80NDEwMAk9IDQ0MTAwCi1SQVRFXzMyMDAwCT0gMzIwMDAKLVJBVEVfMjIwNTAJPSAyMjA1MAotUkFURV8xNjAwMAk9IDE2MDAwCi1SQVRFXzExMDI1CT0gMTEwMjUKLVJBVEVfODAwMAk9IDgwMDAKK1JBVEVfNDgwMDAgICAgICA9IDQ4MDAwCitSQVRFXzQ0MTAwICAgICAgPSA0NDEwMAorUkFURV8zMjAwMCAgICAgID0gMzIwMDAKK1JBVEVfMjIwNTAgICAgICA9IDIyMDUwCitSQVRFXzE2MDAwICAgICAgPSAxNjAwMAorUkFURV8xMTAyNSAgICAgID0gMTEwMjUKK1JBVEVfODAwMCAgICAgICA9IDgwMDAKIAogU0FNUEZNVF9UV09TQ09NUD0gMQotU0FNUEZNVF9GTE9BVAk9IDMyCi1TQU1QRk1UX0RPVUJMRQk9IDY0CitTQU1QRk1UX0ZMT0FUICAgPSAzMgorU0FNUEZNVF9ET1VCTEUgID0gNjQKIAotU0FNUExFXzgJPSAxCi1TQU1QTEVfMTYJPSAyCi0JIyBTQU1QTEVfMjQgaXMgdGhlIGxvdyAyNCBiaXRzIG9mIGEgbG9uZywgc2lnbiBleHRlbmRlZCB0byAzMiBiaXRzCi1TQU1QTEVfMjQJPSA0CitTQU1QTEVfOCAgICAgICAgPSAxCitTQU1QTEVfMTYgICAgICAgPSAyCisgICAgICAgICMgU0FNUExFXzI0IGlzIHRoZSBsb3cgMjQgYml0cyBvZiBhIGxvbmcsIHNpZ24gZXh0ZW5kZWQgdG8gMzIgYml0cworU0FNUExFXzI0ICAgICAgID0gNAogCi1NT05PCQk9IDEKLVNURVJFTwkJPSAyCi1RVUFEUk8JCT0gNAkJCSMgNENIQU5ORUwgaXMgbm90IGEgbGVnYWwgUHl0aG9uIG5hbWUKK01PTk8gICAgICAgICAgICA9IDEKK1NURVJFTyAgICAgICAgICA9IDIKK1FVQURSTyAgICAgICAgICA9IDQgICAgICAgICAgICAgICAgICAgICAjIDRDSEFOTkVMIGlzIG5vdCBhIGxlZ2FsIFB5dGhvbiBuYW1lCiAKLUlOUFVUX0xJTkUJPSAwCi1JTlBVVF9NSUMJPSAxCi1JTlBVVF9ESUdJVEFMCT0gMgorSU5QVVRfTElORSAgICAgID0gMAorSU5QVVRfTUlDICAgICAgID0gMQorSU5QVVRfRElHSVRBTCAgID0gMgogCi1NT05JVE9SX09GRgk9IDAKLU1PTklUT1JfT04JPSAxCitNT05JVE9SX09GRiAgICAgPSAwCitNT05JVE9SX09OICAgICAgPSAxCiAKLUVSUk9SX05VTUJFUgkJPSAwCi1FUlJPUl9UWVBFCQk9IDEKLUVSUk9SX0xPQ0FUSU9OX0xTUCAJPSAyCi1FUlJPUl9MT0NBVElPTl9NU1AJPSAzCi1FUlJPUl9MRU5HVEgJCT0gNAorRVJST1JfTlVNQkVSICAgICAgICAgICAgPSAwCitFUlJPUl9UWVBFICAgICAgICAgICAgICA9IDEKK0VSUk9SX0xPQ0FUSU9OX0xTUCAgICAgID0gMgorRVJST1JfTE9DQVRJT05fTVNQICAgICAgPSAzCitFUlJPUl9MRU5HVEggICAgICAgICAgICA9IDQKIAotRVJST1JfSU5QVVRfVU5ERVJGTE9XCT0gMAotRVJST1JfT1VUUFVUX09WRVJGTE9XCT0gMQorRVJST1JfSU5QVVRfVU5ERVJGTE9XICAgPSAwCitFUlJPUl9PVVRQVVRfT1ZFUkZMT1cgICA9IDEKIAogIyBUaGVzZSBzZWVtIHRvIGJlIG5vdCBzdXBwb3J0ZWQgYW55bW9yZToKLSMjSE9MRCwgUkVMRUFTRQkJCT0gMCwgMQotIyNBVFRBSUwsIEFUSEVBRCwgQVRNQVJLLCBBVFRJTUUJPSAwLCAxLCAyLCAzCisjI0hPTEQsIFJFTEVBU0UgICAgICAgICAgICAgICAgID0gMCwgMQorIyNBVFRBSUwsIEFUSEVBRCwgQVRNQVJLLCBBVFRJTUUgICAgICAgID0gMCwgMSwgMiwgMwogCi1ERUZBVUxUX0RFVklDRQk9IDEKK0RFRkFVTFRfREVWSUNFICA9IDEKIAotSU5QVVRfU09VUkNFCQk9IDAKLUxFRlRfSU5QVVRfQVRURU4JPSAxCi1SSUdIVF9JTlBVVF9BVFRFTgk9IDIKLUlOUFVUX1JBVEUJCT0gMwotT1VUUFVUX1JBVEUJCT0gNAotTEVGVF9TUEVBS0VSX0dBSU4JPSA1Ci1SSUdIVF9TUEVBS0VSX0dBSU4JPSA2Ci1JTlBVVF9DT1VOVAkJPSA3Ci1PVVRQVVRfQ09VTlQJCT0gOAotVU5VU0VEX0NPVU5UCQk9IDkKLVNZTkNfSU5QVVRfVE9fQUVTCT0gMTAKLVNZTkNfT1VUUFVUX1RPX0FFUwk9IDExCi1NT05JVE9SX0NUTAkJPSAxMgotTEVGVF9NT05JVE9SX0FUVEVOCT0gMTMKLVJJR0hUX01PTklUT1JfQVRURU4JPSAxNAorSU5QVVRfU09VUkNFICAgICAgICAgICAgPSAwCitMRUZUX0lOUFVUX0FUVEVOICAgICAgICA9IDEKK1JJR0hUX0lOUFVUX0FUVEVOICAgICAgID0gMgorSU5QVVRfUkFURSAgICAgICAgICAgICAgPSAzCitPVVRQVVRfUkFURSAgICAgICAgICAgICA9IDQKK0xFRlRfU1BFQUtFUl9HQUlOICAgICAgID0gNQorUklHSFRfU1BFQUtFUl9HQUlOICAgICAgPSA2CitJTlBVVF9DT1VOVCAgICAgICAgICAgICA9IDcKK09VVFBVVF9DT1VOVCAgICAgICAgICAgID0gOAorVU5VU0VEX0NPVU5UICAgICAgICAgICAgPSA5CitTWU5DX0lOUFVUX1RPX0FFUyAgICAgICA9IDEwCitTWU5DX09VVFBVVF9UT19BRVMgICAgICA9IDExCitNT05JVE9SX0NUTCAgICAgICAgICAgICA9IDEyCitMRUZUX01PTklUT1JfQVRURU4gICAgICA9IDEzCitSSUdIVF9NT05JVE9SX0FUVEVOICAgICA9IDE0CiAKLUVOVU1fVkFMVUUJPSAwCSMgb25seSBjZXJ0YWluIHZhbHVlcyBhcmUgdmFsaWQKLVJBTkdFX1ZBTFVFCT0gMQkjIGFueSB2YWx1ZSBpbiByYW5nZSBpcyB2YWxpZAorRU5VTV9WQUxVRSAgICAgID0gMCAgICAgIyBvbmx5IGNlcnRhaW4gdmFsdWVzIGFyZSB2YWxpZAorUkFOR0VfVkFMVUUgICAgID0gMSAgICAgIyBhbnkgdmFsdWUgaW4gcmFuZ2UgaXMgdmFsaWQKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWlyaXg1L0NELnB5IGIvTGliL3BsYXQtaXJpeDUvQ0QucHkKaW5kZXggYWQ1NjU2MS4uOGMxZTAzYiAxMDA3NTUKLS0tIGEvTGliL3BsYXQtaXJpeDUvQ0QucHkKKysrIGIvTGliL3BsYXQtaXJpeDUvQ0QucHkKQEAgLTEsMzQgKzEsMzQgQEAKLUVSUk9SCQk9IDAKLU5PRElTQwkJPSAxCi1SRUFEWQkJPSAyCi1QTEFZSU5HCQk9IDMKLVBBVVNFRAkJPSA0Ci1TVElMTAkJPSA1CitFUlJPUiAgICAgICAgICAgPSAwCitOT0RJU0MgICAgICAgICAgPSAxCitSRUFEWSAgICAgICAgICAgPSAyCitQTEFZSU5HICAgICAgICAgPSAzCitQQVVTRUQgICAgICAgICAgPSA0CitTVElMTCAgICAgICAgICAgPSA1CiAKLUFVRElPCQk9IDAKLVBOVU0JCT0gMQotSU5ERVgJCT0gMgotUFRJTUUJCT0gMwotQVRJTUUJCT0gNAotQ0FUQUxPRwkJPSA1Ci1JREVOVAkJPSA2Ci1DT05UUk9MCQk9IDcKK0FVRElPICAgICAgICAgICA9IDAKK1BOVU0gICAgICAgICAgICA9IDEKK0lOREVYICAgICAgICAgICA9IDIKK1BUSU1FICAgICAgICAgICA9IDMKK0FUSU1FICAgICAgICAgICA9IDQKK0NBVEFMT0cgICAgICAgICA9IDUKK0lERU5UICAgICAgICAgICA9IDYKK0NPTlRST0wgICAgICAgICA9IDcKIAotQ0REQV9EQVRBU0laRQk9IDIzNTIKK0NEREFfREFUQVNJWkUgICA9IDIzNTIKIAotIyNDRERBX1NVQkNPREVTSVpFCT0gKHNpemVvZihzdHJ1Y3Qgc3ViY29kZVEpKQotIyNDRERBX0JMT0NLU0laRQk9IChzaXplb2Yoc3RydWN0IGNkZnJhbWUpKQotIyNDRERBX05VTVNBTVBMRVMJPSAoQ0REQV9EQVRBU0laRS8yKQorIyNDRERBX1NVQkNPREVTSVpFICAgICAgPSAoc2l6ZW9mKHN0cnVjdCBzdWJjb2RlUSkpCisjI0NEREFfQkxPQ0tTSVpFICAgICAgICA9IChzaXplb2Yoc3RydWN0IGNkZnJhbWUpKQorIyNDRERBX05VTVNBTVBMRVMgICAgICAgPSAoQ0REQV9EQVRBU0laRS8yKQogIyMKLSMjQ0RRX1BSRUVNUF9NQVNLCT0gMHhkCi0jI0NEUV9DT1BZX01BU0sJPSAweGIKLSMjQ0RRX0REQVRBX01BU0sJPSAweGQKLSMjQ0RRX0JST0FEQ0FTVF9NQVNLCT0gMHg4Ci0jI0NEUV9QUkVFTVBIQVNJUwk9IDB4MQotIyNDRFFfQ09QWV9QRVJNSVRURUQJPSAweDIJCQotIyNDRFFfRElHSVRBTF9EQVRBCT0gMHg0Ci0jI0NEUV9CUk9BRENBU1RfVVNFCT0gMHg4CisjI0NEUV9QUkVFTVBfTUFTSyAgICAgICA9IDB4ZAorIyNDRFFfQ09QWV9NQVNLID0gMHhiCisjI0NEUV9EREFUQV9NQVNLICAgICAgICA9IDB4ZAorIyNDRFFfQlJPQURDQVNUX01BU0sgICAgPSAweDgKKyMjQ0RRX1BSRUVNUEhBU0lTICAgICAgID0gMHgxCisjI0NEUV9DT1BZX1BFUk1JVFRFRCAgICA9IDB4MgorIyNDRFFfRElHSVRBTF9EQVRBICAgICAgPSAweDQKKyMjQ0RRX0JST0FEQ0FTVF9VU0UgICAgID0gMHg4CiAjIwotIyNDRFFfTU9ERTEJPSAweDEKLSMjQ0RRX01PREUyCT0gMHgyCi0jI0NEUV9NT0RFMwk9IDB4MworIyNDRFFfTU9ERTEgICAgID0gMHgxCisjI0NEUV9NT0RFMiAgICAgPSAweDIKKyMjQ0RRX01PREUzICAgICA9IDB4MwpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDUvQ0wucHkgYi9MaWIvcGxhdC1pcml4NS9DTC5weQppbmRleCA0NjhlY2FhLi4yMzI1OWM1IDEwMDc1NQotLS0gYS9MaWIvcGxhdC1pcml4NS9DTC5weQorKysgYi9MaWIvcGxhdC1pcml4NS9DTC5weQpAQCAtMSwyNCArMSwyNCBAQAogIyBCYWNrd2FyZCBjb21wYXRpYmxlIG1vZHVsZSBDTC4KICMgQWxsIHJlbGV2YW50IHN5bWJvbHMgYXJlIG5vdyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgY2wuCiB0cnk6Ci0JZnJvbSBjbCBpbXBvcnQgKgorICAgIGZyb20gY2wgaW1wb3J0ICoKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLQlmcm9tIENMX29sZCBpbXBvcnQgKgorICAgIGZyb20gQ0xfb2xkIGltcG9ydCAqCiBlbHNlOgotCWRlbCBDb21wcmVzc0ltYWdlCi0JZGVsIERlY29tcHJlc3NJbWFnZQotCWRlbCBHZXRBbGdvcml0aG1OYW1lCi0JZGVsIE9wZW5Db21wcmVzc29yCi0JZGVsIE9wZW5EZWNvbXByZXNzb3IKLQlkZWwgUXVlcnlBbGdvcml0aG1zCi0JZGVsIFF1ZXJ5TWF4SGVhZGVyU2l6ZQotCWRlbCBRdWVyeVNjaGVtZQotCWRlbCBRdWVyeVNjaGVtZUZyb21OYW1lCi0JZGVsIFNldERlZmF1bHQKLQlkZWwgU2V0TWF4Ci0JZGVsIFNldE1pbgotCXRyeToKLQkJZGVsIGN2dF90eXBlCi0JZXhjZXB0IE5hbWVFcnJvcjoKLQkJcGFzcwotCWRlbCBlcnJvcgorICAgIGRlbCBDb21wcmVzc0ltYWdlCisgICAgZGVsIERlY29tcHJlc3NJbWFnZQorICAgIGRlbCBHZXRBbGdvcml0aG1OYW1lCisgICAgZGVsIE9wZW5Db21wcmVzc29yCisgICAgZGVsIE9wZW5EZWNvbXByZXNzb3IKKyAgICBkZWwgUXVlcnlBbGdvcml0aG1zCisgICAgZGVsIFF1ZXJ5TWF4SGVhZGVyU2l6ZQorICAgIGRlbCBRdWVyeVNjaGVtZQorICAgIGRlbCBRdWVyeVNjaGVtZUZyb21OYW1lCisgICAgZGVsIFNldERlZmF1bHQKKyAgICBkZWwgU2V0TWF4CisgICAgZGVsIFNldE1pbgorICAgIHRyeToKKyAgICAgICAgZGVsIGN2dF90eXBlCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGRlbCBlcnJvcgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDUvQ0xfb2xkLnB5IGIvTGliL3BsYXQtaXJpeDUvQ0xfb2xkLnB5CmluZGV4IGQ5YTQxMDAuLjk2N2I0OTcgMTAwNzU1Ci0tLSBhL0xpYi9wbGF0LWlyaXg1L0NMX29sZC5weQorKysgYi9MaWIvcGxhdC1pcml4NS9DTF9vbGQucHkKQEAgLTEsOCArMSw4IEBACiAjCiAjIGNsLmggLSBDb21wcmVzc2lvbiBMaWJyYXJ5IHR5cGVkZWZzIGFuZCBwcm90b3R5cGVzCiAjCi0jICAgMDEvMDcvOTIJQ2xlYW51cCBieSBCcmlhbiBLbml0dGVsCi0jICAgMDIvMTgvOTIJT3JpZ2luYWwgVmVyc2lvbiBieSBCcmlhbiBLbml0dGVsCisjICAgMDEvMDcvOTIgICAgQ2xlYW51cCBieSBCcmlhbiBLbml0dGVsCisjICAgMDIvMTgvOTIgICAgT3JpZ2luYWwgVmVyc2lvbiBieSBCcmlhbiBLbml0dGVsCiAjCiAKICMKQEAgLTE0LDEzICsxNCwxMyBAQAogTU9OTyA9IDAKIFNURVJFT19JTlRFUkxFQVZFRCA9IDEKIAotIyBWaWRlbyAKKyMgVmlkZW8KICMgWVVWIGlzIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgdGhpbmcgYXMgWUNyQ2IgKGx1bWEgYW5kIHR3byBjaHJvbWEgY29tcG9uZW50cykuCi0jIDQyMiBpcyBhcHBlbmRlZCB0byBZVVYgKG9yIFlDckNiKSBpZiB0aGUgY2hyb21hIGlzIHN1Yi1zYW1wbGVkIGJ5IDIgCi0jCWhvcml6b250YWxseSwgcGFja2VkIGFzIFUgWTEgViBZMiAoYnl0ZSBvcmRlcikuCi0jIDQyMkhDIGlzIGFwcGVuZGVkIHRvIFlVViAob3IgWUNyQ2IpIGlmIHRoZSBjaHJvbWEgaXMgc3ViLXNhbXBsZWQgYnkgMiAKLSMJdmVydGljYWxseSBpbiBhZGRpdGlvbiB0byBob3Jpem9udGFsbHksIGFuZCBpcyBwYWNrZWQgdGhlIHNhbWUgYXMgCi0jCTQyMiBleGNlcHQgdGhhdCBVICYgViBhcmUgbm90IHZhbGlkIG9uIHRoZSBzZWNvbmQgbGluZS4KKyMgNDIyIGlzIGFwcGVuZGVkIHRvIFlVViAob3IgWUNyQ2IpIGlmIHRoZSBjaHJvbWEgaXMgc3ViLXNhbXBsZWQgYnkgMgorIyAgICAgICBob3Jpem9udGFsbHksIHBhY2tlZCBhcyBVIFkxIFYgWTIgKGJ5dGUgb3JkZXIpLgorIyA0MjJIQyBpcyBhcHBlbmRlZCB0byBZVVYgKG9yIFlDckNiKSBpZiB0aGUgY2hyb21hIGlzIHN1Yi1zYW1wbGVkIGJ5IDIKKyMgICAgICAgdmVydGljYWxseSBpbiBhZGRpdGlvbiB0byBob3Jpem9udGFsbHksIGFuZCBpcyBwYWNrZWQgdGhlIHNhbWUgYXMKKyMgICAgICAgNDIyIGV4Y2VwdCB0aGF0IFUgJiBWIGFyZSBub3QgdmFsaWQgb24gdGhlIHNlY29uZCBsaW5lLgogIwogUkdCID0gMAogUkdCWCA9IDEKQEAgLTI5LDYyICsyOSw2MiBAQAogCiBHUkFZU0NBTEUgPSA0CiBZID0gNAotWVVWID0gNQkKLVlDYkNyID0gNQkKLVlVVjQyMiA9IDYJCQkJIyA0OjI6MiBzYW1wbGluZwotWUNiQ3I0MjIgPSA2CQkJCSMgNDoyOjIgc2FtcGxpbmcKLVlVVjQyMkhDID0gNwkJCQkjIDQ6MToxIHNhbXBsaW5nCi1ZQ2JDcjQyMkhDID0gNwkJCQkjIDQ6MToxIHNhbXBsaW5nCi1ZVVY0MjJEQyA9IDcJCQkJIyA0OjE6MSBzYW1wbGluZwotWUNiQ3I0MjJEQyA9IDcJCQkJIyA0OjE6MSBzYW1wbGluZworWVVWID0gNQorWUNiQ3IgPSA1CitZVVY0MjIgPSA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyA0OjI6MiBzYW1wbGluZworWUNiQ3I0MjIgPSA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgNDoyOjIgc2FtcGxpbmcKK1lVVjQyMkhDID0gNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDQ6MToxIHNhbXBsaW5nCitZQ2JDcjQyMkhDID0gNyAgICAgICAgICAgICAgICAgICAgICAgICAgIyA0OjE6MSBzYW1wbGluZworWVVWNDIyREMgPSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgNDoxOjEgc2FtcGxpbmcKK1lDYkNyNDIyREMgPSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAjIDQ6MToxIHNhbXBsaW5nCiAKLUJFU1RfRklUID0gLTEJCitCRVNUX0ZJVCA9IC0xCiAKIGRlZiBCeXRlc1BlclNhbXBsZShzKToKLQlpZiBzIGluIChNT05PLCBZVVYpOgotCQlyZXR1cm4gMgotCWVsaWYgcyA9PSBTVEVSRU9fSU5URVJMRUFWRUQ6Ci0JCXJldHVybiA0Ci0JZWxzZToKLQkJcmV0dXJuIDAKKyAgICBpZiBzIGluIChNT05PLCBZVVYpOgorICAgICAgICByZXR1cm4gMgorICAgIGVsaWYgcyA9PSBTVEVSRU9fSU5URVJMRUFWRUQ6CisgICAgICAgIHJldHVybiA0CisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIDAKIAogZGVmIEJ5dGVzUGVyUGl4ZWwoZik6Ci0JaWYgZiBpbiAoUkdCLCBZVVYpOgotCQlyZXR1cm4gMwotCWVsaWYgZiBpbiAoUkdCWCwgUkdCQSk6Ci0JCXJldHVybiA0Ci0JZWxpZiBmIGluIChSR0IzMzIsIEdSQVlTQ0FMRSk6Ci0JCXJldHVybiAxCi0JZWxzZToKLQkJcmV0dXJuIDIKKyAgICBpZiBmIGluIChSR0IsIFlVVik6CisgICAgICAgIHJldHVybiAzCisgICAgZWxpZiBmIGluIChSR0JYLCBSR0JBKToKKyAgICAgICAgcmV0dXJuIDQKKyAgICBlbGlmIGYgaW4gKFJHQjMzMiwgR1JBWVNDQUxFKToKKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gMgogCiBkZWYgQXVkaW9Gb3JtYXROYW1lKGYpOgotCWlmIGYgPT0gTU9OTzoKLQkJcmV0dXJuICdNT05PJwotCWVsaWYgZiA9PSBTVEVSRU9fSU5URVJMRUFWRUQ6Ci0JCXJldHVybiAnU1RFUkVPX0lOVEVSTEVBVkVEJwotCWVsc2U6Ci0JCXJldHVybiAnTm90IGEgdmFsaWQgZm9ybWF0JworICAgIGlmIGYgPT0gTU9OTzoKKyAgICAgICAgcmV0dXJuICdNT05PJworICAgIGVsaWYgZiA9PSBTVEVSRU9fSU5URVJMRUFWRUQ6CisgICAgICAgIHJldHVybiAnU1RFUkVPX0lOVEVSTEVBVkVEJworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnTm90IGEgdmFsaWQgZm9ybWF0JwogCiBkZWYgVmlkZW9Gb3JtYXROYW1lKGYpOgotCWlmIGYgPT0gUkdCOgotCQlyZXR1cm4gJ1JHQicKLQllbGlmIGYgPT0gUkdCWDoKLQkJcmV0dXJuICdSR0JYJwotCWVsaWYgZiA9PSBSR0JBOgotCQlyZXR1cm4gJ1JHQkEnCi0JZWxpZiBmID09IFJHQjMzMjoKLQkJcmV0dXJuICdSR0IzMzInCi0JZWxpZiBmID09IEdSQVlTQ0FMRToKLQkJcmV0dXJuICdHUkFZU0NBTEUnCi0JZWxpZiBmID09IFlVVjoKLQkJcmV0dXJuICdZVVYnCi0JZWxpZiBmID09IFlVVjQyMjoKLQkJcmV0dXJuICdZVVY0MjInCi0JZWxpZiBmID09IFlVVjQyMkRDOgotCQlyZXR1cm4gJ1lVVjQyMkRDJwotCWVsc2U6Ci0JCXJldHVybiAnTm90IGEgdmFsaWQgZm9ybWF0JworICAgIGlmIGYgPT0gUkdCOgorICAgICAgICByZXR1cm4gJ1JHQicKKyAgICBlbGlmIGYgPT0gUkdCWDoKKyAgICAgICAgcmV0dXJuICdSR0JYJworICAgIGVsaWYgZiA9PSBSR0JBOgorICAgICAgICByZXR1cm4gJ1JHQkEnCisgICAgZWxpZiBmID09IFJHQjMzMjoKKyAgICAgICAgcmV0dXJuICdSR0IzMzInCisgICAgZWxpZiBmID09IEdSQVlTQ0FMRToKKyAgICAgICAgcmV0dXJuICdHUkFZU0NBTEUnCisgICAgZWxpZiBmID09IFlVVjoKKyAgICAgICAgcmV0dXJuICdZVVYnCisgICAgZWxpZiBmID09IFlVVjQyMjoKKyAgICAgICAgcmV0dXJuICdZVVY0MjInCisgICAgZWxpZiBmID09IFlVVjQyMkRDOgorICAgICAgICByZXR1cm4gJ1lVVjQyMkRDJworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnTm90IGEgdmFsaWQgZm9ybWF0JwogCiBNQVhfTlVNQkVSX09GX0FVRElPX0FMR09SSVRITVMgPSAzMgogTUFYX05VTUJFUl9PRl9WSURFT19BTEdPUklUSE1TID0gMzIKQEAgLTk2LDExICs5NiwxMSBAQAogVklERU8gPSAxCiAKIGRlZiBBbGdvcml0aG1OdW1iZXIoc2NoZW1lKToKLQlyZXR1cm4gc2NoZW1lICYgMHg3ZmZmCisgICAgcmV0dXJuIHNjaGVtZSAmIDB4N2ZmZgogZGVmIEFsZ29yaXRobVR5cGUoc2NoZW1lKToKLQlyZXR1cm4gKHNjaGVtZSA+PiAxNSkgJiAxCisgICAgcmV0dXJuIChzY2hlbWUgPj4gMTUpICYgMQogZGVmIEFsZ29yaXRobSh0eXBlLCBuKToKLQlyZXR1cm4gbiB8ICgodHlwZSAmIDEpIDw8IDE1KQorICAgIHJldHVybiBuIHwgKCh0eXBlICYgMSkgPDwgMTUpCiAKICMKICMgImNvbXByZXNzaW9uU2NoZW1lIiBhcmd1bWVudCB2YWx1ZXMKQEAgLTExNCw3ICsxMTQsNyBAQAogQUxBVyA9IEFsZ29yaXRobShBVURJTywgMikKIEFXQVJFX01QRUdfQVVESU8gPSBBbGdvcml0aG0oQVVESU8sIDMpCiBBV0FSRV9NVUxUSVJBVEUgPSBBbGdvcml0aG0oQVVESU8sIDQpCi0gICAgCisKIFVOQ09NUFJFU1NFRCA9IEFsZ29yaXRobShWSURFTywgMCkKIFVOQ09NUFJFU1NFRF9WSURFTyA9IEFsZ29yaXRobShWSURFTywgMCkKIFJMRSA9IEFsZ29yaXRobShWSURFTywgMSkKQEAgLTEzMCw3ICsxMzAsNyBAQAogTUFYX05VTUJFUl9PRl9QQVJBTVMgPSAyNTYKICMgRGVmYXVsdCBQYXJhbWV0ZXJzCiBJTUFHRV9XSURUSCA9IDAKLUlNQUdFX0hFSUdIVCA9IDEgCitJTUFHRV9IRUlHSFQgPSAxCiBPUklHSU5BTF9GT1JNQVQgPSAyCiBJTlRFUk5BTF9GT1JNQVQgPSAzCiBDT01QT05FTlRTID0gNApAQCAtMTM4LDcgKzEzOCw3IEBACiBGUkFNRV9SQVRFID0gNgogQ09NUFJFU1NJT05fUkFUSU8gPSA3CiBFWEFDVF9DT01QUkVTU0lPTl9SQVRJTyA9IDgKLUZSQU1FX0JVRkZFUl9TSVpFID0gOSAKK0ZSQU1FX0JVRkZFUl9TSVpFID0gOQogQ09NUFJFU1NFRF9CVUZGRVJfU0laRSA9IDEwCiBCTE9DS19TSVpFID0gMTEKIFBSRVJPTEwgPSAxMgpAQCAtMTY1LDEwICsxNjUsMTAgQEAKICMKICMgUGFyYW1ldGVyIHZhbHVlIHR5cGVzCiAjCi1FTlVNX1ZBTFVFID0gMAkJCQkjIG9ubHkgY2VydGFpbiBjb25zdGFudCB2YWx1ZXMgYXJlIHZhbGlkCi1SQU5HRV9WQUxVRSA9IDEJCQkJIyBhbnkgdmFsdWUgaW4gYSBnaXZlbiByYW5nZSBpcyB2YWxpZAotRkxPQVRJTkdfRU5VTV9WQUxVRSA9IDIJCQkjIG9ubHkgY2VydGFpbiBjb25zdGFudCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgYXJlIHZhbGlkCi1GTE9BVElOR19SQU5HRV9WQUxVRSA9IDMJCSMgYW55IHZhbHVlIGluIGEgZ2l2ZW4gZmxvYXRpbmcgcG9pbnQgcmFuZ2UgaXMgdmFsaWQKK0VOVU1fVkFMVUUgPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgY2VydGFpbiBjb25zdGFudCB2YWx1ZXMgYXJlIHZhbGlkCitSQU5HRV9WQUxVRSA9IDEgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbnkgdmFsdWUgaW4gYSBnaXZlbiByYW5nZSBpcyB2YWxpZAorRkxPQVRJTkdfRU5VTV9WQUxVRSA9IDIgICAgICAgICAgICAgICAgICMgb25seSBjZXJ0YWluIGNvbnN0YW50IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBhcmUgdmFsaWQKK0ZMT0FUSU5HX1JBTkdFX1ZBTFVFID0gMyAgICAgICAgICAgICAgICAjIGFueSB2YWx1ZSBpbiBhIGdpdmVuIGZsb2F0aW5nIHBvaW50IHJhbmdlIGlzIHZhbGlkCiAKICMKICMgQWxnb3JpdGhtIEZ1bmN0aW9uYWxpdHkKQEAgLTIwOCwyOSArMjA4LDI5IEBACiAjIGVycm9yIGNvZGVzCiAjCiAKLUJBRF9OT19CVUZGRVJTUEFDRSA9ICAtMgkJIyBubyBzcGFjZSBmb3IgaW50ZXJuYWwgYnVmZmVycwotQkFEX1BWQlVGRkVSID0gIC0zCQkJIyBwYXJhbS92YWwgYnVmZmVyIGRvZXNuJ3QgbWFrZSBzZW5zZQotQkFEX0JVRkZFUkxFTkdUSF9ORUcgPSAgLTQJCSMgbmVnYXRpdmUgYnVmZmVyIGxlbmd0aAotQkFEX0JVRkZFUkxFTkdUSF9PREQgPSAgLTUJCSMgb2RkIGxlbmd0aCBwYXJhbWV0ZXIvdmFsdWUgYnVmZmVyCi1CQURfUEFSQU0gPSAgLTYJCQkJIyBpbnZhbGlkIHBhcmFtZXRlcgotQkFEX0NPTVBSRVNTSU9OX1NDSEVNRSA9ICAtNwkJIyBjb21wcmVzc2lvbiBzY2hlbWUgcGFyYW1ldGVyIGludmFsaWQKLUJBRF9DT01QUkVTU09SX0hBTkRMRSA9ICAtOAkJIyBjb21wcmVzc2lvbiBoYW5kbGUgcGFyYW1ldGVyIGludmFsaWQKLUJBRF9DT01QUkVTU09SX0hBTkRMRV9QT0lOVEVSID0gLTkJIyBjb21wcmVzc2lvbiBoYW5kbGUgcG9pbnRlciBpbnZhbGlkCi1CQURfQlVGRkVSX0hBTkRMRSA9IC0xMAkJCSMgYnVmZmVyIGhhbmRsZSBpbnZhbGlkCi1CQURfQlVGRkVSX1FVRVJZX1NJWkUgPSAtMTEJCSMgYnVmZmVyIHF1ZXJ5IHNpemUgdG9vIGxhcmdlCi1KUEVHX0VSUk9SID0gLTEyCQkJIyBlcnJvciBmcm9tIGxpYmpwZWcKLUJBRF9GUkFNRV9TSVpFID0gLTEzCQkJIyBmcmFtZSBzaXplIGludmFsaWQKLVBBUkFNX09VVF9PRl9SQU5HRSA9IC0xNAkJIyBwYXJhbWV0ZXIgb3V0IG9mIHJhbmdlCi1BRERFRF9BTEdPUklUSE1fRVJST1IgPSAtMTUJCSMgYWRkZWQgYWxnb3JpdGhtIGhhZCBhIHVuaXF1ZSBlcnJvcgotQkFEX0FMR09SSVRITV9UWVBFID0gLTE2CQkjIGJhZCBhbGdvcml0aG0gdHlwZQotQkFEX0FMR09SSVRITV9OQU1FID0gLTE3CQkjIGJhZCBhbGdvcml0aG0gbmFtZQotQkFEX0JVRkZFUklORyA9IC0xOAkJCSMgYmFkIGJ1ZmZlcmluZyBjYWxscwotQlVGRkVSX05PVF9DUkVBVEVEID0gLTE5CQkjIGJ1ZmZlciBub3QgY3JlYXRlZAotQkFEX0JVRkZFUl9FWElTVFMgPSAtMjAJCQkjIGJ1ZmZlciBhbHJlYWR5IGNyZWF0ZWQKLUJBRF9JTlRFUk5BTF9GT1JNQVQgPSAtMjEJCSMgaW52YWxpZCBpbnRlcm5hbCBmb3JtYXQKLUJBRF9CVUZGRVJfUE9JTlRFUiA9IC0yMgkJIyBpbnZhbGlkIGJ1ZmZlciBwb2ludGVyCi1GUkFNRV9CVUZGRVJfU0laRV9aRVJPID0gLTIzCQkjIGZyYW1lIGJ1ZmZlciBoYXMgemVybyBzaXplCi1CQURfU1RSRUFNX0hFQURFUiA9IC0yNAkJCSMgaW52YWxpZCBzdHJlYW0gaGVhZGVyCitCQURfTk9fQlVGRkVSU1BBQ0UgPSAgLTIgICAgICAgICAgICAgICAgIyBubyBzcGFjZSBmb3IgaW50ZXJuYWwgYnVmZmVycworQkFEX1BWQlVGRkVSID0gIC0zICAgICAgICAgICAgICAgICAgICAgICMgcGFyYW0vdmFsIGJ1ZmZlciBkb2Vzbid0IG1ha2Ugc2Vuc2UKK0JBRF9CVUZGRVJMRU5HVEhfTkVHID0gIC00ICAgICAgICAgICAgICAjIG5lZ2F0aXZlIGJ1ZmZlciBsZW5ndGgKK0JBRF9CVUZGRVJMRU5HVEhfT0REID0gIC01ICAgICAgICAgICAgICAjIG9kZCBsZW5ndGggcGFyYW1ldGVyL3ZhbHVlIGJ1ZmZlcgorQkFEX1BBUkFNID0gIC02ICAgICAgICAgICAgICAgICAgICAgICAgICMgaW52YWxpZCBwYXJhbWV0ZXIKK0JBRF9DT01QUkVTU0lPTl9TQ0hFTUUgPSAgLTcgICAgICAgICAgICAjIGNvbXByZXNzaW9uIHNjaGVtZSBwYXJhbWV0ZXIgaW52YWxpZAorQkFEX0NPTVBSRVNTT1JfSEFORExFID0gIC04ICAgICAgICAgICAgICMgY29tcHJlc3Npb24gaGFuZGxlIHBhcmFtZXRlciBpbnZhbGlkCitCQURfQ09NUFJFU1NPUl9IQU5ETEVfUE9JTlRFUiA9IC05ICAgICAgIyBjb21wcmVzc2lvbiBoYW5kbGUgcG9pbnRlciBpbnZhbGlkCitCQURfQlVGRkVSX0hBTkRMRSA9IC0xMCAgICAgICAgICAgICAgICAgIyBidWZmZXIgaGFuZGxlIGludmFsaWQKK0JBRF9CVUZGRVJfUVVFUllfU0laRSA9IC0xMSAgICAgICAgICAgICAjIGJ1ZmZlciBxdWVyeSBzaXplIHRvbyBsYXJnZQorSlBFR19FUlJPUiA9IC0xMiAgICAgICAgICAgICAgICAgICAgICAgICMgZXJyb3IgZnJvbSBsaWJqcGVnCitCQURfRlJBTUVfU0laRSA9IC0xMyAgICAgICAgICAgICAgICAgICAgIyBmcmFtZSBzaXplIGludmFsaWQKK1BBUkFNX09VVF9PRl9SQU5HRSA9IC0xNCAgICAgICAgICAgICAgICAjIHBhcmFtZXRlciBvdXQgb2YgcmFuZ2UKK0FEREVEX0FMR09SSVRITV9FUlJPUiA9IC0xNSAgICAgICAgICAgICAjIGFkZGVkIGFsZ29yaXRobSBoYWQgYSB1bmlxdWUgZXJyb3IKK0JBRF9BTEdPUklUSE1fVFlQRSA9IC0xNiAgICAgICAgICAgICAgICAjIGJhZCBhbGdvcml0aG0gdHlwZQorQkFEX0FMR09SSVRITV9OQU1FID0gLTE3ICAgICAgICAgICAgICAgICMgYmFkIGFsZ29yaXRobSBuYW1lCitCQURfQlVGRkVSSU5HID0gLTE4ICAgICAgICAgICAgICAgICAgICAgIyBiYWQgYnVmZmVyaW5nIGNhbGxzCitCVUZGRVJfTk9UX0NSRUFURUQgPSAtMTkgICAgICAgICAgICAgICAgIyBidWZmZXIgbm90IGNyZWF0ZWQKK0JBRF9CVUZGRVJfRVhJU1RTID0gLTIwICAgICAgICAgICAgICAgICAjIGJ1ZmZlciBhbHJlYWR5IGNyZWF0ZWQKK0JBRF9JTlRFUk5BTF9GT1JNQVQgPSAtMjEgICAgICAgICAgICAgICAjIGludmFsaWQgaW50ZXJuYWwgZm9ybWF0CitCQURfQlVGRkVSX1BPSU5URVIgPSAtMjIgICAgICAgICAgICAgICAgIyBpbnZhbGlkIGJ1ZmZlciBwb2ludGVyCitGUkFNRV9CVUZGRVJfU0laRV9aRVJPID0gLTIzICAgICAgICAgICAgIyBmcmFtZSBidWZmZXIgaGFzIHplcm8gc2l6ZQorQkFEX1NUUkVBTV9IRUFERVIgPSAtMjQgICAgICAgICAgICAgICAgICMgaW52YWxpZCBzdHJlYW0gaGVhZGVyCiAKLUJBRF9MSUNFTlNFID0gLTI1CQkJIyBuZXRscyBsaWNlbnNlIG5vdCB2YWxpZAotQVdBUkVfRVJST1IgPSAtMjYJCQkjIGVycm9yIGZyb20gbGliYXdjbXAKK0JBRF9MSUNFTlNFID0gLTI1ICAgICAgICAgICAgICAgICAgICAgICAjIG5ldGxzIGxpY2Vuc2Ugbm90IHZhbGlkCitBV0FSRV9FUlJPUiA9IC0yNiAgICAgICAgICAgICAgICAgICAgICAgIyBlcnJvciBmcm9tIGxpYmF3Y21wCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1pcml4NS9GTC5weSBiL0xpYi9wbGF0LWlyaXg1L0ZMLnB5CmluZGV4IGFlNjY1ZTMuLjcyN2RhNGMgMTAwNzU1Ci0tLSBhL0xpYi9wbGF0LWlyaXg1L0ZMLnB5CisrKyBiL0xpYi9wbGF0LWlyaXg1L0ZMLnB5CkBAIC03LDkgKzcsOSBAQAogX3YyMSA9IDEKICMjaW1wb3J0IGZsCiAjI3RyeToKLSMjCV92MjAgPSAoZmwuZ2V0X3JnYm1vZGUgaXMgbm90IE5vbmUpCisjIyAgICAgIF92MjAgPSAoZmwuZ2V0X3JnYm1vZGUgaXMgbm90IE5vbmUpCiAjI2V4Y2VwdDoKLSMjCV92MjAgPSAwCisjIyAgICAgIF92MjAgPSAwCiAjI2RlbCBmbAogCiBOVUxMID0gMApAQCAtMjAsNyArMjAsNyBAQAogCiBMQUJFTF9TSVpFID0gNjQKIGlmIF92MjA6Ci0JU0hPUlRDVVRfU0laRSA9IDMyCisgICAgU0hPUlRDVVRfU0laRSA9IDMyCiBQTEFDRV9GUkVFID0gMAogUExBQ0VfU0laRSA9IDEKIFBMQUNFX0FTUEVDVCA9IDIKQEAgLTExOSw3ICsxMTksNyBAQAogSU5PVVRfQlVUVE9OID0gNQogUkVUVVJOX0JVVFRPTiA9IDYKIGlmIF92MjA6Ci0JSElEREVOX1JFVF9CVVRUT04gPSA3CisgICAgSElEREVOX1JFVF9CVVRUT04gPSA3CiBCVVRUT05fQk9YVFlQRSA9IFVQX0JPWAogQlVUVE9OX0NPTDEgPSBDT0wxCiBCVVRUT05fQ09MMiA9IENPTDEKQEAgLTEyOSwyMCArMTI5LDIwIEBACiBCVVRUT05fTUNPTDIgPSBNQ09MCiBCVVRUT05fQlcgPSBCT1VORF9XSURUSAogaWYgX3YyMDoKLQlDSEFSVCA9IDQKLQlCQVJfQ0hBUlQgPSAwCi0JSE9SQkFSX0NIQVJUID0gMQotCUxJTkVfQ0hBUlQgPSAyCi0JRklMTEVEX0NIQVJUID0gMwotCVNQSUtFX0NIQVJUID0gNAotCVBJRV9DSEFSVCA9IDUKLQlTUEVDSUFMUElFX0NIQVJUID0gNgotCUNIQVJUX0JPWFRZUEUgPSBCT1JERVJfQk9YCi0JQ0hBUlRfQ09MMSA9IENPTDEKLQlDSEFSVF9MQ09MID0gTENPTAotCUNIQVJUX0FMSUdOID0gQUxJR05fQk9UVE9NCi0JQ0hBUlRfQlcgPSBCT1VORF9XSURUSAotCUNIQVJUX01BWCA9IDEyOAorICAgIENIQVJUID0gNAorICAgIEJBUl9DSEFSVCA9IDAKKyAgICBIT1JCQVJfQ0hBUlQgPSAxCisgICAgTElORV9DSEFSVCA9IDIKKyAgICBGSUxMRURfQ0hBUlQgPSAzCisgICAgU1BJS0VfQ0hBUlQgPSA0CisgICAgUElFX0NIQVJUID0gNQorICAgIFNQRUNJQUxQSUVfQ0hBUlQgPSA2CisgICAgQ0hBUlRfQk9YVFlQRSA9IEJPUkRFUl9CT1gKKyAgICBDSEFSVF9DT0wxID0gQ09MMQorICAgIENIQVJUX0xDT0wgPSBMQ09MCisgICAgQ0hBUlRfQUxJR04gPSBBTElHTl9CT1RUT00KKyAgICBDSEFSVF9CVyA9IEJPVU5EX1dJRFRICisgICAgQ0hBUlRfTUFYID0gMTI4CiBDSE9JQ0UgPSA0MgogTk9STUFMX0NIT0lDRSA9IDAKIENIT0lDRV9CT1hUWVBFID0gRE9XTl9CT1gKQEAgLTE3MywxMSArMTczLDExIEBACiBDT1VOVEVSX0xDT0wgPSBMQ09MCiBDT1VOVEVSX0FMSUdOID0gQUxJR05fQk9UVE9NCiBpZiBfdjIwOgotCUNPVU5URVJfQlcgPSBCT1VORF9XSURUSAorICAgIENPVU5URVJfQlcgPSBCT1VORF9XSURUSAogZWxzZToKLQlERUZBVUxUID0gNTEKLQlSRVRVUk5fREVGQVVMVCA9IDAKLQlBTFdBWVNfREVGQVVMVCA9IDEKKyAgICBERUZBVUxUID0gNTEKKyAgICBSRVRVUk5fREVGQVVMVCA9IDAKKyAgICBBTFdBWVNfREVGQVVMVCA9IDEKIERJQUwgPSAyMgogTk9STUFMX0RJQUwgPSAwCiBMSU5FX0RJQUwgPSAxCkBAIC0xOTcsMTQgKzE5NywxNCBAQAogSU5QVVQgPSAzMQogTk9STUFMX0lOUFVUID0gMAogaWYgX3YyMDoKLQlGTE9BVF9JTlBVVCA9IDEKLQlJTlRfSU5QVVQgPSAyCi0JSElEREVOX0lOUFVUID0gMwotCWlmIF92MjE6Ci0JCU1VTFRJTElORV9JTlBVVCA9IDQKLQkJU0VDUkVUX0lOUFVUID0gNQorICAgIEZMT0FUX0lOUFVUID0gMQorICAgIElOVF9JTlBVVCA9IDIKKyAgICBISURERU5fSU5QVVQgPSAzCisgICAgaWYgX3YyMToKKyAgICAgICAgTVVMVElMSU5FX0lOUFVUID0gNAorICAgICAgICBTRUNSRVRfSU5QVVQgPSA1CiBlbHNlOgotCUFMV0FZU19JTlBVVCA9IDEKKyAgICBBTFdBWVNfSU5QVVQgPSAxCiBJTlBVVF9CT1hUWVBFID0gRE9XTl9CT1gKIElOUFVUX0NPTDEgPSAxMwogSU5QVVRfQ09MMiA9IDUKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWlyaXg1L1NWLnB5IGIvTGliL3BsYXQtaXJpeDUvU1YucHkKaW5kZXggMDhmYjkxNy4uZGI4ZWZlNSAxMDA3NTUKLS0tIGEvTGliL3BsYXQtaXJpeDUvU1YucHkKKysrIGIvTGliL3BsYXQtaXJpeDUvU1YucHkKQEAgLTcsMTYgKzcsMTYgQEAKIE1BWF9TT1VSQ0VTID0gMgogCiAjIG1vZGUgcGFyYW1ldGVyIGZvciBCaW5kIGNhbGxzCi1JTl9PRkYgPSAwCQkJCSMgTm8gVmlkZW8KLUlOX09WRVIgPSAxCQkJCSMgVmlkZW8gb3ZlciBncmFwaGljcwotSU5fVU5ERVIgPSAyCQkJCSMgVmlkZW8gdW5kZXIgZ3JhcGhpY3MKLUlOX1JFUExBQ0UgPSAzCQkJCSMgVmlkZW8gcmVwbGFjZXMgZW50aXJlIHdpbgorSU5fT0ZGID0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gVmlkZW8KK0lOX09WRVIgPSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFZpZGVvIG92ZXIgZ3JhcGhpY3MKK0lOX1VOREVSID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFZpZGVvIHVuZGVyIGdyYXBoaWNzCitJTl9SRVBMQUNFID0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBWaWRlbyByZXBsYWNlcyBlbnRpcmUgd2luCiAKICMgbW9kZSBwYXJhbWV0ZXJzIGZvciBMb2FkTWFwIGNhbGxzLiAgU3BlY2lmaWVzIGJ1ZmZlciwgYWx3YXlzIDI1NiBlbnRyaWVzCi1JTlBVVF9DT0xPUk1BUCA9IDAJCQkjIHR1cGxlcyBvZiA4LWJpdCBSR0IKLUNIUk9NQV9LRVlfTUFQID0gMQkJCSMgdHVwbGVzIG9mIDgtYml0IFJHQgotQ09MT1JfU1BBQ0VfTUFQID0gMgkJCSMgdHVwbGVzIG9mIDgtYml0IFJHQgotR0FNTUFfTUFQID0gMwkJCQkjIHR1cGxlcyBvZiAyNC1iaXQgcmVkIHZhbHVlcworSU5QVVRfQ09MT1JNQVAgPSAwICAgICAgICAgICAgICAgICAgICAgICMgdHVwbGVzIG9mIDgtYml0IFJHQgorQ0hST01BX0tFWV9NQVAgPSAxICAgICAgICAgICAgICAgICAgICAgICMgdHVwbGVzIG9mIDgtYml0IFJHQgorQ09MT1JfU1BBQ0VfTUFQID0gMiAgICAgICAgICAgICAgICAgICAgICMgdHVwbGVzIG9mIDgtYml0IFJHQgorR0FNTUFfTUFQID0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHVwbGVzIG9mIDI0LWJpdCByZWQgdmFsdWVzCiAKICMgbW9kZSBwYXJhbWV0ZXJzIGZvciBVc2VFeGNsdXNpdmUgY2FsbHMKIElOUFVUID0gMApAQCAtMjQsOSArMjQsOSBAQAogSU5fT1VUID0gMgogCiAjIEZvcm1hdCBjb25zdGFudHMgZm9yIHRoZSBjYXB0dXJlIHJvdXRpbmVzCi1SR0I4X0ZSQU1FUyA9IDAJCQkJIyBub25pbnRlcmxlYXZlZCA4IGJpdCAzOjI6MyBSQkcgZmllbGRzCi1SR0IzMl9GUkFNRVMgPSAxCQkJIyAzMi1iaXQgODo4OjggUkdCIGZyYW1lcwotWVVWNDExX0ZSQU1FUyA9IDIJCQkjIGludGVybGVhdmVkLCA4OjI6MiBZVVYgZm9ybWF0CitSR0I4X0ZSQU1FUyA9IDAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub25pbnRlcmxlYXZlZCA4IGJpdCAzOjI6MyBSQkcgZmllbGRzCitSR0IzMl9GUkFNRVMgPSAxICAgICAgICAgICAgICAgICAgICAgICAgIyAzMi1iaXQgODo4OjggUkdCIGZyYW1lcworWVVWNDExX0ZSQU1FUyA9IDIgICAgICAgICAgICAgICAgICAgICAgICMgaW50ZXJsZWF2ZWQsIDg6MjoyIFlVViBmb3JtYXQKIFlVVjQxMV9GUkFNRVNfQU5EX0JMQU5LSU5HX0JVRkZFUiA9IDMKIAogIwpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDUvY2RkYi5weSBiL0xpYi9wbGF0LWlyaXg1L2NkZGIucHkKaW5kZXggYzRhOTVjZC4uN2IyNzExZiAxMDA3NTUKLS0tIGEvTGliL3BsYXQtaXJpeDUvY2RkYi5weQorKysgYi9MaWIvcGxhdC1pcml4NS9jZGRiLnB5CkBAIC0yMCwxODUgKzIwLDE4NSBAQAogX0RCX0lEX05UUkFDS1MgPSA1CiBfZGJpZF9tYXAgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaQF89K2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwogZGVmIF9kYmlkKHYpOgotCWlmIHYgPj0gbGVuKF9kYmlkX21hcCk6Ci0JCXJldHVybiBzdHJpbmcuemZpbGwodiwgMikKLQllbHNlOgotCQlyZXR1cm4gX2RiaWRfbWFwW3ZdCisgICAgaWYgdiA+PSBsZW4oX2RiaWRfbWFwKToKKyAgICAgICAgcmV0dXJuIHN0cmluZy56ZmlsbCh2LCAyKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfZGJpZF9tYXBbdl0KIAogZGVmIHRvY2hhc2godG9jKToKLQlpZiB0eXBlKHRvYykgPT0gdHlwZSgnJyk6Ci0JCXRyYWNrbGlzdCA9IFtdCi0JCWZvciBpIGluIHJhbmdlKDIsIGxlbih0b2MpLCA0KToKLQkJCXRyYWNrbGlzdC5hcHBlbmQoKE5vbmUsCi0JCQkJICAoaW50KHRvY1tpOmkrMl0pLAotCQkJCSAgIGludCh0b2NbaSsyOmkrNF0pKSkpCi0JZWxzZToKLQkJdHJhY2tsaXN0ID0gdG9jCi0JbnRyYWNrcyA9IGxlbih0cmFja2xpc3QpCi0JaGFzaCA9IF9kYmlkKChudHJhY2tzID4+IDQpICYgMHhGKSArIF9kYmlkKG50cmFja3MgJiAweEYpCi0JaWYgbnRyYWNrcyA8PSBfREJfSURfTlRSQUNLUzoKLQkJbmlkdHJhY2tzID0gbnRyYWNrcwotCWVsc2U6Ci0JCW5pZHRyYWNrcyA9IF9EQl9JRF9OVFJBQ0tTIC0gMQotCQltaW4gPSAwCi0JCXNlYyA9IDAKLQkJZm9yIHRyYWNrIGluIHRyYWNrbGlzdDoKLQkJCXN0YXJ0LCBsZW5ndGggPSB0cmFjawotCQkJbWluID0gbWluICsgbGVuZ3RoWzBdCi0JCQlzZWMgPSBzZWMgKyBsZW5ndGhbMV0KLQkJbWluID0gbWluICsgc2VjIC8gNjAKLQkJc2VjID0gc2VjICUgNjAKLQkJaGFzaCA9IGhhc2ggKyBfZGJpZChtaW4pICsgX2RiaWQoc2VjKQotCWZvciBpIGluIHJhbmdlKG5pZHRyYWNrcyk6Ci0JCXN0YXJ0LCBsZW5ndGggPSB0cmFja2xpc3RbaV0KLQkJaGFzaCA9IGhhc2ggKyBfZGJpZChsZW5ndGhbMF0pICsgX2RiaWQobGVuZ3RoWzFdKQotCXJldHVybiBoYXNoCi0JCisgICAgaWYgdHlwZSh0b2MpID09IHR5cGUoJycpOgorICAgICAgICB0cmFja2xpc3QgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4odG9jKSwgNCk6CisgICAgICAgICAgICB0cmFja2xpc3QuYXBwZW5kKChOb25lLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQodG9jW2k6aSsyXSksCisgICAgICAgICAgICAgICAgICAgICAgIGludCh0b2NbaSsyOmkrNF0pKSkpCisgICAgZWxzZToKKyAgICAgICAgdHJhY2tsaXN0ID0gdG9jCisgICAgbnRyYWNrcyA9IGxlbih0cmFja2xpc3QpCisgICAgaGFzaCA9IF9kYmlkKChudHJhY2tzID4+IDQpICYgMHhGKSArIF9kYmlkKG50cmFja3MgJiAweEYpCisgICAgaWYgbnRyYWNrcyA8PSBfREJfSURfTlRSQUNLUzoKKyAgICAgICAgbmlkdHJhY2tzID0gbnRyYWNrcworICAgIGVsc2U6CisgICAgICAgIG5pZHRyYWNrcyA9IF9EQl9JRF9OVFJBQ0tTIC0gMQorICAgICAgICBtaW4gPSAwCisgICAgICAgIHNlYyA9IDAKKyAgICAgICAgZm9yIHRyYWNrIGluIHRyYWNrbGlzdDoKKyAgICAgICAgICAgIHN0YXJ0LCBsZW5ndGggPSB0cmFjaworICAgICAgICAgICAgbWluID0gbWluICsgbGVuZ3RoWzBdCisgICAgICAgICAgICBzZWMgPSBzZWMgKyBsZW5ndGhbMV0KKyAgICAgICAgbWluID0gbWluICsgc2VjIC8gNjAKKyAgICAgICAgc2VjID0gc2VjICUgNjAKKyAgICAgICAgaGFzaCA9IGhhc2ggKyBfZGJpZChtaW4pICsgX2RiaWQoc2VjKQorICAgIGZvciBpIGluIHJhbmdlKG5pZHRyYWNrcyk6CisgICAgICAgIHN0YXJ0LCBsZW5ndGggPSB0cmFja2xpc3RbaV0KKyAgICAgICAgaGFzaCA9IGhhc2ggKyBfZGJpZChsZW5ndGhbMF0pICsgX2RiaWQobGVuZ3RoWzFdKQorICAgIHJldHVybiBoYXNoCisKIGNsYXNzIENkZGI6Ci0JZGVmIF9faW5pdF9fKHNlbGYsIHRyYWNrbGlzdCk6Ci0JCWlmIG9zLmVudmlyb24uaGFzX2tleSgnQ0REQl9QQVRIJyk6Ci0JCQlwYXRoID0gb3MuZW52aXJvblsnQ0REQl9QQVRIJ10KLQkJCWNkZGJfcGF0aCA9IHBhdGguc3BsaXQoJywnKQotCQllbHNlOgotCQkJaG9tZSA9IG9zLmVudmlyb25bJ0hPTUUnXQotCQkJY2RkYl9wYXRoID0gW2hvbWUgKyAnLycgKyBfY2RkYnJjXQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFja2xpc3QpOgorICAgICAgICBpZiBvcy5lbnZpcm9uLmhhc19rZXkoJ0NEREJfUEFUSCcpOgorICAgICAgICAgICAgcGF0aCA9IG9zLmVudmlyb25bJ0NEREJfUEFUSCddCisgICAgICAgICAgICBjZGRiX3BhdGggPSBwYXRoLnNwbGl0KCcsJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhvbWUgPSBvcy5lbnZpcm9uWydIT01FJ10KKyAgICAgICAgICAgIGNkZGJfcGF0aCA9IFtob21lICsgJy8nICsgX2NkZGJyY10KIAotCQlzZWxmLl9nZXRfaWQodHJhY2tsaXN0KQorICAgICAgICBzZWxmLl9nZXRfaWQodHJhY2tsaXN0KQogCi0JCWZvciBkaXIgaW4gY2RkYl9wYXRoOgotCQkJZmlsZSA9IGRpciArICcvJyArIHNlbGYuaWQgKyAnLnJkYicKLQkJCXRyeToKLQkJCQlmID0gb3BlbihmaWxlLCAncicpCi0JCQkJc2VsZi5maWxlID0gZmlsZQotCQkJCWJyZWFrCi0JCQlleGNlcHQgSU9FcnJvcjoKLQkJCQlwYXNzCi0JCW50cmFja3MgPSBpbnQoc2VsZi5pZFs6Ml0sIDE2KQotCQlzZWxmLmFydGlzdCA9ICcnCi0JCXNlbGYudGl0bGUgPSAnJwotCQlzZWxmLnRyYWNrID0gW05vbmVdICsgWycnXSAqIG50cmFja3MKLQkJc2VsZi50cmFja2FydGlzdCA9IFtOb25lXSArIFsnJ10gKiBudHJhY2tzCi0JCXNlbGYubm90ZXMgPSBbXQotCQlpZiBub3QgaGFzYXR0cihzZWxmLCAnZmlsZScpOgotCQkJcmV0dXJuCi0JCWltcG9ydCByZQotCQlyZWcgPSByZS5jb21waWxlKHInXihbXi5dKilcLihbXjpdKik6W1x0IF0rKC4qKScpCi0JCXdoaWxlIDE6Ci0JCQlsaW5lID0gZi5yZWFkbGluZSgpCi0JCQlpZiBub3QgbGluZToKLQkJCQlicmVhawotCQkJbWF0Y2ggPSByZWcubWF0Y2gobGluZSkKLQkJCWlmIG5vdCBtYXRjaDoKLQkJCQlwcmludCAnc3ludGF4IGVycm9yIGluICcgKyBmaWxlCi0JCQkJY29udGludWUKLQkJCW5hbWUxLCBuYW1lMiwgdmFsdWUgPSBtYXRjaC5ncm91cCgxLCAyLCAzKQotCQkJaWYgbmFtZTEgPT0gJ2FsYnVtJzoKLQkJCQlpZiBuYW1lMiA9PSAnYXJ0aXN0JzoKLQkJCQkJc2VsZi5hcnRpc3QgPSB2YWx1ZQotCQkJCWVsaWYgbmFtZTIgPT0gJ3RpdGxlJzoKLQkJCQkJc2VsZi50aXRsZSA9IHZhbHVlCi0JCQkJZWxpZiBuYW1lMiA9PSAndG9jJzoKLQkJCQkJaWYgbm90IHNlbGYudG9jOgotCQkJCQkJc2VsZi50b2MgPSB2YWx1ZQotCQkJCQlpZiBzZWxmLnRvYyAhPSB2YWx1ZToKLQkJCQkJCXByaW50ICd0b2NcJ3MgZG9uXCd0IG1hdGNoJwotCQkJCWVsaWYgbmFtZTIgPT0gJ25vdGVzJzoKLQkJCQkJc2VsZi5ub3Rlcy5hcHBlbmQodmFsdWUpCi0JCQllbGlmIG5hbWUxWzo1XSA9PSAndHJhY2snOgotCQkJCXRyeToKLQkJCQkJdHJhY2tubyA9IGludChuYW1lMVs1Ol0pCi0JCQkJZXhjZXB0IHN0cmluZ3MuYXRvaV9lcnJvcjoKLQkJCQkJcHJpbnQgJ3N5bnRheCBlcnJvciBpbiAnICsgZmlsZQotCQkJCQljb250aW51ZQotCQkJCWlmIHRyYWNrbm8gPiBudHJhY2tzOgotCQkJCQlwcmludCAndHJhY2sgbnVtYmVyICVyIGluIGZpbGUgJXIgb3V0IG9mIHJhbmdlJyAlICh0cmFja25vLCBmaWxlKQotCQkJCQljb250aW51ZQotCQkJCWlmIG5hbWUyID09ICd0aXRsZSc6Ci0JCQkJCXNlbGYudHJhY2tbdHJhY2tub10gPSB2YWx1ZQotCQkJCWVsaWYgbmFtZTIgPT0gJ2FydGlzdCc6Ci0JCQkJCXNlbGYudHJhY2thcnRpc3RbdHJhY2tub10gPSB2YWx1ZQotCQlmLmNsb3NlKCkKLQkJZm9yIGkgaW4gcmFuZ2UoMiwgbGVuKHNlbGYudHJhY2spKToKLQkJCXRyYWNrID0gc2VsZi50cmFja1tpXQotCQkJIyBpZiB0cmFjayB0aXRsZSBzdGFydHMgd2l0aCBgLCcsIHVzZSBpbml0aWFsIHBhcnQKLQkJCSMgb2YgcHJldmlvdXMgdHJhY2sncyB0aXRsZQotCQkJaWYgdHJhY2sgYW5kIHRyYWNrWzBdID09ICcsJzoKLQkJCQl0cnk6Ci0JCQkJCW9mZiA9IHNlbGYudHJhY2tbaSAtIDFdLmluZGV4KCcsJykKLQkJCQlleGNlcHQgVmFsdWVFcnJvcjoKLQkJCQkJcGFzcwotCQkJCWVsc2U6Ci0JCQkJCXNlbGYudHJhY2tbaV0gPSBzZWxmLnRyYWNrW2ktMV1bOm9mZl0gXAotCQkJCQkJCSsgdHJhY2sKKyAgICAgICAgZm9yIGRpciBpbiBjZGRiX3BhdGg6CisgICAgICAgICAgICBmaWxlID0gZGlyICsgJy8nICsgc2VsZi5pZCArICcucmRiJworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKGZpbGUsICdyJykKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbnRyYWNrcyA9IGludChzZWxmLmlkWzoyXSwgMTYpCisgICAgICAgIHNlbGYuYXJ0aXN0ID0gJycKKyAgICAgICAgc2VsZi50aXRsZSA9ICcnCisgICAgICAgIHNlbGYudHJhY2sgPSBbTm9uZV0gKyBbJyddICogbnRyYWNrcworICAgICAgICBzZWxmLnRyYWNrYXJ0aXN0ID0gW05vbmVdICsgWycnXSAqIG50cmFja3MKKyAgICAgICAgc2VsZi5ub3RlcyA9IFtdCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdmaWxlJyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIHJlZyA9IHJlLmNvbXBpbGUocideKFteLl0qKVwuKFteOl0qKTpbXHQgXSsoLiopJykKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBtYXRjaCA9IHJlZy5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIHByaW50ICdzeW50YXggZXJyb3IgaW4gJyArIGZpbGUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbmFtZTEsIG5hbWUyLCB2YWx1ZSA9IG1hdGNoLmdyb3VwKDEsIDIsIDMpCisgICAgICAgICAgICBpZiBuYW1lMSA9PSAnYWxidW0nOgorICAgICAgICAgICAgICAgIGlmIG5hbWUyID09ICdhcnRpc3QnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFydGlzdCA9IHZhbHVlCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lMiA9PSAndGl0bGUnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRpdGxlID0gdmFsdWUKKyAgICAgICAgICAgICAgICBlbGlmIG5hbWUyID09ICd0b2MnOgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi50b2M6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRvYyA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9jICE9IHZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ3RvY1wncyBkb25cJ3QgbWF0Y2gnCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lMiA9PSAnbm90ZXMnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdGVzLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgIGVsaWYgbmFtZTFbOjVdID09ICd0cmFjayc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0cmFja25vID0gaW50KG5hbWUxWzU6XSkKKyAgICAgICAgICAgICAgICBleGNlcHQgc3RyaW5ncy5hdG9pX2Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnc3ludGF4IGVycm9yIGluICcgKyBmaWxlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgdHJhY2tubyA+IG50cmFja3M6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICd0cmFjayBudW1iZXIgJXIgaW4gZmlsZSAlciBvdXQgb2YgcmFuZ2UnICUgKHRyYWNrbm8sIGZpbGUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbmFtZTIgPT0gJ3RpdGxlJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50cmFja1t0cmFja25vXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lMiA9PSAnYXJ0aXN0JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50cmFja2FydGlzdFt0cmFja25vXSA9IHZhbHVlCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4oc2VsZi50cmFjaykpOgorICAgICAgICAgICAgdHJhY2sgPSBzZWxmLnRyYWNrW2ldCisgICAgICAgICAgICAjIGlmIHRyYWNrIHRpdGxlIHN0YXJ0cyB3aXRoIGAsJywgdXNlIGluaXRpYWwgcGFydAorICAgICAgICAgICAgIyBvZiBwcmV2aW91cyB0cmFjaydzIHRpdGxlCisgICAgICAgICAgICBpZiB0cmFjayBhbmQgdHJhY2tbMF0gPT0gJywnOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb2ZmID0gc2VsZi50cmFja1tpIC0gMV0uaW5kZXgoJywnKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50cmFja1tpXSA9IHNlbGYudHJhY2tbaS0xXVs6b2ZmXSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRyYWNrCiAKLQlkZWYgX2dldF9pZChzZWxmLCB0cmFja2xpc3QpOgotCQkjIGZpbGwgaW4gc2VsZi5pZCBhbmQgc2VsZi50b2MuCi0JCSMgaWYgdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nIGVuZGluZyBpbiAucmRiLCB0aGUgcGFydAotCQkjIHVwdG8gdGhlIHN1ZmZpeCBpcyB0YWtlbiBhcyB0aGUgaWQuCi0JCWlmIHR5cGUodHJhY2tsaXN0KSA9PSB0eXBlKCcnKToKLQkJCWlmIHRyYWNrbGlzdFstNDpdID09ICcucmRiJzoKLQkJCQlzZWxmLmlkID0gdHJhY2tsaXN0WzotNF0KLQkJCQlzZWxmLnRvYyA9ICcnCi0JCQkJcmV0dXJuCi0JCQl0ID0gW10KLQkJCWZvciBpIGluIHJhbmdlKDIsIGxlbih0cmFja2xpc3QpLCA0KToKLQkJCQl0LmFwcGVuZCgoTm9uZSwgXAotCQkJCQkgIChpbnQodHJhY2tsaXN0W2k6aSsyXSksIFwKLQkJCQkJICAgaW50KHRyYWNrbGlzdFtpKzI6aSs0XSkpKSkKLQkJCXRyYWNrbGlzdCA9IHQKLQkJbnRyYWNrcyA9IGxlbih0cmFja2xpc3QpCi0JCXNlbGYuaWQgPSBfZGJpZCgobnRyYWNrcyA+PiA0KSAmIDB4RikgKyBfZGJpZChudHJhY2tzICYgMHhGKQotCQlpZiBudHJhY2tzIDw9IF9EQl9JRF9OVFJBQ0tTOgotCQkJbmlkdHJhY2tzID0gbnRyYWNrcwotCQllbHNlOgotCQkJbmlkdHJhY2tzID0gX0RCX0lEX05UUkFDS1MgLSAxCi0JCQltaW4gPSAwCi0JCQlzZWMgPSAwCi0JCQlmb3IgdHJhY2sgaW4gdHJhY2tsaXN0OgotCQkJCXN0YXJ0LCBsZW5ndGggPSB0cmFjawotCQkJCW1pbiA9IG1pbiArIGxlbmd0aFswXQotCQkJCXNlYyA9IHNlYyArIGxlbmd0aFsxXQotCQkJbWluID0gbWluICsgc2VjIC8gNjAKLQkJCXNlYyA9IHNlYyAlIDYwCi0JCQlzZWxmLmlkID0gc2VsZi5pZCArIF9kYmlkKG1pbikgKyBfZGJpZChzZWMpCi0JCWZvciBpIGluIHJhbmdlKG5pZHRyYWNrcyk6Ci0JCQlzdGFydCwgbGVuZ3RoID0gdHJhY2tsaXN0W2ldCi0JCQlzZWxmLmlkID0gc2VsZi5pZCArIF9kYmlkKGxlbmd0aFswXSkgKyBfZGJpZChsZW5ndGhbMV0pCi0JCXNlbGYudG9jID0gc3RyaW5nLnpmaWxsKG50cmFja3MsIDIpCi0JCWZvciB0cmFjayBpbiB0cmFja2xpc3Q6Ci0JCQlzdGFydCwgbGVuZ3RoID0gdHJhY2sKLQkJCXNlbGYudG9jID0gc2VsZi50b2MgKyBzdHJpbmcuemZpbGwobGVuZ3RoWzBdLCAyKSArIFwKLQkJCQkgIHN0cmluZy56ZmlsbChsZW5ndGhbMV0sIDIpCisgICAgZGVmIF9nZXRfaWQoc2VsZiwgdHJhY2tsaXN0KToKKyAgICAgICAgIyBmaWxsIGluIHNlbGYuaWQgYW5kIHNlbGYudG9jLgorICAgICAgICAjIGlmIHRoZSBhcmd1bWVudCBpcyBhIHN0cmluZyBlbmRpbmcgaW4gLnJkYiwgdGhlIHBhcnQKKyAgICAgICAgIyB1cHRvIHRoZSBzdWZmaXggaXMgdGFrZW4gYXMgdGhlIGlkLgorICAgICAgICBpZiB0eXBlKHRyYWNrbGlzdCkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICBpZiB0cmFja2xpc3RbLTQ6XSA9PSAnLnJkYic6CisgICAgICAgICAgICAgICAgc2VsZi5pZCA9IHRyYWNrbGlzdFs6LTRdCisgICAgICAgICAgICAgICAgc2VsZi50b2MgPSAnJworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgdCA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4odHJhY2tsaXN0KSwgNCk6CisgICAgICAgICAgICAgICAgdC5hcHBlbmQoKE5vbmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCh0cmFja2xpc3RbaTppKzJdKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KHRyYWNrbGlzdFtpKzI6aSs0XSkpKSkKKyAgICAgICAgICAgIHRyYWNrbGlzdCA9IHQKKyAgICAgICAgbnRyYWNrcyA9IGxlbih0cmFja2xpc3QpCisgICAgICAgIHNlbGYuaWQgPSBfZGJpZCgobnRyYWNrcyA+PiA0KSAmIDB4RikgKyBfZGJpZChudHJhY2tzICYgMHhGKQorICAgICAgICBpZiBudHJhY2tzIDw9IF9EQl9JRF9OVFJBQ0tTOgorICAgICAgICAgICAgbmlkdHJhY2tzID0gbnRyYWNrcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmlkdHJhY2tzID0gX0RCX0lEX05UUkFDS1MgLSAxCisgICAgICAgICAgICBtaW4gPSAwCisgICAgICAgICAgICBzZWMgPSAwCisgICAgICAgICAgICBmb3IgdHJhY2sgaW4gdHJhY2tsaXN0OgorICAgICAgICAgICAgICAgIHN0YXJ0LCBsZW5ndGggPSB0cmFjaworICAgICAgICAgICAgICAgIG1pbiA9IG1pbiArIGxlbmd0aFswXQorICAgICAgICAgICAgICAgIHNlYyA9IHNlYyArIGxlbmd0aFsxXQorICAgICAgICAgICAgbWluID0gbWluICsgc2VjIC8gNjAKKyAgICAgICAgICAgIHNlYyA9IHNlYyAlIDYwCisgICAgICAgICAgICBzZWxmLmlkID0gc2VsZi5pZCArIF9kYmlkKG1pbikgKyBfZGJpZChzZWMpCisgICAgICAgIGZvciBpIGluIHJhbmdlKG5pZHRyYWNrcyk6CisgICAgICAgICAgICBzdGFydCwgbGVuZ3RoID0gdHJhY2tsaXN0W2ldCisgICAgICAgICAgICBzZWxmLmlkID0gc2VsZi5pZCArIF9kYmlkKGxlbmd0aFswXSkgKyBfZGJpZChsZW5ndGhbMV0pCisgICAgICAgIHNlbGYudG9jID0gc3RyaW5nLnpmaWxsKG50cmFja3MsIDIpCisgICAgICAgIGZvciB0cmFjayBpbiB0cmFja2xpc3Q6CisgICAgICAgICAgICBzdGFydCwgbGVuZ3RoID0gdHJhY2sKKyAgICAgICAgICAgIHNlbGYudG9jID0gc2VsZi50b2MgKyBzdHJpbmcuemZpbGwobGVuZ3RoWzBdLCAyKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuemZpbGwobGVuZ3RoWzFdLCAyKQogCi0JZGVmIHdyaXRlKHNlbGYpOgotCQlpbXBvcnQgcG9zaXhwYXRoCi0JCWlmIG9zLmVudmlyb24uaGFzX2tleSgnQ0REQl9XUklURV9ESVInKToKLQkJCWRpciA9IG9zLmVudmlyb25bJ0NEREJfV1JJVEVfRElSJ10KLQkJZWxzZToKLQkJCWRpciA9IG9zLmVudmlyb25bJ0hPTUUnXSArICcvJyArIF9jZGRicmMKLQkJZmlsZSA9IGRpciArICcvJyArIHNlbGYuaWQgKyAnLnJkYicKLQkJaWYgcG9zaXhwYXRoLmV4aXN0cyhmaWxlKToKLQkJCSMgbWFrZSBiYWNrdXAgY29weQotCQkJcG9zaXgucmVuYW1lKGZpbGUsIGZpbGUgKyAnficpCi0JCWYgPSBvcGVuKGZpbGUsICd3JykKLQkJZi53cml0ZSgnYWxidW0udGl0bGU6XHQnICsgc2VsZi50aXRsZSArICdcbicpCi0JCWYud3JpdGUoJ2FsYnVtLmFydGlzdDpcdCcgKyBzZWxmLmFydGlzdCArICdcbicpCi0JCWYud3JpdGUoJ2FsYnVtLnRvYzpcdCcgKyBzZWxmLnRvYyArICdcbicpCi0JCWZvciBub3RlIGluIHNlbGYubm90ZXM6Ci0JCQlmLndyaXRlKCdhbGJ1bS5ub3RlczpcdCcgKyBub3RlICsgJ1xuJykKLQkJcHJldnByZWYgPSBOb25lCi0JCWZvciBpIGluIHJhbmdlKDEsIGxlbihzZWxmLnRyYWNrKSk6Ci0JCQlpZiBzZWxmLnRyYWNrYXJ0aXN0W2ldOgotCQkJCWYud3JpdGUoJ3RyYWNrJXIuYXJ0aXN0Olx0JXNcbicgJSAoaSwgc2VsZi50cmFja2FydGlzdFtpXSkpCi0JCQl0cmFjayA9IHNlbGYudHJhY2tbaV0KLQkJCXRyeToKLQkJCQlvZmYgPSB0cmFjay5pbmRleCgnLCcpCi0JCQlleGNlcHQgVmFsdUVycm9yOgotCQkJCXByZXZwcmVmID0gTm9uZQotCQkJZWxzZToKLQkJCQlpZiBwcmV2cHJlZiBhbmQgdHJhY2tbOm9mZl0gPT0gcHJldnByZWY6Ci0JCQkJCXRyYWNrID0gdHJhY2tbb2ZmOl0KLQkJCQllbHNlOgotCQkJCQlwcmV2cHJlZiA9IHRyYWNrWzpvZmZdCi0JCQlmLndyaXRlKCd0cmFjayVyLnRpdGxlOlx0JXNcbicgJSAoaSwgdHJhY2spKQotCQlmLmNsb3NlKCkKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgIGltcG9ydCBwb3NpeHBhdGgKKyAgICAgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdDRERCX1dSSVRFX0RJUicpOgorICAgICAgICAgICAgZGlyID0gb3MuZW52aXJvblsnQ0REQl9XUklURV9ESVInXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGlyID0gb3MuZW52aXJvblsnSE9NRSddICsgJy8nICsgX2NkZGJyYworICAgICAgICBmaWxlID0gZGlyICsgJy8nICsgc2VsZi5pZCArICcucmRiJworICAgICAgICBpZiBwb3NpeHBhdGguZXhpc3RzKGZpbGUpOgorICAgICAgICAgICAgIyBtYWtlIGJhY2t1cCBjb3B5CisgICAgICAgICAgICBwb3NpeC5yZW5hbWUoZmlsZSwgZmlsZSArICd+JykKKyAgICAgICAgZiA9IG9wZW4oZmlsZSwgJ3cnKQorICAgICAgICBmLndyaXRlKCdhbGJ1bS50aXRsZTpcdCcgKyBzZWxmLnRpdGxlICsgJ1xuJykKKyAgICAgICAgZi53cml0ZSgnYWxidW0uYXJ0aXN0Olx0JyArIHNlbGYuYXJ0aXN0ICsgJ1xuJykKKyAgICAgICAgZi53cml0ZSgnYWxidW0udG9jOlx0JyArIHNlbGYudG9jICsgJ1xuJykKKyAgICAgICAgZm9yIG5vdGUgaW4gc2VsZi5ub3RlczoKKyAgICAgICAgICAgIGYud3JpdGUoJ2FsYnVtLm5vdGVzOlx0JyArIG5vdGUgKyAnXG4nKQorICAgICAgICBwcmV2cHJlZiA9IE5vbmUKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHNlbGYudHJhY2spKToKKyAgICAgICAgICAgIGlmIHNlbGYudHJhY2thcnRpc3RbaV06CisgICAgICAgICAgICAgICAgZi53cml0ZSgndHJhY2slci5hcnRpc3Q6XHQlc1xuJyAlIChpLCBzZWxmLnRyYWNrYXJ0aXN0W2ldKSkKKyAgICAgICAgICAgIHRyYWNrID0gc2VsZi50cmFja1tpXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9mZiA9IHRyYWNrLmluZGV4KCcsJykKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1RXJyb3I6CisgICAgICAgICAgICAgICAgcHJldnByZWYgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHByZXZwcmVmIGFuZCB0cmFja1s6b2ZmXSA9PSBwcmV2cHJlZjoKKyAgICAgICAgICAgICAgICAgICAgdHJhY2sgPSB0cmFja1tvZmY6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByZXZwcmVmID0gdHJhY2tbOm9mZl0KKyAgICAgICAgICAgIGYud3JpdGUoJ3RyYWNrJXIudGl0bGU6XHQlc1xuJyAlIChpLCB0cmFjaykpCisgICAgICAgIGYuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDUvY2RwbGF5ZXIucHkgYi9MaWIvcGxhdC1pcml4NS9jZHBsYXllci5weQppbmRleCAwZGQzZmUwLi4xYzAxNjhmIDEwMDc1NQotLS0gYS9MaWIvcGxhdC1pcml4NS9jZHBsYXllci5weQorKysgYi9MaWIvcGxhdC1pcml4NS9jZHBsYXllci5weQpAQCAtMTcsNzIgKzE3LDcyIEBACiBjZHBsYXllcnJjID0gJy5jZHBsYXllcnJjJwogCiBjbGFzcyBDZHBsYXllcjoKLQlkZWYgX19pbml0X18oc2VsZiwgdHJhY2tsaXN0KToKLQkJaW1wb3J0IHN0cmluZwotCQlzZWxmLmFydGlzdCA9ICcnCi0JCXNlbGYudGl0bGUgPSAnJwotCQlpZiB0eXBlKHRyYWNrbGlzdCkgPT0gdHlwZSgnJyk6Ci0JCQl0ID0gW10KLQkJCWZvciBpIGluIHJhbmdlKDIsIGxlbih0cmFja2xpc3QpLCA0KToKLQkJCQl0LmFwcGVuZCgoTm9uZSwgXAotCQkJCQkgIChzdHJpbmcuYXRvaSh0cmFja2xpc3RbaTppKzJdKSwgXAotCQkJCQkgICBzdHJpbmcuYXRvaSh0cmFja2xpc3RbaSsyOmkrNF0pKSkpCi0JCQl0cmFja2xpc3QgPSB0Ci0JCXNlbGYudHJhY2sgPSBbTm9uZV0gKyBbJyddICogbGVuKHRyYWNrbGlzdCkKLQkJc2VsZi5pZCA9ICdkJyArIHN0cmluZy56ZmlsbChsZW4odHJhY2tsaXN0KSwgMikKLQkJZm9yIHRyYWNrIGluIHRyYWNrbGlzdDoKLQkJCXN0YXJ0LCBsZW5ndGggPSB0cmFjawotCQkJc2VsZi5pZCA9IHNlbGYuaWQgKyBzdHJpbmcuemZpbGwobGVuZ3RoWzBdLCAyKSArIFwKLQkJCQkgIHN0cmluZy56ZmlsbChsZW5ndGhbMV0sIDIpCi0JCXRyeToKLQkJCWltcG9ydCBwb3NpeAotCQkJZiA9IG9wZW4ocG9zaXguZW52aXJvblsnSE9NRSddICsgJy8nICsgY2RwbGF5ZXJyYywgJ3InKQotCQlleGNlcHQgSU9FcnJvcjoKLQkJCXJldHVybgotCQlpbXBvcnQgcmUKLQkJcmVnID0gcmUuY29tcGlsZShyJ14oW146XSopOlx0KC4qKScpCi0JCXMgPSBzZWxmLmlkICsgJy4nCi0JCWwgPSBsZW4ocykKLQkJd2hpbGUgMToKLQkJCWxpbmUgPSBmLnJlYWRsaW5lKCkKLQkJCWlmIGxpbmUgPT0gJyc6Ci0JCQkJYnJlYWsKLQkJCWlmIGxpbmVbOmxdID09IHM6Ci0JCQkJbGluZSA9IGxpbmVbbDpdCi0JCQkJbWF0Y2ggPSByZWcubWF0Y2gobGluZSkKLQkJCQlpZiBub3QgbWF0Y2g6Ci0JCQkJCXByaW50ICdzeW50YXggZXJyb3IgaW4gfi8nICsgY2RwbGF5ZXJyYwotCQkJCQljb250aW51ZQotCQkJCW5hbWUsIHZhbHVlID0gbWF0Y2guZ3JvdXAoMSwgMikKLQkJCQlpZiBuYW1lID09ICd0aXRsZSc6Ci0JCQkJCXNlbGYudGl0bGUgPSB2YWx1ZQotCQkJCWVsaWYgbmFtZSA9PSAnYXJ0aXN0JzoKLQkJCQkJc2VsZi5hcnRpc3QgPSB2YWx1ZQotCQkJCWVsaWYgbmFtZVs6NV0gPT0gJ3RyYWNrJzoKLQkJCQkJdHJhY2tubyA9IHN0cmluZy5hdG9pKG5hbWVbNjpdKQotCQkJCQlzZWxmLnRyYWNrW3RyYWNrbm9dID0gdmFsdWUKLQkJZi5jbG9zZSgpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYWNrbGlzdCk6CisgICAgICAgIGltcG9ydCBzdHJpbmcKKyAgICAgICAgc2VsZi5hcnRpc3QgPSAnJworICAgICAgICBzZWxmLnRpdGxlID0gJycKKyAgICAgICAgaWYgdHlwZSh0cmFja2xpc3QpID09IHR5cGUoJycpOgorICAgICAgICAgICAgdCA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4odHJhY2tsaXN0KSwgNCk6CisgICAgICAgICAgICAgICAgdC5hcHBlbmQoKE5vbmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy5hdG9pKHRyYWNrbGlzdFtpOmkrMl0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuYXRvaSh0cmFja2xpc3RbaSsyOmkrNF0pKSkpCisgICAgICAgICAgICB0cmFja2xpc3QgPSB0CisgICAgICAgIHNlbGYudHJhY2sgPSBbTm9uZV0gKyBbJyddICogbGVuKHRyYWNrbGlzdCkKKyAgICAgICAgc2VsZi5pZCA9ICdkJyArIHN0cmluZy56ZmlsbChsZW4odHJhY2tsaXN0KSwgMikKKyAgICAgICAgZm9yIHRyYWNrIGluIHRyYWNrbGlzdDoKKyAgICAgICAgICAgIHN0YXJ0LCBsZW5ndGggPSB0cmFjaworICAgICAgICAgICAgc2VsZi5pZCA9IHNlbGYuaWQgKyBzdHJpbmcuemZpbGwobGVuZ3RoWzBdLCAyKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuemZpbGwobGVuZ3RoWzFdLCAyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgcG9zaXgKKyAgICAgICAgICAgIGYgPSBvcGVuKHBvc2l4LmVudmlyb25bJ0hPTUUnXSArICcvJyArIGNkcGxheWVycmMsICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIHJlZyA9IHJlLmNvbXBpbGUocideKFteOl0qKTpcdCguKiknKQorICAgICAgICBzID0gc2VsZi5pZCArICcuJworICAgICAgICBsID0gbGVuKHMpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lWzpsXSA9PSBzOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW2w6XQorICAgICAgICAgICAgICAgIG1hdGNoID0gcmVnLm1hdGNoKGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnc3ludGF4IGVycm9yIGluIH4vJyArIGNkcGxheWVycmMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSA9IG1hdGNoLmdyb3VwKDEsIDIpCisgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAndGl0bGUnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRpdGxlID0gdmFsdWUKKyAgICAgICAgICAgICAgICBlbGlmIG5hbWUgPT0gJ2FydGlzdCc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXJ0aXN0ID0gdmFsdWUKKyAgICAgICAgICAgICAgICBlbGlmIG5hbWVbOjVdID09ICd0cmFjayc6CisgICAgICAgICAgICAgICAgICAgIHRyYWNrbm8gPSBzdHJpbmcuYXRvaShuYW1lWzY6XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50cmFja1t0cmFja25vXSA9IHZhbHVlCisgICAgICAgIGYuY2xvc2UoKQogCi0JZGVmIHdyaXRlKHNlbGYpOgotCQlpbXBvcnQgcG9zaXgKLQkJZmlsZW5hbWUgPSBwb3NpeC5lbnZpcm9uWydIT01FJ10gKyAnLycgKyBjZHBsYXllcnJjCi0JCXRyeToKLQkJCW9sZCA9IG9wZW4oZmlsZW5hbWUsICdyJykKLQkJZXhjZXB0IElPRXJyb3I6Ci0JCQlvbGQgPSBvcGVuKCcvZGV2L251bGwnLCAncicpCi0JCW5ldyA9IG9wZW4oZmlsZW5hbWUgKyAnLm5ldycsICd3JykKLQkJcyA9IHNlbGYuaWQgKyAnLicKLQkJbCA9IGxlbihzKQotCQl3aGlsZSAxOgotCQkJbGluZSA9IG9sZC5yZWFkbGluZSgpCi0JCQlpZiBsaW5lID09ICcnOgotCQkJCWJyZWFrCi0JCQlpZiBsaW5lWzpsXSAhPSBzOgotCQkJCW5ldy53cml0ZShsaW5lKQotCQluZXcud3JpdGUoc2VsZi5pZCArICcudGl0bGU6XHQnICsgc2VsZi50aXRsZSArICdcbicpCi0JCW5ldy53cml0ZShzZWxmLmlkICsgJy5hcnRpc3Q6XHQnICsgc2VsZi5hcnRpc3QgKyAnXG4nKQotCQlmb3IgaSBpbiByYW5nZSgxLCBsZW4oc2VsZi50cmFjaykpOgotCQkJbmV3LndyaXRlKCclcy50cmFjay4lcjpcdCVzXG4nICUgKHNlbGYuaWQsIGksIHNlbGYudHJhY2tbaV0pKQotCQlvbGQuY2xvc2UoKQotCQluZXcuY2xvc2UoKQotCQlwb3NpeC5yZW5hbWUoZmlsZW5hbWUgKyAnLm5ldycsIGZpbGVuYW1lKQorICAgIGRlZiB3cml0ZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHBvc2l4CisgICAgICAgIGZpbGVuYW1lID0gcG9zaXguZW52aXJvblsnSE9NRSddICsgJy8nICsgY2RwbGF5ZXJyYworICAgICAgICB0cnk6CisgICAgICAgICAgICBvbGQgPSBvcGVuKGZpbGVuYW1lLCAncicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgb2xkID0gb3BlbignL2Rldi9udWxsJywgJ3InKQorICAgICAgICBuZXcgPSBvcGVuKGZpbGVuYW1lICsgJy5uZXcnLCAndycpCisgICAgICAgIHMgPSBzZWxmLmlkICsgJy4nCisgICAgICAgIGwgPSBsZW4ocykKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBvbGQucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbGluZVs6bF0gIT0gczoKKyAgICAgICAgICAgICAgICBuZXcud3JpdGUobGluZSkKKyAgICAgICAgbmV3LndyaXRlKHNlbGYuaWQgKyAnLnRpdGxlOlx0JyArIHNlbGYudGl0bGUgKyAnXG4nKQorICAgICAgICBuZXcud3JpdGUoc2VsZi5pZCArICcuYXJ0aXN0Olx0JyArIHNlbGYuYXJ0aXN0ICsgJ1xuJykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHNlbGYudHJhY2spKToKKyAgICAgICAgICAgIG5ldy53cml0ZSgnJXMudHJhY2suJXI6XHQlc1xuJyAlIChzZWxmLmlkLCBpLCBzZWxmLnRyYWNrW2ldKSkKKyAgICAgICAgb2xkLmNsb3NlKCkKKyAgICAgICAgbmV3LmNsb3NlKCkKKyAgICAgICAgcG9zaXgucmVuYW1lKGZpbGVuYW1lICsgJy5uZXcnLCBmaWxlbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWlyaXg1L2ZscC5weSBiL0xpYi9wbGF0LWlyaXg1L2ZscC5weQppbmRleCBiMjJiYzFhLi40ZjkxNzVmIDEwMDc1NQotLS0gYS9MaWIvcGxhdC1pcml4NS9mbHAucHkKKysrIGIvTGliL3BsYXQtaXJpeDUvZmxwLnB5CkBAIC04MCwxOCArODAsMTggQEAKICAgICAgICAgZnAuY2xvc2UoKQogCiBkZWYgX3VucGFja19jYWNoZShhbHRmb3Jtcyk6Ci0gICAgICAgIGZvcm1zID0ge30KLSAgICAgICAgZm9yIG5hbWUgaW4gYWx0Zm9ybXMua2V5cygpOgotICAgICAgICAgICAgYWx0b2JqLCBhbHRsaXN0ID0gYWx0Zm9ybXNbbmFtZV0KLSAgICAgICAgICAgIG9iaiA9IF9uZXdvYmooKQotICAgICAgICAgICAgb2JqLm1ha2UoYWx0b2JqKQotICAgICAgICAgICAgbGlzdCA9IFtdCi0gICAgICAgICAgICBmb3IgYWx0b2JqIGluIGFsdGxpc3Q6Ci0gICAgICAgICAgICAgICAgbm9iaiA9IF9uZXdvYmooKQotICAgICAgICAgICAgICAgIG5vYmoubWFrZShhbHRvYmopCi0gICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQobm9iaikKLSAgICAgICAgICAgIGZvcm1zW25hbWVdID0gb2JqLCBsaXN0Ci0gICAgICAgIHJldHVybiBmb3JtcworICAgIGZvcm1zID0ge30KKyAgICBmb3IgbmFtZSBpbiBhbHRmb3Jtcy5rZXlzKCk6CisgICAgICAgIGFsdG9iaiwgYWx0bGlzdCA9IGFsdGZvcm1zW25hbWVdCisgICAgICAgIG9iaiA9IF9uZXdvYmooKQorICAgICAgICBvYmoubWFrZShhbHRvYmopCisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICBmb3IgYWx0b2JqIGluIGFsdGxpc3Q6CisgICAgICAgICAgICBub2JqID0gX25ld29iaigpCisgICAgICAgICAgICBub2JqLm1ha2UoYWx0b2JqKQorICAgICAgICAgICAgbGlzdC5hcHBlbmQobm9iaikKKyAgICAgICAgZm9ybXNbbmFtZV0gPSBvYmosIGxpc3QKKyAgICByZXR1cm4gZm9ybXMKIAogZGVmIHJkbG9uZyhmcCk6CiAgICAgcyA9IGZwLnJlYWQoNCkKQEAgLTI3Nyw4ICsyNzcsOCBAQAogICAgICAgICByZXR1cm4gbGluZQogICAgIG5hbWUsIHZhbHVlID0gbWF0Y2guZ3JvdXAoMSwgMikKICAgICBpZiBuYW1lWzBdID09ICdOJzoKLSAgICAgICAgICAgIG5hbWUgPSBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQobmFtZSksJycpCi0gICAgICAgICAgICBuYW1lID0gc3RyaW5nLmxvd2VyKG5hbWUpCisgICAgICAgIG5hbWUgPSBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQobmFtZSksJycpCisgICAgICAgIG5hbWUgPSBzdHJpbmcubG93ZXIobmFtZSkKICAgICBuYW1lID0gc3RyaW5nLmNhcGl0YWxpemUobmFtZSkKICAgICB0cnk6CiAgICAgICAgIHBmID0gX3BhcnNlX2Z1bmNbbmFtZV0KQEAgLTI5Miw3ICsyOTIsNyBAQAogICAgIGlmIG5vdCBsaW5lOgogICAgICAgICByYWlzZSBFT0ZFcnJvcgogICAgIHJldHVybiBsaW5lWzotMV0KLSAgICAgICAgCisKIGRlZiBfcGFyc2VfMV9saW5lKGZpbGUpOgogICAgIGxpbmUgPSBfcmVhZGxpbmUoZmlsZSkKICAgICB3aGlsZSBsaW5lID09ICcnOgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDUvanBlZy5weSBiL0xpYi9wbGF0LWlyaXg1L2pwZWcucHkKaW5kZXggZGEyMGQ2Yi4uZjhmYzdlNyAxMDA3NTUKLS0tIGEvTGliL3BsYXQtaXJpeDUvanBlZy5weQorKysgYi9MaWIvcGxhdC1pcml4NS9qcGVnLnB5CkBAIC02LDcgKzYsNyBAQAogIyBYWFggdGhlIHJlc3VsdGluZyBmaWxlIGNhdXNlcyB3ZWlyZG5lc3MuCiAKIGNsYXNzIGVycm9yKEV4Y2VwdGlvbik6Ci0JcGFzcworICAgIHBhc3MKIAogb3B0aW9ucyA9IHsncXVhbGl0eSc6IDc1LCAnb3B0aW1pemUnOiAwLCAnc21vb3RoJzogMCwgJ2ZvcmNlZ3JheSc6IDB9CiAKQEAgLTE0LDk4ICsxNCw5OCBAQAogZGVjb21wID0gTm9uZQogCiBkZWYgY29tcHJlc3MoaW1nZGF0YSwgd2lkdGgsIGhlaWdodCwgYnl0ZXNwZXJwaXhlbCk6Ci0JZ2xvYmFsIGNvbXAKLQlpbXBvcnQgY2wKLQlpZiBjb21wIGlzIE5vbmU6IGNvbXAgPSBjbC5PcGVuQ29tcHJlc3NvcihjbC5KUEVHKQotCWlmIGJ5dGVzcGVycGl4ZWwgPT0gMToKLQkJZm9ybWF0ID0gY2wuR1JBWVNDQUxFCi0JZWxpZiBieXRlc3BlcnBpeGVsID09IDQ6Ci0JCWZvcm1hdCA9IGNsLlJHQlgKLQlpZiBvcHRpb25zWydmb3JjZWdyYXknXToKLQkJaWZvcm1hdCA9IGNsLkdSQVlTQ0FMRQotCWVsc2U6Ci0JCWlmb3JtYXQgPSBjbC5ZVVYKLQkjIFhYWCBIb3cgdG8gc3VwcG9ydCAnb3B0aW1pemUnPwotCXBhcmFtcyA9IFtjbC5JTUFHRV9XSURUSCwgd2lkdGgsIGNsLklNQUdFX0hFSUdIVCwgaGVpZ2h0LCBcCi0JCSAgY2wuT1JJR0lOQUxfRk9STUFULCBmb3JtYXQsIFwKLQkJICBjbC5PUklFTlRBVElPTiwgY2wuQk9UVE9NX1VQLCBcCi0JCSAgY2wuUVVBTElUWV9GQUNUT1IsIG9wdGlvbnNbJ3F1YWxpdHknXSwgXAotCQkgIGNsLklOVEVSTkFMX0ZPUk1BVCwgaWZvcm1hdCwgXAotCQkgXQotCWNvbXAuU2V0UGFyYW1zKHBhcmFtcykKLQlqcGVnZGF0YSA9IGNvbXAuQ29tcHJlc3MoMSwgaW1nZGF0YSkKLQlyZXR1cm4ganBlZ2RhdGEKKyAgICBnbG9iYWwgY29tcAorICAgIGltcG9ydCBjbAorICAgIGlmIGNvbXAgaXMgTm9uZTogY29tcCA9IGNsLk9wZW5Db21wcmVzc29yKGNsLkpQRUcpCisgICAgaWYgYnl0ZXNwZXJwaXhlbCA9PSAxOgorICAgICAgICBmb3JtYXQgPSBjbC5HUkFZU0NBTEUKKyAgICBlbGlmIGJ5dGVzcGVycGl4ZWwgPT0gNDoKKyAgICAgICAgZm9ybWF0ID0gY2wuUkdCWAorICAgIGlmIG9wdGlvbnNbJ2ZvcmNlZ3JheSddOgorICAgICAgICBpZm9ybWF0ID0gY2wuR1JBWVNDQUxFCisgICAgZWxzZToKKyAgICAgICAgaWZvcm1hdCA9IGNsLllVVgorICAgICMgWFhYIEhvdyB0byBzdXBwb3J0ICdvcHRpbWl6ZSc/CisgICAgcGFyYW1zID0gW2NsLklNQUdFX1dJRFRILCB3aWR0aCwgY2wuSU1BR0VfSEVJR0hULCBoZWlnaHQsIFwKKyAgICAgICAgICAgICAgY2wuT1JJR0lOQUxfRk9STUFULCBmb3JtYXQsIFwKKyAgICAgICAgICAgICAgY2wuT1JJRU5UQVRJT04sIGNsLkJPVFRPTV9VUCwgXAorICAgICAgICAgICAgICBjbC5RVUFMSVRZX0ZBQ1RPUiwgb3B0aW9uc1sncXVhbGl0eSddLCBcCisgICAgICAgICAgICAgIGNsLklOVEVSTkFMX0ZPUk1BVCwgaWZvcm1hdCwgXAorICAgICAgICAgICAgIF0KKyAgICBjb21wLlNldFBhcmFtcyhwYXJhbXMpCisgICAganBlZ2RhdGEgPSBjb21wLkNvbXByZXNzKDEsIGltZ2RhdGEpCisgICAgcmV0dXJuIGpwZWdkYXRhCiAKIGRlZiBkZWNvbXByZXNzKGpwZWdkYXRhKToKLQlnbG9iYWwgZGVjb21wCi0JaW1wb3J0IGNsCi0JaWYgZGVjb21wIGlzIE5vbmU6IGRlY29tcCA9IGNsLk9wZW5EZWNvbXByZXNzb3IoY2wuSlBFRykKLQloZWFkZXJzaXplID0gZGVjb21wLlJlYWRIZWFkZXIoanBlZ2RhdGEpCi0JcGFyYW1zID0gW2NsLklNQUdFX1dJRFRILCAwLCBjbC5JTUFHRV9IRUlHSFQsIDAsIGNsLklOVEVSTkFMX0ZPUk1BVCwgMF0KLQlkZWNvbXAuR2V0UGFyYW1zKHBhcmFtcykKLQl3aWR0aCwgaGVpZ2h0LCBmb3JtYXQgPSBwYXJhbXNbMV0sIHBhcmFtc1szXSwgcGFyYW1zWzVdCi0JaWYgZm9ybWF0ID09IGNsLkdSQVlTQ0FMRSBvciBvcHRpb25zWydmb3JjZWdyYXknXToKLQkJZm9ybWF0ID0gY2wuR1JBWVNDQUxFCi0JCWJ5dGVzcGVycGl4ZWwgPSAxCi0JZWxzZToKLQkJZm9ybWF0ID0gY2wuUkdCWAotCQlieXRlc3BlcnBpeGVsID0gNAotCSMgWFhYIEhvdyB0byBzdXBwb3J0ICdzbW9vdGgnPwotCXBhcmFtcyA9IFtjbC5PUklHSU5BTF9GT1JNQVQsIGZvcm1hdCwgXAotCQkgIGNsLk9SSUVOVEFUSU9OLCBjbC5CT1RUT01fVVAsIFwKLQkJICBjbC5GUkFNRV9CVUZGRVJfU0laRSwgd2lkdGgqaGVpZ2h0KmJ5dGVzcGVycGl4ZWxdCi0JZGVjb21wLlNldFBhcmFtcyhwYXJhbXMpCi0JaW1nZGF0YSA9IGRlY29tcC5EZWNvbXByZXNzKDEsIGpwZWdkYXRhKQotCXJldHVybiBpbWdkYXRhLCB3aWR0aCwgaGVpZ2h0LCBieXRlc3BlcnBpeGVsCisgICAgZ2xvYmFsIGRlY29tcAorICAgIGltcG9ydCBjbAorICAgIGlmIGRlY29tcCBpcyBOb25lOiBkZWNvbXAgPSBjbC5PcGVuRGVjb21wcmVzc29yKGNsLkpQRUcpCisgICAgaGVhZGVyc2l6ZSA9IGRlY29tcC5SZWFkSGVhZGVyKGpwZWdkYXRhKQorICAgIHBhcmFtcyA9IFtjbC5JTUFHRV9XSURUSCwgMCwgY2wuSU1BR0VfSEVJR0hULCAwLCBjbC5JTlRFUk5BTF9GT1JNQVQsIDBdCisgICAgZGVjb21wLkdldFBhcmFtcyhwYXJhbXMpCisgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0ID0gcGFyYW1zWzFdLCBwYXJhbXNbM10sIHBhcmFtc1s1XQorICAgIGlmIGZvcm1hdCA9PSBjbC5HUkFZU0NBTEUgb3Igb3B0aW9uc1snZm9yY2VncmF5J106CisgICAgICAgIGZvcm1hdCA9IGNsLkdSQVlTQ0FMRQorICAgICAgICBieXRlc3BlcnBpeGVsID0gMQorICAgIGVsc2U6CisgICAgICAgIGZvcm1hdCA9IGNsLlJHQlgKKyAgICAgICAgYnl0ZXNwZXJwaXhlbCA9IDQKKyAgICAjIFhYWCBIb3cgdG8gc3VwcG9ydCAnc21vb3RoJz8KKyAgICBwYXJhbXMgPSBbY2wuT1JJR0lOQUxfRk9STUFULCBmb3JtYXQsIFwKKyAgICAgICAgICAgICAgY2wuT1JJRU5UQVRJT04sIGNsLkJPVFRPTV9VUCwgXAorICAgICAgICAgICAgICBjbC5GUkFNRV9CVUZGRVJfU0laRSwgd2lkdGgqaGVpZ2h0KmJ5dGVzcGVycGl4ZWxdCisgICAgZGVjb21wLlNldFBhcmFtcyhwYXJhbXMpCisgICAgaW1nZGF0YSA9IGRlY29tcC5EZWNvbXByZXNzKDEsIGpwZWdkYXRhKQorICAgIHJldHVybiBpbWdkYXRhLCB3aWR0aCwgaGVpZ2h0LCBieXRlc3BlcnBpeGVsCiAKIGRlZiBzZXRvcHRpb24obmFtZSwgdmFsdWUpOgotCWlmIHR5cGUodmFsdWUpIGlzIG5vdCB0eXBlKDApOgotCQlyYWlzZSBUeXBlRXJyb3IsICdqcGVnLnNldG9wdGlvbjogbnVtZXJpYyBvcHRpb25zIG9ubHknCi0JaWYgbmFtZSA9PSAnZm9yY2VncmV5JzoKLQkJbmFtZSA9ICdmb3JjZWdyYXknCi0JaWYgbm90IG9wdGlvbnMuaGFzX2tleShuYW1lKToKLQkJcmFpc2UgS2V5RXJyb3IsICdqcGVnLnNldG9wdGlvbjogdW5rbm93biBvcHRpb24gbmFtZScKLQlvcHRpb25zW25hbWVdID0gaW50KHZhbHVlKQorICAgIGlmIHR5cGUodmFsdWUpIGlzIG5vdCB0eXBlKDApOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdqcGVnLnNldG9wdGlvbjogbnVtZXJpYyBvcHRpb25zIG9ubHknCisgICAgaWYgbmFtZSA9PSAnZm9yY2VncmV5JzoKKyAgICAgICAgbmFtZSA9ICdmb3JjZWdyYXknCisgICAgaWYgbm90IG9wdGlvbnMuaGFzX2tleShuYW1lKToKKyAgICAgICAgcmFpc2UgS2V5RXJyb3IsICdqcGVnLnNldG9wdGlvbjogdW5rbm93biBvcHRpb24gbmFtZScKKyAgICBvcHRpb25zW25hbWVdID0gaW50KHZhbHVlKQogCiBkZWYgdGVzdCgpOgotCWltcG9ydCBzeXMKLQlpZiBzeXMuYXJndlsxOjJdID09IFsnLWcnXToKLQkJZGVsIHN5cy5hcmd2WzFdCi0JCXNldG9wdGlvbignZm9yY2VncmF5JywgMSkKLQlpZiBub3Qgc3lzLmFyZ3ZbMTpdOgotCQlzeXMuYXJndi5hcHBlbmQoJy91c3IvbG9jYWwvaW1hZ2VzL2RhdGEvanBnL2FzdGVyaXguanBnJykKLQlmb3IgZmlsZSBpbiBzeXMuYXJndlsxOl06Ci0JCXNob3coZmlsZSkKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgc3lzLmFyZ3ZbMToyXSA9PSBbJy1nJ106CisgICAgICAgIGRlbCBzeXMuYXJndlsxXQorICAgICAgICBzZXRvcHRpb24oJ2ZvcmNlZ3JheScsIDEpCisgICAgaWYgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgc3lzLmFyZ3YuYXBwZW5kKCcvdXNyL2xvY2FsL2ltYWdlcy9kYXRhL2pwZy9hc3Rlcml4LmpwZycpCisgICAgZm9yIGZpbGUgaW4gc3lzLmFyZ3ZbMTpdOgorICAgICAgICBzaG93KGZpbGUpCiAKIGRlZiBzaG93KGZpbGUpOgotCWltcG9ydCBnbCwgR0wsIERFVklDRQotCWpwZWdkYXRhID0gb3BlbihmaWxlLCAncicpLnJlYWQoKQotCWltZ2RhdGEsIHdpZHRoLCBoZWlnaHQsIGJ5dGVzcGVycGl4ZWwgPSBkZWNvbXByZXNzKGpwZWdkYXRhKQotCWdsLmZvcmVncm91bmQoKQotCWdsLnByZWZzaXplKHdpZHRoLCBoZWlnaHQpCi0Jd2luID0gZ2wud2lub3BlbihmaWxlKQotCWlmIGJ5dGVzcGVycGl4ZWwgPT0gMToKLQkJZ2wuY21vZGUoKQotCQlnbC5waXhtb2RlKEdMLlBNX1NJWkUsIDgpCi0JCWdsLmdjb25maWcoKQotCQlmb3IgaSBpbiByYW5nZSgyNTYpOgotCQkJZ2wubWFwY29sb3IoaSwgaSwgaSwgaSkKLQllbHNlOgotCQlnbC5SR0Jtb2RlKCkKLQkJZ2wucGl4bW9kZShHTC5QTV9TSVpFLCAzMikKLQkJZ2wuZ2NvbmZpZygpCi0JZ2wucWRldmljZShERVZJQ0UuUkVEUkFXKQotCWdsLnFkZXZpY2UoREVWSUNFLkVTQ0tFWSkKLQlnbC5xZGV2aWNlKERFVklDRS5XSU5RVUlUKQotCWdsLnFkZXZpY2UoREVWSUNFLldJTlNIVVQpCi0JZ2wubHJlY3R3cml0ZSgwLCAwLCB3aWR0aC0xLCBoZWlnaHQtMSwgaW1nZGF0YSkKLQl3aGlsZSAxOgotCQlkZXYsIHZhbCA9IGdsLnFyZWFkKCkKLQkJaWYgZGV2IGluIChERVZJQ0UuRVNDS0VZLCBERVZJQ0UuV0lOU0hVVCwgREVWSUNFLldJTlFVSVQpOgotCQkJYnJlYWsKLQkJaWYgZGV2ID09IERFVklDRS5SRURSQVc6Ci0JCQlnbC5scmVjdHdyaXRlKDAsIDAsIHdpZHRoLTEsIGhlaWdodC0xLCBpbWdkYXRhKQotCWdsLndpbmNsb3NlKHdpbikKLQkjIE5vdyB0ZXN0IHRoZSBjb21wcmVzc2lvbiBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBhIGZpeGVkIGZpbGVuYW1lCi0JbmV3anBlZ2RhdGEgPSBjb21wcmVzcyhpbWdkYXRhLCB3aWR0aCwgaGVpZ2h0LCBieXRlc3BlcnBpeGVsKQotCW9wZW4oJy90bXAvai5qcGcnLCAndycpLndyaXRlKG5ld2pwZWdkYXRhKQorICAgIGltcG9ydCBnbCwgR0wsIERFVklDRQorICAgIGpwZWdkYXRhID0gb3BlbihmaWxlLCAncicpLnJlYWQoKQorICAgIGltZ2RhdGEsIHdpZHRoLCBoZWlnaHQsIGJ5dGVzcGVycGl4ZWwgPSBkZWNvbXByZXNzKGpwZWdkYXRhKQorICAgIGdsLmZvcmVncm91bmQoKQorICAgIGdsLnByZWZzaXplKHdpZHRoLCBoZWlnaHQpCisgICAgd2luID0gZ2wud2lub3BlbihmaWxlKQorICAgIGlmIGJ5dGVzcGVycGl4ZWwgPT0gMToKKyAgICAgICAgZ2wuY21vZGUoKQorICAgICAgICBnbC5waXhtb2RlKEdMLlBNX1NJWkUsIDgpCisgICAgICAgIGdsLmdjb25maWcoKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgZ2wubWFwY29sb3IoaSwgaSwgaSwgaSkKKyAgICBlbHNlOgorICAgICAgICBnbC5SR0Jtb2RlKCkKKyAgICAgICAgZ2wucGl4bW9kZShHTC5QTV9TSVpFLCAzMikKKyAgICAgICAgZ2wuZ2NvbmZpZygpCisgICAgZ2wucWRldmljZShERVZJQ0UuUkVEUkFXKQorICAgIGdsLnFkZXZpY2UoREVWSUNFLkVTQ0tFWSkKKyAgICBnbC5xZGV2aWNlKERFVklDRS5XSU5RVUlUKQorICAgIGdsLnFkZXZpY2UoREVWSUNFLldJTlNIVVQpCisgICAgZ2wubHJlY3R3cml0ZSgwLCAwLCB3aWR0aC0xLCBoZWlnaHQtMSwgaW1nZGF0YSkKKyAgICB3aGlsZSAxOgorICAgICAgICBkZXYsIHZhbCA9IGdsLnFyZWFkKCkKKyAgICAgICAgaWYgZGV2IGluIChERVZJQ0UuRVNDS0VZLCBERVZJQ0UuV0lOU0hVVCwgREVWSUNFLldJTlFVSVQpOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZGV2ID09IERFVklDRS5SRURSQVc6CisgICAgICAgICAgICBnbC5scmVjdHdyaXRlKDAsIDAsIHdpZHRoLTEsIGhlaWdodC0xLCBpbWdkYXRhKQorICAgIGdsLndpbmNsb3NlKHdpbikKKyAgICAjIE5vdyB0ZXN0IHRoZSBjb21wcmVzc2lvbiBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBhIGZpeGVkIGZpbGVuYW1lCisgICAgbmV3anBlZ2RhdGEgPSBjb21wcmVzcyhpbWdkYXRhLCB3aWR0aCwgaGVpZ2h0LCBieXRlc3BlcnBpeGVsKQorICAgIG9wZW4oJy90bXAvai5qcGcnLCAndycpLndyaXRlKG5ld2pwZWdkYXRhKQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDUvcGFuZWwucHkgYi9MaWIvcGxhdC1pcml4NS9wYW5lbC5weQppbmRleCAzYWE3NDQ4Li4xMmU2MmE1IDEwMDc1NQotLS0gYS9MaWIvcGxhdC1pcml4NS9wYW5lbC5weQorKysgYi9MaWIvcGxhdC1pcml4NS9wYW5lbC5weQpAQCAtMTcsODIgKzE3LDgyIEBACiAjIFRlc3QgaWYgYW4gb2JqZWN0IGlzIGEgbGlzdC4KICMKIGRlZiBpc19saXN0KHgpOgotCXJldHVybiB0eXBlKHgpID09IHR5cGUoW10pCisgICAgcmV0dXJuIHR5cGUoeCkgPT0gdHlwZShbXSkKIAogCiAjIFJldmVyc2UgYSBsaXN0LgogIwogZGVmIHJldmVyc2UobGlzdCk6Ci0JcmVzID0gW10KLQlmb3IgaXRlbSBpbiBsaXN0OgotCQlyZXMuaW5zZXJ0KDAsIGl0ZW0pCi0JcmV0dXJuIHJlcworICAgIHJlcyA9IFtdCisgICAgZm9yIGl0ZW0gaW4gbGlzdDoKKyAgICAgICAgcmVzLmluc2VydCgwLCBpdGVtKQorICAgIHJldHVybiByZXMKIAogCiAjIEdldCBhbiBhdHRyaWJ1dGUgb2YgYSBsaXN0LCB3aGljaCBtYXkgaXRzZWxmIGJlIGFub3RoZXIgbGlzdC4KICMgRG9uJ3QgdXNlICdwcm9wJyBmb3IgbmFtZS4KICMKIGRlZiBnZXRhdHRybGlzdChsaXN0LCBuYW1lKToKLQlmb3IgaXRlbSBpbiBsaXN0OgotCQlpZiBpdGVtIGFuZCBpc19saXN0KGl0ZW0pIGFuZCBpdGVtWzBdID09IG5hbWU6Ci0JCQlyZXR1cm4gaXRlbVsxOl0KLQlyZXR1cm4gW10KKyAgICBmb3IgaXRlbSBpbiBsaXN0OgorICAgICAgICBpZiBpdGVtIGFuZCBpc19saXN0KGl0ZW0pIGFuZCBpdGVtWzBdID09IG5hbWU6CisgICAgICAgICAgICByZXR1cm4gaXRlbVsxOl0KKyAgICByZXR1cm4gW10KIAogCiAjIEdldCBhIHByb3BlcnR5IG9mIGEgbGlzdCwgd2hpY2ggbWF5IGl0c2VsZiBiZSBhbm90aGVyIGxpc3QuCiAjCiBkZWYgZ2V0cHJvcGxpc3QobGlzdCwgbmFtZSk6Ci0JZm9yIGl0ZW0gaW4gbGlzdDoKLQkJaWYgaXRlbSBhbmQgaXNfbGlzdChpdGVtKSBhbmQgaXRlbVswXSA9PSAncHJvcCc6Ci0JCQlpZiBsZW4oaXRlbSkgPiAxIGFuZCBpdGVtWzFdID09IG5hbWU6Ci0JCQkJcmV0dXJuIGl0ZW1bMjpdCi0JcmV0dXJuIFtdCisgICAgZm9yIGl0ZW0gaW4gbGlzdDoKKyAgICAgICAgaWYgaXRlbSBhbmQgaXNfbGlzdChpdGVtKSBhbmQgaXRlbVswXSA9PSAncHJvcCc6CisgICAgICAgICAgICBpZiBsZW4oaXRlbSkgPiAxIGFuZCBpdGVtWzFdID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bMjpdCisgICAgcmV0dXJuIFtdCiAKIAogIyBUZXN0IGlmIGFuIGFjdHVhdG9yIGRlc2NyaXB0aW9uIGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSAnZW5kLW9mLWdyb3VwJwogIwogZGVmIGlzX2VuZGdyb3VwKGxpc3QpOgotCXggPSBnZXRwcm9wbGlzdChsaXN0LCAnZW5kLW9mLWdyb3VwJykKLQlyZXR1cm4gKHggYW5kIHhbMF0gPT0gJyN0JykKKyAgICB4ID0gZ2V0cHJvcGxpc3QobGlzdCwgJ2VuZC1vZi1ncm91cCcpCisgICAgcmV0dXJuICh4IGFuZCB4WzBdID09ICcjdCcpCiAKIAogIyBOZWF0bHkgZGlzcGxheSBhbiBhY3R1YXRvciBkZWZpbml0aW9uIGdpdmVuIGFzIFMtZXhwcmVzc2lvbgogIyB0aGUgcHJlZml4IHN0cmluZyBpcyBwcmludGVkIGJlZm9yZSBlYWNoIGxpbmUuCiAjCiBkZWYgc2hvd19hY3R1YXRvcihwcmVmaXgsIGEpOgotCWZvciBpdGVtIGluIGE6Ci0JCWlmIG5vdCBpc19saXN0KGl0ZW0pOgotCQkJcHJpbnQgcHJlZml4LCBpdGVtCi0JCWVsaWYgaXRlbSBhbmQgaXRlbVswXSA9PSAnYWwnOgotCQkJcHJpbnQgcHJlZml4LCAnU3ViYWN0dWF0b3IgbGlzdDonCi0JCQlmb3IgYSBpbiBpdGVtWzE6XToKLQkJCQlzaG93X2FjdHVhdG9yKHByZWZpeCArICcgICAgJywgYSkKLQkJZWxpZiBsZW4oaXRlbSkgPT0gMjoKLQkJCXByaW50IHByZWZpeCwgaXRlbVswXSwgJz0+JywgaXRlbVsxXQotCQllbGlmIGxlbihpdGVtKSA9PSAzIGFuZCBpdGVtWzBdID09ICdwcm9wJzoKLQkJCXByaW50IHByZWZpeCwgJ1Byb3AnLCBpdGVtWzFdLCAnPT4nLAotCQkJcHJpbnQgaXRlbVsyXQotCQllbHNlOgotCQkJcHJpbnQgcHJlZml4LCAnPycsIGl0ZW0KKyAgICBmb3IgaXRlbSBpbiBhOgorICAgICAgICBpZiBub3QgaXNfbGlzdChpdGVtKToKKyAgICAgICAgICAgIHByaW50IHByZWZpeCwgaXRlbQorICAgICAgICBlbGlmIGl0ZW0gYW5kIGl0ZW1bMF0gPT0gJ2FsJzoKKyAgICAgICAgICAgIHByaW50IHByZWZpeCwgJ1N1YmFjdHVhdG9yIGxpc3Q6JworICAgICAgICAgICAgZm9yIGEgaW4gaXRlbVsxOl06CisgICAgICAgICAgICAgICAgc2hvd19hY3R1YXRvcihwcmVmaXggKyAnICAgICcsIGEpCisgICAgICAgIGVsaWYgbGVuKGl0ZW0pID09IDI6CisgICAgICAgICAgICBwcmludCBwcmVmaXgsIGl0ZW1bMF0sICc9PicsIGl0ZW1bMV0KKyAgICAgICAgZWxpZiBsZW4oaXRlbSkgPT0gMyBhbmQgaXRlbVswXSA9PSAncHJvcCc6CisgICAgICAgICAgICBwcmludCBwcmVmaXgsICdQcm9wJywgaXRlbVsxXSwgJz0+JywKKyAgICAgICAgICAgIHByaW50IGl0ZW1bMl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50IHByZWZpeCwgJz8nLCBpdGVtCiAKIAogIyBOZWF0bHkgZGlzcGxheSBhIHBhbmVsLgogIwogZGVmIHNob3dfcGFuZWwocHJlZml4LCBwKToKLQlmb3IgaXRlbSBpbiBwOgotCQlpZiBub3QgaXNfbGlzdChpdGVtKToKLQkJCXByaW50IHByZWZpeCwgaXRlbQotCQllbGlmIGl0ZW0gYW5kIGl0ZW1bMF0gPT0gJ2FsJzoKLQkJCXByaW50IHByZWZpeCwgJ0FjdHVhdG9yIGxpc3Q6JwotCQkJZm9yIGEgaW4gaXRlbVsxOl06Ci0JCQkJc2hvd19hY3R1YXRvcihwcmVmaXggKyAnICAgICcsIGEpCi0JCWVsaWYgbGVuKGl0ZW0pID09IDI6Ci0JCQlwcmludCBwcmVmaXgsIGl0ZW1bMF0sICc9PicsIGl0ZW1bMV0KLQkJZWxpZiBsZW4oaXRlbSkgPT0gMyBhbmQgaXRlbVswXSA9PSAncHJvcCc6Ci0JCQlwcmludCBwcmVmaXgsICdQcm9wJywgaXRlbVsxXSwgJz0+JywKLQkJCXByaW50IGl0ZW1bMl0KLQkJZWxzZToKLQkJCXByaW50IHByZWZpeCwgJz8nLCBpdGVtCisgICAgZm9yIGl0ZW0gaW4gcDoKKyAgICAgICAgaWYgbm90IGlzX2xpc3QoaXRlbSk6CisgICAgICAgICAgICBwcmludCBwcmVmaXgsIGl0ZW0KKyAgICAgICAgZWxpZiBpdGVtIGFuZCBpdGVtWzBdID09ICdhbCc6CisgICAgICAgICAgICBwcmludCBwcmVmaXgsICdBY3R1YXRvciBsaXN0OicKKyAgICAgICAgICAgIGZvciBhIGluIGl0ZW1bMTpdOgorICAgICAgICAgICAgICAgIHNob3dfYWN0dWF0b3IocHJlZml4ICsgJyAgICAnLCBhKQorICAgICAgICBlbGlmIGxlbihpdGVtKSA9PSAyOgorICAgICAgICAgICAgcHJpbnQgcHJlZml4LCBpdGVtWzBdLCAnPT4nLCBpdGVtWzFdCisgICAgICAgIGVsaWYgbGVuKGl0ZW0pID09IDMgYW5kIGl0ZW1bMF0gPT0gJ3Byb3AnOgorICAgICAgICAgICAgcHJpbnQgcHJlZml4LCAnUHJvcCcsIGl0ZW1bMV0sICc9PicsCisgICAgICAgICAgICBwcmludCBpdGVtWzJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCBwcmVmaXgsICc/JywgaXRlbQogCiAKICMgRXhjZXB0aW9uIHJhaXNlZCBieSBidWlsZF9hY3R1YXRvciBvciBidWlsZF9wYW5lbC4KQEAgLTEwMyw3ICsxMDMsNyBAQAogIyBEdW1teSBjYWxsYmFjayB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNhbGxiYWNrcy4KICMKIGRlZiBkdW1teV9jYWxsYmFjayhhcmcpOgotCXBhc3MKKyAgICBwYXNzCiAKIAogIyBBc3NpZ24gYXR0cmlidXRlcyB0byBtZW1iZXJzIG9mIHRoZSB0YXJnZXQuCkBAIC0xMTEsNjAgKzExMSw2MCBAQAogIyBUaGUgbWVtYmVyIG5hbWUgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lIHByZWZpeGVkIHdpdGggdGhlIHByZWZpeC4KICMKIGRlZiBhc3NpZ25fbWVtYmVycyh0YXJnZXQsIGF0dHJsaXN0LCBleGNsaXN0LCBwcmVmaXgpOgotCWZvciBpdGVtIGluIGF0dHJsaXN0OgotCQlpZiBpc19saXN0KGl0ZW0pIGFuZCBsZW4oaXRlbSkgPT0gMiBhbmQgaXRlbVswXSBub3QgaW4gZXhjbGlzdDoKLQkJCW5hbWUsIHZhbHVlID0gaXRlbVswXSwgaXRlbVsxXQotCQkJb2sgPSAxCi0JCQlpZiB2YWx1ZVswXSBpbiAnLTAxMjM0NTY3ODknOgotCQkJCXZhbHVlID0gZXZhbCh2YWx1ZSkKLQkJCWVsaWYgdmFsdWVbMF0gPT0gJyInOgotCQkJCXZhbHVlID0gdmFsdWVbMTotMV0KLQkJCWVsaWYgdmFsdWUgPT0gJ21vdmUtdGhlbi1yZXNpemUnOgotCQkJCSMgU3RyYW5nZSBkZWZhdWx0IHNldCBieSBQYW5lbCBFZGl0b3IuLi4KLQkJCQlvayA9IDAKLQkJCWVsc2U6Ci0JCQkJcHJpbnQgJ3Vua25vd24gdmFsdWUnLCB2YWx1ZSwgJ2ZvcicsIG5hbWUKLQkJCQlvayA9IDAKLQkJCWlmIG9rOgotCQkJCWxocyA9ICd0YXJnZXQuJyArIHByZWZpeCArIG5hbWUKLQkJCQlzdG10ID0gbGhzICsgJz0nICsgcmVwcih2YWx1ZSkKLQkJCQlpZiBkZWJ1ZzogcHJpbnQgJ2V4ZWMnLCBzdG10Ci0JCQkJdHJ5OgotCQkJCQlleGVjIHN0bXQgKyAnXG4nCi0JCQkJZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OiAjIERvbid0IGNhdGNoIHRoaXMhCi0JCQkJCXJhaXNlIEtleWJvYXJkSW50ZXJydXB0Ci0JCQkJZXhjZXB0OgotCQkJCQlwcmludCAnYXNzaWduIGZhaWxlZDonLCBzdG10CisgICAgZm9yIGl0ZW0gaW4gYXR0cmxpc3Q6CisgICAgICAgIGlmIGlzX2xpc3QoaXRlbSkgYW5kIGxlbihpdGVtKSA9PSAyIGFuZCBpdGVtWzBdIG5vdCBpbiBleGNsaXN0OgorICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSBpdGVtWzBdLCBpdGVtWzFdCisgICAgICAgICAgICBvayA9IDEKKyAgICAgICAgICAgIGlmIHZhbHVlWzBdIGluICctMDEyMzQ1Njc4OSc6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBldmFsKHZhbHVlKQorICAgICAgICAgICAgZWxpZiB2YWx1ZVswXSA9PSAnIic6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxOi0xXQorICAgICAgICAgICAgZWxpZiB2YWx1ZSA9PSAnbW92ZS10aGVuLXJlc2l6ZSc6CisgICAgICAgICAgICAgICAgIyBTdHJhbmdlIGRlZmF1bHQgc2V0IGJ5IFBhbmVsIEVkaXRvci4uLgorICAgICAgICAgICAgICAgIG9rID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAndW5rbm93biB2YWx1ZScsIHZhbHVlLCAnZm9yJywgbmFtZQorICAgICAgICAgICAgICAgIG9rID0gMAorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgbGhzID0gJ3RhcmdldC4nICsgcHJlZml4ICsgbmFtZQorICAgICAgICAgICAgICAgIHN0bXQgPSBsaHMgKyAnPScgKyByZXByKHZhbHVlKQorICAgICAgICAgICAgICAgIGlmIGRlYnVnOiBwcmludCAnZXhlYycsIHN0bXQKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGV4ZWMgc3RtdCArICdcbicKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6ICMgRG9uJ3QgY2F0Y2ggdGhpcyEKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdhc3NpZ24gZmFpbGVkOicsIHN0bXQKIAogCiAjIEJ1aWxkIGEgcmVhbCBhY3R1YXRvciBmcm9tIGFuIGFjdHVhdG9yIGRlc2NyaXB0aW9uLgogIyBSZXR1cm4gYSBwYWlyIChhY3R1YXRvciwgbmFtZSkuCiAjCiBkZWYgYnVpbGRfYWN0dWF0b3IoZGVzY3IpOgotCW5hbWVsaXN0ID0gZ2V0YXR0cmxpc3QoZGVzY3IsICduYW1lJykKLQlpZiBuYW1lbGlzdDoKLQkJIyBBc3N1bWUgaXQgaXMgYSBzdHJpbmcKLQkJYWN0dWF0b3JuYW1lID0gbmFtZWxpc3RbMF1bMTotMV0KLQllbHNlOgotCQlhY3R1YXRvcm5hbWUgPSAnJwotCXR5cGUgPSBkZXNjclswXQotCWlmIHR5cGVbOjRdID09ICdwbmxfJzogdHlwZSA9IHR5cGVbNDpdCi0JYWN0ID0gcG5sLm1rYWN0KHR5cGUpCi0JYWN0LmRvd25mdW5jID0gYWN0LmFjdGl2ZWZ1bmMgPSBhY3QudXBmdW5jID0gZHVtbXlfY2FsbGJhY2sKLQkjCi0JYXNzaWduX21lbWJlcnMoYWN0LCBkZXNjclsxOl0sIFsnYWwnLCAnZGF0YScsICduYW1lJ10sICcnKQotCSMKLQkjIFRyZWF0IGFjdHVhdG9yLXNwZWNpZmljIGRhdGEKLQkjCi0JZGF0YWxpc3QgPSBnZXRhdHRybGlzdChkZXNjciwgJ2RhdGEnKQotCXByZWZpeCA9ICcnCi0JaWYgdHlwZVstNDpdID09ICdwdWNrJzoKLQkJcHJlZml4ID0gJ3B1Y2tfJwotCWVsaWYgdHlwZSA9PSAnbW91c2UnOgotCQlwcmVmaXggPSAnbW91c2VfJwotCWFzc2lnbl9tZW1iZXJzKGFjdCwgZGF0YWxpc3QsIFtdLCBwcmVmaXgpCi0JIwotCXJldHVybiBhY3QsIGFjdHVhdG9ybmFtZQorICAgIG5hbWVsaXN0ID0gZ2V0YXR0cmxpc3QoZGVzY3IsICduYW1lJykKKyAgICBpZiBuYW1lbGlzdDoKKyAgICAgICAgIyBBc3N1bWUgaXQgaXMgYSBzdHJpbmcKKyAgICAgICAgYWN0dWF0b3JuYW1lID0gbmFtZWxpc3RbMF1bMTotMV0KKyAgICBlbHNlOgorICAgICAgICBhY3R1YXRvcm5hbWUgPSAnJworICAgIHR5cGUgPSBkZXNjclswXQorICAgIGlmIHR5cGVbOjRdID09ICdwbmxfJzogdHlwZSA9IHR5cGVbNDpdCisgICAgYWN0ID0gcG5sLm1rYWN0KHR5cGUpCisgICAgYWN0LmRvd25mdW5jID0gYWN0LmFjdGl2ZWZ1bmMgPSBhY3QudXBmdW5jID0gZHVtbXlfY2FsbGJhY2sKKyAgICAjCisgICAgYXNzaWduX21lbWJlcnMoYWN0LCBkZXNjclsxOl0sIFsnYWwnLCAnZGF0YScsICduYW1lJ10sICcnKQorICAgICMKKyAgICAjIFRyZWF0IGFjdHVhdG9yLXNwZWNpZmljIGRhdGEKKyAgICAjCisgICAgZGF0YWxpc3QgPSBnZXRhdHRybGlzdChkZXNjciwgJ2RhdGEnKQorICAgIHByZWZpeCA9ICcnCisgICAgaWYgdHlwZVstNDpdID09ICdwdWNrJzoKKyAgICAgICAgcHJlZml4ID0gJ3B1Y2tfJworICAgIGVsaWYgdHlwZSA9PSAnbW91c2UnOgorICAgICAgICBwcmVmaXggPSAnbW91c2VfJworICAgIGFzc2lnbl9tZW1iZXJzKGFjdCwgZGF0YWxpc3QsIFtdLCBwcmVmaXgpCisgICAgIworICAgIHJldHVybiBhY3QsIGFjdHVhdG9ybmFtZQogCiAKICMgQnVpbGQgYWxsIHN1Yi1hY3R1YXRvcnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBzdXBlci1hY3R1YXRvci4KQEAgLTE3NiwyNyArMTc2LDI3IEBACiAjIHRvIGEgc3ViLWFjdHVhdG9yLgogIwogZGVmIGJ1aWxkX3N1YmFjdHVhdG9ycyhwYW5lbCwgc3VwZXJfYWN0LCBhbCk6Ci0JIwotCSMgVGhpcyBpcyBuZWFybHkgdGhlIHNhbWUgbG9vcCBhcyBiZWxvdyBpbiBidWlsZF9wYW5lbCgpLAotCSMgZXhjZXB0IGEgY2FsbCBpcyBtYWRlIHRvIGFkZHN1YmFjdCgpIGluc3RlYWQgb2YgYWRkYWN0KCkuCi0JIwotCWZvciBhIGluIGFsOgotCQlhY3QsIG5hbWUgPSBidWlsZF9hY3R1YXRvcihhKQotCQlhY3QuYWRkc3ViYWN0KHN1cGVyX2FjdCkKLQkJaWYgbmFtZToKLQkJCXN0bXQgPSAncGFuZWwuJyArIG5hbWUgKyAnID0gYWN0JwotCQkJaWYgZGVidWc6IHByaW50ICdleGVjJywgc3RtdAotCQkJZXhlYyBzdG10ICsgJ1xuJwotCQlpZiBpc19lbmRncm91cChhKToKLQkJCXBhbmVsLmVuZGdyb3VwKCkKLQkJc3ViX2FsID0gZ2V0YXR0cmxpc3QoYSwgJ2FsJykKLQkJaWYgc3ViX2FsOgotCQkJYnVpbGRfc3ViYWN0dWF0b3JzKHBhbmVsLCBhY3QsIHN1Yl9hbCkKLQkjCi0JIyBGaXggdGhlIGFjdHVhdG9yIHRvIHdoaWNoIHdoZSBqdXN0IGFkZGVkIHN1YmFjdHVhdG9ycy4KLQkjIFRoaXMgY2FuJ3QgaHVydCAoSSBob3BlKSBhbmQgaXMgbmVlZGVkIGZvciB0aGUgc2Nyb2xsIGFjdHVhdG9yLgotCSMKLQlzdXBlcl9hY3QuZml4YWN0KCkKKyAgICAjCisgICAgIyBUaGlzIGlzIG5lYXJseSB0aGUgc2FtZSBsb29wIGFzIGJlbG93IGluIGJ1aWxkX3BhbmVsKCksCisgICAgIyBleGNlcHQgYSBjYWxsIGlzIG1hZGUgdG8gYWRkc3ViYWN0KCkgaW5zdGVhZCBvZiBhZGRhY3QoKS4KKyAgICAjCisgICAgZm9yIGEgaW4gYWw6CisgICAgICAgIGFjdCwgbmFtZSA9IGJ1aWxkX2FjdHVhdG9yKGEpCisgICAgICAgIGFjdC5hZGRzdWJhY3Qoc3VwZXJfYWN0KQorICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgc3RtdCA9ICdwYW5lbC4nICsgbmFtZSArICcgPSBhY3QnCisgICAgICAgICAgICBpZiBkZWJ1ZzogcHJpbnQgJ2V4ZWMnLCBzdG10CisgICAgICAgICAgICBleGVjIHN0bXQgKyAnXG4nCisgICAgICAgIGlmIGlzX2VuZGdyb3VwKGEpOgorICAgICAgICAgICAgcGFuZWwuZW5kZ3JvdXAoKQorICAgICAgICBzdWJfYWwgPSBnZXRhdHRybGlzdChhLCAnYWwnKQorICAgICAgICBpZiBzdWJfYWw6CisgICAgICAgICAgICBidWlsZF9zdWJhY3R1YXRvcnMocGFuZWwsIGFjdCwgc3ViX2FsKQorICAgICMKKyAgICAjIEZpeCB0aGUgYWN0dWF0b3IgdG8gd2hpY2ggd2hlIGp1c3QgYWRkZWQgc3ViYWN0dWF0b3JzLgorICAgICMgVGhpcyBjYW4ndCBodXJ0IChJIGhvcGUpIGFuZCBpcyBuZWVkZWQgZm9yIHRoZSBzY3JvbGwgYWN0dWF0b3IuCisgICAgIworICAgIHN1cGVyX2FjdC5maXhhY3QoKQogCiAKICMgQnVpbGQgYSByZWFsIHBhbmVsIGZyb20gYSBwYW5lbCBkZWZpbml0aW9uLgpAQCAtMjA0LDc4ICsyMDQsNzggQEAKICMgcmVmZXJlbmNlIHRvIGEuCiAjCiBkZWYgYnVpbGRfcGFuZWwoZGVzY3IpOgotCSMKLQkjIFNhbml0eSBjaGVjawotCSMKLQlpZiAobm90IGRlc2NyKSBvciBkZXNjclswXSAhPSAncGFuZWwnOgotCQlyYWlzZSBwYW5lbF9lcnJvciwgJ3BhbmVsIGRlc2NyaXB0aW9uIG11c3Qgc3RhcnQgd2l0aCAicGFuZWwiJwotCSMKLQlpZiBkZWJ1Zzogc2hvd19wYW5lbCgnJywgZGVzY3IpCi0JIwotCSMgQ3JlYXRlIGFuIGVtcHR5IHBhbmVsCi0JIwotCXBhbmVsID0gcG5sLm1rcGFuZWwoKQotCSMKLQkjIEFzc2lnbiBwYW5lbCBhdHRyaWJ1dGVzCi0JIwotCWFzc2lnbl9tZW1iZXJzKHBhbmVsLCBkZXNjclsxOl0sIFsnYWwnXSwgJycpCi0JIwotCSMgTG9vayBmb3IgYWN0dWF0b3IgbGlzdAotCSMKLQlhbCA9IGdldGF0dHJsaXN0KGRlc2NyLCAnYWwnKQotCSMKLQkjIFRoZSBvcmRlciBpbiB3aGljaCBhY3R1YXRvcnMgYXJlIGNyZWF0ZWQgaXMgaW1wb3J0YW50Ci0JIyBiZWNhdXNlIG9mIHRoZSBlbmRncm91cCgpIG9wZXJhdG9yLgotCSMgVW5mb3J0dW5hdGVseSB0aGUgUGFuZWwgRWRpdG9yIG91dHB1dHMgdGhlIGFjdHVhdG9yIGxpc3QKLQkjIGluIHJldmVyc2Ugb3JkZXIsIHNvIHdlIHJldmVyc2UgaXQgaGVyZS4KLQkjCi0JYWwgPSByZXZlcnNlKGFsKQotCSMKLQlmb3IgYSBpbiBhbDoKLQkJYWN0LCBuYW1lID0gYnVpbGRfYWN0dWF0b3IoYSkKLQkJYWN0LmFkZGFjdChwYW5lbCkKLQkJaWYgbmFtZToKLQkJCXN0bXQgPSAncGFuZWwuJyArIG5hbWUgKyAnID0gYWN0JwotCQkJZXhlYyBzdG10ICsgJ1xuJwotCQlpZiBpc19lbmRncm91cChhKToKLQkJCXBhbmVsLmVuZGdyb3VwKCkKLQkJc3ViX2FsID0gZ2V0YXR0cmxpc3QoYSwgJ2FsJykKLQkJaWYgc3ViX2FsOgotCQkJYnVpbGRfc3ViYWN0dWF0b3JzKHBhbmVsLCBhY3QsIHN1Yl9hbCkKLQkjCi0JcmV0dXJuIHBhbmVsCisgICAgIworICAgICMgU2FuaXR5IGNoZWNrCisgICAgIworICAgIGlmIChub3QgZGVzY3IpIG9yIGRlc2NyWzBdICE9ICdwYW5lbCc6CisgICAgICAgIHJhaXNlIHBhbmVsX2Vycm9yLCAncGFuZWwgZGVzY3JpcHRpb24gbXVzdCBzdGFydCB3aXRoICJwYW5lbCInCisgICAgIworICAgIGlmIGRlYnVnOiBzaG93X3BhbmVsKCcnLCBkZXNjcikKKyAgICAjCisgICAgIyBDcmVhdGUgYW4gZW1wdHkgcGFuZWwKKyAgICAjCisgICAgcGFuZWwgPSBwbmwubWtwYW5lbCgpCisgICAgIworICAgICMgQXNzaWduIHBhbmVsIGF0dHJpYnV0ZXMKKyAgICAjCisgICAgYXNzaWduX21lbWJlcnMocGFuZWwsIGRlc2NyWzE6XSwgWydhbCddLCAnJykKKyAgICAjCisgICAgIyBMb29rIGZvciBhY3R1YXRvciBsaXN0CisgICAgIworICAgIGFsID0gZ2V0YXR0cmxpc3QoZGVzY3IsICdhbCcpCisgICAgIworICAgICMgVGhlIG9yZGVyIGluIHdoaWNoIGFjdHVhdG9ycyBhcmUgY3JlYXRlZCBpcyBpbXBvcnRhbnQKKyAgICAjIGJlY2F1c2Ugb2YgdGhlIGVuZGdyb3VwKCkgb3BlcmF0b3IuCisgICAgIyBVbmZvcnR1bmF0ZWx5IHRoZSBQYW5lbCBFZGl0b3Igb3V0cHV0cyB0aGUgYWN0dWF0b3IgbGlzdAorICAgICMgaW4gcmV2ZXJzZSBvcmRlciwgc28gd2UgcmV2ZXJzZSBpdCBoZXJlLgorICAgICMKKyAgICBhbCA9IHJldmVyc2UoYWwpCisgICAgIworICAgIGZvciBhIGluIGFsOgorICAgICAgICBhY3QsIG5hbWUgPSBidWlsZF9hY3R1YXRvcihhKQorICAgICAgICBhY3QuYWRkYWN0KHBhbmVsKQorICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgc3RtdCA9ICdwYW5lbC4nICsgbmFtZSArICcgPSBhY3QnCisgICAgICAgICAgICBleGVjIHN0bXQgKyAnXG4nCisgICAgICAgIGlmIGlzX2VuZGdyb3VwKGEpOgorICAgICAgICAgICAgcGFuZWwuZW5kZ3JvdXAoKQorICAgICAgICBzdWJfYWwgPSBnZXRhdHRybGlzdChhLCAnYWwnKQorICAgICAgICBpZiBzdWJfYWw6CisgICAgICAgICAgICBidWlsZF9zdWJhY3R1YXRvcnMocGFuZWwsIGFjdCwgc3ViX2FsKQorICAgICMKKyAgICByZXR1cm4gcGFuZWwKIAogCiAjIFdyYXBwZXIgYXJvdW5kIHBubC5kb3BhbmVsKCkgd2hpY2ggY2FsbHMgY2FsbC1iYWNrIGZ1bmN0aW9ucy4KICMKIGRlZiBteV9kb3BhbmVsKCk6Ci0JIyBFeHRyYWN0IG9ubHkgdGhlIGZpcnN0IDQgZWxlbWVudHMgdG8gYWxsb3cgZm9yIGZ1dHVyZSBleHBhbnNpb24KLQlhLCBkb3duLCBhY3RpdmUsIHVwID0gcG5sLmRvcGFuZWwoKVs6NF0KLQlpZiBkb3duOgotCQlkb3duLmRvd25mdW5jKGRvd24pCi0JaWYgYWN0aXZlOgotCQlhY3RpdmUuYWN0aXZlZnVuYyhhY3RpdmUpCi0JaWYgdXA6Ci0JCXVwLnVwZnVuYyh1cCkKLQlyZXR1cm4gYQorICAgICMgRXh0cmFjdCBvbmx5IHRoZSBmaXJzdCA0IGVsZW1lbnRzIHRvIGFsbG93IGZvciBmdXR1cmUgZXhwYW5zaW9uCisgICAgYSwgZG93biwgYWN0aXZlLCB1cCA9IHBubC5kb3BhbmVsKClbOjRdCisgICAgaWYgZG93bjoKKyAgICAgICAgZG93bi5kb3duZnVuYyhkb3duKQorICAgIGlmIGFjdGl2ZToKKyAgICAgICAgYWN0aXZlLmFjdGl2ZWZ1bmMoYWN0aXZlKQorICAgIGlmIHVwOgorICAgICAgICB1cC51cGZ1bmModXApCisgICAgcmV0dXJuIGEKIAogCiAjIENyZWF0ZSBvbmUgb3IgbW9yZSBwYW5lbHMgZnJvbSBhIGRlc2NyaXB0aW9uIGZpbGUgKFMtZXhwcmVzc2lvbnMpCiAjIGdlbmVyYXRlZCBieSB0aGUgUGFuZWwgRWRpdG9yLgotIyAKKyMKIGRlZiBkZWZwYW5lbGxpc3QoZmlsZSk6Ci0JaW1wb3J0IHBhbmVscGFyc2VyCi0JZGVzY3JsaXN0ID0gcGFuZWxwYXJzZXIucGFyc2VfZmlsZShvcGVuKGZpbGUsICdyJykpCi0JcGFuZWxsaXN0ID0gW10KLQlmb3IgZGVzY3IgaW4gZGVzY3JsaXN0OgotCQlwYW5lbGxpc3QuYXBwZW5kKGJ1aWxkX3BhbmVsKGRlc2NyKSkKLQlyZXR1cm4gcGFuZWxsaXN0CisgICAgaW1wb3J0IHBhbmVscGFyc2VyCisgICAgZGVzY3JsaXN0ID0gcGFuZWxwYXJzZXIucGFyc2VfZmlsZShvcGVuKGZpbGUsICdyJykpCisgICAgcGFuZWxsaXN0ID0gW10KKyAgICBmb3IgZGVzY3IgaW4gZGVzY3JsaXN0OgorICAgICAgICBwYW5lbGxpc3QuYXBwZW5kKGJ1aWxkX3BhbmVsKGRlc2NyKSkKKyAgICByZXR1cm4gcGFuZWxsaXN0CiAKIAogIyBJbXBvcnQgZXZlcnl0aGluZyBmcm9tIGJ1aWx0LWluIG1ldGhvZCBwbmwsIHNvIHRoZSB1c2VyIGNhbiBhbHdheXMKICMgdXNlIHBhbmVsLmZvbygpIGluc3RlYWQgb2YgcG5sLmZvbygpLgogIyBUaGlzIGdpdmVzICpubyogcGVyZm9ybWFuY2UgcGVuYWx0eSBvbmNlIHRoaXMgbW9kdWxlIGlzIGltcG9ydGVkLgogIwotZnJvbSBwbmwgaW1wb3J0ICoJCQkjIGZvciBleHBvcnQKK2Zyb20gcG5sIGltcG9ydCAqICAgICAgICAgICAgICAgICAgICAgICAjIGZvciBleHBvcnQKIAotZG9wYW5lbCA9IG15X2RvcGFuZWwJCQkjIG92ZXJyaWRlIHBubC5kb3BhbmVsCitkb3BhbmVsID0gbXlfZG9wYW5lbCAgICAgICAgICAgICAgICAgICAgIyBvdmVycmlkZSBwbmwuZG9wYW5lbApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDUvcGFuZWxwYXJzZXIucHkgYi9MaWIvcGxhdC1pcml4NS9wYW5lbHBhcnNlci5weQppbmRleCBlZTUwOTcxLi5jODMxYzQ5IDEwMDc1NQotLS0gYS9MaWIvcGxhdC1pcml4NS9wYW5lbHBhcnNlci5weQorKysgYi9MaWIvcGxhdC1pcml4NS9wYW5lbHBhcnNlci5weQpAQCAtMTUsNDcgKzE1LDQ3IEBACiAjIFJldHVybiBhIGxpc3Qgb2YgdG9rZW5zIChzdHJpbmdzKS4KICMKIGRlZiB0b2tlbml6ZV9zdHJpbmcocyk6Ci0JdG9rZW5zID0gW10KLQl3aGlsZSBzOgotCQljID0gc1s6MV0KLQkJaWYgYyBpbiB3aGl0ZXNwYWNlOgotCQkJcyA9IHNbMTpdCi0JCWVsaWYgYyA9PSAnOyc6Ci0JCQlzID0gJycKLQkJZWxpZiBjID09ICciJzoKLQkJCW4gPSBsZW4ocykKLQkJCWkgPSAxCi0JCQl3aGlsZSBpIDwgbjoKLQkJCQljID0gc1tpXQotCQkJCWkgPSBpKzEKLQkJCQlpZiBjID09ICciJzogYnJlYWsKLQkJCQlpZiBjID09ICdcXCc6IGkgPSBpKzEKLQkJCXRva2Vucy5hcHBlbmQoc1s6aV0pCi0JCQlzID0gc1tpOl0KLQkJZWxpZiBjIGluIG9wZXJhdG9yczoKLQkJCXRva2Vucy5hcHBlbmQoYykKLQkJCXMgPSBzWzE6XQotCQllbHNlOgotCQkJbiA9IGxlbihzKQotCQkJaSA9IDEKLQkJCXdoaWxlIGkgPCBuOgotCQkJCWlmIHNbaV0gaW4gc2VwYXJhdG9yczogYnJlYWsKLQkJCQlpID0gaSsxCi0JCQl0b2tlbnMuYXBwZW5kKHNbOmldKQotCQkJcyA9IHNbaTpdCi0JcmV0dXJuIHRva2VucworICAgIHRva2VucyA9IFtdCisgICAgd2hpbGUgczoKKyAgICAgICAgYyA9IHNbOjFdCisgICAgICAgIGlmIGMgaW4gd2hpdGVzcGFjZToKKyAgICAgICAgICAgIHMgPSBzWzE6XQorICAgICAgICBlbGlmIGMgPT0gJzsnOgorICAgICAgICAgICAgcyA9ICcnCisgICAgICAgIGVsaWYgYyA9PSAnIic6CisgICAgICAgICAgICBuID0gbGVuKHMpCisgICAgICAgICAgICBpID0gMQorICAgICAgICAgICAgd2hpbGUgaSA8IG46CisgICAgICAgICAgICAgICAgYyA9IHNbaV0KKyAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICAgICAgaWYgYyA9PSAnIic6IGJyZWFrCisgICAgICAgICAgICAgICAgaWYgYyA9PSAnXFwnOiBpID0gaSsxCisgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKHNbOmldKQorICAgICAgICAgICAgcyA9IHNbaTpdCisgICAgICAgIGVsaWYgYyBpbiBvcGVyYXRvcnM6CisgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKGMpCisgICAgICAgICAgICBzID0gc1sxOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG4gPSBsZW4ocykKKyAgICAgICAgICAgIGkgPSAxCisgICAgICAgICAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgICAgICAgICBpZiBzW2ldIGluIHNlcGFyYXRvcnM6IGJyZWFrCisgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChzWzppXSkKKyAgICAgICAgICAgIHMgPSBzW2k6XQorICAgIHJldHVybiB0b2tlbnMKIAogCiAjIFRva2VuaXplIGEgd2hvbGUgZmlsZSAoZ2l2ZW4gYXMgZmlsZSBvYmplY3QsIG5vdCBhcyBmaWxlIG5hbWUpLgogIyBSZXR1cm4gYSBsaXN0IG9mIHRva2VucyAoc3RyaW5ncykuCiAjCiBkZWYgdG9rZW5pemVfZmlsZShmcCk6Ci0JdG9rZW5zID0gW10KLQl3aGlsZSAxOgotCQlsaW5lID0gZnAucmVhZGxpbmUoKQotCQlpZiBub3QgbGluZTogYnJlYWsKLQkJdG9rZW5zID0gdG9rZW5zICsgdG9rZW5pemVfc3RyaW5nKGxpbmUpCi0JcmV0dXJuIHRva2VucworICAgIHRva2VucyA9IFtdCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgIHRva2VucyA9IHRva2VucyArIHRva2VuaXplX3N0cmluZyhsaW5lKQorICAgIHJldHVybiB0b2tlbnMKIAogCiAjIEV4Y2VwdGlvbiByYWlzZWQgYnkgcGFyc2VfZXhyLgpAQCAtNzEsNTAgKzcxLDUwIEBACiAjIE1heSByYWlzZSBzeW50YXhfZXJyb3IuCiAjCiBkZWYgcGFyc2VfZXhwcih0b2tlbnMpOgotCWlmIChub3QgdG9rZW5zKSBvciB0b2tlbnNbMF0gIT0gJygnOgotCQlyYWlzZSBzeW50YXhfZXJyb3IsICdleHBlY3RlZCAiKCInCi0JdG9rZW5zID0gdG9rZW5zWzE6XQotCWV4cHIgPSBbXQotCXdoaWxlIDE6Ci0JCWlmIG5vdCB0b2tlbnM6Ci0JCQlyYWlzZSBzeW50YXhfZXJyb3IsICdtaXNzaW5nICIpIicKLQkJaWYgdG9rZW5zWzBdID09ICcpJzoKLQkJCXJldHVybiBleHByLCB0b2tlbnNbMTpdCi0JCWVsaWYgdG9rZW5zWzBdID09ICcoJzoKLQkJCXN1YmV4cHIsIHRva2VucyA9IHBhcnNlX2V4cHIodG9rZW5zKQotCQkJZXhwci5hcHBlbmQoc3ViZXhwcikKLQkJZWxzZToKLQkJCWV4cHIuYXBwZW5kKHRva2Vuc1swXSkKLQkJCXRva2VucyA9IHRva2Vuc1sxOl0KKyAgICBpZiAobm90IHRva2Vucykgb3IgdG9rZW5zWzBdICE9ICcoJzoKKyAgICAgICAgcmFpc2Ugc3ludGF4X2Vycm9yLCAnZXhwZWN0ZWQgIigiJworICAgIHRva2VucyA9IHRva2Vuc1sxOl0KKyAgICBleHByID0gW10KKyAgICB3aGlsZSAxOgorICAgICAgICBpZiBub3QgdG9rZW5zOgorICAgICAgICAgICAgcmFpc2Ugc3ludGF4X2Vycm9yLCAnbWlzc2luZyAiKSInCisgICAgICAgIGlmIHRva2Vuc1swXSA9PSAnKSc6CisgICAgICAgICAgICByZXR1cm4gZXhwciwgdG9rZW5zWzE6XQorICAgICAgICBlbGlmIHRva2Vuc1swXSA9PSAnKCc6CisgICAgICAgICAgICBzdWJleHByLCB0b2tlbnMgPSBwYXJzZV9leHByKHRva2VucykKKyAgICAgICAgICAgIGV4cHIuYXBwZW5kKHN1YmV4cHIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHByLmFwcGVuZCh0b2tlbnNbMF0pCisgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbnNbMTpdCiAKIAogIyBQYXJzZSBhIGZpbGUgKGdpdmVuIGFzIGZpbGUgb2JqZWN0LCBub3QgYXMgZmlsZSBuYW1lKS4KICMgUmV0dXJuIGEgbGlzdCBvZiBwYXJzZWQgUy1leHByZXNzaW9ucyBmb3VuZCBhdCB0aGUgdG9wIGxldmVsLgogIwogZGVmIHBhcnNlX2ZpbGUoZnApOgotCXRva2VucyA9IHRva2VuaXplX2ZpbGUoZnApCi0JZXhwcmxpc3QgPSBbXQotCXdoaWxlIHRva2VuczoKLQkJZXhwciwgdG9rZW5zID0gcGFyc2VfZXhwcih0b2tlbnMpCi0JCWV4cHJsaXN0LmFwcGVuZChleHByKQotCXJldHVybiBleHBybGlzdAorICAgIHRva2VucyA9IHRva2VuaXplX2ZpbGUoZnApCisgICAgZXhwcmxpc3QgPSBbXQorICAgIHdoaWxlIHRva2VuczoKKyAgICAgICAgZXhwciwgdG9rZW5zID0gcGFyc2VfZXhwcih0b2tlbnMpCisgICAgICAgIGV4cHJsaXN0LmFwcGVuZChleHByKQorICAgIHJldHVybiBleHBybGlzdAogCiAKICMgRVhBTVBMRToKICMKICMgVGhlIGlucHV0Ci0jCScoaGlwIChob3AgaHVyLXJheSkpJworIyAgICAgICAnKGhpcCAoaG9wIGh1ci1yYXkpKScKICMKICMgcGFzc2VkIHRvIHRva2VuaXplX3N0cmluZygpIHJldHVybnMgdGhlIHRva2VuIGxpc3QKLSMJWycoJywgJ2hpcCcsICcoJywgJ2hvcCcsICdodXItcmF5JywgJyknLCAnKSddCisjICAgICAgIFsnKCcsICdoaXAnLCAnKCcsICdob3AnLCAnaHVyLXJheScsICcpJywgJyknXQogIwogIyBXaGVuIHRoaXMgaXMgcGFzc2VkIHRvIHBhcnNlX2V4cHIoKSBpdCByZXR1cm5zIHRoZSBleHByZXNzaW9uCi0jCVsnaGlwJywgWydob3AnLCAnaHVyLXJheSddXQorIyAgICAgICBbJ2hpcCcsIFsnaG9wJywgJ2h1ci1yYXknXV0KICMgcGx1cyBhbiBlbXB0eSB0b2tlbiBsaXN0IChiZWNhdXNlIHRoZXJlIGFyZSBubyB0b2tlbnMgbGVmdC4KICMKICMgV2hlbiBhIGZpbGUgY29udGFpbmluZyB0aGUgZXhhbXBsZSBpcyBwYXNzZWQgdG8gcGFyc2VfZmlsZSgpIGl0IHJldHVybnMKICMgYSBsaXN0IHdob3NlIG9ubHkgZWxlbWVudCBpcyB0aGUgb3V0cHV0IG9mIHBhcnNlX2V4cHIoKSBhYm92ZToKLSMJW1snaGlwJywgWydob3AnLCAnaHVyLXJheSddXV0KKyMgICAgICAgW1snaGlwJywgWydob3AnLCAnaHVyLXJheSddXV0KIAogCiAjIFRPS0VOSVpJTkc6CkBAIC0xMjMsNiArMTIzLDYgQEAKICMKICMgVG9rZW5zIGFyZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSwgZXhjZXB0IHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycwogIyBhbHdheXMgZm9ybSBhIHNlcGFyYXRlIHRva2VuIChvdXRzaWRlIHN0cmluZ3MpOgotIwkoICkgJworIyAgICAgICAoICkgJwogIyBTdHJpbmdzIGFyZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzICgiKSBhbmQgYmFja3NsYXNoIChcKSBpcyB1c2VkCiAjIGFzIGVzY2FwZSBjaGFyYWN0ZXIgaW4gc3RyaW5ncy4KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWlyaXg1L3JlYWRjZC5weSBiL0xpYi9wbGF0LWlyaXg1L3JlYWRjZC5weQppbmRleCBmMjc4YmE0Li41NDUzY2U0IDEwMDc1NQotLS0gYS9MaWIvcGxhdC1pcml4NS9yZWFkY2QucHkKKysrIGIvTGliL3BsYXQtaXJpeDUvcmVhZGNkLnB5CkBAIC0zLDI0MiArMywyNDIgQEAKIGltcG9ydCBjZCwgQ0QKIAogY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKLQlwYXNzCisgICAgcGFzcwogY2xhc3MgX1N0b3AoRXhjZXB0aW9uKToKLQlwYXNzCisgICAgcGFzcwogCiBkZWYgX2RvYXRpbWUoc2VsZiwgY2JfdHlwZSwgZGF0YSk6Ci0JaWYgKChkYXRhWzBdICogNjApICsgZGF0YVsxXSkgKiA3NSArIGRhdGFbMl0gPiBzZWxmLmVuZDoKLSMjCQlwcmludCAnZG9uZSB3aXRoIGxpc3QgZW50cnknLCByZXByKHNlbGYubGlzdGluZGV4KQotCQlyYWlzZSBfU3RvcAotCWZ1bmMsIGFyZyA9IHNlbGYuY2FsbGJhY2tzW2NiX3R5cGVdCi0JaWYgZnVuYzoKLQkJZnVuYyhhcmcsIGNiX3R5cGUsIGRhdGEpCisgICAgaWYgKChkYXRhWzBdICogNjApICsgZGF0YVsxXSkgKiA3NSArIGRhdGFbMl0gPiBzZWxmLmVuZDoKKyMjICAgICAgICAgICAgICBwcmludCAnZG9uZSB3aXRoIGxpc3QgZW50cnknLCByZXByKHNlbGYubGlzdGluZGV4KQorICAgICAgICByYWlzZSBfU3RvcAorICAgIGZ1bmMsIGFyZyA9IHNlbGYuY2FsbGJhY2tzW2NiX3R5cGVdCisgICAgaWYgZnVuYzoKKyAgICAgICAgZnVuYyhhcmcsIGNiX3R5cGUsIGRhdGEpCiAKIGRlZiBfZG9wbnVtKHNlbGYsIGNiX3R5cGUsIGRhdGEpOgotCWlmIGRhdGEgPiBzZWxmLmVuZDoKLSMjCQlwcmludCAnZG9uZSB3aXRoIGxpc3QgZW50cnknLCByZXByKHNlbGYubGlzdGluZGV4KQotCQlyYWlzZSBfU3RvcAotCWZ1bmMsIGFyZyA9IHNlbGYuY2FsbGJhY2tzW2NiX3R5cGVdCi0JaWYgZnVuYzoKLQkJZnVuYyhhcmcsIGNiX3R5cGUsIGRhdGEpCisgICAgaWYgZGF0YSA+IHNlbGYuZW5kOgorIyMgICAgICAgICAgICAgIHByaW50ICdkb25lIHdpdGggbGlzdCBlbnRyeScsIHJlcHIoc2VsZi5saXN0aW5kZXgpCisgICAgICAgIHJhaXNlIF9TdG9wCisgICAgZnVuYywgYXJnID0gc2VsZi5jYWxsYmFja3NbY2JfdHlwZV0KKyAgICBpZiBmdW5jOgorICAgICAgICBmdW5jKGFyZywgY2JfdHlwZSwgZGF0YSkKIAogY2xhc3MgUmVhZGNkOgotCWRlZiBfX2luaXRfXyhzZWxmLCAqYXJnKToKLQkJaWYgbGVuKGFyZykgPT0gMDoKLQkJCXNlbGYucGxheWVyID0gY2Qub3BlbigpCi0JCWVsaWYgbGVuKGFyZykgPT0gMToKLQkJCXNlbGYucGxheWVyID0gY2Qub3BlbihhcmdbMF0pCi0JCWVsaWYgbGVuKGFyZykgPT0gMjoKLQkJCXNlbGYucGxheWVyID0gY2Qub3BlbihhcmdbMF0sIGFyZ1sxXSkKLQkJZWxzZToKLQkJCXJhaXNlIEVycm9yLCAnYmFkIF9faW5pdF9fIGNhbGwnCi0JCXNlbGYubGlzdCA9IFtdCi0JCXNlbGYuY2FsbGJhY2tzID0gWyhOb25lLCBOb25lKV0gKiA4Ci0JCXNlbGYucGFyc2VyID0gY2QuY3JlYXRlcGFyc2VyKCkKLQkJc2VsZi5wbGF5aW5nID0gMAotCQlzZWxmLmVuZCA9IDAKLQkJc2VsZi5zdGF0dXMgPSBOb25lCi0JCXNlbGYudHJhY2tpbmZvID0gTm9uZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJnKToKKyAgICAgICAgaWYgbGVuKGFyZykgPT0gMDoKKyAgICAgICAgICAgIHNlbGYucGxheWVyID0gY2Qub3BlbigpCisgICAgICAgIGVsaWYgbGVuKGFyZykgPT0gMToKKyAgICAgICAgICAgIHNlbGYucGxheWVyID0gY2Qub3BlbihhcmdbMF0pCisgICAgICAgIGVsaWYgbGVuKGFyZykgPT0gMjoKKyAgICAgICAgICAgIHNlbGYucGxheWVyID0gY2Qub3BlbihhcmdbMF0sIGFyZ1sxXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnYmFkIF9faW5pdF9fIGNhbGwnCisgICAgICAgIHNlbGYubGlzdCA9IFtdCisgICAgICAgIHNlbGYuY2FsbGJhY2tzID0gWyhOb25lLCBOb25lKV0gKiA4CisgICAgICAgIHNlbGYucGFyc2VyID0gY2QuY3JlYXRlcGFyc2VyKCkKKyAgICAgICAgc2VsZi5wbGF5aW5nID0gMAorICAgICAgICBzZWxmLmVuZCA9IDAKKyAgICAgICAgc2VsZi5zdGF0dXMgPSBOb25lCisgICAgICAgIHNlbGYudHJhY2tpbmZvID0gTm9uZQogCi0JZGVmIGVqZWN0KHNlbGYpOgotCQlzZWxmLnBsYXllci5lamVjdCgpCi0JCXNlbGYubGlzdCA9IFtdCi0JCXNlbGYuZW5kID0gMAotCQlzZWxmLmxpc3RpbmRleCA9IDAKLQkJc2VsZi5zdGF0dXMgPSBOb25lCi0JCXNlbGYudHJhY2tpbmZvID0gTm9uZQotCQlpZiBzZWxmLnBsYXlpbmc6Ci0jIwkJCXByaW50ICdzdG9wIHBsYXlpbmcgZnJvbSBlamVjdCcKLQkJCXJhaXNlIF9TdG9wCisgICAgZGVmIGVqZWN0KHNlbGYpOgorICAgICAgICBzZWxmLnBsYXllci5lamVjdCgpCisgICAgICAgIHNlbGYubGlzdCA9IFtdCisgICAgICAgIHNlbGYuZW5kID0gMAorICAgICAgICBzZWxmLmxpc3RpbmRleCA9IDAKKyAgICAgICAgc2VsZi5zdGF0dXMgPSBOb25lCisgICAgICAgIHNlbGYudHJhY2tpbmZvID0gTm9uZQorICAgICAgICBpZiBzZWxmLnBsYXlpbmc6CisjIyAgICAgICAgICAgICAgICAgICAgICBwcmludCAnc3RvcCBwbGF5aW5nIGZyb20gZWplY3QnCisgICAgICAgICAgICByYWlzZSBfU3RvcAogCi0JZGVmIHBtc2YybXNmKHNlbGYsIHRyYWNrLCBtaW4sIHNlYywgZnJhbWUpOgotCQlpZiBub3Qgc2VsZi5zdGF0dXM6Ci0JCQlzZWxmLmNhY2hlc3RhdHVzKCkKLQkJaWYgdHJhY2sgPCBzZWxmLnN0YXR1c1s1XSBvciB0cmFjayA+IHNlbGYuc3RhdHVzWzZdOgotCQkJcmFpc2UgRXJyb3IsICd0cmFjayBudW1iZXIgb3V0IG9mIHJhbmdlJwotCQlpZiBub3Qgc2VsZi50cmFja2luZm86Ci0JCQlzZWxmLmNhY2hlaW5mbygpCi0JCXN0YXJ0LCB0b3RhbCA9IHNlbGYudHJhY2tpbmZvW3RyYWNrXQotCQlzdGFydCA9ICgoc3RhcnRbMF0gKiA2MCkgKyBzdGFydFsxXSkgKiA3NSArIHN0YXJ0WzJdCi0JCXRvdGFsID0gKCh0b3RhbFswXSAqIDYwKSArIHRvdGFsWzFdKSAqIDc1ICsgdG90YWxbMl0KLQkJYmxvY2sgPSAoKG1pbiAqIDYwKSArIHNlYykgKiA3NSArIGZyYW1lCi0JCWlmIGJsb2NrID4gdG90YWw6Ci0JCQlyYWlzZSBFcnJvciwgJ291dCBvZiByYW5nZScKLQkJYmxvY2sgPSBzdGFydCArIGJsb2NrCi0JCW1pbiwgYmxvY2sgPSBkaXZtb2QoYmxvY2ssIDc1KjYwKQotCQlzZWMsIGZyYW1lID0gZGl2bW9kKGJsb2NrLCA3NSkKLQkJcmV0dXJuIG1pbiwgc2VjLCBmcmFtZQorICAgIGRlZiBwbXNmMm1zZihzZWxmLCB0cmFjaywgbWluLCBzZWMsIGZyYW1lKToKKyAgICAgICAgaWYgbm90IHNlbGYuc3RhdHVzOgorICAgICAgICAgICAgc2VsZi5jYWNoZXN0YXR1cygpCisgICAgICAgIGlmIHRyYWNrIDwgc2VsZi5zdGF0dXNbNV0gb3IgdHJhY2sgPiBzZWxmLnN0YXR1c1s2XToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndHJhY2sgbnVtYmVyIG91dCBvZiByYW5nZScKKyAgICAgICAgaWYgbm90IHNlbGYudHJhY2tpbmZvOgorICAgICAgICAgICAgc2VsZi5jYWNoZWluZm8oKQorICAgICAgICBzdGFydCwgdG90YWwgPSBzZWxmLnRyYWNraW5mb1t0cmFja10KKyAgICAgICAgc3RhcnQgPSAoKHN0YXJ0WzBdICogNjApICsgc3RhcnRbMV0pICogNzUgKyBzdGFydFsyXQorICAgICAgICB0b3RhbCA9ICgodG90YWxbMF0gKiA2MCkgKyB0b3RhbFsxXSkgKiA3NSArIHRvdGFsWzJdCisgICAgICAgIGJsb2NrID0gKChtaW4gKiA2MCkgKyBzZWMpICogNzUgKyBmcmFtZQorICAgICAgICBpZiBibG9jayA+IHRvdGFsOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdvdXQgb2YgcmFuZ2UnCisgICAgICAgIGJsb2NrID0gc3RhcnQgKyBibG9jaworICAgICAgICBtaW4sIGJsb2NrID0gZGl2bW9kKGJsb2NrLCA3NSo2MCkKKyAgICAgICAgc2VjLCBmcmFtZSA9IGRpdm1vZChibG9jaywgNzUpCisgICAgICAgIHJldHVybiBtaW4sIHNlYywgZnJhbWUKIAotCWRlZiByZXNldChzZWxmKToKLQkJc2VsZi5saXN0ID0gW10KKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYubGlzdCA9IFtdCiAKLQlkZWYgYXBwZW5kdHJhY2soc2VsZiwgdHJhY2spOgotCQlzZWxmLmFwcGVuZHN0cmV0Y2godHJhY2ssIHRyYWNrKQotCQkJCQotCWRlZiBhcHBlbmRzdHJldGNoKHNlbGYsIHN0YXJ0LCBlbmQpOgotCQlpZiBub3Qgc2VsZi5zdGF0dXM6Ci0JCQlzZWxmLmNhY2hlc3RhdHVzKCkKLQkJaWYgbm90IHN0YXJ0OgotCQkJc3RhcnQgPSAxCi0JCWlmIG5vdCBlbmQ6Ci0JCQllbmQgPSBzZWxmLnN0YXR1c1s2XQotCQlpZiB0eXBlKGVuZCkgPT0gdHlwZSgwKToKLQkJCWlmIGVuZCA8IHNlbGYuc3RhdHVzWzVdIG9yIGVuZCA+IHNlbGYuc3RhdHVzWzZdOgotCQkJCXJhaXNlIEVycm9yLCAncmFuZ2UgZXJyb3InCi0JCWVsc2U6Ci0JCQlsID0gbGVuKGVuZCkKLQkJCWlmIGwgPT0gNDoKLQkJCQlwcm9nLCBtaW4sIHNlYywgZnJhbWUgPSBlbmQKLQkJCQlpZiBwcm9nIDwgc2VsZi5zdGF0dXNbNV0gb3IgcHJvZyA+IHNlbGYuc3RhdHVzWzZdOgotCQkJCQlyYWlzZSBFcnJvciwgJ3JhbmdlIGVycm9yJwotCQkJCWVuZCA9IHNlbGYucG1zZjJtc2YocHJvZywgbWluLCBzZWMsIGZyYW1lKQotCQkJZWxpZiBsICE9IDM6Ci0JCQkJcmFpc2UgRXJyb3IsICdzeW50YXggZXJyb3InCi0JCWlmIHR5cGUoc3RhcnQpID09IHR5cGUoMCk6Ci0JCQlpZiBzdGFydCA8IHNlbGYuc3RhdHVzWzVdIG9yIHN0YXJ0ID4gc2VsZi5zdGF0dXNbNl06Ci0JCQkJcmFpc2UgRXJyb3IsICdyYW5nZSBlcnJvcicKLQkJCWlmIGxlbihzZWxmLmxpc3QpID4gMDoKLQkJCQlzLCBlID0gc2VsZi5saXN0Wy0xXQotCQkJCWlmIHR5cGUoZSkgPT0gdHlwZSgwKToKLQkJCQkJaWYgc3RhcnQgPT0gZSsxOgotCQkJCQkJc3RhcnQgPSBzCi0JCQkJCQlkZWwgc2VsZi5saXN0Wy0xXQotCQllbHNlOgotCQkJbCA9IGxlbihzdGFydCkKLQkJCWlmIGwgPT0gNDoKLQkJCQlwcm9nLCBtaW4sIHNlYywgZnJhbWUgPSBzdGFydAotCQkJCWlmIHByb2cgPCBzZWxmLnN0YXR1c1s1XSBvciBwcm9nID4gc2VsZi5zdGF0dXNbNl06Ci0JCQkJCXJhaXNlIEVycm9yLCAncmFuZ2UgZXJyb3InCi0JCQkJc3RhcnQgPSBzZWxmLnBtc2YybXNmKHByb2csIG1pbiwgc2VjLCBmcmFtZSkKLQkJCWVsaWYgbCAhPSAzOgotCQkJCXJhaXNlIEVycm9yLCAnc3ludGF4IGVycm9yJwotCQlzZWxmLmxpc3QuYXBwZW5kKChzdGFydCwgZW5kKSkKKyAgICBkZWYgYXBwZW5kdHJhY2soc2VsZiwgdHJhY2spOgorICAgICAgICBzZWxmLmFwcGVuZHN0cmV0Y2godHJhY2ssIHRyYWNrKQogCi0JZGVmIHNldHRyYWNrcyhzZWxmLCBsaXN0KToKLQkJc2VsZi5saXN0ID0gW10KLQkJZm9yIHRyYWNrIGluIGxpc3Q6Ci0JCQlzZWxmLmFwcGVuZHRyYWNrKHRyYWNrKQorICAgIGRlZiBhcHBlbmRzdHJldGNoKHNlbGYsIHN0YXJ0LCBlbmQpOgorICAgICAgICBpZiBub3Qgc2VsZi5zdGF0dXM6CisgICAgICAgICAgICBzZWxmLmNhY2hlc3RhdHVzKCkKKyAgICAgICAgaWYgbm90IHN0YXJ0OgorICAgICAgICAgICAgc3RhcnQgPSAxCisgICAgICAgIGlmIG5vdCBlbmQ6CisgICAgICAgICAgICBlbmQgPSBzZWxmLnN0YXR1c1s2XQorICAgICAgICBpZiB0eXBlKGVuZCkgPT0gdHlwZSgwKToKKyAgICAgICAgICAgIGlmIGVuZCA8IHNlbGYuc3RhdHVzWzVdIG9yIGVuZCA+IHNlbGYuc3RhdHVzWzZdOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAncmFuZ2UgZXJyb3InCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsID0gbGVuKGVuZCkKKyAgICAgICAgICAgIGlmIGwgPT0gNDoKKyAgICAgICAgICAgICAgICBwcm9nLCBtaW4sIHNlYywgZnJhbWUgPSBlbmQKKyAgICAgICAgICAgICAgICBpZiBwcm9nIDwgc2VsZi5zdGF0dXNbNV0gb3IgcHJvZyA+IHNlbGYuc3RhdHVzWzZdOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3JhbmdlIGVycm9yJworICAgICAgICAgICAgICAgIGVuZCA9IHNlbGYucG1zZjJtc2YocHJvZywgbWluLCBzZWMsIGZyYW1lKQorICAgICAgICAgICAgZWxpZiBsICE9IDM6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdzeW50YXggZXJyb3InCisgICAgICAgIGlmIHR5cGUoc3RhcnQpID09IHR5cGUoMCk6CisgICAgICAgICAgICBpZiBzdGFydCA8IHNlbGYuc3RhdHVzWzVdIG9yIHN0YXJ0ID4gc2VsZi5zdGF0dXNbNl06CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdyYW5nZSBlcnJvcicKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmxpc3QpID4gMDoKKyAgICAgICAgICAgICAgICBzLCBlID0gc2VsZi5saXN0Wy0xXQorICAgICAgICAgICAgICAgIGlmIHR5cGUoZSkgPT0gdHlwZSgwKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhcnQgPT0gZSsxOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBzCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5saXN0Wy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbCA9IGxlbihzdGFydCkKKyAgICAgICAgICAgIGlmIGwgPT0gNDoKKyAgICAgICAgICAgICAgICBwcm9nLCBtaW4sIHNlYywgZnJhbWUgPSBzdGFydAorICAgICAgICAgICAgICAgIGlmIHByb2cgPCBzZWxmLnN0YXR1c1s1XSBvciBwcm9nID4gc2VsZi5zdGF0dXNbNl06CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAncmFuZ2UgZXJyb3InCisgICAgICAgICAgICAgICAgc3RhcnQgPSBzZWxmLnBtc2YybXNmKHByb2csIG1pbiwgc2VjLCBmcmFtZSkKKyAgICAgICAgICAgIGVsaWYgbCAhPSAzOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc3ludGF4IGVycm9yJworICAgICAgICBzZWxmLmxpc3QuYXBwZW5kKChzdGFydCwgZW5kKSkKIAotCWRlZiBzZXRjYWxsYmFjayhzZWxmLCBjYl90eXBlLCBmdW5jLCBhcmcpOgotCQlpZiBjYl90eXBlIDwgMCBvciBjYl90eXBlID49IDg6Ci0JCQlyYWlzZSBFcnJvciwgJ3R5cGUgb3V0IG9mIHJhbmdlJwotCQlzZWxmLmNhbGxiYWNrc1tjYl90eXBlXSA9IChmdW5jLCBhcmcpCi0JCWlmIHNlbGYucGxheWluZzoKLQkJCXN0YXJ0LCBlbmQgPSBzZWxmLmxpc3Rbc2VsZi5saXN0aW5kZXhdCi0JCQlpZiB0eXBlKGVuZCkgPT0gdHlwZSgwKToKLQkJCQlpZiBjYl90eXBlICE9IENELlBOVU06Ci0JCQkJCXNlbGYucGFyc2VyLnNldGNhbGxiYWNrKGNiX3R5cGUsIGZ1bmMsIGFyZykKLQkJCWVsc2U6Ci0JCQkJaWYgY2JfdHlwZSAhPSBDRC5BVElNRToKLQkJCQkJc2VsZi5wYXJzZXIuc2V0Y2FsbGJhY2soY2JfdHlwZSwgZnVuYywgYXJnKQorICAgIGRlZiBzZXR0cmFja3Moc2VsZiwgbGlzdCk6CisgICAgICAgIHNlbGYubGlzdCA9IFtdCisgICAgICAgIGZvciB0cmFjayBpbiBsaXN0OgorICAgICAgICAgICAgc2VsZi5hcHBlbmR0cmFjayh0cmFjaykKIAotCWRlZiByZW1vdmVjYWxsYmFjayhzZWxmLCBjYl90eXBlKToKLQkJaWYgY2JfdHlwZSA8IDAgb3IgY2JfdHlwZSA+PSA4OgotCQkJcmFpc2UgRXJyb3IsICd0eXBlIG91dCBvZiByYW5nZScKLQkJc2VsZi5jYWxsYmFja3NbY2JfdHlwZV0gPSAoTm9uZSwgTm9uZSkKLQkJaWYgc2VsZi5wbGF5aW5nOgotCQkJc3RhcnQsIGVuZCA9IHNlbGYubGlzdFtzZWxmLmxpc3RpbmRleF0KLQkJCWlmIHR5cGUoZW5kKSA9PSB0eXBlKDApOgotCQkJCWlmIGNiX3R5cGUgIT0gQ0QuUE5VTToKLQkJCQkJc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soY2JfdHlwZSkKLQkJCWVsc2U6Ci0JCQkJaWYgY2JfdHlwZSAhPSBDRC5BVElNRToKLQkJCQkJc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soY2JfdHlwZSkKKyAgICBkZWYgc2V0Y2FsbGJhY2soc2VsZiwgY2JfdHlwZSwgZnVuYywgYXJnKToKKyAgICAgICAgaWYgY2JfdHlwZSA8IDAgb3IgY2JfdHlwZSA+PSA4OgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICd0eXBlIG91dCBvZiByYW5nZScKKyAgICAgICAgc2VsZi5jYWxsYmFja3NbY2JfdHlwZV0gPSAoZnVuYywgYXJnKQorICAgICAgICBpZiBzZWxmLnBsYXlpbmc6CisgICAgICAgICAgICBzdGFydCwgZW5kID0gc2VsZi5saXN0W3NlbGYubGlzdGluZGV4XQorICAgICAgICAgICAgaWYgdHlwZShlbmQpID09IHR5cGUoMCk6CisgICAgICAgICAgICAgICAgaWYgY2JfdHlwZSAhPSBDRC5QTlVNOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5zZXRjYWxsYmFjayhjYl90eXBlLCBmdW5jLCBhcmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGNiX3R5cGUgIT0gQ0QuQVRJTUU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnNldGNhbGxiYWNrKGNiX3R5cGUsIGZ1bmMsIGFyZykKIAotCWRlZiBnZXR0cmFja2luZm8oc2VsZiwgKmFyZyk6Ci0JCWlmIG5vdCBzZWxmLnN0YXR1czoKLQkJCXNlbGYuY2FjaGVzdGF0dXMoKQotCQlpZiBub3Qgc2VsZi50cmFja2luZm86Ci0JCQlzZWxmLmNhY2hlaW5mbygpCi0JCWlmIGxlbihhcmcpID09IDA6Ci0JCQlyZXR1cm4gc2VsZi50cmFja2luZm9bc2VsZi5zdGF0dXNbNV06c2VsZi5zdGF0dXNbNl0rMV0KLQkJcmVzdWx0ID0gW10KLQkJZm9yIGkgaW4gYXJnOgotCQkJaWYgaSA8IHNlbGYuc3RhdHVzWzVdIG9yIGkgPiBzZWxmLnN0YXR1c1s2XToKLQkJCQlyYWlzZSBFcnJvciwgJ3JhbmdlIGVycm9yJwotCQkJcmVzdWx0LmFwcGVuZChzZWxmLnRyYWNraW5mb1tpXSkKLQkJcmV0dXJuIHJlc3VsdAorICAgIGRlZiByZW1vdmVjYWxsYmFjayhzZWxmLCBjYl90eXBlKToKKyAgICAgICAgaWYgY2JfdHlwZSA8IDAgb3IgY2JfdHlwZSA+PSA4OgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICd0eXBlIG91dCBvZiByYW5nZScKKyAgICAgICAgc2VsZi5jYWxsYmFja3NbY2JfdHlwZV0gPSAoTm9uZSwgTm9uZSkKKyAgICAgICAgaWYgc2VsZi5wbGF5aW5nOgorICAgICAgICAgICAgc3RhcnQsIGVuZCA9IHNlbGYubGlzdFtzZWxmLmxpc3RpbmRleF0KKyAgICAgICAgICAgIGlmIHR5cGUoZW5kKSA9PSB0eXBlKDApOgorICAgICAgICAgICAgICAgIGlmIGNiX3R5cGUgIT0gQ0QuUE5VTToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soY2JfdHlwZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgY2JfdHlwZSAhPSBDRC5BVElNRToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soY2JfdHlwZSkKIAotCWRlZiBjYWNoZWluZm8oc2VsZik6Ci0JCWlmIG5vdCBzZWxmLnN0YXR1czoKLQkJCXNlbGYuY2FjaGVzdGF0dXMoKQotCQlzZWxmLnRyYWNraW5mbyA9IFtdCi0JCWZvciBpIGluIHJhbmdlKHNlbGYuc3RhdHVzWzVdKToKLQkJCXNlbGYudHJhY2tpbmZvLmFwcGVuZChOb25lKQotCQlmb3IgaSBpbiByYW5nZShzZWxmLnN0YXR1c1s1XSwgc2VsZi5zdGF0dXNbNl0rMSk6Ci0JCQlzZWxmLnRyYWNraW5mby5hcHBlbmQoc2VsZi5wbGF5ZXIuZ2V0dHJhY2tpbmZvKGkpKQorICAgIGRlZiBnZXR0cmFja2luZm8oc2VsZiwgKmFyZyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnN0YXR1czoKKyAgICAgICAgICAgIHNlbGYuY2FjaGVzdGF0dXMoKQorICAgICAgICBpZiBub3Qgc2VsZi50cmFja2luZm86CisgICAgICAgICAgICBzZWxmLmNhY2hlaW5mbygpCisgICAgICAgIGlmIGxlbihhcmcpID09IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFja2luZm9bc2VsZi5zdGF0dXNbNV06c2VsZi5zdGF0dXNbNl0rMV0KKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGkgaW4gYXJnOgorICAgICAgICAgICAgaWYgaSA8IHNlbGYuc3RhdHVzWzVdIG9yIGkgPiBzZWxmLnN0YXR1c1s2XToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3JhbmdlIGVycm9yJworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWxmLnRyYWNraW5mb1tpXSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCi0JZGVmIGNhY2hlc3RhdHVzKHNlbGYpOgotCQlzZWxmLnN0YXR1cyA9IHNlbGYucGxheWVyLmdldHN0YXR1cygpCi0JCWlmIHNlbGYuc3RhdHVzWzBdID09IENELk5PRElTQzoKLQkJCXNlbGYuc3RhdHVzID0gTm9uZQotCQkJcmFpc2UgRXJyb3IsICdubyBkaXNjIGluIHBsYXllcicKKyAgICBkZWYgY2FjaGVpbmZvKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5zdGF0dXM6CisgICAgICAgICAgICBzZWxmLmNhY2hlc3RhdHVzKCkKKyAgICAgICAgc2VsZi50cmFja2luZm8gPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLnN0YXR1c1s1XSk6CisgICAgICAgICAgICBzZWxmLnRyYWNraW5mby5hcHBlbmQoTm9uZSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5zdGF0dXNbNV0sIHNlbGYuc3RhdHVzWzZdKzEpOgorICAgICAgICAgICAgc2VsZi50cmFja2luZm8uYXBwZW5kKHNlbGYucGxheWVyLmdldHRyYWNraW5mbyhpKSkKIAotCWRlZiBnZXRzdGF0dXMoc2VsZik6Ci0JCXJldHVybiBzZWxmLnBsYXllci5nZXRzdGF0dXMoKQorICAgIGRlZiBjYWNoZXN0YXR1cyhzZWxmKToKKyAgICAgICAgc2VsZi5zdGF0dXMgPSBzZWxmLnBsYXllci5nZXRzdGF0dXMoKQorICAgICAgICBpZiBzZWxmLnN0YXR1c1swXSA9PSBDRC5OT0RJU0M6CisgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IE5vbmUKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnbm8gZGlzYyBpbiBwbGF5ZXInCiAKLQlkZWYgcGxheShzZWxmKToKLQkJaWYgbm90IHNlbGYuc3RhdHVzOgotCQkJc2VsZi5jYWNoZXN0YXR1cygpCi0JCXNpemUgPSBzZWxmLnBsYXllci5iZXN0cmVhZHNpemUoKQotCQlzZWxmLmxpc3RpbmRleCA9IDAKLQkJc2VsZi5wbGF5aW5nID0gMAotCQlmb3IgaSBpbiByYW5nZSg4KToKLQkJCWZ1bmMsIGFyZyA9IHNlbGYuY2FsbGJhY2tzW2ldCi0JCQlpZiBmdW5jOgotCQkJCXNlbGYucGFyc2VyLnNldGNhbGxiYWNrKGksIGZ1bmMsIGFyZykKLQkJCWVsc2U6Ci0JCQkJc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soaSkKLQkJaWYgbGVuKHNlbGYubGlzdCkgPT0gMDoKLQkJCWZvciBpIGluIHJhbmdlKHNlbGYuc3RhdHVzWzVdLCBzZWxmLnN0YXR1c1s2XSsxKToKLQkJCQlzZWxmLmFwcGVuZHRyYWNrKGkpCi0JCXRyeToKLQkJCXdoaWxlIDE6Ci0JCQkJaWYgbm90IHNlbGYucGxheWluZzoKLQkJCQkJaWYgc2VsZi5saXN0aW5kZXggPj0gbGVuKHNlbGYubGlzdCk6Ci0JCQkJCQlyZXR1cm4KLQkJCQkJc3RhcnQsIGVuZCA9IHNlbGYubGlzdFtzZWxmLmxpc3RpbmRleF0KLQkJCQkJaWYgdHlwZShzdGFydCkgPT0gdHlwZSgwKToKLQkJCQkJCWR1bW15ID0gc2VsZi5wbGF5ZXIuc2Vla3RyYWNrKAotCQkJCQkJCXN0YXJ0KQotCQkJCQllbHNlOgotCQkJCQkJbWluLCBzZWMsIGZyYW1lID0gc3RhcnQKLQkJCQkJCWR1bW15ID0gc2VsZi5wbGF5ZXIuc2VlaygKLQkJCQkJCQltaW4sIHNlYywgZnJhbWUpCi0JCQkJCWlmIHR5cGUoZW5kKSA9PSB0eXBlKDApOgotCQkJCQkJc2VsZi5wYXJzZXIuc2V0Y2FsbGJhY2soCi0JCQkJCQkJQ0QuUE5VTSwgX2RvcG51bSwgc2VsZikKLQkJCQkJCXNlbGYuZW5kID0gZW5kCi0JCQkJCQlmdW5jLCBhcmcgPSBcCi0JCQkJCQkgICAgICBzZWxmLmNhbGxiYWNrc1tDRC5BVElNRV0KLQkJCQkJCWlmIGZ1bmM6Ci0JCQkJCQkJc2VsZi5wYXJzZXIuc2V0Y2FsbGJhY2soQ0QuQVRJTUUsIGZ1bmMsIGFyZykKLQkJCQkJCWVsc2U6Ci0JCQkJCQkJc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soQ0QuQVRJTUUpCi0JCQkJCWVsc2U6Ci0JCQkJCQltaW4sIHNlYywgZnJhbWUgPSBlbmQKLQkJCQkJCXNlbGYucGFyc2VyLnNldGNhbGxiYWNrKAotCQkJCQkJCUNELkFUSU1FLCBfZG9hdGltZSwKLQkJCQkJCQlzZWxmKQotCQkJCQkJc2VsZi5lbmQgPSAobWluICogNjAgKyBzZWMpICogXAotCQkJCQkJCSAgIDc1ICsgZnJhbWUKLQkJCQkJCWZ1bmMsIGFyZyA9IFwKLQkJCQkJCSAgICAgIHNlbGYuY2FsbGJhY2tzW0NELlBOVU1dCi0JCQkJCQlpZiBmdW5jOgotCQkJCQkJCXNlbGYucGFyc2VyLnNldGNhbGxiYWNrKENELlBOVU0sIGZ1bmMsIGFyZykKLQkJCQkJCWVsc2U6Ci0JCQkJCQkJc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soQ0QuUE5VTSkKLQkJCQkJc2VsZi5wbGF5aW5nID0gMQotCQkJCWRhdGEgPSBzZWxmLnBsYXllci5yZWFkZGEoc2l6ZSkKLQkJCQlpZiBkYXRhID09ICcnOgotCQkJCQlzZWxmLnBsYXlpbmcgPSAwCi0JCQkJCXNlbGYubGlzdGluZGV4ID0gc2VsZi5saXN0aW5kZXggKyAxCi0JCQkJCWNvbnRpbnVlCi0JCQkJdHJ5OgotCQkJCQlzZWxmLnBhcnNlci5wYXJzZWZyYW1lKGRhdGEpCi0JCQkJZXhjZXB0IF9TdG9wOgotCQkJCQlzZWxmLnBsYXlpbmcgPSAwCi0JCQkJCXNlbGYubGlzdGluZGV4ID0gc2VsZi5saXN0aW5kZXggKyAxCi0JCWZpbmFsbHk6Ci0JCQlzZWxmLnBsYXlpbmcgPSAwCisgICAgZGVmIGdldHN0YXR1cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucGxheWVyLmdldHN0YXR1cygpCisKKyAgICBkZWYgcGxheShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuc3RhdHVzOgorICAgICAgICAgICAgc2VsZi5jYWNoZXN0YXR1cygpCisgICAgICAgIHNpemUgPSBzZWxmLnBsYXllci5iZXN0cmVhZHNpemUoKQorICAgICAgICBzZWxmLmxpc3RpbmRleCA9IDAKKyAgICAgICAgc2VsZi5wbGF5aW5nID0gMAorICAgICAgICBmb3IgaSBpbiByYW5nZSg4KToKKyAgICAgICAgICAgIGZ1bmMsIGFyZyA9IHNlbGYuY2FsbGJhY2tzW2ldCisgICAgICAgICAgICBpZiBmdW5jOgorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnNldGNhbGxiYWNrKGksIGZ1bmMsIGFyZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soaSkKKyAgICAgICAgaWYgbGVuKHNlbGYubGlzdCkgPT0gMDoKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuc3RhdHVzWzVdLCBzZWxmLnN0YXR1c1s2XSsxKToKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZHRyYWNrKGkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucGxheWluZzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5saXN0aW5kZXggPj0gbGVuKHNlbGYubGlzdCk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCA9IHNlbGYubGlzdFtzZWxmLmxpc3RpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShzdGFydCkgPT0gdHlwZSgwKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bW15ID0gc2VsZi5wbGF5ZXIuc2Vla3RyYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbiwgc2VjLCBmcmFtZSA9IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1teSA9IHNlbGYucGxheWVyLnNlZWsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiwgc2VjLCBmcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShlbmQpID09IHR5cGUoMCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5zZXRjYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0QuUE5VTSwgX2RvcG51bSwgc2VsZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kID0gZW5kCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLCBhcmcgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbGxiYWNrc1tDRC5BVElNRV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZ1bmM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuc2V0Y2FsbGJhY2soQ0QuQVRJTUUsIGZ1bmMsIGFyZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soQ0QuQVRJTUUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBtaW4sIHNlYywgZnJhbWUgPSBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnNldGNhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRC5BVElNRSwgX2RvYXRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZCA9IChtaW4gKiA2MCArIHNlYykgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1ICsgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsIGFyZyA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzW0NELlBOVU1dCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBmdW5jOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnNldGNhbGxiYWNrKENELlBOVU0sIGZ1bmMsIGFyZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soQ0QuUE5VTSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wbGF5aW5nID0gMQorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnBsYXllci5yZWFkZGEoc2l6ZSkKKyAgICAgICAgICAgICAgICBpZiBkYXRhID09ICcnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBsYXlpbmcgPSAwCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGlzdGluZGV4ID0gc2VsZi5saXN0aW5kZXggKyAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZWZyYW1lKGRhdGEpCisgICAgICAgICAgICAgICAgZXhjZXB0IF9TdG9wOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBsYXlpbmcgPSAwCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGlzdGluZGV4ID0gc2VsZi5saXN0aW5kZXggKyAxCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnBsYXlpbmcgPSAwCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1pcml4NS90b3JnYi5weSBiL0xpYi9wbGF0LWlyaXg1L3RvcmdiLnB5CmluZGV4IGMyYjE3NDAuLjU0Yzg2YzQgMTAwNzU1Ci0tLSBhL0xpYi9wbGF0LWlyaXg1L3RvcmdiLnB5CisrKyBiL0xpYi9wbGF0LWlyaXg1L3RvcmdiLnB5CkBAIC01MSw0OSArNTEsNDkgQEAKIAogCiBjbGFzcyBlcnJvcihFeGNlcHRpb24pOgotCXBhc3MKKyAgICBwYXNzCiAKIGRlZiB0b3JnYihmaWxlbmFtZSk6Ci0JdGVtcHMgPSBbXQotCXJldCA9IE5vbmUKLQl0cnk6Ci0JCXJldCA9IF90b3JnYihmaWxlbmFtZSwgdGVtcHMpCi0JZmluYWxseToKLQkJZm9yIHRlbXAgaW4gdGVtcHNbOl06Ci0JCQlpZiB0ZW1wICE9IHJldDoKLQkJCQl0cnk6Ci0JCQkJCW9zLnVubGluayh0ZW1wKQotCQkJCWV4Y2VwdCBvcy5lcnJvcjoKLQkJCQkJcGFzcwotCQkJCXRlbXBzLnJlbW92ZSh0ZW1wKQotCXJldHVybiByZXQKKyAgICB0ZW1wcyA9IFtdCisgICAgcmV0ID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgcmV0ID0gX3RvcmdiKGZpbGVuYW1lLCB0ZW1wcykKKyAgICBmaW5hbGx5OgorICAgICAgICBmb3IgdGVtcCBpbiB0ZW1wc1s6XToKKyAgICAgICAgICAgIGlmIHRlbXAgIT0gcmV0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHRlbXApCisgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdGVtcHMucmVtb3ZlKHRlbXApCisgICAgcmV0dXJuIHJldAogCiBkZWYgX3RvcmdiKGZpbGVuYW1lLCB0ZW1wcyk6Ci0JaWYgZmlsZW5hbWVbLTI6XSA9PSAnLlonOgotCQkoZmQsIGZuYW1lKSA9IHRlbXBmaWxlLm1rc3RlbXAoKQotCQlvcy5jbG9zZShmZCkKLQkJdGVtcHMuYXBwZW5kKGZuYW1lKQotCQlzdHMgPSB1bmNvbXByZXNzLmNvcHkoZmlsZW5hbWUsIGZuYW1lKQotCQlpZiBzdHM6Ci0JCQlyYWlzZSBlcnJvciwgZmlsZW5hbWUgKyAnOiB1bmNvbXByZXNzIGZhaWxlZCcKLQllbHNlOgotCQlmbmFtZSA9IGZpbGVuYW1lCi0JdHJ5OgotCQlmdHlwZSA9IGltZ2hkci53aGF0KGZuYW1lKQotCWV4Y2VwdCBJT0Vycm9yLCBtc2c6Ci0JCWlmIHR5cGUobXNnKSA9PSB0eXBlKCgpKSBhbmQgbGVuKG1zZykgPT0gMiBhbmQgXAotCQkJdHlwZShtc2dbMF0pID09IHR5cGUoMCkgYW5kIHR5cGUobXNnWzFdKSA9PSB0eXBlKCcnKToKLQkJCW1zZyA9IG1zZ1sxXQotCQlpZiB0eXBlKG1zZykgaXMgbm90IHR5cGUoJycpOgotCQkJbXNnID0gcmVwcihtc2cpCi0JCXJhaXNlIGVycm9yLCBmaWxlbmFtZSArICc6ICcgKyBtc2cKLQlpZiBmdHlwZSA9PSAncmdiJzoKLQkJcmV0dXJuIGZuYW1lCi0JaWYgZnR5cGUgaXMgTm9uZSBvciBub3QgdGFibGUuaGFzX2tleShmdHlwZSk6Ci0JCXJhaXNlIGVycm9yLCAnJXM6IHVuc3VwcG9ydGVkIGltYWdlIGZpbGUgdHlwZSAlcicgJSAoZmlsZW5hbWUsIGZ0eXBlKQotCShmZCwgdGVtcCkgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKLQlvcy5jbG9zZShmZCkKLQlzdHMgPSB0YWJsZVtmdHlwZV0uY29weShmbmFtZSwgdGVtcCkKLQlpZiBzdHM6Ci0JCXJhaXNlIGVycm9yLCBmaWxlbmFtZSArICc6IGNvbnZlcnNpb24gdG8gcmdiIGZhaWxlZCcKLQlyZXR1cm4gdGVtcAorICAgIGlmIGZpbGVuYW1lWy0yOl0gPT0gJy5aJzoKKyAgICAgICAgKGZkLCBmbmFtZSkgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIHRlbXBzLmFwcGVuZChmbmFtZSkKKyAgICAgICAgc3RzID0gdW5jb21wcmVzcy5jb3B5KGZpbGVuYW1lLCBmbmFtZSkKKyAgICAgICAgaWYgc3RzOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsIGZpbGVuYW1lICsgJzogdW5jb21wcmVzcyBmYWlsZWQnCisgICAgZWxzZToKKyAgICAgICAgZm5hbWUgPSBmaWxlbmFtZQorICAgIHRyeToKKyAgICAgICAgZnR5cGUgPSBpbWdoZHIud2hhdChmbmFtZSkKKyAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICBpZiB0eXBlKG1zZykgPT0gdHlwZSgoKSkgYW5kIGxlbihtc2cpID09IDIgYW5kIFwKKyAgICAgICAgICAgICAgICB0eXBlKG1zZ1swXSkgPT0gdHlwZSgwKSBhbmQgdHlwZShtc2dbMV0pID09IHR5cGUoJycpOgorICAgICAgICAgICAgbXNnID0gbXNnWzFdCisgICAgICAgIGlmIHR5cGUobXNnKSBpcyBub3QgdHlwZSgnJyk6CisgICAgICAgICAgICBtc2cgPSByZXByKG1zZykKKyAgICAgICAgcmFpc2UgZXJyb3IsIGZpbGVuYW1lICsgJzogJyArIG1zZworICAgIGlmIGZ0eXBlID09ICdyZ2InOgorICAgICAgICByZXR1cm4gZm5hbWUKKyAgICBpZiBmdHlwZSBpcyBOb25lIG9yIG5vdCB0YWJsZS5oYXNfa2V5KGZ0eXBlKToKKyAgICAgICAgcmFpc2UgZXJyb3IsICclczogdW5zdXBwb3J0ZWQgaW1hZ2UgZmlsZSB0eXBlICVyJyAlIChmaWxlbmFtZSwgZnR5cGUpCisgICAgKGZkLCB0ZW1wKSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgIG9zLmNsb3NlKGZkKQorICAgIHN0cyA9IHRhYmxlW2Z0eXBlXS5jb3B5KGZuYW1lLCB0ZW1wKQorICAgIGlmIHN0czoKKyAgICAgICAgcmFpc2UgZXJyb3IsIGZpbGVuYW1lICsgJzogY29udmVyc2lvbiB0byByZ2IgZmFpbGVkJworICAgIHJldHVybiB0ZW1wCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1pcml4Ni9BTC5weSBiL0xpYi9wbGF0LWlyaXg2L0FMLnB5CmluZGV4IGVkMTdjZGUuLmVjOTQxYTIgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LWlyaXg2L0FMLnB5CisrKyBiL0xpYi9wbGF0LWlyaXg2L0FMLnB5CkBAIC0xLDYxICsxLDYxIEBACi1SQVRFXzQ4MDAwIAk9IDQ4MDAwCi1SQVRFXzQ0MTAwCT0gNDQxMDAKLVJBVEVfMzIwMDAJPSAzMjAwMAotUkFURV8yMjA1MAk9IDIyMDUwCi1SQVRFXzE2MDAwCT0gMTYwMDAKLVJBVEVfMTEwMjUJPSAxMTAyNQotUkFURV84MDAwCT0gODAwMAorUkFURV80ODAwMCAgICAgID0gNDgwMDAKK1JBVEVfNDQxMDAgICAgICA9IDQ0MTAwCitSQVRFXzMyMDAwICAgICAgPSAzMjAwMAorUkFURV8yMjA1MCAgICAgID0gMjIwNTAKK1JBVEVfMTYwMDAgICAgICA9IDE2MDAwCitSQVRFXzExMDI1ICAgICAgPSAxMTAyNQorUkFURV84MDAwICAgICAgID0gODAwMAogCiBTQU1QRk1UX1RXT1NDT01QPSAxCi1TQU1QRk1UX0ZMT0FUCT0gMzIKLVNBTVBGTVRfRE9VQkxFCT0gNjQKK1NBTVBGTVRfRkxPQVQgICA9IDMyCitTQU1QRk1UX0RPVUJMRSAgPSA2NAogCi1TQU1QTEVfOAk9IDEKLVNBTVBMRV8xNgk9IDIKLQkjIFNBTVBMRV8yNCBpcyB0aGUgbG93IDI0IGJpdHMgb2YgYSBsb25nLCBzaWduIGV4dGVuZGVkIHRvIDMyIGJpdHMKLVNBTVBMRV8yNAk9IDQKK1NBTVBMRV84ICAgICAgICA9IDEKK1NBTVBMRV8xNiAgICAgICA9IDIKKyAgICAgICAgIyBTQU1QTEVfMjQgaXMgdGhlIGxvdyAyNCBiaXRzIG9mIGEgbG9uZywgc2lnbiBleHRlbmRlZCB0byAzMiBiaXRzCitTQU1QTEVfMjQgICAgICAgPSA0CiAKLU1PTk8JCT0gMQotU1RFUkVPCQk9IDIKLVFVQURSTwkJPSA0CQkJIyA0Q0hBTk5FTCBpcyBub3QgYSBsZWdhbCBQeXRob24gbmFtZQorTU9OTyAgICAgICAgICAgID0gMQorU1RFUkVPICAgICAgICAgID0gMgorUVVBRFJPICAgICAgICAgID0gNCAgICAgICAgICAgICAgICAgICAgICMgNENIQU5ORUwgaXMgbm90IGEgbGVnYWwgUHl0aG9uIG5hbWUKIAotSU5QVVRfTElORQk9IDAKLUlOUFVUX01JQwk9IDEKLUlOUFVUX0RJR0lUQUwJPSAyCitJTlBVVF9MSU5FICAgICAgPSAwCitJTlBVVF9NSUMgICAgICAgPSAxCitJTlBVVF9ESUdJVEFMICAgPSAyCiAKLU1PTklUT1JfT0ZGCT0gMAotTU9OSVRPUl9PTgk9IDEKK01PTklUT1JfT0ZGICAgICA9IDAKK01PTklUT1JfT04gICAgICA9IDEKIAotRVJST1JfTlVNQkVSCQk9IDAKLUVSUk9SX1RZUEUJCT0gMQotRVJST1JfTE9DQVRJT05fTFNQIAk9IDIKLUVSUk9SX0xPQ0FUSU9OX01TUAk9IDMKLUVSUk9SX0xFTkdUSAkJPSA0CitFUlJPUl9OVU1CRVIgICAgICAgICAgICA9IDAKK0VSUk9SX1RZUEUgICAgICAgICAgICAgID0gMQorRVJST1JfTE9DQVRJT05fTFNQICAgICAgPSAyCitFUlJPUl9MT0NBVElPTl9NU1AgICAgICA9IDMKK0VSUk9SX0xFTkdUSCAgICAgICAgICAgID0gNAogCi1FUlJPUl9JTlBVVF9VTkRFUkZMT1cJPSAwCi1FUlJPUl9PVVRQVVRfT1ZFUkZMT1cJPSAxCitFUlJPUl9JTlBVVF9VTkRFUkZMT1cgICA9IDAKK0VSUk9SX09VVFBVVF9PVkVSRkxPVyAgID0gMQogCiAjIFRoZXNlIHNlZW0gdG8gYmUgbm90IHN1cHBvcnRlZCBhbnltb3JlOgotIyNIT0xELCBSRUxFQVNFCQkJPSAwLCAxCi0jI0FUVEFJTCwgQVRIRUFELCBBVE1BUkssIEFUVElNRQk9IDAsIDEsIDIsIDMKKyMjSE9MRCwgUkVMRUFTRSAgICAgICAgICAgICAgICAgPSAwLCAxCisjI0FUVEFJTCwgQVRIRUFELCBBVE1BUkssIEFUVElNRSAgICAgICAgPSAwLCAxLCAyLCAzCiAKLURFRkFVTFRfREVWSUNFCT0gMQorREVGQVVMVF9ERVZJQ0UgID0gMQogCi1JTlBVVF9TT1VSQ0UJCT0gMAotTEVGVF9JTlBVVF9BVFRFTgk9IDEKLVJJR0hUX0lOUFVUX0FUVEVOCT0gMgotSU5QVVRfUkFURQkJPSAzCi1PVVRQVVRfUkFURQkJPSA0Ci1MRUZUX1NQRUFLRVJfR0FJTgk9IDUKLVJJR0hUX1NQRUFLRVJfR0FJTgk9IDYKLUlOUFVUX0NPVU5UCQk9IDcKLU9VVFBVVF9DT1VOVAkJPSA4Ci1VTlVTRURfQ09VTlQJCT0gOQotU1lOQ19JTlBVVF9UT19BRVMJPSAxMAotU1lOQ19PVVRQVVRfVE9fQUVTCT0gMTEKLU1PTklUT1JfQ1RMCQk9IDEyCi1MRUZUX01PTklUT1JfQVRURU4JPSAxMwotUklHSFRfTU9OSVRPUl9BVFRFTgk9IDE0CitJTlBVVF9TT1VSQ0UgICAgICAgICAgICA9IDAKK0xFRlRfSU5QVVRfQVRURU4gICAgICAgID0gMQorUklHSFRfSU5QVVRfQVRURU4gICAgICAgPSAyCitJTlBVVF9SQVRFICAgICAgICAgICAgICA9IDMKK09VVFBVVF9SQVRFICAgICAgICAgICAgID0gNAorTEVGVF9TUEVBS0VSX0dBSU4gICAgICAgPSA1CitSSUdIVF9TUEVBS0VSX0dBSU4gICAgICA9IDYKK0lOUFVUX0NPVU5UICAgICAgICAgICAgID0gNworT1VUUFVUX0NPVU5UICAgICAgICAgICAgPSA4CitVTlVTRURfQ09VTlQgICAgICAgICAgICA9IDkKK1NZTkNfSU5QVVRfVE9fQUVTICAgICAgID0gMTAKK1NZTkNfT1VUUFVUX1RPX0FFUyAgICAgID0gMTEKK01PTklUT1JfQ1RMICAgICAgICAgICAgID0gMTIKK0xFRlRfTU9OSVRPUl9BVFRFTiAgICAgID0gMTMKK1JJR0hUX01PTklUT1JfQVRURU4gICAgID0gMTQKIAotRU5VTV9WQUxVRQk9IDAJIyBvbmx5IGNlcnRhaW4gdmFsdWVzIGFyZSB2YWxpZAotUkFOR0VfVkFMVUUJPSAxCSMgYW55IHZhbHVlIGluIHJhbmdlIGlzIHZhbGlkCitFTlVNX1ZBTFVFICAgICAgPSAwICAgICAjIG9ubHkgY2VydGFpbiB2YWx1ZXMgYXJlIHZhbGlkCitSQU5HRV9WQUxVRSAgICAgPSAxICAgICAjIGFueSB2YWx1ZSBpbiByYW5nZSBpcyB2YWxpZApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDYvQ0QucHkgYi9MaWIvcGxhdC1pcml4Ni9DRC5weQppbmRleCBhZDU2NTYxLi44YzFlMDNiIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1pcml4Ni9DRC5weQorKysgYi9MaWIvcGxhdC1pcml4Ni9DRC5weQpAQCAtMSwzNCArMSwzNCBAQAotRVJST1IJCT0gMAotTk9ESVNDCQk9IDEKLVJFQURZCQk9IDIKLVBMQVlJTkcJCT0gMwotUEFVU0VECQk9IDQKLVNUSUxMCQk9IDUKK0VSUk9SICAgICAgICAgICA9IDAKK05PRElTQyAgICAgICAgICA9IDEKK1JFQURZICAgICAgICAgICA9IDIKK1BMQVlJTkcgICAgICAgICA9IDMKK1BBVVNFRCAgICAgICAgICA9IDQKK1NUSUxMICAgICAgICAgICA9IDUKIAotQVVESU8JCT0gMAotUE5VTQkJPSAxCi1JTkRFWAkJPSAyCi1QVElNRQkJPSAzCi1BVElNRQkJPSA0Ci1DQVRBTE9HCQk9IDUKLUlERU5UCQk9IDYKLUNPTlRST0wJCT0gNworQVVESU8gICAgICAgICAgID0gMAorUE5VTSAgICAgICAgICAgID0gMQorSU5ERVggICAgICAgICAgID0gMgorUFRJTUUgICAgICAgICAgID0gMworQVRJTUUgICAgICAgICAgID0gNAorQ0FUQUxPRyAgICAgICAgID0gNQorSURFTlQgICAgICAgICAgID0gNgorQ09OVFJPTCAgICAgICAgID0gNwogCi1DRERBX0RBVEFTSVpFCT0gMjM1MgorQ0REQV9EQVRBU0laRSAgID0gMjM1MgogCi0jI0NEREFfU1VCQ09ERVNJWkUJPSAoc2l6ZW9mKHN0cnVjdCBzdWJjb2RlUSkpCi0jI0NEREFfQkxPQ0tTSVpFCT0gKHNpemVvZihzdHJ1Y3QgY2RmcmFtZSkpCi0jI0NEREFfTlVNU0FNUExFUwk9IChDRERBX0RBVEFTSVpFLzIpCisjI0NEREFfU1VCQ09ERVNJWkUgICAgICA9IChzaXplb2Yoc3RydWN0IHN1YmNvZGVRKSkKKyMjQ0REQV9CTE9DS1NJWkUgICAgICAgID0gKHNpemVvZihzdHJ1Y3QgY2RmcmFtZSkpCisjI0NEREFfTlVNU0FNUExFUyAgICAgICA9IChDRERBX0RBVEFTSVpFLzIpCiAjIwotIyNDRFFfUFJFRU1QX01BU0sJPSAweGQKLSMjQ0RRX0NPUFlfTUFTSwk9IDB4YgotIyNDRFFfRERBVEFfTUFTSwk9IDB4ZAotIyNDRFFfQlJPQURDQVNUX01BU0sJPSAweDgKLSMjQ0RRX1BSRUVNUEhBU0lTCT0gMHgxCi0jI0NEUV9DT1BZX1BFUk1JVFRFRAk9IDB4MgkJCi0jI0NEUV9ESUdJVEFMX0RBVEEJPSAweDQKLSMjQ0RRX0JST0FEQ0FTVF9VU0UJPSAweDgKKyMjQ0RRX1BSRUVNUF9NQVNLICAgICAgID0gMHhkCisjI0NEUV9DT1BZX01BU0sgPSAweGIKKyMjQ0RRX0REQVRBX01BU0sgICAgICAgID0gMHhkCisjI0NEUV9CUk9BRENBU1RfTUFTSyAgICA9IDB4OAorIyNDRFFfUFJFRU1QSEFTSVMgICAgICAgPSAweDEKKyMjQ0RRX0NPUFlfUEVSTUlUVEVEICAgID0gMHgyCisjI0NEUV9ESUdJVEFMX0RBVEEgICAgICA9IDB4NAorIyNDRFFfQlJPQURDQVNUX1VTRSAgICAgPSAweDgKICMjCi0jI0NEUV9NT0RFMQk9IDB4MQotIyNDRFFfTU9ERTIJPSAweDIKLSMjQ0RRX01PREUzCT0gMHgzCisjI0NEUV9NT0RFMSAgICAgPSAweDEKKyMjQ0RRX01PREUyICAgICA9IDB4MgorIyNDRFFfTU9ERTMgICAgID0gMHgzCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1pcml4Ni9DTC5weSBiL0xpYi9wbGF0LWlyaXg2L0NMLnB5CmluZGV4IDQ2OGVjYWEuLjIzMjU5YzUgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LWlyaXg2L0NMLnB5CisrKyBiL0xpYi9wbGF0LWlyaXg2L0NMLnB5CkBAIC0xLDI0ICsxLDI0IEBACiAjIEJhY2t3YXJkIGNvbXBhdGlibGUgbW9kdWxlIENMLgogIyBBbGwgcmVsZXZhbnQgc3ltYm9scyBhcmUgbm93IGRlZmluZWQgaW4gdGhlIG1vZHVsZSBjbC4KIHRyeToKLQlmcm9tIGNsIGltcG9ydCAqCisgICAgZnJvbSBjbCBpbXBvcnQgKgogZXhjZXB0IEltcG9ydEVycm9yOgotCWZyb20gQ0xfb2xkIGltcG9ydCAqCisgICAgZnJvbSBDTF9vbGQgaW1wb3J0ICoKIGVsc2U6Ci0JZGVsIENvbXByZXNzSW1hZ2UKLQlkZWwgRGVjb21wcmVzc0ltYWdlCi0JZGVsIEdldEFsZ29yaXRobU5hbWUKLQlkZWwgT3BlbkNvbXByZXNzb3IKLQlkZWwgT3BlbkRlY29tcHJlc3NvcgotCWRlbCBRdWVyeUFsZ29yaXRobXMKLQlkZWwgUXVlcnlNYXhIZWFkZXJTaXplCi0JZGVsIFF1ZXJ5U2NoZW1lCi0JZGVsIFF1ZXJ5U2NoZW1lRnJvbU5hbWUKLQlkZWwgU2V0RGVmYXVsdAotCWRlbCBTZXRNYXgKLQlkZWwgU2V0TWluCi0JdHJ5OgotCQlkZWwgY3Z0X3R5cGUKLQlleGNlcHQgTmFtZUVycm9yOgotCQlwYXNzCi0JZGVsIGVycm9yCisgICAgZGVsIENvbXByZXNzSW1hZ2UKKyAgICBkZWwgRGVjb21wcmVzc0ltYWdlCisgICAgZGVsIEdldEFsZ29yaXRobU5hbWUKKyAgICBkZWwgT3BlbkNvbXByZXNzb3IKKyAgICBkZWwgT3BlbkRlY29tcHJlc3NvcgorICAgIGRlbCBRdWVyeUFsZ29yaXRobXMKKyAgICBkZWwgUXVlcnlNYXhIZWFkZXJTaXplCisgICAgZGVsIFF1ZXJ5U2NoZW1lCisgICAgZGVsIFF1ZXJ5U2NoZW1lRnJvbU5hbWUKKyAgICBkZWwgU2V0RGVmYXVsdAorICAgIGRlbCBTZXRNYXgKKyAgICBkZWwgU2V0TWluCisgICAgdHJ5OgorICAgICAgICBkZWwgY3Z0X3R5cGUKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZGVsIGVycm9yCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1pcml4Ni9GSUxFLnB5IGIvTGliL3BsYXQtaXJpeDYvRklMRS5weQppbmRleCAwODdkMmVjLi5hYjc0ZDdjIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1pcml4Ni9GSUxFLnB5CisrKyBiL0xpYi9wbGF0LWlyaXg2L0ZJTEUucHkKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiBkZWYgT0ZGVE9CQlQoYnl0ZXMpOiByZXR1cm4gKChvZmZfdCkoYnl0ZXMpID4+IEJCU0hJRlQpCiAKLWRlZiBCQlRPT0ZGKGJicyk6IHJldHVybiAoKG9mZl90KShiYnMpIDw8IEJCU0hJRlQpICAgICAKK2RlZiBCQlRPT0ZGKGJicyk6IHJldHVybiAoKG9mZl90KShiYnMpIDw8IEJCU0hJRlQpCiAKIFNFRUtMSU1JVDMyID0gMHg3ZmZmZmZmZgogTUFYQlNJWkUgPSA4MTkyCkBAIC00ODksOSArNDg5LDkgQEAKIE1STE9DS19EQkxUUklQUEFCTEUgPSAweDQKIE1STE9DS19BTExPV19FUVVBTF9QUkkgPSAweDgKIE1STE9DS19ERUZBVUxUID0gTVJMT0NLX0JBUlJJRVIKLWRlZiBtcmFjY2VzcyhtcnApOiByZXR1cm4gbXJhY2Nlc3NmKG1ycCwgMCkJIAorZGVmIG1yYWNjZXNzKG1ycCk6IHJldHVybiBtcmFjY2Vzc2YobXJwLCAwKQogCi1kZWYgbXJ1cGRhdGUobXJwKTogcmV0dXJuIG1ydXBkYXRlZihtcnAsIDApCSAKK2RlZiBtcnVwZGF0ZShtcnApOiByZXR1cm4gbXJ1cGRhdGVmKG1ycCwgMCkKIAogZGVmIG1wX211dGV4X3VubG9jayhtKTogcmV0dXJuIG11dGV4X3VubG9jayhtKQogCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1pcml4Ni9GTC5weSBiL0xpYi9wbGF0LWlyaXg2L0ZMLnB5CmluZGV4IGFlNjY1ZTMuLjcyN2RhNGMgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LWlyaXg2L0ZMLnB5CisrKyBiL0xpYi9wbGF0LWlyaXg2L0ZMLnB5CkBAIC03LDkgKzcsOSBAQAogX3YyMSA9IDEKICMjaW1wb3J0IGZsCiAjI3RyeToKLSMjCV92MjAgPSAoZmwuZ2V0X3JnYm1vZGUgaXMgbm90IE5vbmUpCisjIyAgICAgIF92MjAgPSAoZmwuZ2V0X3JnYm1vZGUgaXMgbm90IE5vbmUpCiAjI2V4Y2VwdDoKLSMjCV92MjAgPSAwCisjIyAgICAgIF92MjAgPSAwCiAjI2RlbCBmbAogCiBOVUxMID0gMApAQCAtMjAsNyArMjAsNyBAQAogCiBMQUJFTF9TSVpFID0gNjQKIGlmIF92MjA6Ci0JU0hPUlRDVVRfU0laRSA9IDMyCisgICAgU0hPUlRDVVRfU0laRSA9IDMyCiBQTEFDRV9GUkVFID0gMAogUExBQ0VfU0laRSA9IDEKIFBMQUNFX0FTUEVDVCA9IDIKQEAgLTExOSw3ICsxMTksNyBAQAogSU5PVVRfQlVUVE9OID0gNQogUkVUVVJOX0JVVFRPTiA9IDYKIGlmIF92MjA6Ci0JSElEREVOX1JFVF9CVVRUT04gPSA3CisgICAgSElEREVOX1JFVF9CVVRUT04gPSA3CiBCVVRUT05fQk9YVFlQRSA9IFVQX0JPWAogQlVUVE9OX0NPTDEgPSBDT0wxCiBCVVRUT05fQ09MMiA9IENPTDEKQEAgLTEyOSwyMCArMTI5LDIwIEBACiBCVVRUT05fTUNPTDIgPSBNQ09MCiBCVVRUT05fQlcgPSBCT1VORF9XSURUSAogaWYgX3YyMDoKLQlDSEFSVCA9IDQKLQlCQVJfQ0hBUlQgPSAwCi0JSE9SQkFSX0NIQVJUID0gMQotCUxJTkVfQ0hBUlQgPSAyCi0JRklMTEVEX0NIQVJUID0gMwotCVNQSUtFX0NIQVJUID0gNAotCVBJRV9DSEFSVCA9IDUKLQlTUEVDSUFMUElFX0NIQVJUID0gNgotCUNIQVJUX0JPWFRZUEUgPSBCT1JERVJfQk9YCi0JQ0hBUlRfQ09MMSA9IENPTDEKLQlDSEFSVF9MQ09MID0gTENPTAotCUNIQVJUX0FMSUdOID0gQUxJR05fQk9UVE9NCi0JQ0hBUlRfQlcgPSBCT1VORF9XSURUSAotCUNIQVJUX01BWCA9IDEyOAorICAgIENIQVJUID0gNAorICAgIEJBUl9DSEFSVCA9IDAKKyAgICBIT1JCQVJfQ0hBUlQgPSAxCisgICAgTElORV9DSEFSVCA9IDIKKyAgICBGSUxMRURfQ0hBUlQgPSAzCisgICAgU1BJS0VfQ0hBUlQgPSA0CisgICAgUElFX0NIQVJUID0gNQorICAgIFNQRUNJQUxQSUVfQ0hBUlQgPSA2CisgICAgQ0hBUlRfQk9YVFlQRSA9IEJPUkRFUl9CT1gKKyAgICBDSEFSVF9DT0wxID0gQ09MMQorICAgIENIQVJUX0xDT0wgPSBMQ09MCisgICAgQ0hBUlRfQUxJR04gPSBBTElHTl9CT1RUT00KKyAgICBDSEFSVF9CVyA9IEJPVU5EX1dJRFRICisgICAgQ0hBUlRfTUFYID0gMTI4CiBDSE9JQ0UgPSA0MgogTk9STUFMX0NIT0lDRSA9IDAKIENIT0lDRV9CT1hUWVBFID0gRE9XTl9CT1gKQEAgLTE3MywxMSArMTczLDExIEBACiBDT1VOVEVSX0xDT0wgPSBMQ09MCiBDT1VOVEVSX0FMSUdOID0gQUxJR05fQk9UVE9NCiBpZiBfdjIwOgotCUNPVU5URVJfQlcgPSBCT1VORF9XSURUSAorICAgIENPVU5URVJfQlcgPSBCT1VORF9XSURUSAogZWxzZToKLQlERUZBVUxUID0gNTEKLQlSRVRVUk5fREVGQVVMVCA9IDAKLQlBTFdBWVNfREVGQVVMVCA9IDEKKyAgICBERUZBVUxUID0gNTEKKyAgICBSRVRVUk5fREVGQVVMVCA9IDAKKyAgICBBTFdBWVNfREVGQVVMVCA9IDEKIERJQUwgPSAyMgogTk9STUFMX0RJQUwgPSAwCiBMSU5FX0RJQUwgPSAxCkBAIC0xOTcsMTQgKzE5NywxNCBAQAogSU5QVVQgPSAzMQogTk9STUFMX0lOUFVUID0gMAogaWYgX3YyMDoKLQlGTE9BVF9JTlBVVCA9IDEKLQlJTlRfSU5QVVQgPSAyCi0JSElEREVOX0lOUFVUID0gMwotCWlmIF92MjE6Ci0JCU1VTFRJTElORV9JTlBVVCA9IDQKLQkJU0VDUkVUX0lOUFVUID0gNQorICAgIEZMT0FUX0lOUFVUID0gMQorICAgIElOVF9JTlBVVCA9IDIKKyAgICBISURERU5fSU5QVVQgPSAzCisgICAgaWYgX3YyMToKKyAgICAgICAgTVVMVElMSU5FX0lOUFVUID0gNAorICAgICAgICBTRUNSRVRfSU5QVVQgPSA1CiBlbHNlOgotCUFMV0FZU19JTlBVVCA9IDEKKyAgICBBTFdBWVNfSU5QVVQgPSAxCiBJTlBVVF9CT1hUWVBFID0gRE9XTl9CT1gKIElOUFVUX0NPTDEgPSAxMwogSU5QVVRfQ09MMiA9IDUKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWlyaXg2L1NWLnB5IGIvTGliL3BsYXQtaXJpeDYvU1YucHkKaW5kZXggMDhmYjkxNy4uZGI4ZWZlNSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtaXJpeDYvU1YucHkKKysrIGIvTGliL3BsYXQtaXJpeDYvU1YucHkKQEAgLTcsMTYgKzcsMTYgQEAKIE1BWF9TT1VSQ0VTID0gMgogCiAjIG1vZGUgcGFyYW1ldGVyIGZvciBCaW5kIGNhbGxzCi1JTl9PRkYgPSAwCQkJCSMgTm8gVmlkZW8KLUlOX09WRVIgPSAxCQkJCSMgVmlkZW8gb3ZlciBncmFwaGljcwotSU5fVU5ERVIgPSAyCQkJCSMgVmlkZW8gdW5kZXIgZ3JhcGhpY3MKLUlOX1JFUExBQ0UgPSAzCQkJCSMgVmlkZW8gcmVwbGFjZXMgZW50aXJlIHdpbgorSU5fT0ZGID0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gVmlkZW8KK0lOX09WRVIgPSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFZpZGVvIG92ZXIgZ3JhcGhpY3MKK0lOX1VOREVSID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFZpZGVvIHVuZGVyIGdyYXBoaWNzCitJTl9SRVBMQUNFID0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBWaWRlbyByZXBsYWNlcyBlbnRpcmUgd2luCiAKICMgbW9kZSBwYXJhbWV0ZXJzIGZvciBMb2FkTWFwIGNhbGxzLiAgU3BlY2lmaWVzIGJ1ZmZlciwgYWx3YXlzIDI1NiBlbnRyaWVzCi1JTlBVVF9DT0xPUk1BUCA9IDAJCQkjIHR1cGxlcyBvZiA4LWJpdCBSR0IKLUNIUk9NQV9LRVlfTUFQID0gMQkJCSMgdHVwbGVzIG9mIDgtYml0IFJHQgotQ09MT1JfU1BBQ0VfTUFQID0gMgkJCSMgdHVwbGVzIG9mIDgtYml0IFJHQgotR0FNTUFfTUFQID0gMwkJCQkjIHR1cGxlcyBvZiAyNC1iaXQgcmVkIHZhbHVlcworSU5QVVRfQ09MT1JNQVAgPSAwICAgICAgICAgICAgICAgICAgICAgICMgdHVwbGVzIG9mIDgtYml0IFJHQgorQ0hST01BX0tFWV9NQVAgPSAxICAgICAgICAgICAgICAgICAgICAgICMgdHVwbGVzIG9mIDgtYml0IFJHQgorQ09MT1JfU1BBQ0VfTUFQID0gMiAgICAgICAgICAgICAgICAgICAgICMgdHVwbGVzIG9mIDgtYml0IFJHQgorR0FNTUFfTUFQID0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHVwbGVzIG9mIDI0LWJpdCByZWQgdmFsdWVzCiAKICMgbW9kZSBwYXJhbWV0ZXJzIGZvciBVc2VFeGNsdXNpdmUgY2FsbHMKIElOUFVUID0gMApAQCAtMjQsOSArMjQsOSBAQAogSU5fT1VUID0gMgogCiAjIEZvcm1hdCBjb25zdGFudHMgZm9yIHRoZSBjYXB0dXJlIHJvdXRpbmVzCi1SR0I4X0ZSQU1FUyA9IDAJCQkJIyBub25pbnRlcmxlYXZlZCA4IGJpdCAzOjI6MyBSQkcgZmllbGRzCi1SR0IzMl9GUkFNRVMgPSAxCQkJIyAzMi1iaXQgODo4OjggUkdCIGZyYW1lcwotWVVWNDExX0ZSQU1FUyA9IDIJCQkjIGludGVybGVhdmVkLCA4OjI6MiBZVVYgZm9ybWF0CitSR0I4X0ZSQU1FUyA9IDAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub25pbnRlcmxlYXZlZCA4IGJpdCAzOjI6MyBSQkcgZmllbGRzCitSR0IzMl9GUkFNRVMgPSAxICAgICAgICAgICAgICAgICAgICAgICAgIyAzMi1iaXQgODo4OjggUkdCIGZyYW1lcworWVVWNDExX0ZSQU1FUyA9IDIgICAgICAgICAgICAgICAgICAgICAgICMgaW50ZXJsZWF2ZWQsIDg6MjoyIFlVViBmb3JtYXQKIFlVVjQxMV9GUkFNRVNfQU5EX0JMQU5LSU5HX0JVRkZFUiA9IDMKIAogIwpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDYvY2RkYi5weSBiL0xpYi9wbGF0LWlyaXg2L2NkZGIucHkKaW5kZXggMjU2OTI3Yy4uNDU4ODMwNSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtaXJpeDYvY2RkYi5weQorKysgYi9MaWIvcGxhdC1pcml4Ni9jZGRiLnB5CkBAIC0yMCwxODUgKzIwLDE4NSBAQAogX0RCX0lEX05UUkFDS1MgPSA1CiBfZGJpZF9tYXAgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaQF89K2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwogZGVmIF9kYmlkKHYpOgotCWlmIHYgPj0gbGVuKF9kYmlkX21hcCk6Ci0JCXJldHVybiBzdHJpbmcuemZpbGwodiwgMikKLQllbHNlOgotCQlyZXR1cm4gX2RiaWRfbWFwW3ZdCisgICAgaWYgdiA+PSBsZW4oX2RiaWRfbWFwKToKKyAgICAgICAgcmV0dXJuIHN0cmluZy56ZmlsbCh2LCAyKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfZGJpZF9tYXBbdl0KIAogZGVmIHRvY2hhc2godG9jKToKLQlpZiB0eXBlKHRvYykgPT0gdHlwZSgnJyk6Ci0JCXRyYWNrbGlzdCA9IFtdCi0JCWZvciBpIGluIHJhbmdlKDIsIGxlbih0b2MpLCA0KToKLQkJCXRyYWNrbGlzdC5hcHBlbmQoKE5vbmUsCi0JCQkJICAoaW50KHRvY1tpOmkrMl0pLAotCQkJCSAgIGludCh0b2NbaSsyOmkrNF0pKSkpCi0JZWxzZToKLQkJdHJhY2tsaXN0ID0gdG9jCi0JbnRyYWNrcyA9IGxlbih0cmFja2xpc3QpCi0JaGFzaCA9IF9kYmlkKChudHJhY2tzID4+IDQpICYgMHhGKSArIF9kYmlkKG50cmFja3MgJiAweEYpCi0JaWYgbnRyYWNrcyA8PSBfREJfSURfTlRSQUNLUzoKLQkJbmlkdHJhY2tzID0gbnRyYWNrcwotCWVsc2U6Ci0JCW5pZHRyYWNrcyA9IF9EQl9JRF9OVFJBQ0tTIC0gMQotCQltaW4gPSAwCi0JCXNlYyA9IDAKLQkJZm9yIHRyYWNrIGluIHRyYWNrbGlzdDoKLQkJCXN0YXJ0LCBsZW5ndGggPSB0cmFjawotCQkJbWluID0gbWluICsgbGVuZ3RoWzBdCi0JCQlzZWMgPSBzZWMgKyBsZW5ndGhbMV0KLQkJbWluID0gbWluICsgc2VjIC8gNjAKLQkJc2VjID0gc2VjICUgNjAKLQkJaGFzaCA9IGhhc2ggKyBfZGJpZChtaW4pICsgX2RiaWQoc2VjKQotCWZvciBpIGluIHJhbmdlKG5pZHRyYWNrcyk6Ci0JCXN0YXJ0LCBsZW5ndGggPSB0cmFja2xpc3RbaV0KLQkJaGFzaCA9IGhhc2ggKyBfZGJpZChsZW5ndGhbMF0pICsgX2RiaWQobGVuZ3RoWzFdKQotCXJldHVybiBoYXNoCi0JCisgICAgaWYgdHlwZSh0b2MpID09IHR5cGUoJycpOgorICAgICAgICB0cmFja2xpc3QgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4odG9jKSwgNCk6CisgICAgICAgICAgICB0cmFja2xpc3QuYXBwZW5kKChOb25lLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQodG9jW2k6aSsyXSksCisgICAgICAgICAgICAgICAgICAgICAgIGludCh0b2NbaSsyOmkrNF0pKSkpCisgICAgZWxzZToKKyAgICAgICAgdHJhY2tsaXN0ID0gdG9jCisgICAgbnRyYWNrcyA9IGxlbih0cmFja2xpc3QpCisgICAgaGFzaCA9IF9kYmlkKChudHJhY2tzID4+IDQpICYgMHhGKSArIF9kYmlkKG50cmFja3MgJiAweEYpCisgICAgaWYgbnRyYWNrcyA8PSBfREJfSURfTlRSQUNLUzoKKyAgICAgICAgbmlkdHJhY2tzID0gbnRyYWNrcworICAgIGVsc2U6CisgICAgICAgIG5pZHRyYWNrcyA9IF9EQl9JRF9OVFJBQ0tTIC0gMQorICAgICAgICBtaW4gPSAwCisgICAgICAgIHNlYyA9IDAKKyAgICAgICAgZm9yIHRyYWNrIGluIHRyYWNrbGlzdDoKKyAgICAgICAgICAgIHN0YXJ0LCBsZW5ndGggPSB0cmFjaworICAgICAgICAgICAgbWluID0gbWluICsgbGVuZ3RoWzBdCisgICAgICAgICAgICBzZWMgPSBzZWMgKyBsZW5ndGhbMV0KKyAgICAgICAgbWluID0gbWluICsgc2VjIC8gNjAKKyAgICAgICAgc2VjID0gc2VjICUgNjAKKyAgICAgICAgaGFzaCA9IGhhc2ggKyBfZGJpZChtaW4pICsgX2RiaWQoc2VjKQorICAgIGZvciBpIGluIHJhbmdlKG5pZHRyYWNrcyk6CisgICAgICAgIHN0YXJ0LCBsZW5ndGggPSB0cmFja2xpc3RbaV0KKyAgICAgICAgaGFzaCA9IGhhc2ggKyBfZGJpZChsZW5ndGhbMF0pICsgX2RiaWQobGVuZ3RoWzFdKQorICAgIHJldHVybiBoYXNoCisKIGNsYXNzIENkZGI6Ci0JZGVmIF9faW5pdF9fKHNlbGYsIHRyYWNrbGlzdCk6Ci0JCWlmIG9zLmVudmlyb24uaGFzX2tleSgnQ0REQl9QQVRIJyk6Ci0JCQlwYXRoID0gb3MuZW52aXJvblsnQ0REQl9QQVRIJ10KLQkJCWNkZGJfcGF0aCA9IHBhdGguc3BsaXQoJywnKQotCQllbHNlOgotCQkJaG9tZSA9IG9zLmVudmlyb25bJ0hPTUUnXQotCQkJY2RkYl9wYXRoID0gW2hvbWUgKyAnLycgKyBfY2RkYnJjXQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFja2xpc3QpOgorICAgICAgICBpZiBvcy5lbnZpcm9uLmhhc19rZXkoJ0NEREJfUEFUSCcpOgorICAgICAgICAgICAgcGF0aCA9IG9zLmVudmlyb25bJ0NEREJfUEFUSCddCisgICAgICAgICAgICBjZGRiX3BhdGggPSBwYXRoLnNwbGl0KCcsJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhvbWUgPSBvcy5lbnZpcm9uWydIT01FJ10KKyAgICAgICAgICAgIGNkZGJfcGF0aCA9IFtob21lICsgJy8nICsgX2NkZGJyY10KIAotCQlzZWxmLl9nZXRfaWQodHJhY2tsaXN0KQorICAgICAgICBzZWxmLl9nZXRfaWQodHJhY2tsaXN0KQogCi0JCWZvciBkaXIgaW4gY2RkYl9wYXRoOgotCQkJZmlsZSA9IGRpciArICcvJyArIHNlbGYuaWQgKyAnLnJkYicKLQkJCXRyeToKLQkJCQlmID0gb3BlbihmaWxlLCAncicpCi0JCQkJc2VsZi5maWxlID0gZmlsZQotCQkJCWJyZWFrCi0JCQlleGNlcHQgSU9FcnJvcjoKLQkJCQlwYXNzCi0JCW50cmFja3MgPSBpbnQoc2VsZi5pZFs6Ml0sIDE2KQotCQlzZWxmLmFydGlzdCA9ICcnCi0JCXNlbGYudGl0bGUgPSAnJwotCQlzZWxmLnRyYWNrID0gW05vbmVdICsgWycnXSAqIG50cmFja3MKLQkJc2VsZi50cmFja2FydGlzdCA9IFtOb25lXSArIFsnJ10gKiBudHJhY2tzCi0JCXNlbGYubm90ZXMgPSBbXQotCQlpZiBub3QgaGFzYXR0cihzZWxmLCAnZmlsZScpOgotCQkJcmV0dXJuCi0JCWltcG9ydCByZQotCQlyZWcgPSByZS5jb21waWxlKHInXihbXi5dKilcLihbXjpdKik6W1x0IF0rKC4qKScpCi0JCXdoaWxlIDE6Ci0JCQlsaW5lID0gZi5yZWFkbGluZSgpCi0JCQlpZiBub3QgbGluZToKLQkJCQlicmVhawotCQkJbWF0Y2ggPSByZWcubWF0Y2gobGluZSkKLQkJCWlmIG5vdCBtYXRjaDoKLQkJCQlwcmludCAnc3ludGF4IGVycm9yIGluICcgKyBmaWxlCi0JCQkJY29udGludWUKLQkJCW5hbWUxLCBuYW1lMiwgdmFsdWUgPSBtYXRjaC5ncm91cCgxLCAyLCAzKQotCQkJaWYgbmFtZTEgPT0gJ2FsYnVtJzoKLQkJCQlpZiBuYW1lMiA9PSAnYXJ0aXN0JzoKLQkJCQkJc2VsZi5hcnRpc3QgPSB2YWx1ZQotCQkJCWVsaWYgbmFtZTIgPT0gJ3RpdGxlJzoKLQkJCQkJc2VsZi50aXRsZSA9IHZhbHVlCi0JCQkJZWxpZiBuYW1lMiA9PSAndG9jJzoKLQkJCQkJaWYgbm90IHNlbGYudG9jOgotCQkJCQkJc2VsZi50b2MgPSB2YWx1ZQotCQkJCQlpZiBzZWxmLnRvYyAhPSB2YWx1ZToKLQkJCQkJCXByaW50ICd0b2NcJ3MgZG9uXCd0IG1hdGNoJwotCQkJCWVsaWYgbmFtZTIgPT0gJ25vdGVzJzoKLQkJCQkJc2VsZi5ub3Rlcy5hcHBlbmQodmFsdWUpCi0JCQllbGlmIG5hbWUxWzo1XSA9PSAndHJhY2snOgotCQkJCXRyeToKLQkJCQkJdHJhY2tubyA9IGludChuYW1lMVs1Ol0pCi0JCQkJZXhjZXB0IFZhbHVlRXJyb3I6Ci0JCQkJCXByaW50ICdzeW50YXggZXJyb3IgaW4gJyArIGZpbGUKLQkJCQkJY29udGludWUKLQkJCQlpZiB0cmFja25vID4gbnRyYWNrczoKLQkJCQkJcHJpbnQgJ3RyYWNrIG51bWJlciAlciBpbiBmaWxlICVzIG91dCBvZiByYW5nZScgJSAodHJhY2tubywgZmlsZSkKLQkJCQkJY29udGludWUKLQkJCQlpZiBuYW1lMiA9PSAndGl0bGUnOgotCQkJCQlzZWxmLnRyYWNrW3RyYWNrbm9dID0gdmFsdWUKLQkJCQllbGlmIG5hbWUyID09ICdhcnRpc3QnOgotCQkJCQlzZWxmLnRyYWNrYXJ0aXN0W3RyYWNrbm9dID0gdmFsdWUKLQkJZi5jbG9zZSgpCi0JCWZvciBpIGluIHJhbmdlKDIsIGxlbihzZWxmLnRyYWNrKSk6Ci0JCQl0cmFjayA9IHNlbGYudHJhY2tbaV0KLQkJCSMgaWYgdHJhY2sgdGl0bGUgc3RhcnRzIHdpdGggYCwnLCB1c2UgaW5pdGlhbCBwYXJ0Ci0JCQkjIG9mIHByZXZpb3VzIHRyYWNrJ3MgdGl0bGUKLQkJCWlmIHRyYWNrIGFuZCB0cmFja1swXSA9PSAnLCc6Ci0JCQkJdHJ5OgotCQkJCQlvZmYgPSBzZWxmLnRyYWNrW2kgLSAxXS5pbmRleCgnLCcpCi0JCQkJZXhjZXB0IFZhbHVlRXJyb3I6Ci0JCQkJCXBhc3MKLQkJCQllbHNlOgotCQkJCQlzZWxmLnRyYWNrW2ldID0gc2VsZi50cmFja1tpLTFdWzpvZmZdIFwKLQkJCQkJCQkrIHRyYWNrCisgICAgICAgIGZvciBkaXIgaW4gY2RkYl9wYXRoOgorICAgICAgICAgICAgZmlsZSA9IGRpciArICcvJyArIHNlbGYuaWQgKyAnLnJkYicKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlLCAncicpCisgICAgICAgICAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIG50cmFja3MgPSBpbnQoc2VsZi5pZFs6Ml0sIDE2KQorICAgICAgICBzZWxmLmFydGlzdCA9ICcnCisgICAgICAgIHNlbGYudGl0bGUgPSAnJworICAgICAgICBzZWxmLnRyYWNrID0gW05vbmVdICsgWycnXSAqIG50cmFja3MKKyAgICAgICAgc2VsZi50cmFja2FydGlzdCA9IFtOb25lXSArIFsnJ10gKiBudHJhY2tzCisgICAgICAgIHNlbGYubm90ZXMgPSBbXQorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnZmlsZScpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGltcG9ydCByZQorICAgICAgICByZWcgPSByZS5jb21waWxlKHInXihbXi5dKilcLihbXjpdKik6W1x0IF0rKC4qKScpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgbWF0Y2ggPSByZWcubWF0Y2gobGluZSkKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICBwcmludCAnc3ludGF4IGVycm9yIGluICcgKyBmaWxlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG5hbWUxLCBuYW1lMiwgdmFsdWUgPSBtYXRjaC5ncm91cCgxLCAyLCAzKQorICAgICAgICAgICAgaWYgbmFtZTEgPT0gJ2FsYnVtJzoKKyAgICAgICAgICAgICAgICBpZiBuYW1lMiA9PSAnYXJ0aXN0JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hcnRpc3QgPSB2YWx1ZQorICAgICAgICAgICAgICAgIGVsaWYgbmFtZTIgPT0gJ3RpdGxlJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50aXRsZSA9IHZhbHVlCisgICAgICAgICAgICAgICAgZWxpZiBuYW1lMiA9PSAndG9jJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYudG9jOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2MgPSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRvYyAhPSB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICd0b2NcJ3MgZG9uXCd0IG1hdGNoJworICAgICAgICAgICAgICAgIGVsaWYgbmFtZTIgPT0gJ25vdGVzJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3Rlcy5hcHBlbmQodmFsdWUpCisgICAgICAgICAgICBlbGlmIG5hbWUxWzo1XSA9PSAndHJhY2snOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tubyA9IGludChuYW1lMVs1Ol0pCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdzeW50YXggZXJyb3IgaW4gJyArIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiB0cmFja25vID4gbnRyYWNrczoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ3RyYWNrIG51bWJlciAlciBpbiBmaWxlICVzIG91dCBvZiByYW5nZScgJSAodHJhY2tubywgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBuYW1lMiA9PSAndGl0bGUnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRyYWNrW3RyYWNrbm9dID0gdmFsdWUKKyAgICAgICAgICAgICAgICBlbGlmIG5hbWUyID09ICdhcnRpc3QnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRyYWNrYXJ0aXN0W3RyYWNrbm9dID0gdmFsdWUKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIsIGxlbihzZWxmLnRyYWNrKSk6CisgICAgICAgICAgICB0cmFjayA9IHNlbGYudHJhY2tbaV0KKyAgICAgICAgICAgICMgaWYgdHJhY2sgdGl0bGUgc3RhcnRzIHdpdGggYCwnLCB1c2UgaW5pdGlhbCBwYXJ0CisgICAgICAgICAgICAjIG9mIHByZXZpb3VzIHRyYWNrJ3MgdGl0bGUKKyAgICAgICAgICAgIGlmIHRyYWNrIGFuZCB0cmFja1swXSA9PSAnLCc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvZmYgPSBzZWxmLnRyYWNrW2kgLSAxXS5pbmRleCgnLCcpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRyYWNrW2ldID0gc2VsZi50cmFja1tpLTFdWzpvZmZdIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHJhY2sKIAotCWRlZiBfZ2V0X2lkKHNlbGYsIHRyYWNrbGlzdCk6Ci0JCSMgZmlsbCBpbiBzZWxmLmlkIGFuZCBzZWxmLnRvYy4KLQkJIyBpZiB0aGUgYXJndW1lbnQgaXMgYSBzdHJpbmcgZW5kaW5nIGluIC5yZGIsIHRoZSBwYXJ0Ci0JCSMgdXB0byB0aGUgc3VmZml4IGlzIHRha2VuIGFzIHRoZSBpZC4KLQkJaWYgdHlwZSh0cmFja2xpc3QpID09IHR5cGUoJycpOgotCQkJaWYgdHJhY2tsaXN0Wy00Ol0gPT0gJy5yZGInOgotCQkJCXNlbGYuaWQgPSB0cmFja2xpc3RbOi00XQotCQkJCXNlbGYudG9jID0gJycKLQkJCQlyZXR1cm4KLQkJCXQgPSBbXQotCQkJZm9yIGkgaW4gcmFuZ2UoMiwgbGVuKHRyYWNrbGlzdCksIDQpOgotCQkJCXQuYXBwZW5kKChOb25lLCBcCi0JCQkJCSAgKGludCh0cmFja2xpc3RbaTppKzJdKSwgXAotCQkJCQkgICBpbnQodHJhY2tsaXN0W2krMjppKzRdKSkpKQotCQkJdHJhY2tsaXN0ID0gdAotCQludHJhY2tzID0gbGVuKHRyYWNrbGlzdCkKLQkJc2VsZi5pZCA9IF9kYmlkKChudHJhY2tzID4+IDQpICYgMHhGKSArIF9kYmlkKG50cmFja3MgJiAweEYpCi0JCWlmIG50cmFja3MgPD0gX0RCX0lEX05UUkFDS1M6Ci0JCQluaWR0cmFja3MgPSBudHJhY2tzCi0JCWVsc2U6Ci0JCQluaWR0cmFja3MgPSBfREJfSURfTlRSQUNLUyAtIDEKLQkJCW1pbiA9IDAKLQkJCXNlYyA9IDAKLQkJCWZvciB0cmFjayBpbiB0cmFja2xpc3Q6Ci0JCQkJc3RhcnQsIGxlbmd0aCA9IHRyYWNrCi0JCQkJbWluID0gbWluICsgbGVuZ3RoWzBdCi0JCQkJc2VjID0gc2VjICsgbGVuZ3RoWzFdCi0JCQltaW4gPSBtaW4gKyBzZWMgLyA2MAotCQkJc2VjID0gc2VjICUgNjAKLQkJCXNlbGYuaWQgPSBzZWxmLmlkICsgX2RiaWQobWluKSArIF9kYmlkKHNlYykKLQkJZm9yIGkgaW4gcmFuZ2UobmlkdHJhY2tzKToKLQkJCXN0YXJ0LCBsZW5ndGggPSB0cmFja2xpc3RbaV0KLQkJCXNlbGYuaWQgPSBzZWxmLmlkICsgX2RiaWQobGVuZ3RoWzBdKSArIF9kYmlkKGxlbmd0aFsxXSkKLQkJc2VsZi50b2MgPSBzdHJpbmcuemZpbGwobnRyYWNrcywgMikKLQkJZm9yIHRyYWNrIGluIHRyYWNrbGlzdDoKLQkJCXN0YXJ0LCBsZW5ndGggPSB0cmFjawotCQkJc2VsZi50b2MgPSBzZWxmLnRvYyArIHN0cmluZy56ZmlsbChsZW5ndGhbMF0sIDIpICsgXAotCQkJCSAgc3RyaW5nLnpmaWxsKGxlbmd0aFsxXSwgMikKKyAgICBkZWYgX2dldF9pZChzZWxmLCB0cmFja2xpc3QpOgorICAgICAgICAjIGZpbGwgaW4gc2VsZi5pZCBhbmQgc2VsZi50b2MuCisgICAgICAgICMgaWYgdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nIGVuZGluZyBpbiAucmRiLCB0aGUgcGFydAorICAgICAgICAjIHVwdG8gdGhlIHN1ZmZpeCBpcyB0YWtlbiBhcyB0aGUgaWQuCisgICAgICAgIGlmIHR5cGUodHJhY2tsaXN0KSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgIGlmIHRyYWNrbGlzdFstNDpdID09ICcucmRiJzoKKyAgICAgICAgICAgICAgICBzZWxmLmlkID0gdHJhY2tsaXN0WzotNF0KKyAgICAgICAgICAgICAgICBzZWxmLnRvYyA9ICcnCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB0ID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDIsIGxlbih0cmFja2xpc3QpLCA0KToKKyAgICAgICAgICAgICAgICB0LmFwcGVuZCgoTm9uZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KHRyYWNrbGlzdFtpOmkrMl0pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQodHJhY2tsaXN0W2krMjppKzRdKSkpKQorICAgICAgICAgICAgdHJhY2tsaXN0ID0gdAorICAgICAgICBudHJhY2tzID0gbGVuKHRyYWNrbGlzdCkKKyAgICAgICAgc2VsZi5pZCA9IF9kYmlkKChudHJhY2tzID4+IDQpICYgMHhGKSArIF9kYmlkKG50cmFja3MgJiAweEYpCisgICAgICAgIGlmIG50cmFja3MgPD0gX0RCX0lEX05UUkFDS1M6CisgICAgICAgICAgICBuaWR0cmFja3MgPSBudHJhY2tzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuaWR0cmFja3MgPSBfREJfSURfTlRSQUNLUyAtIDEKKyAgICAgICAgICAgIG1pbiA9IDAKKyAgICAgICAgICAgIHNlYyA9IDAKKyAgICAgICAgICAgIGZvciB0cmFjayBpbiB0cmFja2xpc3Q6CisgICAgICAgICAgICAgICAgc3RhcnQsIGxlbmd0aCA9IHRyYWNrCisgICAgICAgICAgICAgICAgbWluID0gbWluICsgbGVuZ3RoWzBdCisgICAgICAgICAgICAgICAgc2VjID0gc2VjICsgbGVuZ3RoWzFdCisgICAgICAgICAgICBtaW4gPSBtaW4gKyBzZWMgLyA2MAorICAgICAgICAgICAgc2VjID0gc2VjICUgNjAKKyAgICAgICAgICAgIHNlbGYuaWQgPSBzZWxmLmlkICsgX2RiaWQobWluKSArIF9kYmlkKHNlYykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobmlkdHJhY2tzKToKKyAgICAgICAgICAgIHN0YXJ0LCBsZW5ndGggPSB0cmFja2xpc3RbaV0KKyAgICAgICAgICAgIHNlbGYuaWQgPSBzZWxmLmlkICsgX2RiaWQobGVuZ3RoWzBdKSArIF9kYmlkKGxlbmd0aFsxXSkKKyAgICAgICAgc2VsZi50b2MgPSBzdHJpbmcuemZpbGwobnRyYWNrcywgMikKKyAgICAgICAgZm9yIHRyYWNrIGluIHRyYWNrbGlzdDoKKyAgICAgICAgICAgIHN0YXJ0LCBsZW5ndGggPSB0cmFjaworICAgICAgICAgICAgc2VsZi50b2MgPSBzZWxmLnRvYyArIHN0cmluZy56ZmlsbChsZW5ndGhbMF0sIDIpICsgXAorICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy56ZmlsbChsZW5ndGhbMV0sIDIpCiAKLQlkZWYgd3JpdGUoc2VsZik6Ci0JCWltcG9ydCBwb3NpeHBhdGgKLQkJaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdDRERCX1dSSVRFX0RJUicpOgotCQkJZGlyID0gb3MuZW52aXJvblsnQ0REQl9XUklURV9ESVInXQotCQllbHNlOgotCQkJZGlyID0gb3MuZW52aXJvblsnSE9NRSddICsgJy8nICsgX2NkZGJyYwotCQlmaWxlID0gZGlyICsgJy8nICsgc2VsZi5pZCArICcucmRiJwotCQlpZiBwb3NpeHBhdGguZXhpc3RzKGZpbGUpOgotCQkJIyBtYWtlIGJhY2t1cCBjb3B5Ci0JCQlwb3NpeC5yZW5hbWUoZmlsZSwgZmlsZSArICd+JykKLQkJZiA9IG9wZW4oZmlsZSwgJ3cnKQotCQlmLndyaXRlKCdhbGJ1bS50aXRsZTpcdCcgKyBzZWxmLnRpdGxlICsgJ1xuJykKLQkJZi53cml0ZSgnYWxidW0uYXJ0aXN0Olx0JyArIHNlbGYuYXJ0aXN0ICsgJ1xuJykKLQkJZi53cml0ZSgnYWxidW0udG9jOlx0JyArIHNlbGYudG9jICsgJ1xuJykKLQkJZm9yIG5vdGUgaW4gc2VsZi5ub3RlczoKLQkJCWYud3JpdGUoJ2FsYnVtLm5vdGVzOlx0JyArIG5vdGUgKyAnXG4nKQotCQlwcmV2cHJlZiA9IE5vbmUKLQkJZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHNlbGYudHJhY2spKToKLQkJCWlmIHNlbGYudHJhY2thcnRpc3RbaV06Ci0JCQkJZi53cml0ZSgndHJhY2slci5hcnRpc3Q6XHQlc1xuJyAlIChpLCBzZWxmLnRyYWNrYXJ0aXN0W2ldKSkKLQkJCXRyYWNrID0gc2VsZi50cmFja1tpXQotCQkJdHJ5OgotCQkJCW9mZiA9IHRyYWNrLmluZGV4KCcsJykKLQkJCWV4Y2VwdCBWYWx1ZUVycm9yOgotCQkJCXByZXZwcmVmID0gTm9uZQotCQkJZWxzZToKLQkJCQlpZiBwcmV2cHJlZiBhbmQgdHJhY2tbOm9mZl0gPT0gcHJldnByZWY6Ci0JCQkJCXRyYWNrID0gdHJhY2tbb2ZmOl0KLQkJCQllbHNlOgotCQkJCQlwcmV2cHJlZiA9IHRyYWNrWzpvZmZdCi0JCQlmLndyaXRlKCd0cmFjayVyLnRpdGxlOlx0JXNcbicgJSAoaSwgdHJhY2spKQotCQlmLmNsb3NlKCkKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgIGltcG9ydCBwb3NpeHBhdGgKKyAgICAgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdDRERCX1dSSVRFX0RJUicpOgorICAgICAgICAgICAgZGlyID0gb3MuZW52aXJvblsnQ0REQl9XUklURV9ESVInXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGlyID0gb3MuZW52aXJvblsnSE9NRSddICsgJy8nICsgX2NkZGJyYworICAgICAgICBmaWxlID0gZGlyICsgJy8nICsgc2VsZi5pZCArICcucmRiJworICAgICAgICBpZiBwb3NpeHBhdGguZXhpc3RzKGZpbGUpOgorICAgICAgICAgICAgIyBtYWtlIGJhY2t1cCBjb3B5CisgICAgICAgICAgICBwb3NpeC5yZW5hbWUoZmlsZSwgZmlsZSArICd+JykKKyAgICAgICAgZiA9IG9wZW4oZmlsZSwgJ3cnKQorICAgICAgICBmLndyaXRlKCdhbGJ1bS50aXRsZTpcdCcgKyBzZWxmLnRpdGxlICsgJ1xuJykKKyAgICAgICAgZi53cml0ZSgnYWxidW0uYXJ0aXN0Olx0JyArIHNlbGYuYXJ0aXN0ICsgJ1xuJykKKyAgICAgICAgZi53cml0ZSgnYWxidW0udG9jOlx0JyArIHNlbGYudG9jICsgJ1xuJykKKyAgICAgICAgZm9yIG5vdGUgaW4gc2VsZi5ub3RlczoKKyAgICAgICAgICAgIGYud3JpdGUoJ2FsYnVtLm5vdGVzOlx0JyArIG5vdGUgKyAnXG4nKQorICAgICAgICBwcmV2cHJlZiA9IE5vbmUKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHNlbGYudHJhY2spKToKKyAgICAgICAgICAgIGlmIHNlbGYudHJhY2thcnRpc3RbaV06CisgICAgICAgICAgICAgICAgZi53cml0ZSgndHJhY2slci5hcnRpc3Q6XHQlc1xuJyAlIChpLCBzZWxmLnRyYWNrYXJ0aXN0W2ldKSkKKyAgICAgICAgICAgIHRyYWNrID0gc2VsZi50cmFja1tpXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9mZiA9IHRyYWNrLmluZGV4KCcsJykKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHByZXZwcmVmID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBwcmV2cHJlZiBhbmQgdHJhY2tbOm9mZl0gPT0gcHJldnByZWY6CisgICAgICAgICAgICAgICAgICAgIHRyYWNrID0gdHJhY2tbb2ZmOl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmV2cHJlZiA9IHRyYWNrWzpvZmZdCisgICAgICAgICAgICBmLndyaXRlKCd0cmFjayVyLnRpdGxlOlx0JXNcbicgJSAoaSwgdHJhY2spKQorICAgICAgICBmLmNsb3NlKCkKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWlyaXg2L2NkcGxheWVyLnB5IGIvTGliL3BsYXQtaXJpeDYvY2RwbGF5ZXIucHkKaW5kZXggNGJhM2Y1MS4uZDRiYzczMiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtaXJpeDYvY2RwbGF5ZXIucHkKKysrIGIvTGliL3BsYXQtaXJpeDYvY2RwbGF5ZXIucHkKQEAgLTE3LDcyICsxNyw3MiBAQAogY2RwbGF5ZXJyYyA9ICcuY2RwbGF5ZXJyYycKIAogY2xhc3MgQ2RwbGF5ZXI6Ci0JZGVmIF9faW5pdF9fKHNlbGYsIHRyYWNrbGlzdCk6Ci0JCWltcG9ydCBzdHJpbmcKLQkJc2VsZi5hcnRpc3QgPSAnJwotCQlzZWxmLnRpdGxlID0gJycKLQkJaWYgdHlwZSh0cmFja2xpc3QpID09IHR5cGUoJycpOgotCQkJdCA9IFtdCi0JCQlmb3IgaSBpbiByYW5nZSgyLCBsZW4odHJhY2tsaXN0KSwgNCk6Ci0JCQkJdC5hcHBlbmQoKE5vbmUsIFwKLQkJCQkJICAoaW50KHRyYWNrbGlzdFtpOmkrMl0pLCBcCi0JCQkJCSAgIGludCh0cmFja2xpc3RbaSsyOmkrNF0pKSkpCi0JCQl0cmFja2xpc3QgPSB0Ci0JCXNlbGYudHJhY2sgPSBbTm9uZV0gKyBbJyddICogbGVuKHRyYWNrbGlzdCkKLQkJc2VsZi5pZCA9ICdkJyArIHN0cmluZy56ZmlsbChsZW4odHJhY2tsaXN0KSwgMikKLQkJZm9yIHRyYWNrIGluIHRyYWNrbGlzdDoKLQkJCXN0YXJ0LCBsZW5ndGggPSB0cmFjawotCQkJc2VsZi5pZCA9IHNlbGYuaWQgKyBzdHJpbmcuemZpbGwobGVuZ3RoWzBdLCAyKSArIFwKLQkJCQkgIHN0cmluZy56ZmlsbChsZW5ndGhbMV0sIDIpCi0JCXRyeToKLQkJCWltcG9ydCBwb3NpeAotCQkJZiA9IG9wZW4ocG9zaXguZW52aXJvblsnSE9NRSddICsgJy8nICsgY2RwbGF5ZXJyYywgJ3InKQotCQlleGNlcHQgSU9FcnJvcjoKLQkJCXJldHVybgotCQlpbXBvcnQgcmUKLQkJcmVnID0gcmUuY29tcGlsZShyJ14oW146XSopOlx0KC4qKScpCi0JCXMgPSBzZWxmLmlkICsgJy4nCi0JCWwgPSBsZW4ocykKLQkJd2hpbGUgMToKLQkJCWxpbmUgPSBmLnJlYWRsaW5lKCkKLQkJCWlmIGxpbmUgPT0gJyc6Ci0JCQkJYnJlYWsKLQkJCWlmIGxpbmVbOmxdID09IHM6Ci0JCQkJbGluZSA9IGxpbmVbbDpdCi0JCQkJbWF0Y2ggPSByZWcubWF0Y2gobGluZSkKLQkJCQlpZiBub3QgbWF0Y2g6Ci0JCQkJCXByaW50ICdzeW50YXggZXJyb3IgaW4gfi8nICsgY2RwbGF5ZXJyYwotCQkJCQljb250aW51ZQotCQkJCW5hbWUsIHZhbHVlID0gbWF0Y2guZ3JvdXAoMSwgMikKLQkJCQlpZiBuYW1lID09ICd0aXRsZSc6Ci0JCQkJCXNlbGYudGl0bGUgPSB2YWx1ZQotCQkJCWVsaWYgbmFtZSA9PSAnYXJ0aXN0JzoKLQkJCQkJc2VsZi5hcnRpc3QgPSB2YWx1ZQotCQkJCWVsaWYgbmFtZVs6NV0gPT0gJ3RyYWNrJzoKLQkJCQkJdHJhY2tubyA9IGludChuYW1lWzY6XSkKLQkJCQkJc2VsZi50cmFja1t0cmFja25vXSA9IHZhbHVlCi0JCWYuY2xvc2UoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFja2xpc3QpOgorICAgICAgICBpbXBvcnQgc3RyaW5nCisgICAgICAgIHNlbGYuYXJ0aXN0ID0gJycKKyAgICAgICAgc2VsZi50aXRsZSA9ICcnCisgICAgICAgIGlmIHR5cGUodHJhY2tsaXN0KSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgIHQgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMiwgbGVuKHRyYWNrbGlzdCksIDQpOgorICAgICAgICAgICAgICAgIHQuYXBwZW5kKChOb25lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQodHJhY2tsaXN0W2k6aSsyXSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCh0cmFja2xpc3RbaSsyOmkrNF0pKSkpCisgICAgICAgICAgICB0cmFja2xpc3QgPSB0CisgICAgICAgIHNlbGYudHJhY2sgPSBbTm9uZV0gKyBbJyddICogbGVuKHRyYWNrbGlzdCkKKyAgICAgICAgc2VsZi5pZCA9ICdkJyArIHN0cmluZy56ZmlsbChsZW4odHJhY2tsaXN0KSwgMikKKyAgICAgICAgZm9yIHRyYWNrIGluIHRyYWNrbGlzdDoKKyAgICAgICAgICAgIHN0YXJ0LCBsZW5ndGggPSB0cmFjaworICAgICAgICAgICAgc2VsZi5pZCA9IHNlbGYuaWQgKyBzdHJpbmcuemZpbGwobGVuZ3RoWzBdLCAyKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuemZpbGwobGVuZ3RoWzFdLCAyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgcG9zaXgKKyAgICAgICAgICAgIGYgPSBvcGVuKHBvc2l4LmVudmlyb25bJ0hPTUUnXSArICcvJyArIGNkcGxheWVycmMsICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIHJlZyA9IHJlLmNvbXBpbGUocideKFteOl0qKTpcdCguKiknKQorICAgICAgICBzID0gc2VsZi5pZCArICcuJworICAgICAgICBsID0gbGVuKHMpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lWzpsXSA9PSBzOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW2w6XQorICAgICAgICAgICAgICAgIG1hdGNoID0gcmVnLm1hdGNoKGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnc3ludGF4IGVycm9yIGluIH4vJyArIGNkcGxheWVycmMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSA9IG1hdGNoLmdyb3VwKDEsIDIpCisgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAndGl0bGUnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRpdGxlID0gdmFsdWUKKyAgICAgICAgICAgICAgICBlbGlmIG5hbWUgPT0gJ2FydGlzdCc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXJ0aXN0ID0gdmFsdWUKKyAgICAgICAgICAgICAgICBlbGlmIG5hbWVbOjVdID09ICd0cmFjayc6CisgICAgICAgICAgICAgICAgICAgIHRyYWNrbm8gPSBpbnQobmFtZVs2Ol0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYudHJhY2tbdHJhY2tub10gPSB2YWx1ZQorICAgICAgICBmLmNsb3NlKCkKIAotCWRlZiB3cml0ZShzZWxmKToKLQkJaW1wb3J0IHBvc2l4Ci0JCWZpbGVuYW1lID0gcG9zaXguZW52aXJvblsnSE9NRSddICsgJy8nICsgY2RwbGF5ZXJyYwotCQl0cnk6Ci0JCQlvbGQgPSBvcGVuKGZpbGVuYW1lLCAncicpCi0JCWV4Y2VwdCBJT0Vycm9yOgotCQkJb2xkID0gb3BlbignL2Rldi9udWxsJywgJ3InKQotCQluZXcgPSBvcGVuKGZpbGVuYW1lICsgJy5uZXcnLCAndycpCi0JCXMgPSBzZWxmLmlkICsgJy4nCi0JCWwgPSBsZW4ocykKLQkJd2hpbGUgMToKLQkJCWxpbmUgPSBvbGQucmVhZGxpbmUoKQotCQkJaWYgbGluZSA9PSAnJzoKLQkJCQlicmVhawotCQkJaWYgbGluZVs6bF0gIT0gczoKLQkJCQluZXcud3JpdGUobGluZSkKLQkJbmV3LndyaXRlKHNlbGYuaWQgKyAnLnRpdGxlOlx0JyArIHNlbGYudGl0bGUgKyAnXG4nKQotCQluZXcud3JpdGUoc2VsZi5pZCArICcuYXJ0aXN0Olx0JyArIHNlbGYuYXJ0aXN0ICsgJ1xuJykKLQkJZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHNlbGYudHJhY2spKToKLQkJCW5ldy53cml0ZSgnJXMudHJhY2suJXI6XHQlc1xuJyAlIChpLCB0cmFjaykpCi0JCW9sZC5jbG9zZSgpCi0JCW5ldy5jbG9zZSgpCi0JCXBvc2l4LnJlbmFtZShmaWxlbmFtZSArICcubmV3JywgZmlsZW5hbWUpCisgICAgZGVmIHdyaXRlKHNlbGYpOgorICAgICAgICBpbXBvcnQgcG9zaXgKKyAgICAgICAgZmlsZW5hbWUgPSBwb3NpeC5lbnZpcm9uWydIT01FJ10gKyAnLycgKyBjZHBsYXllcnJjCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9sZCA9IG9wZW4oZmlsZW5hbWUsICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBvbGQgPSBvcGVuKCcvZGV2L251bGwnLCAncicpCisgICAgICAgIG5ldyA9IG9wZW4oZmlsZW5hbWUgKyAnLm5ldycsICd3JykKKyAgICAgICAgcyA9IHNlbGYuaWQgKyAnLicKKyAgICAgICAgbCA9IGxlbihzKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IG9sZC5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lWzpsXSAhPSBzOgorICAgICAgICAgICAgICAgIG5ldy53cml0ZShsaW5lKQorICAgICAgICBuZXcud3JpdGUoc2VsZi5pZCArICcudGl0bGU6XHQnICsgc2VsZi50aXRsZSArICdcbicpCisgICAgICAgIG5ldy53cml0ZShzZWxmLmlkICsgJy5hcnRpc3Q6XHQnICsgc2VsZi5hcnRpc3QgKyAnXG4nKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4oc2VsZi50cmFjaykpOgorICAgICAgICAgICAgbmV3LndyaXRlKCclcy50cmFjay4lcjpcdCVzXG4nICUgKGksIHRyYWNrKSkKKyAgICAgICAgb2xkLmNsb3NlKCkKKyAgICAgICAgbmV3LmNsb3NlKCkKKyAgICAgICAgcG9zaXgucmVuYW1lKGZpbGVuYW1lICsgJy5uZXcnLCBmaWxlbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWlyaXg2L2ZscC5weSBiL0xpYi9wbGF0LWlyaXg2L2ZscC5weQppbmRleCBhYTIzMTA3Li5mNzQ1NDcyIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1pcml4Ni9mbHAucHkKKysrIGIvTGliL3BsYXQtaXJpeDYvZmxwLnB5CkBAIC03OSwxOCArNzksMTggQEAKICAgICAgICAgZnAuY2xvc2UoKQogCiBkZWYgX3VucGFja19jYWNoZShhbHRmb3Jtcyk6Ci0gICAgICAgIGZvcm1zID0ge30KLSAgICAgICAgZm9yIG5hbWUgaW4gYWx0Zm9ybXMua2V5cygpOgotICAgICAgICAgICAgYWx0b2JqLCBhbHRsaXN0ID0gYWx0Zm9ybXNbbmFtZV0KLSAgICAgICAgICAgIG9iaiA9IF9uZXdvYmooKQotICAgICAgICAgICAgb2JqLm1ha2UoYWx0b2JqKQotICAgICAgICAgICAgbGlzdCA9IFtdCi0gICAgICAgICAgICBmb3IgYWx0b2JqIGluIGFsdGxpc3Q6Ci0gICAgICAgICAgICAgICAgbm9iaiA9IF9uZXdvYmooKQotICAgICAgICAgICAgICAgIG5vYmoubWFrZShhbHRvYmopCi0gICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQobm9iaikKLSAgICAgICAgICAgIGZvcm1zW25hbWVdID0gb2JqLCBsaXN0Ci0gICAgICAgIHJldHVybiBmb3JtcworICAgIGZvcm1zID0ge30KKyAgICBmb3IgbmFtZSBpbiBhbHRmb3Jtcy5rZXlzKCk6CisgICAgICAgIGFsdG9iaiwgYWx0bGlzdCA9IGFsdGZvcm1zW25hbWVdCisgICAgICAgIG9iaiA9IF9uZXdvYmooKQorICAgICAgICBvYmoubWFrZShhbHRvYmopCisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICBmb3IgYWx0b2JqIGluIGFsdGxpc3Q6CisgICAgICAgICAgICBub2JqID0gX25ld29iaigpCisgICAgICAgICAgICBub2JqLm1ha2UoYWx0b2JqKQorICAgICAgICAgICAgbGlzdC5hcHBlbmQobm9iaikKKyAgICAgICAgZm9ybXNbbmFtZV0gPSBvYmosIGxpc3QKKyAgICByZXR1cm4gZm9ybXMKIAogZGVmIHJkbG9uZyhmcCk6CiAgICAgcyA9IGZwLnJlYWQoNCkKQEAgLTI3Niw4ICsyNzYsOCBAQAogICAgICAgICByZXR1cm4gbGluZQogICAgIG5hbWUsIHZhbHVlID0gbWF0Y2guZ3JvdXAoMSwgMikKICAgICBpZiBuYW1lWzBdID09ICdOJzoKLSAgICAgICAgICAgIG5hbWUgPSAnJy5qb2luKG5hbWUuc3BsaXQoKSkKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgbmFtZSA9ICcnLmpvaW4obmFtZS5zcGxpdCgpKQorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCiAgICAgbmFtZSA9IG5hbWUuY2FwaXRhbGl6ZSgpCiAgICAgdHJ5OgogICAgICAgICBwZiA9IF9wYXJzZV9mdW5jW25hbWVdCkBAIC0yOTEsNyArMjkxLDcgQEAKICAgICBpZiBub3QgbGluZToKICAgICAgICAgcmFpc2UgRU9GRXJyb3IKICAgICByZXR1cm4gbGluZVs6LTFdCi0gICAgICAgIAorCiBkZWYgX3BhcnNlXzFfbGluZShmaWxlKToKICAgICBsaW5lID0gX3JlYWRsaW5lKGZpbGUpCiAgICAgd2hpbGUgbGluZSA9PSAnJzoKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWlyaXg2L2pwZWcucHkgYi9MaWIvcGxhdC1pcml4Ni9qcGVnLnB5CmluZGV4IDIzNTRmNDAuLjBiNTIwMzEgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LWlyaXg2L2pwZWcucHkKKysrIGIvTGliL3BsYXQtaXJpeDYvanBlZy5weQpAQCAtNiw3ICs2LDcgQEAKICMgWFhYIHRoZSByZXN1bHRpbmcgZmlsZSBjYXVzZXMgd2VpcmRuZXNzLgogCiBjbGFzcyBlcnJvcihFeGNlcHRpb24pOgotCXBhc3MKKyAgICBwYXNzCiAKIG9wdGlvbnMgPSB7J3F1YWxpdHknOiA3NSwgJ29wdGltaXplJzogMCwgJ3Ntb290aCc6IDAsICdmb3JjZWdyYXknOiAwfQogCkBAIC0xNCw5OCArMTQsOTggQEAKIGRlY29tcCA9IE5vbmUKIAogZGVmIGNvbXByZXNzKGltZ2RhdGEsIHdpZHRoLCBoZWlnaHQsIGJ5dGVzcGVycGl4ZWwpOgotCWdsb2JhbCBjb21wCi0JaW1wb3J0IGNsCi0JaWYgY29tcCBpcyBOb25lOiBjb21wID0gY2wuT3BlbkNvbXByZXNzb3IoY2wuSlBFRykKLQlpZiBieXRlc3BlcnBpeGVsID09IDE6Ci0JCWZvcm1hdCA9IGNsLkdSQVlTQ0FMRQotCWVsaWYgYnl0ZXNwZXJwaXhlbCA9PSA0OgotCQlmb3JtYXQgPSBjbC5SR0JYCi0JaWYgb3B0aW9uc1snZm9yY2VncmF5J106Ci0JCWlmb3JtYXQgPSBjbC5HUkFZU0NBTEUKLQllbHNlOgotCQlpZm9ybWF0ID0gY2wuWVVWCi0JIyBYWFggSG93IHRvIHN1cHBvcnQgJ29wdGltaXplJz8KLQlwYXJhbXMgPSBbY2wuSU1BR0VfV0lEVEgsIHdpZHRoLCBjbC5JTUFHRV9IRUlHSFQsIGhlaWdodCwKLQkJICBjbC5PUklHSU5BTF9GT1JNQVQsIGZvcm1hdCwKLQkJICBjbC5PUklFTlRBVElPTiwgY2wuQk9UVE9NX1VQLAotCQkgIGNsLlFVQUxJVFlfRkFDVE9SLCBvcHRpb25zWydxdWFsaXR5J10sCi0JCSAgY2wuSU5URVJOQUxfRk9STUFULCBpZm9ybWF0LAotCQkgXQotCWNvbXAuU2V0UGFyYW1zKHBhcmFtcykKLQlqcGVnZGF0YSA9IGNvbXAuQ29tcHJlc3MoMSwgaW1nZGF0YSkKLQlyZXR1cm4ganBlZ2RhdGEKKyAgICBnbG9iYWwgY29tcAorICAgIGltcG9ydCBjbAorICAgIGlmIGNvbXAgaXMgTm9uZTogY29tcCA9IGNsLk9wZW5Db21wcmVzc29yKGNsLkpQRUcpCisgICAgaWYgYnl0ZXNwZXJwaXhlbCA9PSAxOgorICAgICAgICBmb3JtYXQgPSBjbC5HUkFZU0NBTEUKKyAgICBlbGlmIGJ5dGVzcGVycGl4ZWwgPT0gNDoKKyAgICAgICAgZm9ybWF0ID0gY2wuUkdCWAorICAgIGlmIG9wdGlvbnNbJ2ZvcmNlZ3JheSddOgorICAgICAgICBpZm9ybWF0ID0gY2wuR1JBWVNDQUxFCisgICAgZWxzZToKKyAgICAgICAgaWZvcm1hdCA9IGNsLllVVgorICAgICMgWFhYIEhvdyB0byBzdXBwb3J0ICdvcHRpbWl6ZSc/CisgICAgcGFyYW1zID0gW2NsLklNQUdFX1dJRFRILCB3aWR0aCwgY2wuSU1BR0VfSEVJR0hULCBoZWlnaHQsCisgICAgICAgICAgICAgIGNsLk9SSUdJTkFMX0ZPUk1BVCwgZm9ybWF0LAorICAgICAgICAgICAgICBjbC5PUklFTlRBVElPTiwgY2wuQk9UVE9NX1VQLAorICAgICAgICAgICAgICBjbC5RVUFMSVRZX0ZBQ1RPUiwgb3B0aW9uc1sncXVhbGl0eSddLAorICAgICAgICAgICAgICBjbC5JTlRFUk5BTF9GT1JNQVQsIGlmb3JtYXQsCisgICAgICAgICAgICAgXQorICAgIGNvbXAuU2V0UGFyYW1zKHBhcmFtcykKKyAgICBqcGVnZGF0YSA9IGNvbXAuQ29tcHJlc3MoMSwgaW1nZGF0YSkKKyAgICByZXR1cm4ganBlZ2RhdGEKIAogZGVmIGRlY29tcHJlc3MoanBlZ2RhdGEpOgotCWdsb2JhbCBkZWNvbXAKLQlpbXBvcnQgY2wKLQlpZiBkZWNvbXAgaXMgTm9uZTogZGVjb21wID0gY2wuT3BlbkRlY29tcHJlc3NvcihjbC5KUEVHKQotCWhlYWRlcnNpemUgPSBkZWNvbXAuUmVhZEhlYWRlcihqcGVnZGF0YSkKLQlwYXJhbXMgPSBbY2wuSU1BR0VfV0lEVEgsIDAsIGNsLklNQUdFX0hFSUdIVCwgMCwgY2wuSU5URVJOQUxfRk9STUFULCAwXQotCWRlY29tcC5HZXRQYXJhbXMocGFyYW1zKQotCXdpZHRoLCBoZWlnaHQsIGZvcm1hdCA9IHBhcmFtc1sxXSwgcGFyYW1zWzNdLCBwYXJhbXNbNV0KLQlpZiBmb3JtYXQgPT0gY2wuR1JBWVNDQUxFIG9yIG9wdGlvbnNbJ2ZvcmNlZ3JheSddOgotCQlmb3JtYXQgPSBjbC5HUkFZU0NBTEUKLQkJYnl0ZXNwZXJwaXhlbCA9IDEKLQllbHNlOgotCQlmb3JtYXQgPSBjbC5SR0JYCi0JCWJ5dGVzcGVycGl4ZWwgPSA0Ci0JIyBYWFggSG93IHRvIHN1cHBvcnQgJ3Ntb290aCc/Ci0JcGFyYW1zID0gW2NsLk9SSUdJTkFMX0ZPUk1BVCwgZm9ybWF0LAotCQkgIGNsLk9SSUVOVEFUSU9OLCBjbC5CT1RUT01fVVAsCi0JCSAgY2wuRlJBTUVfQlVGRkVSX1NJWkUsIHdpZHRoKmhlaWdodCpieXRlc3BlcnBpeGVsXQotCWRlY29tcC5TZXRQYXJhbXMocGFyYW1zKQotCWltZ2RhdGEgPSBkZWNvbXAuRGVjb21wcmVzcygxLCBqcGVnZGF0YSkKLQlyZXR1cm4gaW1nZGF0YSwgd2lkdGgsIGhlaWdodCwgYnl0ZXNwZXJwaXhlbAorICAgIGdsb2JhbCBkZWNvbXAKKyAgICBpbXBvcnQgY2wKKyAgICBpZiBkZWNvbXAgaXMgTm9uZTogZGVjb21wID0gY2wuT3BlbkRlY29tcHJlc3NvcihjbC5KUEVHKQorICAgIGhlYWRlcnNpemUgPSBkZWNvbXAuUmVhZEhlYWRlcihqcGVnZGF0YSkKKyAgICBwYXJhbXMgPSBbY2wuSU1BR0VfV0lEVEgsIDAsIGNsLklNQUdFX0hFSUdIVCwgMCwgY2wuSU5URVJOQUxfRk9STUFULCAwXQorICAgIGRlY29tcC5HZXRQYXJhbXMocGFyYW1zKQorICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCA9IHBhcmFtc1sxXSwgcGFyYW1zWzNdLCBwYXJhbXNbNV0KKyAgICBpZiBmb3JtYXQgPT0gY2wuR1JBWVNDQUxFIG9yIG9wdGlvbnNbJ2ZvcmNlZ3JheSddOgorICAgICAgICBmb3JtYXQgPSBjbC5HUkFZU0NBTEUKKyAgICAgICAgYnl0ZXNwZXJwaXhlbCA9IDEKKyAgICBlbHNlOgorICAgICAgICBmb3JtYXQgPSBjbC5SR0JYCisgICAgICAgIGJ5dGVzcGVycGl4ZWwgPSA0CisgICAgIyBYWFggSG93IHRvIHN1cHBvcnQgJ3Ntb290aCc/CisgICAgcGFyYW1zID0gW2NsLk9SSUdJTkFMX0ZPUk1BVCwgZm9ybWF0LAorICAgICAgICAgICAgICBjbC5PUklFTlRBVElPTiwgY2wuQk9UVE9NX1VQLAorICAgICAgICAgICAgICBjbC5GUkFNRV9CVUZGRVJfU0laRSwgd2lkdGgqaGVpZ2h0KmJ5dGVzcGVycGl4ZWxdCisgICAgZGVjb21wLlNldFBhcmFtcyhwYXJhbXMpCisgICAgaW1nZGF0YSA9IGRlY29tcC5EZWNvbXByZXNzKDEsIGpwZWdkYXRhKQorICAgIHJldHVybiBpbWdkYXRhLCB3aWR0aCwgaGVpZ2h0LCBieXRlc3BlcnBpeGVsCiAKIGRlZiBzZXRvcHRpb24obmFtZSwgdmFsdWUpOgotCWlmIHR5cGUodmFsdWUpIGlzIG5vdCB0eXBlKDApOgotCQlyYWlzZSBUeXBlRXJyb3IsICdqcGVnLnNldG9wdGlvbjogbnVtZXJpYyBvcHRpb25zIG9ubHknCi0JaWYgbmFtZSA9PSAnZm9yY2VncmV5JzoKLQkJbmFtZSA9ICdmb3JjZWdyYXknCi0JaWYgbm90IG9wdGlvbnMuaGFzX2tleShuYW1lKToKLQkJcmFpc2UgS2V5RXJyb3IsICdqcGVnLnNldG9wdGlvbjogdW5rbm93biBvcHRpb24gbmFtZScKLQlvcHRpb25zW25hbWVdID0gaW50KHZhbHVlKQorICAgIGlmIHR5cGUodmFsdWUpIGlzIG5vdCB0eXBlKDApOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdqcGVnLnNldG9wdGlvbjogbnVtZXJpYyBvcHRpb25zIG9ubHknCisgICAgaWYgbmFtZSA9PSAnZm9yY2VncmV5JzoKKyAgICAgICAgbmFtZSA9ICdmb3JjZWdyYXknCisgICAgaWYgbm90IG9wdGlvbnMuaGFzX2tleShuYW1lKToKKyAgICAgICAgcmFpc2UgS2V5RXJyb3IsICdqcGVnLnNldG9wdGlvbjogdW5rbm93biBvcHRpb24gbmFtZScKKyAgICBvcHRpb25zW25hbWVdID0gaW50KHZhbHVlKQogCiBkZWYgdGVzdCgpOgotCWltcG9ydCBzeXMKLQlpZiBzeXMuYXJndlsxOjJdID09IFsnLWcnXToKLQkJZGVsIHN5cy5hcmd2WzFdCi0JCXNldG9wdGlvbignZm9yY2VncmF5JywgMSkKLQlpZiBub3Qgc3lzLmFyZ3ZbMTpdOgotCQlzeXMuYXJndi5hcHBlbmQoJy91c3IvbG9jYWwvaW1hZ2VzL2RhdGEvanBnL2FzdGVyaXguanBnJykKLQlmb3IgZmlsZSBpbiBzeXMuYXJndlsxOl06Ci0JCXNob3coZmlsZSkKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgc3lzLmFyZ3ZbMToyXSA9PSBbJy1nJ106CisgICAgICAgIGRlbCBzeXMuYXJndlsxXQorICAgICAgICBzZXRvcHRpb24oJ2ZvcmNlZ3JheScsIDEpCisgICAgaWYgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgc3lzLmFyZ3YuYXBwZW5kKCcvdXNyL2xvY2FsL2ltYWdlcy9kYXRhL2pwZy9hc3Rlcml4LmpwZycpCisgICAgZm9yIGZpbGUgaW4gc3lzLmFyZ3ZbMTpdOgorICAgICAgICBzaG93KGZpbGUpCiAKIGRlZiBzaG93KGZpbGUpOgotCWltcG9ydCBnbCwgR0wsIERFVklDRQotCWpwZWdkYXRhID0gb3BlbihmaWxlLCAncicpLnJlYWQoKQotCWltZ2RhdGEsIHdpZHRoLCBoZWlnaHQsIGJ5dGVzcGVycGl4ZWwgPSBkZWNvbXByZXNzKGpwZWdkYXRhKQotCWdsLmZvcmVncm91bmQoKQotCWdsLnByZWZzaXplKHdpZHRoLCBoZWlnaHQpCi0Jd2luID0gZ2wud2lub3BlbihmaWxlKQotCWlmIGJ5dGVzcGVycGl4ZWwgPT0gMToKLQkJZ2wuY21vZGUoKQotCQlnbC5waXhtb2RlKEdMLlBNX1NJWkUsIDgpCi0JCWdsLmdjb25maWcoKQotCQlmb3IgaSBpbiByYW5nZSgyNTYpOgotCQkJZ2wubWFwY29sb3IoaSwgaSwgaSwgaSkKLQllbHNlOgotCQlnbC5SR0Jtb2RlKCkKLQkJZ2wucGl4bW9kZShHTC5QTV9TSVpFLCAzMikKLQkJZ2wuZ2NvbmZpZygpCi0JZ2wucWRldmljZShERVZJQ0UuUkVEUkFXKQotCWdsLnFkZXZpY2UoREVWSUNFLkVTQ0tFWSkKLQlnbC5xZGV2aWNlKERFVklDRS5XSU5RVUlUKQotCWdsLnFkZXZpY2UoREVWSUNFLldJTlNIVVQpCi0JZ2wubHJlY3R3cml0ZSgwLCAwLCB3aWR0aC0xLCBoZWlnaHQtMSwgaW1nZGF0YSkKLQl3aGlsZSAxOgotCQlkZXYsIHZhbCA9IGdsLnFyZWFkKCkKLQkJaWYgZGV2IGluIChERVZJQ0UuRVNDS0VZLCBERVZJQ0UuV0lOU0hVVCwgREVWSUNFLldJTlFVSVQpOgotCQkJYnJlYWsKLQkJaWYgZGV2ID09IERFVklDRS5SRURSQVc6Ci0JCQlnbC5scmVjdHdyaXRlKDAsIDAsIHdpZHRoLTEsIGhlaWdodC0xLCBpbWdkYXRhKQotCWdsLndpbmNsb3NlKHdpbikKLQkjIE5vdyB0ZXN0IHRoZSBjb21wcmVzc2lvbiBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBhIGZpeGVkIGZpbGVuYW1lCi0JbmV3anBlZ2RhdGEgPSBjb21wcmVzcyhpbWdkYXRhLCB3aWR0aCwgaGVpZ2h0LCBieXRlc3BlcnBpeGVsKQotCW9wZW4oJy90bXAvai5qcGcnLCAndycpLndyaXRlKG5ld2pwZWdkYXRhKQorICAgIGltcG9ydCBnbCwgR0wsIERFVklDRQorICAgIGpwZWdkYXRhID0gb3BlbihmaWxlLCAncicpLnJlYWQoKQorICAgIGltZ2RhdGEsIHdpZHRoLCBoZWlnaHQsIGJ5dGVzcGVycGl4ZWwgPSBkZWNvbXByZXNzKGpwZWdkYXRhKQorICAgIGdsLmZvcmVncm91bmQoKQorICAgIGdsLnByZWZzaXplKHdpZHRoLCBoZWlnaHQpCisgICAgd2luID0gZ2wud2lub3BlbihmaWxlKQorICAgIGlmIGJ5dGVzcGVycGl4ZWwgPT0gMToKKyAgICAgICAgZ2wuY21vZGUoKQorICAgICAgICBnbC5waXhtb2RlKEdMLlBNX1NJWkUsIDgpCisgICAgICAgIGdsLmdjb25maWcoKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgZ2wubWFwY29sb3IoaSwgaSwgaSwgaSkKKyAgICBlbHNlOgorICAgICAgICBnbC5SR0Jtb2RlKCkKKyAgICAgICAgZ2wucGl4bW9kZShHTC5QTV9TSVpFLCAzMikKKyAgICAgICAgZ2wuZ2NvbmZpZygpCisgICAgZ2wucWRldmljZShERVZJQ0UuUkVEUkFXKQorICAgIGdsLnFkZXZpY2UoREVWSUNFLkVTQ0tFWSkKKyAgICBnbC5xZGV2aWNlKERFVklDRS5XSU5RVUlUKQorICAgIGdsLnFkZXZpY2UoREVWSUNFLldJTlNIVVQpCisgICAgZ2wubHJlY3R3cml0ZSgwLCAwLCB3aWR0aC0xLCBoZWlnaHQtMSwgaW1nZGF0YSkKKyAgICB3aGlsZSAxOgorICAgICAgICBkZXYsIHZhbCA9IGdsLnFyZWFkKCkKKyAgICAgICAgaWYgZGV2IGluIChERVZJQ0UuRVNDS0VZLCBERVZJQ0UuV0lOU0hVVCwgREVWSUNFLldJTlFVSVQpOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZGV2ID09IERFVklDRS5SRURSQVc6CisgICAgICAgICAgICBnbC5scmVjdHdyaXRlKDAsIDAsIHdpZHRoLTEsIGhlaWdodC0xLCBpbWdkYXRhKQorICAgIGdsLndpbmNsb3NlKHdpbikKKyAgICAjIE5vdyB0ZXN0IHRoZSBjb21wcmVzc2lvbiBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBhIGZpeGVkIGZpbGVuYW1lCisgICAgbmV3anBlZ2RhdGEgPSBjb21wcmVzcyhpbWdkYXRhLCB3aWR0aCwgaGVpZ2h0LCBieXRlc3BlcnBpeGVsKQorICAgIG9wZW4oJy90bXAvai5qcGcnLCAndycpLndyaXRlKG5ld2pwZWdkYXRhKQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDYvcGFuZWwucHkgYi9MaWIvcGxhdC1pcml4Ni9wYW5lbC5weQppbmRleCAzYWE3NDQ4Li4xMmU2MmE1IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1pcml4Ni9wYW5lbC5weQorKysgYi9MaWIvcGxhdC1pcml4Ni9wYW5lbC5weQpAQCAtMTcsODIgKzE3LDgyIEBACiAjIFRlc3QgaWYgYW4gb2JqZWN0IGlzIGEgbGlzdC4KICMKIGRlZiBpc19saXN0KHgpOgotCXJldHVybiB0eXBlKHgpID09IHR5cGUoW10pCisgICAgcmV0dXJuIHR5cGUoeCkgPT0gdHlwZShbXSkKIAogCiAjIFJldmVyc2UgYSBsaXN0LgogIwogZGVmIHJldmVyc2UobGlzdCk6Ci0JcmVzID0gW10KLQlmb3IgaXRlbSBpbiBsaXN0OgotCQlyZXMuaW5zZXJ0KDAsIGl0ZW0pCi0JcmV0dXJuIHJlcworICAgIHJlcyA9IFtdCisgICAgZm9yIGl0ZW0gaW4gbGlzdDoKKyAgICAgICAgcmVzLmluc2VydCgwLCBpdGVtKQorICAgIHJldHVybiByZXMKIAogCiAjIEdldCBhbiBhdHRyaWJ1dGUgb2YgYSBsaXN0LCB3aGljaCBtYXkgaXRzZWxmIGJlIGFub3RoZXIgbGlzdC4KICMgRG9uJ3QgdXNlICdwcm9wJyBmb3IgbmFtZS4KICMKIGRlZiBnZXRhdHRybGlzdChsaXN0LCBuYW1lKToKLQlmb3IgaXRlbSBpbiBsaXN0OgotCQlpZiBpdGVtIGFuZCBpc19saXN0KGl0ZW0pIGFuZCBpdGVtWzBdID09IG5hbWU6Ci0JCQlyZXR1cm4gaXRlbVsxOl0KLQlyZXR1cm4gW10KKyAgICBmb3IgaXRlbSBpbiBsaXN0OgorICAgICAgICBpZiBpdGVtIGFuZCBpc19saXN0KGl0ZW0pIGFuZCBpdGVtWzBdID09IG5hbWU6CisgICAgICAgICAgICByZXR1cm4gaXRlbVsxOl0KKyAgICByZXR1cm4gW10KIAogCiAjIEdldCBhIHByb3BlcnR5IG9mIGEgbGlzdCwgd2hpY2ggbWF5IGl0c2VsZiBiZSBhbm90aGVyIGxpc3QuCiAjCiBkZWYgZ2V0cHJvcGxpc3QobGlzdCwgbmFtZSk6Ci0JZm9yIGl0ZW0gaW4gbGlzdDoKLQkJaWYgaXRlbSBhbmQgaXNfbGlzdChpdGVtKSBhbmQgaXRlbVswXSA9PSAncHJvcCc6Ci0JCQlpZiBsZW4oaXRlbSkgPiAxIGFuZCBpdGVtWzFdID09IG5hbWU6Ci0JCQkJcmV0dXJuIGl0ZW1bMjpdCi0JcmV0dXJuIFtdCisgICAgZm9yIGl0ZW0gaW4gbGlzdDoKKyAgICAgICAgaWYgaXRlbSBhbmQgaXNfbGlzdChpdGVtKSBhbmQgaXRlbVswXSA9PSAncHJvcCc6CisgICAgICAgICAgICBpZiBsZW4oaXRlbSkgPiAxIGFuZCBpdGVtWzFdID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bMjpdCisgICAgcmV0dXJuIFtdCiAKIAogIyBUZXN0IGlmIGFuIGFjdHVhdG9yIGRlc2NyaXB0aW9uIGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSAnZW5kLW9mLWdyb3VwJwogIwogZGVmIGlzX2VuZGdyb3VwKGxpc3QpOgotCXggPSBnZXRwcm9wbGlzdChsaXN0LCAnZW5kLW9mLWdyb3VwJykKLQlyZXR1cm4gKHggYW5kIHhbMF0gPT0gJyN0JykKKyAgICB4ID0gZ2V0cHJvcGxpc3QobGlzdCwgJ2VuZC1vZi1ncm91cCcpCisgICAgcmV0dXJuICh4IGFuZCB4WzBdID09ICcjdCcpCiAKIAogIyBOZWF0bHkgZGlzcGxheSBhbiBhY3R1YXRvciBkZWZpbml0aW9uIGdpdmVuIGFzIFMtZXhwcmVzc2lvbgogIyB0aGUgcHJlZml4IHN0cmluZyBpcyBwcmludGVkIGJlZm9yZSBlYWNoIGxpbmUuCiAjCiBkZWYgc2hvd19hY3R1YXRvcihwcmVmaXgsIGEpOgotCWZvciBpdGVtIGluIGE6Ci0JCWlmIG5vdCBpc19saXN0KGl0ZW0pOgotCQkJcHJpbnQgcHJlZml4LCBpdGVtCi0JCWVsaWYgaXRlbSBhbmQgaXRlbVswXSA9PSAnYWwnOgotCQkJcHJpbnQgcHJlZml4LCAnU3ViYWN0dWF0b3IgbGlzdDonCi0JCQlmb3IgYSBpbiBpdGVtWzE6XToKLQkJCQlzaG93X2FjdHVhdG9yKHByZWZpeCArICcgICAgJywgYSkKLQkJZWxpZiBsZW4oaXRlbSkgPT0gMjoKLQkJCXByaW50IHByZWZpeCwgaXRlbVswXSwgJz0+JywgaXRlbVsxXQotCQllbGlmIGxlbihpdGVtKSA9PSAzIGFuZCBpdGVtWzBdID09ICdwcm9wJzoKLQkJCXByaW50IHByZWZpeCwgJ1Byb3AnLCBpdGVtWzFdLCAnPT4nLAotCQkJcHJpbnQgaXRlbVsyXQotCQllbHNlOgotCQkJcHJpbnQgcHJlZml4LCAnPycsIGl0ZW0KKyAgICBmb3IgaXRlbSBpbiBhOgorICAgICAgICBpZiBub3QgaXNfbGlzdChpdGVtKToKKyAgICAgICAgICAgIHByaW50IHByZWZpeCwgaXRlbQorICAgICAgICBlbGlmIGl0ZW0gYW5kIGl0ZW1bMF0gPT0gJ2FsJzoKKyAgICAgICAgICAgIHByaW50IHByZWZpeCwgJ1N1YmFjdHVhdG9yIGxpc3Q6JworICAgICAgICAgICAgZm9yIGEgaW4gaXRlbVsxOl06CisgICAgICAgICAgICAgICAgc2hvd19hY3R1YXRvcihwcmVmaXggKyAnICAgICcsIGEpCisgICAgICAgIGVsaWYgbGVuKGl0ZW0pID09IDI6CisgICAgICAgICAgICBwcmludCBwcmVmaXgsIGl0ZW1bMF0sICc9PicsIGl0ZW1bMV0KKyAgICAgICAgZWxpZiBsZW4oaXRlbSkgPT0gMyBhbmQgaXRlbVswXSA9PSAncHJvcCc6CisgICAgICAgICAgICBwcmludCBwcmVmaXgsICdQcm9wJywgaXRlbVsxXSwgJz0+JywKKyAgICAgICAgICAgIHByaW50IGl0ZW1bMl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50IHByZWZpeCwgJz8nLCBpdGVtCiAKIAogIyBOZWF0bHkgZGlzcGxheSBhIHBhbmVsLgogIwogZGVmIHNob3dfcGFuZWwocHJlZml4LCBwKToKLQlmb3IgaXRlbSBpbiBwOgotCQlpZiBub3QgaXNfbGlzdChpdGVtKToKLQkJCXByaW50IHByZWZpeCwgaXRlbQotCQllbGlmIGl0ZW0gYW5kIGl0ZW1bMF0gPT0gJ2FsJzoKLQkJCXByaW50IHByZWZpeCwgJ0FjdHVhdG9yIGxpc3Q6JwotCQkJZm9yIGEgaW4gaXRlbVsxOl06Ci0JCQkJc2hvd19hY3R1YXRvcihwcmVmaXggKyAnICAgICcsIGEpCi0JCWVsaWYgbGVuKGl0ZW0pID09IDI6Ci0JCQlwcmludCBwcmVmaXgsIGl0ZW1bMF0sICc9PicsIGl0ZW1bMV0KLQkJZWxpZiBsZW4oaXRlbSkgPT0gMyBhbmQgaXRlbVswXSA9PSAncHJvcCc6Ci0JCQlwcmludCBwcmVmaXgsICdQcm9wJywgaXRlbVsxXSwgJz0+JywKLQkJCXByaW50IGl0ZW1bMl0KLQkJZWxzZToKLQkJCXByaW50IHByZWZpeCwgJz8nLCBpdGVtCisgICAgZm9yIGl0ZW0gaW4gcDoKKyAgICAgICAgaWYgbm90IGlzX2xpc3QoaXRlbSk6CisgICAgICAgICAgICBwcmludCBwcmVmaXgsIGl0ZW0KKyAgICAgICAgZWxpZiBpdGVtIGFuZCBpdGVtWzBdID09ICdhbCc6CisgICAgICAgICAgICBwcmludCBwcmVmaXgsICdBY3R1YXRvciBsaXN0OicKKyAgICAgICAgICAgIGZvciBhIGluIGl0ZW1bMTpdOgorICAgICAgICAgICAgICAgIHNob3dfYWN0dWF0b3IocHJlZml4ICsgJyAgICAnLCBhKQorICAgICAgICBlbGlmIGxlbihpdGVtKSA9PSAyOgorICAgICAgICAgICAgcHJpbnQgcHJlZml4LCBpdGVtWzBdLCAnPT4nLCBpdGVtWzFdCisgICAgICAgIGVsaWYgbGVuKGl0ZW0pID09IDMgYW5kIGl0ZW1bMF0gPT0gJ3Byb3AnOgorICAgICAgICAgICAgcHJpbnQgcHJlZml4LCAnUHJvcCcsIGl0ZW1bMV0sICc9PicsCisgICAgICAgICAgICBwcmludCBpdGVtWzJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCBwcmVmaXgsICc/JywgaXRlbQogCiAKICMgRXhjZXB0aW9uIHJhaXNlZCBieSBidWlsZF9hY3R1YXRvciBvciBidWlsZF9wYW5lbC4KQEAgLTEwMyw3ICsxMDMsNyBAQAogIyBEdW1teSBjYWxsYmFjayB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNhbGxiYWNrcy4KICMKIGRlZiBkdW1teV9jYWxsYmFjayhhcmcpOgotCXBhc3MKKyAgICBwYXNzCiAKIAogIyBBc3NpZ24gYXR0cmlidXRlcyB0byBtZW1iZXJzIG9mIHRoZSB0YXJnZXQuCkBAIC0xMTEsNjAgKzExMSw2MCBAQAogIyBUaGUgbWVtYmVyIG5hbWUgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lIHByZWZpeGVkIHdpdGggdGhlIHByZWZpeC4KICMKIGRlZiBhc3NpZ25fbWVtYmVycyh0YXJnZXQsIGF0dHJsaXN0LCBleGNsaXN0LCBwcmVmaXgpOgotCWZvciBpdGVtIGluIGF0dHJsaXN0OgotCQlpZiBpc19saXN0KGl0ZW0pIGFuZCBsZW4oaXRlbSkgPT0gMiBhbmQgaXRlbVswXSBub3QgaW4gZXhjbGlzdDoKLQkJCW5hbWUsIHZhbHVlID0gaXRlbVswXSwgaXRlbVsxXQotCQkJb2sgPSAxCi0JCQlpZiB2YWx1ZVswXSBpbiAnLTAxMjM0NTY3ODknOgotCQkJCXZhbHVlID0gZXZhbCh2YWx1ZSkKLQkJCWVsaWYgdmFsdWVbMF0gPT0gJyInOgotCQkJCXZhbHVlID0gdmFsdWVbMTotMV0KLQkJCWVsaWYgdmFsdWUgPT0gJ21vdmUtdGhlbi1yZXNpemUnOgotCQkJCSMgU3RyYW5nZSBkZWZhdWx0IHNldCBieSBQYW5lbCBFZGl0b3IuLi4KLQkJCQlvayA9IDAKLQkJCWVsc2U6Ci0JCQkJcHJpbnQgJ3Vua25vd24gdmFsdWUnLCB2YWx1ZSwgJ2ZvcicsIG5hbWUKLQkJCQlvayA9IDAKLQkJCWlmIG9rOgotCQkJCWxocyA9ICd0YXJnZXQuJyArIHByZWZpeCArIG5hbWUKLQkJCQlzdG10ID0gbGhzICsgJz0nICsgcmVwcih2YWx1ZSkKLQkJCQlpZiBkZWJ1ZzogcHJpbnQgJ2V4ZWMnLCBzdG10Ci0JCQkJdHJ5OgotCQkJCQlleGVjIHN0bXQgKyAnXG4nCi0JCQkJZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OiAjIERvbid0IGNhdGNoIHRoaXMhCi0JCQkJCXJhaXNlIEtleWJvYXJkSW50ZXJydXB0Ci0JCQkJZXhjZXB0OgotCQkJCQlwcmludCAnYXNzaWduIGZhaWxlZDonLCBzdG10CisgICAgZm9yIGl0ZW0gaW4gYXR0cmxpc3Q6CisgICAgICAgIGlmIGlzX2xpc3QoaXRlbSkgYW5kIGxlbihpdGVtKSA9PSAyIGFuZCBpdGVtWzBdIG5vdCBpbiBleGNsaXN0OgorICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSBpdGVtWzBdLCBpdGVtWzFdCisgICAgICAgICAgICBvayA9IDEKKyAgICAgICAgICAgIGlmIHZhbHVlWzBdIGluICctMDEyMzQ1Njc4OSc6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBldmFsKHZhbHVlKQorICAgICAgICAgICAgZWxpZiB2YWx1ZVswXSA9PSAnIic6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxOi0xXQorICAgICAgICAgICAgZWxpZiB2YWx1ZSA9PSAnbW92ZS10aGVuLXJlc2l6ZSc6CisgICAgICAgICAgICAgICAgIyBTdHJhbmdlIGRlZmF1bHQgc2V0IGJ5IFBhbmVsIEVkaXRvci4uLgorICAgICAgICAgICAgICAgIG9rID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAndW5rbm93biB2YWx1ZScsIHZhbHVlLCAnZm9yJywgbmFtZQorICAgICAgICAgICAgICAgIG9rID0gMAorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgbGhzID0gJ3RhcmdldC4nICsgcHJlZml4ICsgbmFtZQorICAgICAgICAgICAgICAgIHN0bXQgPSBsaHMgKyAnPScgKyByZXByKHZhbHVlKQorICAgICAgICAgICAgICAgIGlmIGRlYnVnOiBwcmludCAnZXhlYycsIHN0bXQKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGV4ZWMgc3RtdCArICdcbicKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6ICMgRG9uJ3QgY2F0Y2ggdGhpcyEKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdhc3NpZ24gZmFpbGVkOicsIHN0bXQKIAogCiAjIEJ1aWxkIGEgcmVhbCBhY3R1YXRvciBmcm9tIGFuIGFjdHVhdG9yIGRlc2NyaXB0aW9uLgogIyBSZXR1cm4gYSBwYWlyIChhY3R1YXRvciwgbmFtZSkuCiAjCiBkZWYgYnVpbGRfYWN0dWF0b3IoZGVzY3IpOgotCW5hbWVsaXN0ID0gZ2V0YXR0cmxpc3QoZGVzY3IsICduYW1lJykKLQlpZiBuYW1lbGlzdDoKLQkJIyBBc3N1bWUgaXQgaXMgYSBzdHJpbmcKLQkJYWN0dWF0b3JuYW1lID0gbmFtZWxpc3RbMF1bMTotMV0KLQllbHNlOgotCQlhY3R1YXRvcm5hbWUgPSAnJwotCXR5cGUgPSBkZXNjclswXQotCWlmIHR5cGVbOjRdID09ICdwbmxfJzogdHlwZSA9IHR5cGVbNDpdCi0JYWN0ID0gcG5sLm1rYWN0KHR5cGUpCi0JYWN0LmRvd25mdW5jID0gYWN0LmFjdGl2ZWZ1bmMgPSBhY3QudXBmdW5jID0gZHVtbXlfY2FsbGJhY2sKLQkjCi0JYXNzaWduX21lbWJlcnMoYWN0LCBkZXNjclsxOl0sIFsnYWwnLCAnZGF0YScsICduYW1lJ10sICcnKQotCSMKLQkjIFRyZWF0IGFjdHVhdG9yLXNwZWNpZmljIGRhdGEKLQkjCi0JZGF0YWxpc3QgPSBnZXRhdHRybGlzdChkZXNjciwgJ2RhdGEnKQotCXByZWZpeCA9ICcnCi0JaWYgdHlwZVstNDpdID09ICdwdWNrJzoKLQkJcHJlZml4ID0gJ3B1Y2tfJwotCWVsaWYgdHlwZSA9PSAnbW91c2UnOgotCQlwcmVmaXggPSAnbW91c2VfJwotCWFzc2lnbl9tZW1iZXJzKGFjdCwgZGF0YWxpc3QsIFtdLCBwcmVmaXgpCi0JIwotCXJldHVybiBhY3QsIGFjdHVhdG9ybmFtZQorICAgIG5hbWVsaXN0ID0gZ2V0YXR0cmxpc3QoZGVzY3IsICduYW1lJykKKyAgICBpZiBuYW1lbGlzdDoKKyAgICAgICAgIyBBc3N1bWUgaXQgaXMgYSBzdHJpbmcKKyAgICAgICAgYWN0dWF0b3JuYW1lID0gbmFtZWxpc3RbMF1bMTotMV0KKyAgICBlbHNlOgorICAgICAgICBhY3R1YXRvcm5hbWUgPSAnJworICAgIHR5cGUgPSBkZXNjclswXQorICAgIGlmIHR5cGVbOjRdID09ICdwbmxfJzogdHlwZSA9IHR5cGVbNDpdCisgICAgYWN0ID0gcG5sLm1rYWN0KHR5cGUpCisgICAgYWN0LmRvd25mdW5jID0gYWN0LmFjdGl2ZWZ1bmMgPSBhY3QudXBmdW5jID0gZHVtbXlfY2FsbGJhY2sKKyAgICAjCisgICAgYXNzaWduX21lbWJlcnMoYWN0LCBkZXNjclsxOl0sIFsnYWwnLCAnZGF0YScsICduYW1lJ10sICcnKQorICAgICMKKyAgICAjIFRyZWF0IGFjdHVhdG9yLXNwZWNpZmljIGRhdGEKKyAgICAjCisgICAgZGF0YWxpc3QgPSBnZXRhdHRybGlzdChkZXNjciwgJ2RhdGEnKQorICAgIHByZWZpeCA9ICcnCisgICAgaWYgdHlwZVstNDpdID09ICdwdWNrJzoKKyAgICAgICAgcHJlZml4ID0gJ3B1Y2tfJworICAgIGVsaWYgdHlwZSA9PSAnbW91c2UnOgorICAgICAgICBwcmVmaXggPSAnbW91c2VfJworICAgIGFzc2lnbl9tZW1iZXJzKGFjdCwgZGF0YWxpc3QsIFtdLCBwcmVmaXgpCisgICAgIworICAgIHJldHVybiBhY3QsIGFjdHVhdG9ybmFtZQogCiAKICMgQnVpbGQgYWxsIHN1Yi1hY3R1YXRvcnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBzdXBlci1hY3R1YXRvci4KQEAgLTE3NiwyNyArMTc2LDI3IEBACiAjIHRvIGEgc3ViLWFjdHVhdG9yLgogIwogZGVmIGJ1aWxkX3N1YmFjdHVhdG9ycyhwYW5lbCwgc3VwZXJfYWN0LCBhbCk6Ci0JIwotCSMgVGhpcyBpcyBuZWFybHkgdGhlIHNhbWUgbG9vcCBhcyBiZWxvdyBpbiBidWlsZF9wYW5lbCgpLAotCSMgZXhjZXB0IGEgY2FsbCBpcyBtYWRlIHRvIGFkZHN1YmFjdCgpIGluc3RlYWQgb2YgYWRkYWN0KCkuCi0JIwotCWZvciBhIGluIGFsOgotCQlhY3QsIG5hbWUgPSBidWlsZF9hY3R1YXRvcihhKQotCQlhY3QuYWRkc3ViYWN0KHN1cGVyX2FjdCkKLQkJaWYgbmFtZToKLQkJCXN0bXQgPSAncGFuZWwuJyArIG5hbWUgKyAnID0gYWN0JwotCQkJaWYgZGVidWc6IHByaW50ICdleGVjJywgc3RtdAotCQkJZXhlYyBzdG10ICsgJ1xuJwotCQlpZiBpc19lbmRncm91cChhKToKLQkJCXBhbmVsLmVuZGdyb3VwKCkKLQkJc3ViX2FsID0gZ2V0YXR0cmxpc3QoYSwgJ2FsJykKLQkJaWYgc3ViX2FsOgotCQkJYnVpbGRfc3ViYWN0dWF0b3JzKHBhbmVsLCBhY3QsIHN1Yl9hbCkKLQkjCi0JIyBGaXggdGhlIGFjdHVhdG9yIHRvIHdoaWNoIHdoZSBqdXN0IGFkZGVkIHN1YmFjdHVhdG9ycy4KLQkjIFRoaXMgY2FuJ3QgaHVydCAoSSBob3BlKSBhbmQgaXMgbmVlZGVkIGZvciB0aGUgc2Nyb2xsIGFjdHVhdG9yLgotCSMKLQlzdXBlcl9hY3QuZml4YWN0KCkKKyAgICAjCisgICAgIyBUaGlzIGlzIG5lYXJseSB0aGUgc2FtZSBsb29wIGFzIGJlbG93IGluIGJ1aWxkX3BhbmVsKCksCisgICAgIyBleGNlcHQgYSBjYWxsIGlzIG1hZGUgdG8gYWRkc3ViYWN0KCkgaW5zdGVhZCBvZiBhZGRhY3QoKS4KKyAgICAjCisgICAgZm9yIGEgaW4gYWw6CisgICAgICAgIGFjdCwgbmFtZSA9IGJ1aWxkX2FjdHVhdG9yKGEpCisgICAgICAgIGFjdC5hZGRzdWJhY3Qoc3VwZXJfYWN0KQorICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgc3RtdCA9ICdwYW5lbC4nICsgbmFtZSArICcgPSBhY3QnCisgICAgICAgICAgICBpZiBkZWJ1ZzogcHJpbnQgJ2V4ZWMnLCBzdG10CisgICAgICAgICAgICBleGVjIHN0bXQgKyAnXG4nCisgICAgICAgIGlmIGlzX2VuZGdyb3VwKGEpOgorICAgICAgICAgICAgcGFuZWwuZW5kZ3JvdXAoKQorICAgICAgICBzdWJfYWwgPSBnZXRhdHRybGlzdChhLCAnYWwnKQorICAgICAgICBpZiBzdWJfYWw6CisgICAgICAgICAgICBidWlsZF9zdWJhY3R1YXRvcnMocGFuZWwsIGFjdCwgc3ViX2FsKQorICAgICMKKyAgICAjIEZpeCB0aGUgYWN0dWF0b3IgdG8gd2hpY2ggd2hlIGp1c3QgYWRkZWQgc3ViYWN0dWF0b3JzLgorICAgICMgVGhpcyBjYW4ndCBodXJ0IChJIGhvcGUpIGFuZCBpcyBuZWVkZWQgZm9yIHRoZSBzY3JvbGwgYWN0dWF0b3IuCisgICAgIworICAgIHN1cGVyX2FjdC5maXhhY3QoKQogCiAKICMgQnVpbGQgYSByZWFsIHBhbmVsIGZyb20gYSBwYW5lbCBkZWZpbml0aW9uLgpAQCAtMjA0LDc4ICsyMDQsNzggQEAKICMgcmVmZXJlbmNlIHRvIGEuCiAjCiBkZWYgYnVpbGRfcGFuZWwoZGVzY3IpOgotCSMKLQkjIFNhbml0eSBjaGVjawotCSMKLQlpZiAobm90IGRlc2NyKSBvciBkZXNjclswXSAhPSAncGFuZWwnOgotCQlyYWlzZSBwYW5lbF9lcnJvciwgJ3BhbmVsIGRlc2NyaXB0aW9uIG11c3Qgc3RhcnQgd2l0aCAicGFuZWwiJwotCSMKLQlpZiBkZWJ1Zzogc2hvd19wYW5lbCgnJywgZGVzY3IpCi0JIwotCSMgQ3JlYXRlIGFuIGVtcHR5IHBhbmVsCi0JIwotCXBhbmVsID0gcG5sLm1rcGFuZWwoKQotCSMKLQkjIEFzc2lnbiBwYW5lbCBhdHRyaWJ1dGVzCi0JIwotCWFzc2lnbl9tZW1iZXJzKHBhbmVsLCBkZXNjclsxOl0sIFsnYWwnXSwgJycpCi0JIwotCSMgTG9vayBmb3IgYWN0dWF0b3IgbGlzdAotCSMKLQlhbCA9IGdldGF0dHJsaXN0KGRlc2NyLCAnYWwnKQotCSMKLQkjIFRoZSBvcmRlciBpbiB3aGljaCBhY3R1YXRvcnMgYXJlIGNyZWF0ZWQgaXMgaW1wb3J0YW50Ci0JIyBiZWNhdXNlIG9mIHRoZSBlbmRncm91cCgpIG9wZXJhdG9yLgotCSMgVW5mb3J0dW5hdGVseSB0aGUgUGFuZWwgRWRpdG9yIG91dHB1dHMgdGhlIGFjdHVhdG9yIGxpc3QKLQkjIGluIHJldmVyc2Ugb3JkZXIsIHNvIHdlIHJldmVyc2UgaXQgaGVyZS4KLQkjCi0JYWwgPSByZXZlcnNlKGFsKQotCSMKLQlmb3IgYSBpbiBhbDoKLQkJYWN0LCBuYW1lID0gYnVpbGRfYWN0dWF0b3IoYSkKLQkJYWN0LmFkZGFjdChwYW5lbCkKLQkJaWYgbmFtZToKLQkJCXN0bXQgPSAncGFuZWwuJyArIG5hbWUgKyAnID0gYWN0JwotCQkJZXhlYyBzdG10ICsgJ1xuJwotCQlpZiBpc19lbmRncm91cChhKToKLQkJCXBhbmVsLmVuZGdyb3VwKCkKLQkJc3ViX2FsID0gZ2V0YXR0cmxpc3QoYSwgJ2FsJykKLQkJaWYgc3ViX2FsOgotCQkJYnVpbGRfc3ViYWN0dWF0b3JzKHBhbmVsLCBhY3QsIHN1Yl9hbCkKLQkjCi0JcmV0dXJuIHBhbmVsCisgICAgIworICAgICMgU2FuaXR5IGNoZWNrCisgICAgIworICAgIGlmIChub3QgZGVzY3IpIG9yIGRlc2NyWzBdICE9ICdwYW5lbCc6CisgICAgICAgIHJhaXNlIHBhbmVsX2Vycm9yLCAncGFuZWwgZGVzY3JpcHRpb24gbXVzdCBzdGFydCB3aXRoICJwYW5lbCInCisgICAgIworICAgIGlmIGRlYnVnOiBzaG93X3BhbmVsKCcnLCBkZXNjcikKKyAgICAjCisgICAgIyBDcmVhdGUgYW4gZW1wdHkgcGFuZWwKKyAgICAjCisgICAgcGFuZWwgPSBwbmwubWtwYW5lbCgpCisgICAgIworICAgICMgQXNzaWduIHBhbmVsIGF0dHJpYnV0ZXMKKyAgICAjCisgICAgYXNzaWduX21lbWJlcnMocGFuZWwsIGRlc2NyWzE6XSwgWydhbCddLCAnJykKKyAgICAjCisgICAgIyBMb29rIGZvciBhY3R1YXRvciBsaXN0CisgICAgIworICAgIGFsID0gZ2V0YXR0cmxpc3QoZGVzY3IsICdhbCcpCisgICAgIworICAgICMgVGhlIG9yZGVyIGluIHdoaWNoIGFjdHVhdG9ycyBhcmUgY3JlYXRlZCBpcyBpbXBvcnRhbnQKKyAgICAjIGJlY2F1c2Ugb2YgdGhlIGVuZGdyb3VwKCkgb3BlcmF0b3IuCisgICAgIyBVbmZvcnR1bmF0ZWx5IHRoZSBQYW5lbCBFZGl0b3Igb3V0cHV0cyB0aGUgYWN0dWF0b3IgbGlzdAorICAgICMgaW4gcmV2ZXJzZSBvcmRlciwgc28gd2UgcmV2ZXJzZSBpdCBoZXJlLgorICAgICMKKyAgICBhbCA9IHJldmVyc2UoYWwpCisgICAgIworICAgIGZvciBhIGluIGFsOgorICAgICAgICBhY3QsIG5hbWUgPSBidWlsZF9hY3R1YXRvcihhKQorICAgICAgICBhY3QuYWRkYWN0KHBhbmVsKQorICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgc3RtdCA9ICdwYW5lbC4nICsgbmFtZSArICcgPSBhY3QnCisgICAgICAgICAgICBleGVjIHN0bXQgKyAnXG4nCisgICAgICAgIGlmIGlzX2VuZGdyb3VwKGEpOgorICAgICAgICAgICAgcGFuZWwuZW5kZ3JvdXAoKQorICAgICAgICBzdWJfYWwgPSBnZXRhdHRybGlzdChhLCAnYWwnKQorICAgICAgICBpZiBzdWJfYWw6CisgICAgICAgICAgICBidWlsZF9zdWJhY3R1YXRvcnMocGFuZWwsIGFjdCwgc3ViX2FsKQorICAgICMKKyAgICByZXR1cm4gcGFuZWwKIAogCiAjIFdyYXBwZXIgYXJvdW5kIHBubC5kb3BhbmVsKCkgd2hpY2ggY2FsbHMgY2FsbC1iYWNrIGZ1bmN0aW9ucy4KICMKIGRlZiBteV9kb3BhbmVsKCk6Ci0JIyBFeHRyYWN0IG9ubHkgdGhlIGZpcnN0IDQgZWxlbWVudHMgdG8gYWxsb3cgZm9yIGZ1dHVyZSBleHBhbnNpb24KLQlhLCBkb3duLCBhY3RpdmUsIHVwID0gcG5sLmRvcGFuZWwoKVs6NF0KLQlpZiBkb3duOgotCQlkb3duLmRvd25mdW5jKGRvd24pCi0JaWYgYWN0aXZlOgotCQlhY3RpdmUuYWN0aXZlZnVuYyhhY3RpdmUpCi0JaWYgdXA6Ci0JCXVwLnVwZnVuYyh1cCkKLQlyZXR1cm4gYQorICAgICMgRXh0cmFjdCBvbmx5IHRoZSBmaXJzdCA0IGVsZW1lbnRzIHRvIGFsbG93IGZvciBmdXR1cmUgZXhwYW5zaW9uCisgICAgYSwgZG93biwgYWN0aXZlLCB1cCA9IHBubC5kb3BhbmVsKClbOjRdCisgICAgaWYgZG93bjoKKyAgICAgICAgZG93bi5kb3duZnVuYyhkb3duKQorICAgIGlmIGFjdGl2ZToKKyAgICAgICAgYWN0aXZlLmFjdGl2ZWZ1bmMoYWN0aXZlKQorICAgIGlmIHVwOgorICAgICAgICB1cC51cGZ1bmModXApCisgICAgcmV0dXJuIGEKIAogCiAjIENyZWF0ZSBvbmUgb3IgbW9yZSBwYW5lbHMgZnJvbSBhIGRlc2NyaXB0aW9uIGZpbGUgKFMtZXhwcmVzc2lvbnMpCiAjIGdlbmVyYXRlZCBieSB0aGUgUGFuZWwgRWRpdG9yLgotIyAKKyMKIGRlZiBkZWZwYW5lbGxpc3QoZmlsZSk6Ci0JaW1wb3J0IHBhbmVscGFyc2VyCi0JZGVzY3JsaXN0ID0gcGFuZWxwYXJzZXIucGFyc2VfZmlsZShvcGVuKGZpbGUsICdyJykpCi0JcGFuZWxsaXN0ID0gW10KLQlmb3IgZGVzY3IgaW4gZGVzY3JsaXN0OgotCQlwYW5lbGxpc3QuYXBwZW5kKGJ1aWxkX3BhbmVsKGRlc2NyKSkKLQlyZXR1cm4gcGFuZWxsaXN0CisgICAgaW1wb3J0IHBhbmVscGFyc2VyCisgICAgZGVzY3JsaXN0ID0gcGFuZWxwYXJzZXIucGFyc2VfZmlsZShvcGVuKGZpbGUsICdyJykpCisgICAgcGFuZWxsaXN0ID0gW10KKyAgICBmb3IgZGVzY3IgaW4gZGVzY3JsaXN0OgorICAgICAgICBwYW5lbGxpc3QuYXBwZW5kKGJ1aWxkX3BhbmVsKGRlc2NyKSkKKyAgICByZXR1cm4gcGFuZWxsaXN0CiAKIAogIyBJbXBvcnQgZXZlcnl0aGluZyBmcm9tIGJ1aWx0LWluIG1ldGhvZCBwbmwsIHNvIHRoZSB1c2VyIGNhbiBhbHdheXMKICMgdXNlIHBhbmVsLmZvbygpIGluc3RlYWQgb2YgcG5sLmZvbygpLgogIyBUaGlzIGdpdmVzICpubyogcGVyZm9ybWFuY2UgcGVuYWx0eSBvbmNlIHRoaXMgbW9kdWxlIGlzIGltcG9ydGVkLgogIwotZnJvbSBwbmwgaW1wb3J0ICoJCQkjIGZvciBleHBvcnQKK2Zyb20gcG5sIGltcG9ydCAqICAgICAgICAgICAgICAgICAgICAgICAjIGZvciBleHBvcnQKIAotZG9wYW5lbCA9IG15X2RvcGFuZWwJCQkjIG92ZXJyaWRlIHBubC5kb3BhbmVsCitkb3BhbmVsID0gbXlfZG9wYW5lbCAgICAgICAgICAgICAgICAgICAgIyBvdmVycmlkZSBwbmwuZG9wYW5lbApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtaXJpeDYvcGFuZWxwYXJzZXIucHkgYi9MaWIvcGxhdC1pcml4Ni9wYW5lbHBhcnNlci5weQppbmRleCBlZTUwOTcxLi5jODMxYzQ5IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1pcml4Ni9wYW5lbHBhcnNlci5weQorKysgYi9MaWIvcGxhdC1pcml4Ni9wYW5lbHBhcnNlci5weQpAQCAtMTUsNDcgKzE1LDQ3IEBACiAjIFJldHVybiBhIGxpc3Qgb2YgdG9rZW5zIChzdHJpbmdzKS4KICMKIGRlZiB0b2tlbml6ZV9zdHJpbmcocyk6Ci0JdG9rZW5zID0gW10KLQl3aGlsZSBzOgotCQljID0gc1s6MV0KLQkJaWYgYyBpbiB3aGl0ZXNwYWNlOgotCQkJcyA9IHNbMTpdCi0JCWVsaWYgYyA9PSAnOyc6Ci0JCQlzID0gJycKLQkJZWxpZiBjID09ICciJzoKLQkJCW4gPSBsZW4ocykKLQkJCWkgPSAxCi0JCQl3aGlsZSBpIDwgbjoKLQkJCQljID0gc1tpXQotCQkJCWkgPSBpKzEKLQkJCQlpZiBjID09ICciJzogYnJlYWsKLQkJCQlpZiBjID09ICdcXCc6IGkgPSBpKzEKLQkJCXRva2Vucy5hcHBlbmQoc1s6aV0pCi0JCQlzID0gc1tpOl0KLQkJZWxpZiBjIGluIG9wZXJhdG9yczoKLQkJCXRva2Vucy5hcHBlbmQoYykKLQkJCXMgPSBzWzE6XQotCQllbHNlOgotCQkJbiA9IGxlbihzKQotCQkJaSA9IDEKLQkJCXdoaWxlIGkgPCBuOgotCQkJCWlmIHNbaV0gaW4gc2VwYXJhdG9yczogYnJlYWsKLQkJCQlpID0gaSsxCi0JCQl0b2tlbnMuYXBwZW5kKHNbOmldKQotCQkJcyA9IHNbaTpdCi0JcmV0dXJuIHRva2VucworICAgIHRva2VucyA9IFtdCisgICAgd2hpbGUgczoKKyAgICAgICAgYyA9IHNbOjFdCisgICAgICAgIGlmIGMgaW4gd2hpdGVzcGFjZToKKyAgICAgICAgICAgIHMgPSBzWzE6XQorICAgICAgICBlbGlmIGMgPT0gJzsnOgorICAgICAgICAgICAgcyA9ICcnCisgICAgICAgIGVsaWYgYyA9PSAnIic6CisgICAgICAgICAgICBuID0gbGVuKHMpCisgICAgICAgICAgICBpID0gMQorICAgICAgICAgICAgd2hpbGUgaSA8IG46CisgICAgICAgICAgICAgICAgYyA9IHNbaV0KKyAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICAgICAgaWYgYyA9PSAnIic6IGJyZWFrCisgICAgICAgICAgICAgICAgaWYgYyA9PSAnXFwnOiBpID0gaSsxCisgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKHNbOmldKQorICAgICAgICAgICAgcyA9IHNbaTpdCisgICAgICAgIGVsaWYgYyBpbiBvcGVyYXRvcnM6CisgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKGMpCisgICAgICAgICAgICBzID0gc1sxOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG4gPSBsZW4ocykKKyAgICAgICAgICAgIGkgPSAxCisgICAgICAgICAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgICAgICAgICBpZiBzW2ldIGluIHNlcGFyYXRvcnM6IGJyZWFrCisgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChzWzppXSkKKyAgICAgICAgICAgIHMgPSBzW2k6XQorICAgIHJldHVybiB0b2tlbnMKIAogCiAjIFRva2VuaXplIGEgd2hvbGUgZmlsZSAoZ2l2ZW4gYXMgZmlsZSBvYmplY3QsIG5vdCBhcyBmaWxlIG5hbWUpLgogIyBSZXR1cm4gYSBsaXN0IG9mIHRva2VucyAoc3RyaW5ncykuCiAjCiBkZWYgdG9rZW5pemVfZmlsZShmcCk6Ci0JdG9rZW5zID0gW10KLQl3aGlsZSAxOgotCQlsaW5lID0gZnAucmVhZGxpbmUoKQotCQlpZiBub3QgbGluZTogYnJlYWsKLQkJdG9rZW5zID0gdG9rZW5zICsgdG9rZW5pemVfc3RyaW5nKGxpbmUpCi0JcmV0dXJuIHRva2VucworICAgIHRva2VucyA9IFtdCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgIHRva2VucyA9IHRva2VucyArIHRva2VuaXplX3N0cmluZyhsaW5lKQorICAgIHJldHVybiB0b2tlbnMKIAogCiAjIEV4Y2VwdGlvbiByYWlzZWQgYnkgcGFyc2VfZXhyLgpAQCAtNzEsNTAgKzcxLDUwIEBACiAjIE1heSByYWlzZSBzeW50YXhfZXJyb3IuCiAjCiBkZWYgcGFyc2VfZXhwcih0b2tlbnMpOgotCWlmIChub3QgdG9rZW5zKSBvciB0b2tlbnNbMF0gIT0gJygnOgotCQlyYWlzZSBzeW50YXhfZXJyb3IsICdleHBlY3RlZCAiKCInCi0JdG9rZW5zID0gdG9rZW5zWzE6XQotCWV4cHIgPSBbXQotCXdoaWxlIDE6Ci0JCWlmIG5vdCB0b2tlbnM6Ci0JCQlyYWlzZSBzeW50YXhfZXJyb3IsICdtaXNzaW5nICIpIicKLQkJaWYgdG9rZW5zWzBdID09ICcpJzoKLQkJCXJldHVybiBleHByLCB0b2tlbnNbMTpdCi0JCWVsaWYgdG9rZW5zWzBdID09ICcoJzoKLQkJCXN1YmV4cHIsIHRva2VucyA9IHBhcnNlX2V4cHIodG9rZW5zKQotCQkJZXhwci5hcHBlbmQoc3ViZXhwcikKLQkJZWxzZToKLQkJCWV4cHIuYXBwZW5kKHRva2Vuc1swXSkKLQkJCXRva2VucyA9IHRva2Vuc1sxOl0KKyAgICBpZiAobm90IHRva2Vucykgb3IgdG9rZW5zWzBdICE9ICcoJzoKKyAgICAgICAgcmFpc2Ugc3ludGF4X2Vycm9yLCAnZXhwZWN0ZWQgIigiJworICAgIHRva2VucyA9IHRva2Vuc1sxOl0KKyAgICBleHByID0gW10KKyAgICB3aGlsZSAxOgorICAgICAgICBpZiBub3QgdG9rZW5zOgorICAgICAgICAgICAgcmFpc2Ugc3ludGF4X2Vycm9yLCAnbWlzc2luZyAiKSInCisgICAgICAgIGlmIHRva2Vuc1swXSA9PSAnKSc6CisgICAgICAgICAgICByZXR1cm4gZXhwciwgdG9rZW5zWzE6XQorICAgICAgICBlbGlmIHRva2Vuc1swXSA9PSAnKCc6CisgICAgICAgICAgICBzdWJleHByLCB0b2tlbnMgPSBwYXJzZV9leHByKHRva2VucykKKyAgICAgICAgICAgIGV4cHIuYXBwZW5kKHN1YmV4cHIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHByLmFwcGVuZCh0b2tlbnNbMF0pCisgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbnNbMTpdCiAKIAogIyBQYXJzZSBhIGZpbGUgKGdpdmVuIGFzIGZpbGUgb2JqZWN0LCBub3QgYXMgZmlsZSBuYW1lKS4KICMgUmV0dXJuIGEgbGlzdCBvZiBwYXJzZWQgUy1leHByZXNzaW9ucyBmb3VuZCBhdCB0aGUgdG9wIGxldmVsLgogIwogZGVmIHBhcnNlX2ZpbGUoZnApOgotCXRva2VucyA9IHRva2VuaXplX2ZpbGUoZnApCi0JZXhwcmxpc3QgPSBbXQotCXdoaWxlIHRva2VuczoKLQkJZXhwciwgdG9rZW5zID0gcGFyc2VfZXhwcih0b2tlbnMpCi0JCWV4cHJsaXN0LmFwcGVuZChleHByKQotCXJldHVybiBleHBybGlzdAorICAgIHRva2VucyA9IHRva2VuaXplX2ZpbGUoZnApCisgICAgZXhwcmxpc3QgPSBbXQorICAgIHdoaWxlIHRva2VuczoKKyAgICAgICAgZXhwciwgdG9rZW5zID0gcGFyc2VfZXhwcih0b2tlbnMpCisgICAgICAgIGV4cHJsaXN0LmFwcGVuZChleHByKQorICAgIHJldHVybiBleHBybGlzdAogCiAKICMgRVhBTVBMRToKICMKICMgVGhlIGlucHV0Ci0jCScoaGlwIChob3AgaHVyLXJheSkpJworIyAgICAgICAnKGhpcCAoaG9wIGh1ci1yYXkpKScKICMKICMgcGFzc2VkIHRvIHRva2VuaXplX3N0cmluZygpIHJldHVybnMgdGhlIHRva2VuIGxpc3QKLSMJWycoJywgJ2hpcCcsICcoJywgJ2hvcCcsICdodXItcmF5JywgJyknLCAnKSddCisjICAgICAgIFsnKCcsICdoaXAnLCAnKCcsICdob3AnLCAnaHVyLXJheScsICcpJywgJyknXQogIwogIyBXaGVuIHRoaXMgaXMgcGFzc2VkIHRvIHBhcnNlX2V4cHIoKSBpdCByZXR1cm5zIHRoZSBleHByZXNzaW9uCi0jCVsnaGlwJywgWydob3AnLCAnaHVyLXJheSddXQorIyAgICAgICBbJ2hpcCcsIFsnaG9wJywgJ2h1ci1yYXknXV0KICMgcGx1cyBhbiBlbXB0eSB0b2tlbiBsaXN0IChiZWNhdXNlIHRoZXJlIGFyZSBubyB0b2tlbnMgbGVmdC4KICMKICMgV2hlbiBhIGZpbGUgY29udGFpbmluZyB0aGUgZXhhbXBsZSBpcyBwYXNzZWQgdG8gcGFyc2VfZmlsZSgpIGl0IHJldHVybnMKICMgYSBsaXN0IHdob3NlIG9ubHkgZWxlbWVudCBpcyB0aGUgb3V0cHV0IG9mIHBhcnNlX2V4cHIoKSBhYm92ZToKLSMJW1snaGlwJywgWydob3AnLCAnaHVyLXJheSddXV0KKyMgICAgICAgW1snaGlwJywgWydob3AnLCAnaHVyLXJheSddXV0KIAogCiAjIFRPS0VOSVpJTkc6CkBAIC0xMjMsNiArMTIzLDYgQEAKICMKICMgVG9rZW5zIGFyZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSwgZXhjZXB0IHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycwogIyBhbHdheXMgZm9ybSBhIHNlcGFyYXRlIHRva2VuIChvdXRzaWRlIHN0cmluZ3MpOgotIwkoICkgJworIyAgICAgICAoICkgJwogIyBTdHJpbmdzIGFyZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzICgiKSBhbmQgYmFja3NsYXNoIChcKSBpcyB1c2VkCiAjIGFzIGVzY2FwZSBjaGFyYWN0ZXIgaW4gc3RyaW5ncy4KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWlyaXg2L3JlYWRjZC5weSBiL0xpYi9wbGF0LWlyaXg2L3JlYWRjZC5weQppbmRleCBmMjc4YmE0Li41NDUzY2U0IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1pcml4Ni9yZWFkY2QucHkKKysrIGIvTGliL3BsYXQtaXJpeDYvcmVhZGNkLnB5CkBAIC0zLDI0MiArMywyNDIgQEAKIGltcG9ydCBjZCwgQ0QKIAogY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKLQlwYXNzCisgICAgcGFzcwogY2xhc3MgX1N0b3AoRXhjZXB0aW9uKToKLQlwYXNzCisgICAgcGFzcwogCiBkZWYgX2RvYXRpbWUoc2VsZiwgY2JfdHlwZSwgZGF0YSk6Ci0JaWYgKChkYXRhWzBdICogNjApICsgZGF0YVsxXSkgKiA3NSArIGRhdGFbMl0gPiBzZWxmLmVuZDoKLSMjCQlwcmludCAnZG9uZSB3aXRoIGxpc3QgZW50cnknLCByZXByKHNlbGYubGlzdGluZGV4KQotCQlyYWlzZSBfU3RvcAotCWZ1bmMsIGFyZyA9IHNlbGYuY2FsbGJhY2tzW2NiX3R5cGVdCi0JaWYgZnVuYzoKLQkJZnVuYyhhcmcsIGNiX3R5cGUsIGRhdGEpCisgICAgaWYgKChkYXRhWzBdICogNjApICsgZGF0YVsxXSkgKiA3NSArIGRhdGFbMl0gPiBzZWxmLmVuZDoKKyMjICAgICAgICAgICAgICBwcmludCAnZG9uZSB3aXRoIGxpc3QgZW50cnknLCByZXByKHNlbGYubGlzdGluZGV4KQorICAgICAgICByYWlzZSBfU3RvcAorICAgIGZ1bmMsIGFyZyA9IHNlbGYuY2FsbGJhY2tzW2NiX3R5cGVdCisgICAgaWYgZnVuYzoKKyAgICAgICAgZnVuYyhhcmcsIGNiX3R5cGUsIGRhdGEpCiAKIGRlZiBfZG9wbnVtKHNlbGYsIGNiX3R5cGUsIGRhdGEpOgotCWlmIGRhdGEgPiBzZWxmLmVuZDoKLSMjCQlwcmludCAnZG9uZSB3aXRoIGxpc3QgZW50cnknLCByZXByKHNlbGYubGlzdGluZGV4KQotCQlyYWlzZSBfU3RvcAotCWZ1bmMsIGFyZyA9IHNlbGYuY2FsbGJhY2tzW2NiX3R5cGVdCi0JaWYgZnVuYzoKLQkJZnVuYyhhcmcsIGNiX3R5cGUsIGRhdGEpCisgICAgaWYgZGF0YSA+IHNlbGYuZW5kOgorIyMgICAgICAgICAgICAgIHByaW50ICdkb25lIHdpdGggbGlzdCBlbnRyeScsIHJlcHIoc2VsZi5saXN0aW5kZXgpCisgICAgICAgIHJhaXNlIF9TdG9wCisgICAgZnVuYywgYXJnID0gc2VsZi5jYWxsYmFja3NbY2JfdHlwZV0KKyAgICBpZiBmdW5jOgorICAgICAgICBmdW5jKGFyZywgY2JfdHlwZSwgZGF0YSkKIAogY2xhc3MgUmVhZGNkOgotCWRlZiBfX2luaXRfXyhzZWxmLCAqYXJnKToKLQkJaWYgbGVuKGFyZykgPT0gMDoKLQkJCXNlbGYucGxheWVyID0gY2Qub3BlbigpCi0JCWVsaWYgbGVuKGFyZykgPT0gMToKLQkJCXNlbGYucGxheWVyID0gY2Qub3BlbihhcmdbMF0pCi0JCWVsaWYgbGVuKGFyZykgPT0gMjoKLQkJCXNlbGYucGxheWVyID0gY2Qub3BlbihhcmdbMF0sIGFyZ1sxXSkKLQkJZWxzZToKLQkJCXJhaXNlIEVycm9yLCAnYmFkIF9faW5pdF9fIGNhbGwnCi0JCXNlbGYubGlzdCA9IFtdCi0JCXNlbGYuY2FsbGJhY2tzID0gWyhOb25lLCBOb25lKV0gKiA4Ci0JCXNlbGYucGFyc2VyID0gY2QuY3JlYXRlcGFyc2VyKCkKLQkJc2VsZi5wbGF5aW5nID0gMAotCQlzZWxmLmVuZCA9IDAKLQkJc2VsZi5zdGF0dXMgPSBOb25lCi0JCXNlbGYudHJhY2tpbmZvID0gTm9uZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJnKToKKyAgICAgICAgaWYgbGVuKGFyZykgPT0gMDoKKyAgICAgICAgICAgIHNlbGYucGxheWVyID0gY2Qub3BlbigpCisgICAgICAgIGVsaWYgbGVuKGFyZykgPT0gMToKKyAgICAgICAgICAgIHNlbGYucGxheWVyID0gY2Qub3BlbihhcmdbMF0pCisgICAgICAgIGVsaWYgbGVuKGFyZykgPT0gMjoKKyAgICAgICAgICAgIHNlbGYucGxheWVyID0gY2Qub3BlbihhcmdbMF0sIGFyZ1sxXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnYmFkIF9faW5pdF9fIGNhbGwnCisgICAgICAgIHNlbGYubGlzdCA9IFtdCisgICAgICAgIHNlbGYuY2FsbGJhY2tzID0gWyhOb25lLCBOb25lKV0gKiA4CisgICAgICAgIHNlbGYucGFyc2VyID0gY2QuY3JlYXRlcGFyc2VyKCkKKyAgICAgICAgc2VsZi5wbGF5aW5nID0gMAorICAgICAgICBzZWxmLmVuZCA9IDAKKyAgICAgICAgc2VsZi5zdGF0dXMgPSBOb25lCisgICAgICAgIHNlbGYudHJhY2tpbmZvID0gTm9uZQogCi0JZGVmIGVqZWN0KHNlbGYpOgotCQlzZWxmLnBsYXllci5lamVjdCgpCi0JCXNlbGYubGlzdCA9IFtdCi0JCXNlbGYuZW5kID0gMAotCQlzZWxmLmxpc3RpbmRleCA9IDAKLQkJc2VsZi5zdGF0dXMgPSBOb25lCi0JCXNlbGYudHJhY2tpbmZvID0gTm9uZQotCQlpZiBzZWxmLnBsYXlpbmc6Ci0jIwkJCXByaW50ICdzdG9wIHBsYXlpbmcgZnJvbSBlamVjdCcKLQkJCXJhaXNlIF9TdG9wCisgICAgZGVmIGVqZWN0KHNlbGYpOgorICAgICAgICBzZWxmLnBsYXllci5lamVjdCgpCisgICAgICAgIHNlbGYubGlzdCA9IFtdCisgICAgICAgIHNlbGYuZW5kID0gMAorICAgICAgICBzZWxmLmxpc3RpbmRleCA9IDAKKyAgICAgICAgc2VsZi5zdGF0dXMgPSBOb25lCisgICAgICAgIHNlbGYudHJhY2tpbmZvID0gTm9uZQorICAgICAgICBpZiBzZWxmLnBsYXlpbmc6CisjIyAgICAgICAgICAgICAgICAgICAgICBwcmludCAnc3RvcCBwbGF5aW5nIGZyb20gZWplY3QnCisgICAgICAgICAgICByYWlzZSBfU3RvcAogCi0JZGVmIHBtc2YybXNmKHNlbGYsIHRyYWNrLCBtaW4sIHNlYywgZnJhbWUpOgotCQlpZiBub3Qgc2VsZi5zdGF0dXM6Ci0JCQlzZWxmLmNhY2hlc3RhdHVzKCkKLQkJaWYgdHJhY2sgPCBzZWxmLnN0YXR1c1s1XSBvciB0cmFjayA+IHNlbGYuc3RhdHVzWzZdOgotCQkJcmFpc2UgRXJyb3IsICd0cmFjayBudW1iZXIgb3V0IG9mIHJhbmdlJwotCQlpZiBub3Qgc2VsZi50cmFja2luZm86Ci0JCQlzZWxmLmNhY2hlaW5mbygpCi0JCXN0YXJ0LCB0b3RhbCA9IHNlbGYudHJhY2tpbmZvW3RyYWNrXQotCQlzdGFydCA9ICgoc3RhcnRbMF0gKiA2MCkgKyBzdGFydFsxXSkgKiA3NSArIHN0YXJ0WzJdCi0JCXRvdGFsID0gKCh0b3RhbFswXSAqIDYwKSArIHRvdGFsWzFdKSAqIDc1ICsgdG90YWxbMl0KLQkJYmxvY2sgPSAoKG1pbiAqIDYwKSArIHNlYykgKiA3NSArIGZyYW1lCi0JCWlmIGJsb2NrID4gdG90YWw6Ci0JCQlyYWlzZSBFcnJvciwgJ291dCBvZiByYW5nZScKLQkJYmxvY2sgPSBzdGFydCArIGJsb2NrCi0JCW1pbiwgYmxvY2sgPSBkaXZtb2QoYmxvY2ssIDc1KjYwKQotCQlzZWMsIGZyYW1lID0gZGl2bW9kKGJsb2NrLCA3NSkKLQkJcmV0dXJuIG1pbiwgc2VjLCBmcmFtZQorICAgIGRlZiBwbXNmMm1zZihzZWxmLCB0cmFjaywgbWluLCBzZWMsIGZyYW1lKToKKyAgICAgICAgaWYgbm90IHNlbGYuc3RhdHVzOgorICAgICAgICAgICAgc2VsZi5jYWNoZXN0YXR1cygpCisgICAgICAgIGlmIHRyYWNrIDwgc2VsZi5zdGF0dXNbNV0gb3IgdHJhY2sgPiBzZWxmLnN0YXR1c1s2XToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndHJhY2sgbnVtYmVyIG91dCBvZiByYW5nZScKKyAgICAgICAgaWYgbm90IHNlbGYudHJhY2tpbmZvOgorICAgICAgICAgICAgc2VsZi5jYWNoZWluZm8oKQorICAgICAgICBzdGFydCwgdG90YWwgPSBzZWxmLnRyYWNraW5mb1t0cmFja10KKyAgICAgICAgc3RhcnQgPSAoKHN0YXJ0WzBdICogNjApICsgc3RhcnRbMV0pICogNzUgKyBzdGFydFsyXQorICAgICAgICB0b3RhbCA9ICgodG90YWxbMF0gKiA2MCkgKyB0b3RhbFsxXSkgKiA3NSArIHRvdGFsWzJdCisgICAgICAgIGJsb2NrID0gKChtaW4gKiA2MCkgKyBzZWMpICogNzUgKyBmcmFtZQorICAgICAgICBpZiBibG9jayA+IHRvdGFsOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdvdXQgb2YgcmFuZ2UnCisgICAgICAgIGJsb2NrID0gc3RhcnQgKyBibG9jaworICAgICAgICBtaW4sIGJsb2NrID0gZGl2bW9kKGJsb2NrLCA3NSo2MCkKKyAgICAgICAgc2VjLCBmcmFtZSA9IGRpdm1vZChibG9jaywgNzUpCisgICAgICAgIHJldHVybiBtaW4sIHNlYywgZnJhbWUKIAotCWRlZiByZXNldChzZWxmKToKLQkJc2VsZi5saXN0ID0gW10KKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYubGlzdCA9IFtdCiAKLQlkZWYgYXBwZW5kdHJhY2soc2VsZiwgdHJhY2spOgotCQlzZWxmLmFwcGVuZHN0cmV0Y2godHJhY2ssIHRyYWNrKQotCQkJCQotCWRlZiBhcHBlbmRzdHJldGNoKHNlbGYsIHN0YXJ0LCBlbmQpOgotCQlpZiBub3Qgc2VsZi5zdGF0dXM6Ci0JCQlzZWxmLmNhY2hlc3RhdHVzKCkKLQkJaWYgbm90IHN0YXJ0OgotCQkJc3RhcnQgPSAxCi0JCWlmIG5vdCBlbmQ6Ci0JCQllbmQgPSBzZWxmLnN0YXR1c1s2XQotCQlpZiB0eXBlKGVuZCkgPT0gdHlwZSgwKToKLQkJCWlmIGVuZCA8IHNlbGYuc3RhdHVzWzVdIG9yIGVuZCA+IHNlbGYuc3RhdHVzWzZdOgotCQkJCXJhaXNlIEVycm9yLCAncmFuZ2UgZXJyb3InCi0JCWVsc2U6Ci0JCQlsID0gbGVuKGVuZCkKLQkJCWlmIGwgPT0gNDoKLQkJCQlwcm9nLCBtaW4sIHNlYywgZnJhbWUgPSBlbmQKLQkJCQlpZiBwcm9nIDwgc2VsZi5zdGF0dXNbNV0gb3IgcHJvZyA+IHNlbGYuc3RhdHVzWzZdOgotCQkJCQlyYWlzZSBFcnJvciwgJ3JhbmdlIGVycm9yJwotCQkJCWVuZCA9IHNlbGYucG1zZjJtc2YocHJvZywgbWluLCBzZWMsIGZyYW1lKQotCQkJZWxpZiBsICE9IDM6Ci0JCQkJcmFpc2UgRXJyb3IsICdzeW50YXggZXJyb3InCi0JCWlmIHR5cGUoc3RhcnQpID09IHR5cGUoMCk6Ci0JCQlpZiBzdGFydCA8IHNlbGYuc3RhdHVzWzVdIG9yIHN0YXJ0ID4gc2VsZi5zdGF0dXNbNl06Ci0JCQkJcmFpc2UgRXJyb3IsICdyYW5nZSBlcnJvcicKLQkJCWlmIGxlbihzZWxmLmxpc3QpID4gMDoKLQkJCQlzLCBlID0gc2VsZi5saXN0Wy0xXQotCQkJCWlmIHR5cGUoZSkgPT0gdHlwZSgwKToKLQkJCQkJaWYgc3RhcnQgPT0gZSsxOgotCQkJCQkJc3RhcnQgPSBzCi0JCQkJCQlkZWwgc2VsZi5saXN0Wy0xXQotCQllbHNlOgotCQkJbCA9IGxlbihzdGFydCkKLQkJCWlmIGwgPT0gNDoKLQkJCQlwcm9nLCBtaW4sIHNlYywgZnJhbWUgPSBzdGFydAotCQkJCWlmIHByb2cgPCBzZWxmLnN0YXR1c1s1XSBvciBwcm9nID4gc2VsZi5zdGF0dXNbNl06Ci0JCQkJCXJhaXNlIEVycm9yLCAncmFuZ2UgZXJyb3InCi0JCQkJc3RhcnQgPSBzZWxmLnBtc2YybXNmKHByb2csIG1pbiwgc2VjLCBmcmFtZSkKLQkJCWVsaWYgbCAhPSAzOgotCQkJCXJhaXNlIEVycm9yLCAnc3ludGF4IGVycm9yJwotCQlzZWxmLmxpc3QuYXBwZW5kKChzdGFydCwgZW5kKSkKKyAgICBkZWYgYXBwZW5kdHJhY2soc2VsZiwgdHJhY2spOgorICAgICAgICBzZWxmLmFwcGVuZHN0cmV0Y2godHJhY2ssIHRyYWNrKQogCi0JZGVmIHNldHRyYWNrcyhzZWxmLCBsaXN0KToKLQkJc2VsZi5saXN0ID0gW10KLQkJZm9yIHRyYWNrIGluIGxpc3Q6Ci0JCQlzZWxmLmFwcGVuZHRyYWNrKHRyYWNrKQorICAgIGRlZiBhcHBlbmRzdHJldGNoKHNlbGYsIHN0YXJ0LCBlbmQpOgorICAgICAgICBpZiBub3Qgc2VsZi5zdGF0dXM6CisgICAgICAgICAgICBzZWxmLmNhY2hlc3RhdHVzKCkKKyAgICAgICAgaWYgbm90IHN0YXJ0OgorICAgICAgICAgICAgc3RhcnQgPSAxCisgICAgICAgIGlmIG5vdCBlbmQ6CisgICAgICAgICAgICBlbmQgPSBzZWxmLnN0YXR1c1s2XQorICAgICAgICBpZiB0eXBlKGVuZCkgPT0gdHlwZSgwKToKKyAgICAgICAgICAgIGlmIGVuZCA8IHNlbGYuc3RhdHVzWzVdIG9yIGVuZCA+IHNlbGYuc3RhdHVzWzZdOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAncmFuZ2UgZXJyb3InCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsID0gbGVuKGVuZCkKKyAgICAgICAgICAgIGlmIGwgPT0gNDoKKyAgICAgICAgICAgICAgICBwcm9nLCBtaW4sIHNlYywgZnJhbWUgPSBlbmQKKyAgICAgICAgICAgICAgICBpZiBwcm9nIDwgc2VsZi5zdGF0dXNbNV0gb3IgcHJvZyA+IHNlbGYuc3RhdHVzWzZdOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3JhbmdlIGVycm9yJworICAgICAgICAgICAgICAgIGVuZCA9IHNlbGYucG1zZjJtc2YocHJvZywgbWluLCBzZWMsIGZyYW1lKQorICAgICAgICAgICAgZWxpZiBsICE9IDM6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdzeW50YXggZXJyb3InCisgICAgICAgIGlmIHR5cGUoc3RhcnQpID09IHR5cGUoMCk6CisgICAgICAgICAgICBpZiBzdGFydCA8IHNlbGYuc3RhdHVzWzVdIG9yIHN0YXJ0ID4gc2VsZi5zdGF0dXNbNl06CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdyYW5nZSBlcnJvcicKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmxpc3QpID4gMDoKKyAgICAgICAgICAgICAgICBzLCBlID0gc2VsZi5saXN0Wy0xXQorICAgICAgICAgICAgICAgIGlmIHR5cGUoZSkgPT0gdHlwZSgwKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhcnQgPT0gZSsxOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBzCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5saXN0Wy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbCA9IGxlbihzdGFydCkKKyAgICAgICAgICAgIGlmIGwgPT0gNDoKKyAgICAgICAgICAgICAgICBwcm9nLCBtaW4sIHNlYywgZnJhbWUgPSBzdGFydAorICAgICAgICAgICAgICAgIGlmIHByb2cgPCBzZWxmLnN0YXR1c1s1XSBvciBwcm9nID4gc2VsZi5zdGF0dXNbNl06CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAncmFuZ2UgZXJyb3InCisgICAgICAgICAgICAgICAgc3RhcnQgPSBzZWxmLnBtc2YybXNmKHByb2csIG1pbiwgc2VjLCBmcmFtZSkKKyAgICAgICAgICAgIGVsaWYgbCAhPSAzOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc3ludGF4IGVycm9yJworICAgICAgICBzZWxmLmxpc3QuYXBwZW5kKChzdGFydCwgZW5kKSkKIAotCWRlZiBzZXRjYWxsYmFjayhzZWxmLCBjYl90eXBlLCBmdW5jLCBhcmcpOgotCQlpZiBjYl90eXBlIDwgMCBvciBjYl90eXBlID49IDg6Ci0JCQlyYWlzZSBFcnJvciwgJ3R5cGUgb3V0IG9mIHJhbmdlJwotCQlzZWxmLmNhbGxiYWNrc1tjYl90eXBlXSA9IChmdW5jLCBhcmcpCi0JCWlmIHNlbGYucGxheWluZzoKLQkJCXN0YXJ0LCBlbmQgPSBzZWxmLmxpc3Rbc2VsZi5saXN0aW5kZXhdCi0JCQlpZiB0eXBlKGVuZCkgPT0gdHlwZSgwKToKLQkJCQlpZiBjYl90eXBlICE9IENELlBOVU06Ci0JCQkJCXNlbGYucGFyc2VyLnNldGNhbGxiYWNrKGNiX3R5cGUsIGZ1bmMsIGFyZykKLQkJCWVsc2U6Ci0JCQkJaWYgY2JfdHlwZSAhPSBDRC5BVElNRToKLQkJCQkJc2VsZi5wYXJzZXIuc2V0Y2FsbGJhY2soY2JfdHlwZSwgZnVuYywgYXJnKQorICAgIGRlZiBzZXR0cmFja3Moc2VsZiwgbGlzdCk6CisgICAgICAgIHNlbGYubGlzdCA9IFtdCisgICAgICAgIGZvciB0cmFjayBpbiBsaXN0OgorICAgICAgICAgICAgc2VsZi5hcHBlbmR0cmFjayh0cmFjaykKIAotCWRlZiByZW1vdmVjYWxsYmFjayhzZWxmLCBjYl90eXBlKToKLQkJaWYgY2JfdHlwZSA8IDAgb3IgY2JfdHlwZSA+PSA4OgotCQkJcmFpc2UgRXJyb3IsICd0eXBlIG91dCBvZiByYW5nZScKLQkJc2VsZi5jYWxsYmFja3NbY2JfdHlwZV0gPSAoTm9uZSwgTm9uZSkKLQkJaWYgc2VsZi5wbGF5aW5nOgotCQkJc3RhcnQsIGVuZCA9IHNlbGYubGlzdFtzZWxmLmxpc3RpbmRleF0KLQkJCWlmIHR5cGUoZW5kKSA9PSB0eXBlKDApOgotCQkJCWlmIGNiX3R5cGUgIT0gQ0QuUE5VTToKLQkJCQkJc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soY2JfdHlwZSkKLQkJCWVsc2U6Ci0JCQkJaWYgY2JfdHlwZSAhPSBDRC5BVElNRToKLQkJCQkJc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soY2JfdHlwZSkKKyAgICBkZWYgc2V0Y2FsbGJhY2soc2VsZiwgY2JfdHlwZSwgZnVuYywgYXJnKToKKyAgICAgICAgaWYgY2JfdHlwZSA8IDAgb3IgY2JfdHlwZSA+PSA4OgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICd0eXBlIG91dCBvZiByYW5nZScKKyAgICAgICAgc2VsZi5jYWxsYmFja3NbY2JfdHlwZV0gPSAoZnVuYywgYXJnKQorICAgICAgICBpZiBzZWxmLnBsYXlpbmc6CisgICAgICAgICAgICBzdGFydCwgZW5kID0gc2VsZi5saXN0W3NlbGYubGlzdGluZGV4XQorICAgICAgICAgICAgaWYgdHlwZShlbmQpID09IHR5cGUoMCk6CisgICAgICAgICAgICAgICAgaWYgY2JfdHlwZSAhPSBDRC5QTlVNOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5zZXRjYWxsYmFjayhjYl90eXBlLCBmdW5jLCBhcmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGNiX3R5cGUgIT0gQ0QuQVRJTUU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnNldGNhbGxiYWNrKGNiX3R5cGUsIGZ1bmMsIGFyZykKIAotCWRlZiBnZXR0cmFja2luZm8oc2VsZiwgKmFyZyk6Ci0JCWlmIG5vdCBzZWxmLnN0YXR1czoKLQkJCXNlbGYuY2FjaGVzdGF0dXMoKQotCQlpZiBub3Qgc2VsZi50cmFja2luZm86Ci0JCQlzZWxmLmNhY2hlaW5mbygpCi0JCWlmIGxlbihhcmcpID09IDA6Ci0JCQlyZXR1cm4gc2VsZi50cmFja2luZm9bc2VsZi5zdGF0dXNbNV06c2VsZi5zdGF0dXNbNl0rMV0KLQkJcmVzdWx0ID0gW10KLQkJZm9yIGkgaW4gYXJnOgotCQkJaWYgaSA8IHNlbGYuc3RhdHVzWzVdIG9yIGkgPiBzZWxmLnN0YXR1c1s2XToKLQkJCQlyYWlzZSBFcnJvciwgJ3JhbmdlIGVycm9yJwotCQkJcmVzdWx0LmFwcGVuZChzZWxmLnRyYWNraW5mb1tpXSkKLQkJcmV0dXJuIHJlc3VsdAorICAgIGRlZiByZW1vdmVjYWxsYmFjayhzZWxmLCBjYl90eXBlKToKKyAgICAgICAgaWYgY2JfdHlwZSA8IDAgb3IgY2JfdHlwZSA+PSA4OgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICd0eXBlIG91dCBvZiByYW5nZScKKyAgICAgICAgc2VsZi5jYWxsYmFja3NbY2JfdHlwZV0gPSAoTm9uZSwgTm9uZSkKKyAgICAgICAgaWYgc2VsZi5wbGF5aW5nOgorICAgICAgICAgICAgc3RhcnQsIGVuZCA9IHNlbGYubGlzdFtzZWxmLmxpc3RpbmRleF0KKyAgICAgICAgICAgIGlmIHR5cGUoZW5kKSA9PSB0eXBlKDApOgorICAgICAgICAgICAgICAgIGlmIGNiX3R5cGUgIT0gQ0QuUE5VTToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soY2JfdHlwZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgY2JfdHlwZSAhPSBDRC5BVElNRToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soY2JfdHlwZSkKIAotCWRlZiBjYWNoZWluZm8oc2VsZik6Ci0JCWlmIG5vdCBzZWxmLnN0YXR1czoKLQkJCXNlbGYuY2FjaGVzdGF0dXMoKQotCQlzZWxmLnRyYWNraW5mbyA9IFtdCi0JCWZvciBpIGluIHJhbmdlKHNlbGYuc3RhdHVzWzVdKToKLQkJCXNlbGYudHJhY2tpbmZvLmFwcGVuZChOb25lKQotCQlmb3IgaSBpbiByYW5nZShzZWxmLnN0YXR1c1s1XSwgc2VsZi5zdGF0dXNbNl0rMSk6Ci0JCQlzZWxmLnRyYWNraW5mby5hcHBlbmQoc2VsZi5wbGF5ZXIuZ2V0dHJhY2tpbmZvKGkpKQorICAgIGRlZiBnZXR0cmFja2luZm8oc2VsZiwgKmFyZyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnN0YXR1czoKKyAgICAgICAgICAgIHNlbGYuY2FjaGVzdGF0dXMoKQorICAgICAgICBpZiBub3Qgc2VsZi50cmFja2luZm86CisgICAgICAgICAgICBzZWxmLmNhY2hlaW5mbygpCisgICAgICAgIGlmIGxlbihhcmcpID09IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFja2luZm9bc2VsZi5zdGF0dXNbNV06c2VsZi5zdGF0dXNbNl0rMV0KKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGkgaW4gYXJnOgorICAgICAgICAgICAgaWYgaSA8IHNlbGYuc3RhdHVzWzVdIG9yIGkgPiBzZWxmLnN0YXR1c1s2XToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3JhbmdlIGVycm9yJworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWxmLnRyYWNraW5mb1tpXSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCi0JZGVmIGNhY2hlc3RhdHVzKHNlbGYpOgotCQlzZWxmLnN0YXR1cyA9IHNlbGYucGxheWVyLmdldHN0YXR1cygpCi0JCWlmIHNlbGYuc3RhdHVzWzBdID09IENELk5PRElTQzoKLQkJCXNlbGYuc3RhdHVzID0gTm9uZQotCQkJcmFpc2UgRXJyb3IsICdubyBkaXNjIGluIHBsYXllcicKKyAgICBkZWYgY2FjaGVpbmZvKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5zdGF0dXM6CisgICAgICAgICAgICBzZWxmLmNhY2hlc3RhdHVzKCkKKyAgICAgICAgc2VsZi50cmFja2luZm8gPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLnN0YXR1c1s1XSk6CisgICAgICAgICAgICBzZWxmLnRyYWNraW5mby5hcHBlbmQoTm9uZSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5zdGF0dXNbNV0sIHNlbGYuc3RhdHVzWzZdKzEpOgorICAgICAgICAgICAgc2VsZi50cmFja2luZm8uYXBwZW5kKHNlbGYucGxheWVyLmdldHRyYWNraW5mbyhpKSkKIAotCWRlZiBnZXRzdGF0dXMoc2VsZik6Ci0JCXJldHVybiBzZWxmLnBsYXllci5nZXRzdGF0dXMoKQorICAgIGRlZiBjYWNoZXN0YXR1cyhzZWxmKToKKyAgICAgICAgc2VsZi5zdGF0dXMgPSBzZWxmLnBsYXllci5nZXRzdGF0dXMoKQorICAgICAgICBpZiBzZWxmLnN0YXR1c1swXSA9PSBDRC5OT0RJU0M6CisgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IE5vbmUKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnbm8gZGlzYyBpbiBwbGF5ZXInCiAKLQlkZWYgcGxheShzZWxmKToKLQkJaWYgbm90IHNlbGYuc3RhdHVzOgotCQkJc2VsZi5jYWNoZXN0YXR1cygpCi0JCXNpemUgPSBzZWxmLnBsYXllci5iZXN0cmVhZHNpemUoKQotCQlzZWxmLmxpc3RpbmRleCA9IDAKLQkJc2VsZi5wbGF5aW5nID0gMAotCQlmb3IgaSBpbiByYW5nZSg4KToKLQkJCWZ1bmMsIGFyZyA9IHNlbGYuY2FsbGJhY2tzW2ldCi0JCQlpZiBmdW5jOgotCQkJCXNlbGYucGFyc2VyLnNldGNhbGxiYWNrKGksIGZ1bmMsIGFyZykKLQkJCWVsc2U6Ci0JCQkJc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soaSkKLQkJaWYgbGVuKHNlbGYubGlzdCkgPT0gMDoKLQkJCWZvciBpIGluIHJhbmdlKHNlbGYuc3RhdHVzWzVdLCBzZWxmLnN0YXR1c1s2XSsxKToKLQkJCQlzZWxmLmFwcGVuZHRyYWNrKGkpCi0JCXRyeToKLQkJCXdoaWxlIDE6Ci0JCQkJaWYgbm90IHNlbGYucGxheWluZzoKLQkJCQkJaWYgc2VsZi5saXN0aW5kZXggPj0gbGVuKHNlbGYubGlzdCk6Ci0JCQkJCQlyZXR1cm4KLQkJCQkJc3RhcnQsIGVuZCA9IHNlbGYubGlzdFtzZWxmLmxpc3RpbmRleF0KLQkJCQkJaWYgdHlwZShzdGFydCkgPT0gdHlwZSgwKToKLQkJCQkJCWR1bW15ID0gc2VsZi5wbGF5ZXIuc2Vla3RyYWNrKAotCQkJCQkJCXN0YXJ0KQotCQkJCQllbHNlOgotCQkJCQkJbWluLCBzZWMsIGZyYW1lID0gc3RhcnQKLQkJCQkJCWR1bW15ID0gc2VsZi5wbGF5ZXIuc2VlaygKLQkJCQkJCQltaW4sIHNlYywgZnJhbWUpCi0JCQkJCWlmIHR5cGUoZW5kKSA9PSB0eXBlKDApOgotCQkJCQkJc2VsZi5wYXJzZXIuc2V0Y2FsbGJhY2soCi0JCQkJCQkJQ0QuUE5VTSwgX2RvcG51bSwgc2VsZikKLQkJCQkJCXNlbGYuZW5kID0gZW5kCi0JCQkJCQlmdW5jLCBhcmcgPSBcCi0JCQkJCQkgICAgICBzZWxmLmNhbGxiYWNrc1tDRC5BVElNRV0KLQkJCQkJCWlmIGZ1bmM6Ci0JCQkJCQkJc2VsZi5wYXJzZXIuc2V0Y2FsbGJhY2soQ0QuQVRJTUUsIGZ1bmMsIGFyZykKLQkJCQkJCWVsc2U6Ci0JCQkJCQkJc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soQ0QuQVRJTUUpCi0JCQkJCWVsc2U6Ci0JCQkJCQltaW4sIHNlYywgZnJhbWUgPSBlbmQKLQkJCQkJCXNlbGYucGFyc2VyLnNldGNhbGxiYWNrKAotCQkJCQkJCUNELkFUSU1FLCBfZG9hdGltZSwKLQkJCQkJCQlzZWxmKQotCQkJCQkJc2VsZi5lbmQgPSAobWluICogNjAgKyBzZWMpICogXAotCQkJCQkJCSAgIDc1ICsgZnJhbWUKLQkJCQkJCWZ1bmMsIGFyZyA9IFwKLQkJCQkJCSAgICAgIHNlbGYuY2FsbGJhY2tzW0NELlBOVU1dCi0JCQkJCQlpZiBmdW5jOgotCQkJCQkJCXNlbGYucGFyc2VyLnNldGNhbGxiYWNrKENELlBOVU0sIGZ1bmMsIGFyZykKLQkJCQkJCWVsc2U6Ci0JCQkJCQkJc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soQ0QuUE5VTSkKLQkJCQkJc2VsZi5wbGF5aW5nID0gMQotCQkJCWRhdGEgPSBzZWxmLnBsYXllci5yZWFkZGEoc2l6ZSkKLQkJCQlpZiBkYXRhID09ICcnOgotCQkJCQlzZWxmLnBsYXlpbmcgPSAwCi0JCQkJCXNlbGYubGlzdGluZGV4ID0gc2VsZi5saXN0aW5kZXggKyAxCi0JCQkJCWNvbnRpbnVlCi0JCQkJdHJ5OgotCQkJCQlzZWxmLnBhcnNlci5wYXJzZWZyYW1lKGRhdGEpCi0JCQkJZXhjZXB0IF9TdG9wOgotCQkJCQlzZWxmLnBsYXlpbmcgPSAwCi0JCQkJCXNlbGYubGlzdGluZGV4ID0gc2VsZi5saXN0aW5kZXggKyAxCi0JCWZpbmFsbHk6Ci0JCQlzZWxmLnBsYXlpbmcgPSAwCisgICAgZGVmIGdldHN0YXR1cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucGxheWVyLmdldHN0YXR1cygpCisKKyAgICBkZWYgcGxheShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuc3RhdHVzOgorICAgICAgICAgICAgc2VsZi5jYWNoZXN0YXR1cygpCisgICAgICAgIHNpemUgPSBzZWxmLnBsYXllci5iZXN0cmVhZHNpemUoKQorICAgICAgICBzZWxmLmxpc3RpbmRleCA9IDAKKyAgICAgICAgc2VsZi5wbGF5aW5nID0gMAorICAgICAgICBmb3IgaSBpbiByYW5nZSg4KToKKyAgICAgICAgICAgIGZ1bmMsIGFyZyA9IHNlbGYuY2FsbGJhY2tzW2ldCisgICAgICAgICAgICBpZiBmdW5jOgorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnNldGNhbGxiYWNrKGksIGZ1bmMsIGFyZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soaSkKKyAgICAgICAgaWYgbGVuKHNlbGYubGlzdCkgPT0gMDoKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuc3RhdHVzWzVdLCBzZWxmLnN0YXR1c1s2XSsxKToKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZHRyYWNrKGkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucGxheWluZzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5saXN0aW5kZXggPj0gbGVuKHNlbGYubGlzdCk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCA9IHNlbGYubGlzdFtzZWxmLmxpc3RpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShzdGFydCkgPT0gdHlwZSgwKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bW15ID0gc2VsZi5wbGF5ZXIuc2Vla3RyYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbiwgc2VjLCBmcmFtZSA9IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1teSA9IHNlbGYucGxheWVyLnNlZWsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiwgc2VjLCBmcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShlbmQpID09IHR5cGUoMCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5zZXRjYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0QuUE5VTSwgX2RvcG51bSwgc2VsZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kID0gZW5kCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLCBhcmcgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbGxiYWNrc1tDRC5BVElNRV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZ1bmM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuc2V0Y2FsbGJhY2soQ0QuQVRJTUUsIGZ1bmMsIGFyZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soQ0QuQVRJTUUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBtaW4sIHNlYywgZnJhbWUgPSBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnNldGNhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRC5BVElNRSwgX2RvYXRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZCA9IChtaW4gKiA2MCArIHNlYykgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1ICsgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsIGFyZyA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzW0NELlBOVU1dCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBmdW5jOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnNldGNhbGxiYWNrKENELlBOVU0sIGZ1bmMsIGFyZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlY2FsbGJhY2soQ0QuUE5VTSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wbGF5aW5nID0gMQorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnBsYXllci5yZWFkZGEoc2l6ZSkKKyAgICAgICAgICAgICAgICBpZiBkYXRhID09ICcnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBsYXlpbmcgPSAwCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGlzdGluZGV4ID0gc2VsZi5saXN0aW5kZXggKyAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZWZyYW1lKGRhdGEpCisgICAgICAgICAgICAgICAgZXhjZXB0IF9TdG9wOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBsYXlpbmcgPSAwCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGlzdGluZGV4ID0gc2VsZi5saXN0aW5kZXggKyAxCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnBsYXlpbmcgPSAwCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1pcml4Ni90b3JnYi5weSBiL0xpYi9wbGF0LWlyaXg2L3RvcmdiLnB5CmluZGV4IGMyYjE3NDAuLjU0Yzg2YzQgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LWlyaXg2L3RvcmdiLnB5CisrKyBiL0xpYi9wbGF0LWlyaXg2L3RvcmdiLnB5CkBAIC01MSw0OSArNTEsNDkgQEAKIAogCiBjbGFzcyBlcnJvcihFeGNlcHRpb24pOgotCXBhc3MKKyAgICBwYXNzCiAKIGRlZiB0b3JnYihmaWxlbmFtZSk6Ci0JdGVtcHMgPSBbXQotCXJldCA9IE5vbmUKLQl0cnk6Ci0JCXJldCA9IF90b3JnYihmaWxlbmFtZSwgdGVtcHMpCi0JZmluYWxseToKLQkJZm9yIHRlbXAgaW4gdGVtcHNbOl06Ci0JCQlpZiB0ZW1wICE9IHJldDoKLQkJCQl0cnk6Ci0JCQkJCW9zLnVubGluayh0ZW1wKQotCQkJCWV4Y2VwdCBvcy5lcnJvcjoKLQkJCQkJcGFzcwotCQkJCXRlbXBzLnJlbW92ZSh0ZW1wKQotCXJldHVybiByZXQKKyAgICB0ZW1wcyA9IFtdCisgICAgcmV0ID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgcmV0ID0gX3RvcmdiKGZpbGVuYW1lLCB0ZW1wcykKKyAgICBmaW5hbGx5OgorICAgICAgICBmb3IgdGVtcCBpbiB0ZW1wc1s6XToKKyAgICAgICAgICAgIGlmIHRlbXAgIT0gcmV0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHRlbXApCisgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdGVtcHMucmVtb3ZlKHRlbXApCisgICAgcmV0dXJuIHJldAogCiBkZWYgX3RvcmdiKGZpbGVuYW1lLCB0ZW1wcyk6Ci0JaWYgZmlsZW5hbWVbLTI6XSA9PSAnLlonOgotCQkoZmQsIGZuYW1lKSA9IHRlbXBmaWxlLm1rc3RlbXAoKQotCQlvcy5jbG9zZShmZCkKLQkJdGVtcHMuYXBwZW5kKGZuYW1lKQotCQlzdHMgPSB1bmNvbXByZXNzLmNvcHkoZmlsZW5hbWUsIGZuYW1lKQotCQlpZiBzdHM6Ci0JCQlyYWlzZSBlcnJvciwgZmlsZW5hbWUgKyAnOiB1bmNvbXByZXNzIGZhaWxlZCcKLQllbHNlOgotCQlmbmFtZSA9IGZpbGVuYW1lCi0JdHJ5OgotCQlmdHlwZSA9IGltZ2hkci53aGF0KGZuYW1lKQotCWV4Y2VwdCBJT0Vycm9yLCBtc2c6Ci0JCWlmIHR5cGUobXNnKSA9PSB0eXBlKCgpKSBhbmQgbGVuKG1zZykgPT0gMiBhbmQgXAotCQkJdHlwZShtc2dbMF0pID09IHR5cGUoMCkgYW5kIHR5cGUobXNnWzFdKSA9PSB0eXBlKCcnKToKLQkJCW1zZyA9IG1zZ1sxXQotCQlpZiB0eXBlKG1zZykgaXMgbm90IHR5cGUoJycpOgotCQkJbXNnID0gcmVwcihtc2cpCi0JCXJhaXNlIGVycm9yLCBmaWxlbmFtZSArICc6ICcgKyBtc2cKLQlpZiBmdHlwZSA9PSAncmdiJzoKLQkJcmV0dXJuIGZuYW1lCi0JaWYgZnR5cGUgaXMgTm9uZSBvciBub3QgdGFibGUuaGFzX2tleShmdHlwZSk6Ci0JCXJhaXNlIGVycm9yLCAnJXM6IHVuc3VwcG9ydGVkIGltYWdlIGZpbGUgdHlwZSAlcicgJSAoZmlsZW5hbWUsIGZ0eXBlKQotCShmZCwgdGVtcCkgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKLQlvcy5jbG9zZShmZCkKLQlzdHMgPSB0YWJsZVtmdHlwZV0uY29weShmbmFtZSwgdGVtcCkKLQlpZiBzdHM6Ci0JCXJhaXNlIGVycm9yLCBmaWxlbmFtZSArICc6IGNvbnZlcnNpb24gdG8gcmdiIGZhaWxlZCcKLQlyZXR1cm4gdGVtcAorICAgIGlmIGZpbGVuYW1lWy0yOl0gPT0gJy5aJzoKKyAgICAgICAgKGZkLCBmbmFtZSkgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIHRlbXBzLmFwcGVuZChmbmFtZSkKKyAgICAgICAgc3RzID0gdW5jb21wcmVzcy5jb3B5KGZpbGVuYW1lLCBmbmFtZSkKKyAgICAgICAgaWYgc3RzOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsIGZpbGVuYW1lICsgJzogdW5jb21wcmVzcyBmYWlsZWQnCisgICAgZWxzZToKKyAgICAgICAgZm5hbWUgPSBmaWxlbmFtZQorICAgIHRyeToKKyAgICAgICAgZnR5cGUgPSBpbWdoZHIud2hhdChmbmFtZSkKKyAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICBpZiB0eXBlKG1zZykgPT0gdHlwZSgoKSkgYW5kIGxlbihtc2cpID09IDIgYW5kIFwKKyAgICAgICAgICAgICAgICB0eXBlKG1zZ1swXSkgPT0gdHlwZSgwKSBhbmQgdHlwZShtc2dbMV0pID09IHR5cGUoJycpOgorICAgICAgICAgICAgbXNnID0gbXNnWzFdCisgICAgICAgIGlmIHR5cGUobXNnKSBpcyBub3QgdHlwZSgnJyk6CisgICAgICAgICAgICBtc2cgPSByZXByKG1zZykKKyAgICAgICAgcmFpc2UgZXJyb3IsIGZpbGVuYW1lICsgJzogJyArIG1zZworICAgIGlmIGZ0eXBlID09ICdyZ2InOgorICAgICAgICByZXR1cm4gZm5hbWUKKyAgICBpZiBmdHlwZSBpcyBOb25lIG9yIG5vdCB0YWJsZS5oYXNfa2V5KGZ0eXBlKToKKyAgICAgICAgcmFpc2UgZXJyb3IsICclczogdW5zdXBwb3J0ZWQgaW1hZ2UgZmlsZSB0eXBlICVyJyAlIChmaWxlbmFtZSwgZnR5cGUpCisgICAgKGZkLCB0ZW1wKSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgIG9zLmNsb3NlKGZkKQorICAgIHN0cyA9IHRhYmxlW2Z0eXBlXS5jb3B5KGZuYW1lLCB0ZW1wKQorICAgIGlmIHN0czoKKyAgICAgICAgcmFpc2UgZXJyb3IsIGZpbGVuYW1lICsgJzogY29udmVyc2lvbiB0byByZ2IgZmFpbGVkJworICAgIHJldHVybiB0ZW1wCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1saW51eDIvRExGQ04ucHkgYi9MaWIvcGxhdC1saW51eDIvRExGQ04ucHkKaW5kZXggMTZlYzUzOC4uZTIzMzQwYSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbGludXgyL0RMRkNOLnB5CisrKyBiL0xpYi9wbGF0LWxpbnV4Mi9ETEZDTi5weQpAQCAtNjEsMTEgKzYxLDExIEBACiBfX2ZsZXhhcnIgPSBbMV0KIGRlZiBfX0FTTU5BTUUoY25hbWUpOiByZXR1cm4gX19BU01OQU1FMiAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCBjbmFtZSkKIAotZGVmIF9fYXR0cmlidXRlX18oeHl6KTogcmV0dXJuICAKK2RlZiBfX2F0dHJpYnV0ZV9fKHh5eik6IHJldHVybgogCiBkZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X2FyZ19fICh4KSkpCiAKLWRlZiBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18oeCk6IHJldHVybiAgCitkZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4KIAogX19VU0VfTEFSR0VGSUxFID0gMQogX19VU0VfTEFSR0VGSUxFNjQgPSAxCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1saW51eDIvSU4ucHkgYi9MaWIvcGxhdC1saW51eDIvSU4ucHkKaW5kZXggYzYzYzE1ZS4uMjAyMGIwMyAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbGludXgyL0lOLnB5CisrKyBiL0xpYi9wbGF0LWxpbnV4Mi9JTi5weQpAQCAtNjEsMTEgKzYxLDExIEBACiBfX2ZsZXhhcnIgPSBbMV0KIGRlZiBfX0FTTU5BTUUoY25hbWUpOiByZXR1cm4gX19BU01OQU1FMiAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCBjbmFtZSkKIAotZGVmIF9fYXR0cmlidXRlX18oeHl6KTogcmV0dXJuICAKK2RlZiBfX2F0dHJpYnV0ZV9fKHh5eik6IHJldHVybgogCiBkZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X2FyZ19fICh4KSkpCiAKLWRlZiBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18oeCk6IHJldHVybiAgCitkZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4KIAogX19VU0VfTEFSR0VGSUxFID0gMQogX19VU0VfTEFSR0VGSUxFNjQgPSAxCkBAIC02MTMsNCArNjEzLDMgQEAKIGRlZiBJTjZfSVNfQUREUl9NQ19PUkdMT0NBTChhKTogcmV0dXJuIFwKIAogZGVmIElONl9JU19BRERSX01DX0dMT0JBTChhKTogcmV0dXJuIFwKLQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbGludXgyL1RZUEVTLnB5IGIvTGliL3BsYXQtbGludXgyL1RZUEVTLnB5CmluZGV4IDIwMDZiZmMuLjBjZGQ1OTkgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LWxpbnV4Mi9UWVBFUy5weQorKysgYi9MaWIvcGxhdC1saW51eDIvVFlQRVMucHkKQEAgLTYxLDExICs2MSwxMSBAQAogX19mbGV4YXJyID0gWzFdCiBkZWYgX19BU01OQU1FKGNuYW1lKTogcmV0dXJuIF9fQVNNTkFNRTIgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgY25hbWUpCiAKLWRlZiBfX2F0dHJpYnV0ZV9fKHh5eik6IHJldHVybiAgCitkZWYgX19hdHRyaWJ1dGVfXyh4eXopOiByZXR1cm4KIAogZGVmIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyh4KTogcmV0dXJuIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9hcmdfXyAoeCkpKQogCi1kZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4gIAorZGVmIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyh4KTogcmV0dXJuCiAKIF9fVVNFX0xBUkdFRklMRSA9IDEKIF9fVVNFX0xBUkdFRklMRTY0ID0gMQpAQCAtMTY4LDQgKzE2OCwzIEBACiBkZWYgbWFqb3IoZGV2KTogcmV0dXJuICgoKGRldikuX192YWxbMF0gPj4gOCkgJiAweGZmKQogCiBkZWYgbWlub3IoZGV2KTogcmV0dXJuICgoZGV2KS5fX3ZhbFswXSAmIDB4ZmYpCi0KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9BdWRpb19tYWMucHkgYi9MaWIvcGxhdC1tYWMvQXVkaW9fbWFjLnB5CmluZGV4IDUzNTBlNTUuLmZkOTYwOTUgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9BdWRpb19tYWMucHkKKysrIGIvTGliL3BsYXQtbWFjL0F1ZGlvX21hYy5weQpAQCAtODEsNyArODEsNyBAQAogICAgICAgICBkZWwgc2VsZi5fZ2NbMF0KICAgICAgICAgaWYgc2VsZi5fdXNlcmNhbGxiYWNrOgogICAgICAgICAgICAgc2VsZi5fdXNlcmNhbGxiYWNrKCkKLSAgICAgICAgICAgIAorCiAgICAgZGVmIHNldGNhbGxiYWNrKHNlbGYsIGNhbGxiYWNrKToKICAgICAgICAgc2VsZi5fdXNlcmNhbGxiYWNrID0gY2FsbGJhY2sKIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9BbGlhc2VzLnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9BbGlhc2VzLnB5CmluZGV4IDEyMTFlM2QuLjU1ZTFhMWYgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9DYXJib24vQWxpYXNlcy5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0FsaWFzZXMucHkKQEAgLTMsMTYgKzMsMTYgQEAKIGRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKIHRydWUgPSBUcnVlCiBmYWxzZSA9IEZhbHNlCi1yQWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2FsaXMnKSAKK3JBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYWxpcycpCiBrQVJNTW91bnRWb2wgPSAweDAwMDAwMDAxCiBrQVJNTm9VSSA9IDB4MDAwMDAwMDIKIGtBUk1NdWx0Vm9scyA9IDB4MDAwMDAwMDgKIGtBUk1TZWFyY2ggPSAweDAwMDAwMTAwCiBrQVJNU2VhcmNoTW9yZSA9IDB4MDAwMDAyMDAKLWtBUk1TZWFyY2hSZWxGaXJzdCA9IDB4MDAwMDA0MDAgCitrQVJNU2VhcmNoUmVsRmlyc3QgPSAweDAwMDAwNDAwCiBhc2lab25lTmFtZSA9IC0zCiBhc2lTZXJ2ZXJOYW1lID0gLTIKIGFzaVZvbHVtZU5hbWUgPSAtMQogYXNpQWxpYXNOYW1lID0gMAotYXNpUGFyZW50TmFtZSA9IDEgICAgIAota1Jlc29sdmVBbGlhc0ZpbGVOb1VJID0gMHgwMDAwMDAwMSAKK2FzaVBhcmVudE5hbWUgPSAxCitrUmVzb2x2ZUFsaWFzRmlsZU5vVUkgPSAweDAwMDAwMDAxCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0FwcGVhcmFuY2UucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0FwcGVhcmFuY2UucHkKaW5kZXggZTQyZTUzMS4uZDk5YzZkYyAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9BcHBlYXJhbmNlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vQXBwZWFyYW5jZS5weQpAQCAtNSw3ICs1LDcgQEAKIGtBRUFwcGVhcmFuY2VDaGFuZ2VkID0gRk9VUl9DSEFSX0NPREUoJ3RobWUnKQoga0FFU3lzdGVtRm9udENoYW5nZWQgPSBGT1VSX0NIQVJfQ09ERSgnc3lzZicpCiBrQUVTbWFsbFN5c3RlbUZvbnRDaGFuZ2VkID0gRk9VUl9DSEFSX0NPREUoJ3NzZm4nKQota0FFVmlld3NGb250Q2hhbmdlZCA9IEZPVVJfQ0hBUl9DT0RFKCd2Zm50JykgCitrQUVWaWV3c0ZvbnRDaGFuZ2VkID0gRk9VUl9DSEFSX0NPREUoJ3ZmbnQnKQoga1RoZW1lRGF0YUZpbGVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RobWUnKQoga1RoZW1lUGxhdGludW1GaWxlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdwbHRuJykKIGtUaGVtZUN1c3RvbVRoZW1lc0ZpbGVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NjZW4nKQpAQCAtNjQsMTIgKzY0LDEyIEBACiBrVGhlbWVCcnVzaFRvb2xiYXJCYWNrZ3JvdW5kID0gNTIKIGtUaGVtZUJydXNoU2hlZXRCYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSA1Mwoga1RoZW1lQnJ1c2hNZW51QmFja2dyb3VuZCA9IDU0Ci1rVGhlbWVCcnVzaE1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQgPSA1NSAKK2tUaGVtZUJydXNoTWVudUJhY2tncm91bmRTZWxlY3RlZCA9IDU1CiBrVGhlbWVCcnVzaFNoZWV0QmFja2dyb3VuZCA9IGtUaGVtZUJydXNoU2hlZXRCYWNrZ3JvdW5kT3BhcXVlCiBrVGhlbWVCcnVzaEJsYWNrID0gLTEKIGtUaGVtZUJydXNoV2hpdGUgPSAtMgoga1RoZW1lQnJ1c2hQcmltYXJ5SGlnaGxpZ2h0Q29sb3IgPSAtMwota1RoZW1lQnJ1c2hTZWNvbmRhcnlIaWdobGlnaHRDb2xvciA9IC00IAora1RoZW1lQnJ1c2hTZWNvbmRhcnlIaWdobGlnaHRDb2xvciA9IC00CiBrVGhlbWVUZXh0Q29sb3JEaWFsb2dBY3RpdmUgPSAxCiBrVGhlbWVUZXh0Q29sb3JEaWFsb2dJbmFjdGl2ZSA9IDIKIGtUaGVtZVRleHRDb2xvckFsZXJ0QWN0aXZlID0gMwpAQCAtMTI3LDcgKzEyNyw3IEBACiBrVGhlbWVTdGF0ZVVuYXZhaWxhYmxlSW5hY3RpdmUgPSA4CiBrVGhlbWVTdGF0ZURpc2FibGVkID0gMAoga1RoZW1lU3RhdGVQcmVzc2VkVXAgPSAyCi1rVGhlbWVTdGF0ZVByZXNzZWREb3duID0gMyAgICAgCitrVGhlbWVTdGF0ZVByZXNzZWREb3duID0gMwoga1RoZW1lQXJyb3dDdXJzb3IgPSAwCiBrVGhlbWVDb3B5QXJyb3dDdXJzb3IgPSAxCiBrVGhlbWVBbGlhc0Fycm93Q3Vyc29yID0gMgpAQCAtMTY1LDcgKzE2NSw3IEBACiBrVGhlbWVNZW51SXRlbUhpZXJCYWNrZ3JvdW5kID0gMHgwNDAwCiBrVGhlbWVNZW51SXRlbVBvcFVwQmFja2dyb3VuZCA9IDB4MDgwMAoga1RoZW1lTWVudUl0ZW1IYXNJY29uID0gMHg4MDAwCi1rVGhlbWVNZW51SXRlbU5vQmFja2dyb3VuZCA9IDB4NDAwMCAKK2tUaGVtZU1lbnVJdGVtTm9CYWNrZ3JvdW5kID0gMHg0MDAwCiBrVGhlbWVCYWNrZ3JvdW5kVGFiUGFuZSA9IDEKIGtUaGVtZUJhY2tncm91bmRQbGFjYXJkID0gMgoga1RoZW1lQmFja2dyb3VuZFdpbmRvd0hlYWRlciA9IDMKQEAgLTE3OCw3ICsxNzgsNyBAQAoga1RoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzYmFyJykKIGtUaGVtZVNjcm9sbEJhclRodW1iU3R5bGVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnc2J0aCcpCiBrVGhlbWVTb3VuZHNFbmFibGVkVGFnID0gRk9VUl9DSEFSX0NPREUoJ3NuZHMnKQota1RoZW1lRGJsQ2xpY2tDb2xsYXBzZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdjb2xsJykgCitrVGhlbWVEYmxDbGlja0NvbGxhcHNlVGFnID0gRk9VUl9DSEFSX0NPREUoJ2NvbGwnKQoga1RoZW1lQXBwZWFyYW5jZUZpbGVOYW1lVGFnID0gRk9VUl9DSEFSX0NPREUoJ3RobWUnKQoga1RoZW1lU3lzdGVtRm9udFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdsZ3NmJykKIGtUaGVtZVNtYWxsU3lzdGVtRm9udFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzbXNmJykKQEAgLTE5NSwxOCArMTk1LDE4IEBACiBrVGhlbWVTb3VuZE1hc2tUYWcgPSBGT1VSX0NIQVJfQ09ERSgnc21zaycpCiBrVGhlbWVVc2VyRGVmaW5lZFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCd1c2VyJykKIGtUaGVtZVNtb290aEZvbnRFbmFibGVkVGFnID0gRk9VUl9DSEFSX0NPREUoJ3Ntb28nKQota1RoZW1lU21vb3RoRm9udE1pblNpemVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnc21vcycpIAora1RoZW1lU21vb3RoRm9udE1pblNpemVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnc21vcycpCiBrVGlsZWRPblNjcmVlbiA9IDEKIGtDZW50ZXJPblNjcmVlbiA9IDIKIGtGaXRUb1NjcmVlbiA9IDMKIGtGaWxsU2NyZWVuID0gNAota1VzZUJlc3RHdWVzcyA9IDUgICAgIAora1VzZUJlc3RHdWVzcyA9IDUKIGtUaGVtZUNoZWNrQm94Q2xhc3NpY1ggPSAwCi1rVGhlbWVDaGVja0JveENoZWNrTWFyayA9IDEgICAgIAora1RoZW1lQ2hlY2tCb3hDaGVja01hcmsgPSAxCiBrVGhlbWVTY3JvbGxCYXJBcnJvd3NTaW5nbGUgPSAwCi1rVGhlbWVTY3JvbGxCYXJBcnJvd3NMb3dlclJpZ2h0ID0gMSAgIAora1RoZW1lU2Nyb2xsQmFyQXJyb3dzTG93ZXJSaWdodCA9IDEKIGtUaGVtZVNjcm9sbEJhclRodW1iTm9ybWFsID0gMAota1RoZW1lU2Nyb2xsQmFyVGh1bWJQcm9wb3J0aW9uYWwgPSAxICAKK2tUaGVtZVNjcm9sbEJhclRodW1iUHJvcG9ydGlvbmFsID0gMQoga1RoZW1lU3lzdGVtRm9udCA9IDAKIGtUaGVtZVNtYWxsU3lzdGVtRm9udCA9IDEKIGtUaGVtZVNtYWxsRW1waGFzaXplZFN5c3RlbUZvbnQgPSAyCkBAIC0yMzgsNyArMjM4LDcgQEAKIGtUaGVtZUxhcmdlVGFiSGVpZ2h0ID0gMjEKIGtUaGVtZVRhYlBhbmVPdmVybGFwID0gMwoga1RoZW1lU21hbGxUYWJIZWlnaHRNYXggPSAxOQota1RoZW1lTGFyZ2VUYWJIZWlnaHRNYXggPSAyNCAgICAKK2tUaGVtZUxhcmdlVGFiSGVpZ2h0TWF4ID0gMjQKIGtUaGVtZU1lZGl1bVNjcm9sbEJhciA9IDAKIGtUaGVtZVNtYWxsU2Nyb2xsQmFyID0gMQoga1RoZW1lTWVkaXVtU2xpZGVyID0gMgpAQCAtMzA5LDcgKzMwOSw3IEBACiBrVGhlbWVHcm93TGVmdCA9ICgxIDw8IDApCiBrVGhlbWVHcm93UmlnaHQgPSAoMSA8PCAxKQoga1RoZW1lR3Jvd1VwID0gKDEgPDwgMikKLWtUaGVtZUdyb3dEb3duID0gKDEgPDwgMykgCitrVGhlbWVHcm93RG93biA9ICgxIDw8IDMpCiBrVGhlbWVQdXNoQnV0dG9uID0gMAoga1RoZW1lQ2hlY2tCb3ggPSAxCiBrVGhlbWVSYWRpb0J1dHRvbiA9IDIKQEAgLTM1MSw3ICszNTEsNyBAQAoga1RoZW1lQWRvcm5tZW50QXJyb3dMZWZ0QXJyb3cgPSAoMSA8PCA2KQoga1RoZW1lQWRvcm5tZW50QXJyb3dEb3duQXJyb3cgPSAoMSA8PCA3KQoga1RoZW1lQWRvcm5tZW50QXJyb3dEb3VibGVBcnJvdyA9ICgxIDw8IDgpCi1rVGhlbWVBZG9ybm1lbnRBcnJvd1VwQXJyb3cgPSAoMSA8PCA5KSAKK2tUaGVtZUFkb3JubWVudEFycm93VXBBcnJvdyA9ICgxIDw8IDkpCiBrVGhlbWVOb1NvdW5kcyA9IDAKIGtUaGVtZVdpbmRvd1NvdW5kc01hc2sgPSAoMSA8PCAwKQoga1RoZW1lTWVudVNvdW5kc01hc2sgPSAoMSA8PCAxKQpAQCAtNjI5LDcgKzYyOSw3IEBACiBrVGhlbWVEaXNhYmxlZE1lbnVJdGVtVGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yTWVudUl0ZW1EaXNhYmxlZAoga1RoZW1lQWN0aXZlUG9wdXBMYWJlbFRleHRDb2xvciA9IGtUaGVtZVRleHRDb2xvclBvcHVwTGFiZWxBY3RpdmUKIGtUaGVtZUluYWN0aXZlUG9wdXBMYWJlbFRleHRDb2xvciA9IGtUaGVtZVRleHRDb2xvclBvcHVwTGFiZWxJbmFjdGl2ZQota0FFVGhlbWVTd2l0Y2ggPSBrQUVBcHBlYXJhbmNlQ2hhbmdlZCAKK2tBRVRoZW1lU3dpdGNoID0ga0FFQXBwZWFyYW5jZUNoYW5nZWQKIGtUaGVtZU5vQWRvcm5tZW50ID0ga1RoZW1lQWRvcm5tZW50Tm9uZQoga1RoZW1lRGVmYXVsdEFkb3JubWVudCA9IGtUaGVtZUFkb3JubWVudERlZmF1bHQKIGtUaGVtZUZvY3VzQWRvcm5tZW50ID0ga1RoZW1lQWRvcm5tZW50Rm9jdXMKQEAgLTY0MSw3ICs2NDEsNyBAQAoga1RoZW1lTWV0cmljRGlzY2xvc3VyZUJ1dHRvblNpemUgPSBrVGhlbWVNZXRyaWNEaXNjbG9zdXJlQnV0dG9uSGVpZ2h0CiBrVGhlbWVNZXRyaWNCZXN0TGlzdEhlYWRlckhlaWdodCA9IGtUaGVtZU1ldHJpY0xpc3RIZWFkZXJIZWlnaHQKIGtUaGVtZU1ldHJpY1NtYWxsUHJvZ3Jlc3NCYXJUaGlja25lc3MgPSBrVGhlbWVNZXRyaWNOb3JtYWxQcm9ncmVzc0JhclRoaWNrbmVzcwota1RoZW1lTWV0cmljUHJvZ3Jlc3NCYXJUaGlja25lc3MgPSBrVGhlbWVNZXRyaWNMYXJnZVByb2dyZXNzQmFyVGhpY2tuZXNzIAora1RoZW1lTWV0cmljUHJvZ3Jlc3NCYXJUaGlja25lc3MgPSBrVGhlbWVNZXRyaWNMYXJnZVByb2dyZXNzQmFyVGhpY2tuZXNzCiBrVGhlbWVTY3JvbGxCYXIgPSBrVGhlbWVNZWRpdW1TY3JvbGxCYXIKIGtUaGVtZVNsaWRlciA9IGtUaGVtZU1lZGl1bVNsaWRlcgoga1RoZW1lUHJvZ3Jlc3NCYXIgPSBrVGhlbWVNZWRpdW1Qcm9ncmVzc0JhcgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9BcHBsZUV2ZW50cy5weSBiL0xpYi9wbGF0LW1hYy9DYXJib24vQXBwbGVFdmVudHMucHkKaW5kZXggNzI1M2EzZS4uZTIzYzA3OSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9BcHBsZUV2ZW50cy5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0FwcGxlRXZlbnRzLnB5CkBAIC00NCw3ICs0NCw3IEBACiB0eXBlRml4ZWQgPSBGT1VSX0NIQVJfQ09ERSgnZml4ZCcpCiB0eXBlUHJvY2Vzc1NlcmlhbE51bWJlciA9IEZPVVJfQ0hBUl9DT0RFKCdwc24gJykKIHR5cGVBcHBsaWNhdGlvblVSTCA9IEZPVVJfQ0hBUl9DT0RFKCdhcHJsJykKLXR5cGVOdWxsID0gRk9VUl9DSEFSX0NPREUoJ251bGwnKSAKK3R5cGVOdWxsID0gRk9VUl9DSEFSX0NPREUoJ251bGwnKQogdHlwZVNlc3Npb25JRCA9IEZPVVJfQ0hBUl9DT0RFKCdzc2lkJykKIHR5cGVUYXJnZXRJRCA9IEZPVVJfQ0hBUl9DT0RFKCd0YXJnJykKIHR5cGVEaXNwYXRjaGVySUQgPSBGT1VSX0NIQVJfQ09ERSgnZHNwdCcpCkBAIC01OSwxOSArNTksMTkgQEAKIGtleUV2ZW50U291cmNlQXR0ciA9IEZPVVJfQ0hBUl9DT0RFKCdlc3JjJykKIGtleU1pc3NlZEtleXdvcmRBdHRyID0gRk9VUl9DSEFSX0NPREUoJ21pc3MnKQoga2V5T3JpZ2luYWxBZGRyZXNzQXR0ciA9IEZPVVJfQ0hBUl9DT0RFKCdmcm9tJykKLWtleUFjY2VwdFRpbWVvdXRBdHRyID0gRk9VUl9DSEFSX0NPREUoJ2FjdG0nKSAKK2tleUFjY2VwdFRpbWVvdXRBdHRyID0gRk9VUl9DSEFSX0NPREUoJ2FjdG0nKQoga0FFRGVzY0xpc3RGYWN0b3JOb25lID0gMAoga0FFRGVzY0xpc3RGYWN0b3JUeXBlID0gNAoga0FFRGVzY0xpc3RGYWN0b3JUeXBlQW5kU2l6ZSA9IDgKIGtBdXRvR2VuZXJhdGVSZXR1cm5JRCA9IC0xCi1rQW55VHJhbnNhY3Rpb25JRCA9IDAgICAgIAora0FueVRyYW5zYWN0aW9uSUQgPSAwCiBrQUVEYXRhQXJyYXkgPSAwCiBrQUVQYWNrZWRBcnJheSA9IDEKIGtBRURlc2NBcnJheSA9IDMKIGtBRUtleURlc2NBcnJheSA9IDQKIGtBRUhhbmRsZUFycmF5ID0gMgoga0FFTm9ybWFsUHJpb3JpdHkgPSAweDAwMDAwMDAwCi1rQUVIaWdoUHJpb3JpdHkgPSAweDAwMDAwMDAxIAora0FFSGlnaFByaW9yaXR5ID0gMHgwMDAwMDAwMQoga0FFTm9SZXBseSA9IDB4MDAwMDAwMDEKIGtBRVF1ZXVlUmVwbHkgPSAweDAwMDAwMDAyCiBrQUVXYWl0UmVwbHkgPSAweDAwMDAwMDAzCkBAIC04Myw5ICs4Myw5IEBACiBrQUVDYW5Td2l0Y2hMYXllciA9IDB4MDAwMDAwNDAKIGtBRURvbnRSZWNvcmQgPSAweDAwMDAxMDAwCiBrQUVEb250RXhlY3V0ZSA9IDB4MDAwMDIwMDAKLWtBRVByb2Nlc3NOb25SZXBseUV2ZW50cyA9IDB4MDAwMDgwMDAgCitrQUVQcm9jZXNzTm9uUmVwbHlFdmVudHMgPSAweDAwMDA4MDAwCiBrQUVEZWZhdWx0VGltZW91dCA9IC0xCi1rTm9UaW1lT3V0ID0gLTIgICAgCitrTm9UaW1lT3V0ID0gLTIKIGtBRUludGVyYWN0V2l0aFNlbGYgPSAwCiBrQUVJbnRlcmFjdFdpdGhMb2NhbCA9IDEKIGtBRUludGVyYWN0V2l0aEFsbCA9IDIKQEAgLTk1LDkgKzk1LDkgQEAKIGtBRUlnbm9yZVN5c1BoYWNIYW5kbGVyID0gMHgwMDAwMDAwNAoga0FFSWdub3JlU3lzRXZlbnRIYW5kbGVyID0gMHgwMDAwMDAwOAoga0FFSW5nb3JlQnVpbHRJbkV2ZW50SGFuZGxlciA9IDB4MDAwMDAwMTAKLSMga0FFRG9udERpc3Bvc2VPblJlc3VtZSA9IChsb25nKTB4ODAwMDAwMDAgCisjIGtBRURvbnREaXNwb3NlT25SZXN1bWUgPSAobG9uZykweDgwMDAwMDAwCiBrQUVOb0Rpc3BhdGNoID0gMAotIyBrQUVVc2VTdGFuZGFyZERpc3BhdGNoID0gKGxvbmcpMHhGRkZGRkZGRiAKKyMga0FFVXNlU3RhbmRhcmREaXNwYXRjaCA9IChsb25nKTB4RkZGRkZGRkYKIGtleURpcmVjdE9iamVjdCA9IEZPVVJfQ0hBUl9DT0RFKCctLS0tJykKIGtleUVycm9yTnVtYmVyID0gRk9VUl9DSEFSX0NPREUoJ2Vycm4nKQoga2V5RXJyb3JTdHJpbmcgPSBGT1VSX0NIQVJfQ09ERSgnZXJycycpCkBAIC0xMDUsNyArMTA1LDcgQEAKIGtleVByZURpc3BhdGNoID0gRk9VUl9DSEFSX0NPREUoJ3BoYWMnKQoga2V5U2VsZWN0UHJvYyA9IEZPVVJfQ0hBUl9DT0RFKCdzZWxoJykKIGtleUFFUmVjb3JkZXJDb3VudCA9IEZPVVJfQ0hBUl9DT0RFKCdyZWNyJykKLWtleUFFVmVyc2lvbiA9IEZPVVJfQ0hBUl9DT0RFKCd2ZXJzJykgCitrZXlBRVZlcnNpb24gPSBGT1VSX0NIQVJfQ09ERSgndmVycycpCiBrQ29yZUV2ZW50Q2xhc3MgPSBGT1VSX0NIQVJfQ09ERSgnYWV2dCcpCiBrQUVPcGVuQXBwbGljYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnb2FwcCcpCiBrQUVPcGVuRG9jdW1lbnRzID0gRk9VUl9DSEFSX0NPREUoJ29kb2MnKQpAQCAtMTEzLDEyICsxMTMsMTIgQEAKIGtBRVF1aXRBcHBsaWNhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdxdWl0JykKIGtBRUFuc3dlciA9IEZPVVJfQ0hBUl9DT0RFKCdhbnNyJykKIGtBRUFwcGxpY2F0aW9uRGllZCA9IEZPVVJfQ0hBUl9DT0RFKCdvYml0JykKLWtBRVNob3dQcmVmZXJlbmNlcyA9IEZPVVJfQ0hBUl9DT0RFKCdwcmVmJykgCitrQUVTaG93UHJlZmVyZW5jZXMgPSBGT1VSX0NIQVJfQ09ERSgncHJlZicpCiBrQUVTdGFydFJlY29yZGluZyA9IEZPVVJfQ0hBUl9DT0RFKCdyZWNhJykKIGtBRVN0b3BSZWNvcmRpbmcgPSBGT1VSX0NIQVJfQ09ERSgncmVjYycpCiBrQUVOb3RpZnlTdGFydFJlY29yZGluZyA9IEZPVVJfQ0hBUl9DT0RFKCdyZWMxJykKIGtBRU5vdGlmeVN0b3BSZWNvcmRpbmcgPSBGT1VSX0NIQVJfQ09ERSgncmVjMCcpCi1rQUVOb3RpZnlSZWNvcmRpbmcgPSBGT1VSX0NIQVJfQ09ERSgncmVjcicpIAora0FFTm90aWZ5UmVjb3JkaW5nID0gRk9VUl9DSEFSX0NPREUoJ3JlY3InKQoga0FFVW5rbm93blNvdXJjZSA9IDAKIGtBRURpcmVjdENhbGwgPSAxCiBrQUVTYW1lUHJvY2VzcyA9IDIKQEAgLTE0Myw3ICsxNDMsNyBAQAogY0dyYXBoaWNPYmplY3QgPSBGT1VSX0NIQVJfQ09ERSgnY2dvYicpCiBjR3JhcGhpY1NoYXBlID0gRk9VUl9DSEFSX0NPREUoJ2Nnc2gnKQogY0dyYXBoaWNUZXh0ID0gRk9VUl9DSEFSX0NPREUoJ2NndHgnKQotY0dyb3VwZWRHcmFwaGljID0gRk9VUl9DSEFSX0NPREUoJ2NwaWMnKSAKK2NHcm91cGVkR3JhcGhpYyA9IEZPVVJfQ0hBUl9DT0RFKCdjcGljJykKIGNJbnNlcnRpb25Mb2MgPSBGT1VSX0NIQVJfQ09ERSgnaW5zbCcpCiBjSW5zZXJ0aW9uUG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgnY2lucycpCiBjSW50bFRleHQgPSBGT1VSX0NIQVJfQ09ERSgnaXR4dCcpCkBAIC0xNjMsNyArMTYzLDcgQEAKIGNPYmplY3QgPSBGT1VSX0NIQVJfQ09ERSgnY29iaicpCiBjT2JqZWN0U3BlY2lmaWVyID0gRk9VUl9DSEFSX0NPREUoJ29iaiAnKQogY09wZW5hYmxlT2JqZWN0ID0gRk9VUl9DSEFSX0NPREUoJ2Nvb2InKQotY092YWwgPSBGT1VSX0NIQVJfQ09ERSgnY292bCcpIAorY092YWwgPSBGT1VSX0NIQVJfQ09ERSgnY292bCcpCiBjUGFyYWdyYXBoID0gRk9VUl9DSEFSX0NPREUoJ2NwYXInKQogY1BJQ1QgPSBGT1VSX0NIQVJfQ09ERSgnUElDVCcpCiBjUGl4ZWwgPSBGT1VSX0NIQVJfQ09ERSgnY3B4bCcpCkBAIC0xODMsNyArMTgzLDcgQEAKIGNUZXh0ID0gRk9VUl9DSEFSX0NPREUoJ2N0eHQnKQogY1RleHRGbG93ID0gRk9VUl9DSEFSX0NPREUoJ2NmbG8nKQogY1RleHRTdHlsZXMgPSBGT1VSX0NIQVJfQ09ERSgndHN0eScpCi1jVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0eXBlJykgCitjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0eXBlJykKIGNWZXJzaW9uID0gRk9VUl9DSEFSX0NPREUoJ3ZlcnMnKQogY1dpbmRvdyA9IEZPVVJfQ0hBUl9DT0RFKCdjd2luJykKIGNXb3JkID0gRk9VUl9DSEFSX0NPREUoJ2N3b3InKQpAQCAtMjAzLDcgKzIwMyw3IEBACiBrQUVBbGxDYXBzID0gRk9VUl9DSEFSX0NPREUoJ2FsY3AnKQoga0FFQXJyb3dBdEVuZCA9IEZPVVJfQ0hBUl9DT0RFKCdhcmVuJykKIGtBRUFycm93QXRTdGFydCA9IEZPVVJfQ0hBUl9DT0RFKCdhcnN0JykKLWtBRUFycm93Qm90aEVuZHMgPSBGT1VSX0NIQVJfQ09ERSgnYXJibycpIAora0FFQXJyb3dCb3RoRW5kcyA9IEZPVVJfQ0hBUl9DT0RFKCdhcmJvJykKIGtBRUFzayA9IEZPVVJfQ0hBUl9DT0RFKCdhc2sgJykKIGtBRUJlZm9yZSA9IEZPVVJfQ0hBUl9DT0RFKCdiZWZvJykKIGtBRUJlZ2lubmluZyA9IEZPVVJfQ0hBUl9DT0RFKCdiZ25nJykKQEAgLTIyMyw3ICsyMjMsNyBAQAoga0FFQ3JlYXRlRWxlbWVudCA9IEZPVVJfQ0hBUl9DT0RFKCdjcmVsJykKIGtBRUNyZWF0ZVB1Ymxpc2hlciA9IEZPVVJfQ0hBUl9DT0RFKCdjcHViJykKIGtBRUN1dCA9IEZPVVJfQ0hBUl9DT0RFKCdjdXQgJykKLWtBRURlbGV0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdkZWxvJykgCitrQUVEZWxldGUgPSBGT1VSX0NIQVJfQ09ERSgnZGVsbycpCiBrQUVEb09iamVjdHNFeGlzdCA9IEZPVVJfQ0hBUl9DT0RFKCdkb2V4JykKIGtBRURvU2NyaXB0ID0gRk9VUl9DSEFSX0NPREUoJ2Rvc2MnKQoga0FFRHJhZyA9IEZPVVJfQ0hBUl9DT0RFKCdkcmFnJykKQEAgLTI0Myw3ICsyNDMsNyBAQAoga0FFR2V0RGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdnZXRkJykKIGtBRUdldERhdGFTaXplID0gRk9VUl9DSEFSX0NPREUoJ2RzaXonKQoga0FFR2V0RXZlbnRJbmZvID0gRk9VUl9DSEFSX0NPREUoJ2d0ZWknKQota0FFR2V0SW5mb1NlbGVjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzaW5mJykgCitrQUVHZXRJbmZvU2VsZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3NpbmYnKQoga0FFR2V0UHJpdmlsZWdlU2VsZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3NwcnYnKQoga0FFR2V0U3VpdGVJbmZvID0gRk9VUl9DSEFSX0NPREUoJ2d0c2knKQoga0FFR3JlYXRlclRoYW4gPSBGT1VSX0NIQVJfQ09ERSgnPiAgICcpCkBAIC0yNjMsNyArMjYzLDcgQEAKIGtBRU1vZGlmaWFibGUgPSBGT1VSX0NIQVJfQ09ERSgnbW9kZicpCiBrQUVNb3ZlID0gRk9VUl9DSEFSX0NPREUoJ21vdmUnKQoga0FFTm8gPSBGT1VSX0NIQVJfQ09ERSgnbm8gICcpCi1rQUVOb0Fycm93ID0gRk9VUl9DSEFSX0NPREUoJ2Fybm8nKSAKK2tBRU5vQXJyb3cgPSBGT1VSX0NIQVJfQ09ERSgnYXJubycpCiBrQUVOb25tb2RpZmlhYmxlID0gRk9VUl9DSEFSX0NPREUoJ25tb2QnKQoga0FFT3BlbiA9IEZPVVJfQ0hBUl9DT0RFKCdvZG9jJykKIGtBRU9wZW5TZWxlY3Rpb24gPSBGT1VSX0NIQVJfQ09ERSgnc29wZScpCkBAIC0yODMsNyArMjgzLDcgQEAKIGtBRVFEQmxlbmQgPSBGT1VSX0NIQVJfQ09ERSgnYmxuZCcpCiBrQUVRRENvcHkgPSBGT1VSX0NIQVJfQ09ERSgnY3B5ICcpCiBrQUVRRE5vdEJpYyA9IEZPVVJfQ0hBUl9DT0RFKCduYmljJykKLWtBRVFETm90Q29weSA9IEZPVVJfQ0hBUl9DT0RFKCduY3B5JykgCitrQUVRRE5vdENvcHkgPSBGT1VSX0NIQVJfQ09ERSgnbmNweScpCiBrQUVRRE5vdE9yID0gRk9VUl9DSEFSX0NPREUoJ250b3InKQoga0FFUUROb3RYb3IgPSBGT1VSX0NIQVJfQ09ERSgnbnhvcicpCiBrQUVRRE9yID0gRk9VUl9DSEFSX0NPREUoJ29yICAnKQpAQCAtMzA0LDcgKzMwNCw3IEBACiBrQUVSaWdodEp1c3RpZmllZCA9IEZPVVJfQ0hBUl9DT0RFKCdyZ2h0JykKIGtBRVNhdmUgPSBGT1VSX0NIQVJfQ09ERSgnc2F2ZScpCiBrQUVTZWxlY3QgPSBGT1VSX0NIQVJfQ09ERSgnc2xjdCcpCi1rQUVTZXREYXRhID0gRk9VUl9DSEFSX0NPREUoJ3NldGQnKSAKK2tBRVNldERhdGEgPSBGT1VSX0NIQVJfQ09ERSgnc2V0ZCcpCiBrQUVTZXRQb3NpdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdwb3NuJykKIGtBRVNoYWRvdyA9IEZPVVJfQ0hBUl9DT0RFKCdzaGFkJykKIGtBRVNob3dDbGlwYm9hcmQgPSBGT1VSX0NIQVJfQ09ERSgnc2hjbCcpCkBAIC0zMjIsNyArMzIyLDcgQEAKIGtBRVVuZG8gPSBGT1VSX0NIQVJfQ09ERSgndW5kbycpCiBrQUVXaG9sZVdvcmRFcXVhbHMgPSBGT1VSX0NIQVJfQ09ERSgnd3dlcScpCiBrQUVZZXMgPSBGT1VSX0NIQVJfQ09ERSgneWVzICcpCi1rQUVab29tID0gRk9VUl9DSEFSX0NPREUoJ3pvb20nKSAKK2tBRVpvb20gPSBGT1VSX0NIQVJfQ09ERSgnem9vbScpCiBrQUVNb3VzZUNsYXNzID0gRk9VUl9DSEFSX0NPREUoJ21vdXMnKQoga0FFRG93biA9IEZPVVJfQ0hBUl9DT0RFKCdkb3duJykKIGtBRVVwID0gRk9VUl9DSEFSX0NPREUoJ3VwICAnKQpAQCAtMzQ3LDcgKzM0Nyw3IEBACiBrQUVTY3JhcEV2ZW50ID0gRk9VUl9DSEFSX0NPREUoJ3NjcnAnKQoga0FFSGlnaExldmVsID0gRk9VUl9DSEFSX0NPREUoJ2hpZ2gnKQoga2V5QUVBbmdsZSA9IEZPVVJfQ0hBUl9DT0RFKCdrYW5nJykKLWtleUFFQXJjQW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgncGFyYycpIAora2V5QUVBcmNBbmdsZSA9IEZPVVJfQ0hBUl9DT0RFKCdwYXJjJykKIGtleUFFQmFzZUFkZHIgPSBGT1VSX0NIQVJfQ09ERSgnYmFkZCcpCiBrZXlBRUJlc3RUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3Bic3QnKQoga2V5QUVCZ25kQ29sb3IgPSBGT1VSX0NIQVJfQ09ERSgna2JjbCcpCkBAIC0zNjcsNyArMzY3LDcgQEAKIGtleUFFRGVzdGluYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnZGVzdCcpCiBrZXlBRURvQW50aUFsaWFzID0gRk9VUl9DSEFSX0NPREUoJ2FudGEnKQoga2V5QUVEb0RpdGhlcmVkID0gRk9VUl9DSEFSX0NPREUoJ2dkaXQnKQota2V5QUVEb1JvdGF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdrZHJ0JykgCitrZXlBRURvUm90YXRlID0gRk9VUl9DSEFSX0NPREUoJ2tkcnQnKQoga2V5QUVEb1NjYWxlID0gRk9VUl9DSEFSX0NPREUoJ2tzY2EnKQoga2V5QUVEb1RyYW5zbGF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdrdHJhJykKIGtleUFFRWRpdGlvbkZpbGVMb2MgPSBGT1VSX0NIQVJfQ09ERSgnZWxvYycpCkBAIC0zODcsNyArMzg3LDcgQEAKIGtleUFFSUQgPSBGT1VSX0NIQVJfQ09ERSgnSUQgICcpCiBrZXlBRUltYWdlUXVhbGl0eSA9IEZPVVJfQ0hBUl9DT0RFKCdncXVhJykKIGtleUFFSW5zZXJ0SGVyZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbnNoJykKLWtleUFFS2V5Rm9ybXMgPSBGT1VSX0NIQVJfQ09ERSgna2V5ZicpIAora2V5QUVLZXlGb3JtcyA9IEZPVVJfQ0hBUl9DT0RFKCdrZXlmJykKIGtleUFFS2V5d29yZCA9IEZPVVJfQ0hBUl9DT0RFKCdreXdkJykKIGtleUFFTGV2ZWwgPSBGT1VSX0NIQVJfQ09ERSgnbGV2bCcpCiBrZXlBRUxpbmVBcnJvdyA9IEZPVVJfQ0hBUl9DT0RFKCdhcnJvJykKQEAgLTQwNyw3ICs0MDcsNyBAQAoga2V5QUVQTVRhYmxlID0gRk9VUl9DSEFSX0NPREUoJ2twbXQnKQoga2V5QUVQb2ludExpc3QgPSBGT1VSX0NIQVJfQ09ERSgncHRsdCcpCiBrZXlBRVBvaW50U2l6ZSA9IEZPVVJfQ0hBUl9DT0RFKCdwdHN6JykKLWtleUFFUG9zaXRpb24gPSBGT1VSX0NIQVJfQ09ERSgna3BvcycpIAora2V5QUVQb3NpdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdrcG9zJykKIGtleUFFUHJvcERhdGEgPSBGT1VSX0NIQVJfQ09ERSgncHJkdCcpCiBrZXlBRVByb3BlcnRpZXMgPSBGT1VSX0NIQVJfQ09ERSgncXBybycpCiBrZXlBRVByb3BlcnR5ID0gRk9VUl9DSEFSX0NPREUoJ2twcnAnKQpAQCAtNDI3LDcgKzQyNyw3IEBACiBrZXlBRVNob3dXaGVyZSA9IEZPVVJfQ0hBUl9DT0RFKCdzaG93JykKIGtleUFFU3RhcnRBbmdsZSA9IEZPVVJfQ0hBUl9DT0RFKCdwYW5nJykKIGtleUFFU3RhcnRQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdwc3RwJykKLWtleUFFU3R5bGVzID0gRk9VUl9DSEFSX0NPREUoJ2tzdHknKSAKK2tleUFFU3R5bGVzID0gRk9VUl9DSEFSX0NPREUoJ2tzdHknKQoga2V5QUVTdWl0ZUlEID0gRk9VUl9DSEFSX0NPREUoJ3N1aXQnKQoga2V5QUVUZXh0ID0gRk9VUl9DSEFSX0NPREUoJ2t0eHQnKQoga2V5QUVUZXh0Q29sb3IgPSBGT1VSX0NIQVJfQ09ERSgncHR4YycpCkBAIC00NDQsNyArNDQ0LDcgQEAKIGtleUFFVXBkYXRlT24gPSBGT1VSX0NIQVJfQ09ERSgncHVwZCcpCiBrZXlBRVVzZXJUZXJtID0gRk9VUl9DSEFSX0NPREUoJ3V0cm0nKQoga2V5QUVXaW5kb3cgPSBGT1VSX0NIQVJfQ09ERSgnd25kdycpCi1rZXlBRVdyaXRpbmdDb2RlID0gRk9VUl9DSEFSX0NPREUoJ3dyY2QnKSAKK2tleUFFV3JpdGluZ0NvZGUgPSBGT1VSX0NIQVJfQ09ERSgnd3JjZCcpCiBrZXlNaXNjZWxsYW5lb3VzID0gRk9VUl9DSEFSX0NPREUoJ2Ztc2MnKQoga2V5U2VsZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2ZzZWwnKQoga2V5V2luZG93ID0gRk9VUl9DSEFSX0NPREUoJ2t3bmQnKQpAQCAtNDc3LDcgKzQ3Nyw3IEBACiBwRW5kUG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgncGVuZCcpCiBwRmlsbENvbG9yID0gRk9VUl9DSEFSX0NPREUoJ2ZsY2wnKQogcEZpbGxQYXR0ZXJuID0gRk9VUl9DSEFSX0NPREUoJ2ZscHQnKQotcEZvbnQgPSBGT1VSX0NIQVJfQ09ERSgnZm9udCcpIAorcEZvbnQgPSBGT1VSX0NIQVJfQ09ERSgnZm9udCcpCiBwRm9ybXVsYSA9IEZPVVJfQ0hBUl9DT0RFKCdwZm9yJykKIHBHcmFwaGljT2JqZWN0cyA9IEZPVVJfQ0hBUl9DT0RFKCdnb2JzJykKIHBIYXNDbG9zZUJveCA9IEZPVVJfQ0hBUl9DT0RFKCdoY2xiJykKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogcEp1c3RpZmljYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgncGpzdCcpCiBwTGluZUFycm93ID0gRk9VUl9DSEFSX0NPREUoJ2Fycm8nKQogcE1lbnVJRCA9IEZPVVJfQ0hBUl9DT0RFKCdtbmlkJykKLXBOYW1lID0gRk9VUl9DSEFSX0NPREUoJ3BuYW0nKSAKK3BOYW1lID0gRk9VUl9DSEFSX0NPREUoJ3BuYW0nKQogcE5ld0VsZW1lbnRMb2MgPSBGT1VSX0NIQVJfQ09ERSgncG5lbCcpCiBwUGVuQ29sb3IgPSBGT1VSX0NIQVJfQ09ERSgncHBjbCcpCiBwUGVuUGF0dGVybiA9IEZPVVJfQ0hBUl9DT0RFKCdwcHBhJykKQEAgLTUxNyw3ICs1MTcsNyBAQAogcFRleHRDb2xvciA9IEZPVVJfQ0hBUl9DT0RFKCdwdHhjJykKIHBUZXh0Rm9udCA9IEZPVVJfQ0hBUl9DT0RFKCdwdHhmJykKIHBUZXh0SXRlbURlbGltaXRlcnMgPSBGT1VSX0NIQVJfQ09ERSgndHhkbCcpCi1wVGV4dFBvaW50U2l6ZSA9IEZPVVJfQ0hBUl9DT0RFKCdwdHBzJykgCitwVGV4dFBvaW50U2l6ZSA9IEZPVVJfQ0hBUl9DT0RFKCdwdHBzJykKIHBUZXh0U3R5bGVzID0gRk9VUl9DSEFSX0NPREUoJ3R4c3QnKQogcFRyYW5zZmVyTW9kZSA9IEZPVVJfQ0hBUl9DT0RFKCdwcHRtJykKIHBUcmFuc2xhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdwdHJzJykKQEAgLTUyNSw3ICs1MjUsNyBAQAogcFVwZGF0ZU9uID0gRk9VUl9DSEFSX0NPREUoJ3B1cGQnKQogcFVzZXJTZWxlY3Rpb24gPSBGT1VSX0NIQVJfQ09ERSgncHVzbCcpCiBwVmVyc2lvbiA9IEZPVVJfQ0hBUl9DT0RFKCd2ZXJzJykKLXBWaXNpYmxlID0gRk9VUl9DSEFSX0NPREUoJ3B2aXMnKSAKK3BWaXNpYmxlID0gRk9VUl9DSEFSX0NPREUoJ3B2aXMnKQogdHlwZUFFVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCd0VFhUJykKIHR5cGVBcmMgPSBGT1VSX0NIQVJfQ09ERSgnY2FyYycpCiB0eXBlQmVzdCA9IEZPVVJfQ0hBUl9DT0RFKCdiZXN0JykKQEAgLTUzOSw3ICs1MzksNyBAQAogdHlwZUVsZW1JbmZvID0gRk9VUl9DSEFSX0NPREUoJ2VsaW4nKQogdHlwZUVudW1lcmF0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2VudW0nKQogdHlwZUVQUyA9IEZPVVJfQ0hBUl9DT0RFKCdFUFMgJykKLXR5cGVFdmVudEluZm8gPSBGT1VSX0NIQVJfQ09ERSgnZXZpbicpIAordHlwZUV2ZW50SW5mbyA9IEZPVVJfQ0hBUl9DT0RFKCdldmluJykKIHR5cGVGaW5kZXJXaW5kb3cgPSBGT1VSX0NIQVJfQ09ERSgnZndpbicpCiB0eXBlRml4ZWRQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdmcG50JykKIHR5cGVGaXhlZFJlY3RhbmdsZSA9IEZPVVJfQ0hBUl9DT0RFKCdmcmN0JykKQEAgLTU1OCw3ICs1NTgsNyBAQAogdHlwZU1hY2hpbmVMb2MgPSBGT1VSX0NIQVJfQ09ERSgnbUxvYycpCiB0eXBlT3ZhbCA9IEZPVVJfQ0hBUl9DT0RFKCdjb3ZsJykKIHR5cGVQYXJhbUluZm8gPSBGT1VSX0NIQVJfQ09ERSgncG1pbicpCi10eXBlUGljdCA9IEZPVVJfQ0hBUl9DT0RFKCdQSUNUJykgCit0eXBlUGljdCA9IEZPVVJfQ0hBUl9DT0RFKCdQSUNUJykKIHR5cGVQaXhlbE1hcCA9IEZPVVJfQ0hBUl9DT0RFKCdjcGl4JykKIHR5cGVQaXhNYXBNaW51cyA9IEZPVVJfQ0hBUl9DT0RFKCd0cG1tJykKIHR5cGVQb2x5Z29uID0gRk9VUl9DSEFSX0NPREUoJ2NwZ24nKQpAQCAtNTc4LDkgKzU3OCw5IEBACiB0eXBlU3R5bGVkVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdTVFhUJykKIHR5cGVTdWl0ZUluZm8gPSBGT1VSX0NIQVJfQ09ERSgnc3VpbicpCiB0eXBlVGFibGUgPSBGT1VSX0NIQVJfQ09ERSgnY3RibCcpCi10eXBlVGV4dFN0eWxlcyA9IEZPVVJfQ0hBUl9DT0RFKCd0c3R5JykgCit0eXBlVGV4dFN0eWxlcyA9IEZPVVJfQ0hBUl9DT0RFKCd0c3R5JykKIHR5cGVUSUZGID0gRk9VUl9DSEFSX0NPREUoJ1RJRkYnKQotdHlwZVZlcnNpb24gPSBGT1VSX0NIQVJfQ09ERSgndmVycycpIAordHlwZVZlcnNpb24gPSBGT1VSX0NIQVJfQ09ERSgndmVycycpCiBrQUVNZW51Q2xhc3MgPSBGT1VSX0NIQVJfQ09ERSgnbWVudScpCiBrQUVNZW51U2VsZWN0ID0gRk9VUl9DSEFSX0NPREUoJ21oaXQnKQoga0FFTW91c2VEb3duID0gRk9VUl9DSEFSX0NPREUoJ21kd24nKQpAQCAtNjQwLDcgKzY0MCw3IEBACiB0eXBlVGV4dFJhbmdlQXJyYXkgPSBGT1VSX0NIQVJfQ09ERSgndHJheScpCiB0eXBlTG93TGV2ZWxFdmVudFJlY29yZCA9IEZPVVJfQ0hBUl9DT0RFKCdldnRyJykKIHR5cGVFdmVudFJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdldnJmJykKLXR5cGVUZXh0ID0gdHlwZUNoYXIgCit0eXBlVGV4dCA9IHR5cGVDaGFyCiBrVFNNT3V0c2lkZU9mQm9keSA9IDEKIGtUU01JbnNpZGVPZkJvZHkgPSAyCiBrVFNNSW5zaWRlT2ZBY3RpdmVJbnB1dEFyZWEgPSAzCkBAIC02NTMsNyArNjUzLDcgQEAKIGtTZWxlY3RlZENvbnZlcnRlZFRleHQgPSA1CiBrQmxvY2tGaWxsVGV4dCA9IDYKIGtPdXRsaW5lVGV4dCA9IDcKLWtTZWxlY3RlZFRleHQgPSA4ICAgICAKK2tTZWxlY3RlZFRleHQgPSA4CiBrZXlBRUhpbGl0ZVJhbmdlID0gRk9VUl9DSEFSX0NPREUoJ2hybmcnKQoga2V5QUVQaW5SYW5nZSA9IEZPVVJfQ0hBUl9DT0RFKCdwbnJnJykKIGtleUFFQ2xhdXNlT2Zmc2V0cyA9IEZPVVJfQ0hBUl9DT0RFKCdjbGF1JykKQEAgLTY2MSw3ICs2NjEsNyBAQAoga2V5QUVQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdncG9zJykKIGtleUFFTGVmdFNpZGUgPSBGT1VSX0NIQVJfQ09ERSgna2xlZicpCiBrZXlBRVJlZ2lvbkNsYXNzID0gRk9VUl9DSEFSX0NPREUoJ3JnbmMnKQota2V5QUVEcmFnZ2luZyA9IEZPVVJfQ0hBUl9DT0RFKCdib29sJykgCitrZXlBRURyYWdnaW5nID0gRk9VUl9DSEFSX0NPREUoJ2Jvb2wnKQoga2V5QUVMZWFkaW5nRWRnZSA9IGtleUFFTGVmdFNpZGUKIHR5cGVVbmljb2RlVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCd1dHh0JykKIHR5cGVTdHlsZWRVbmljb2RlVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdzdXR4JykKQEAgLTcxMCw3ICs3MTAsNyBAQAoga0ZBUmVtb3ZlQ29tbWFuZCA9IEZPVVJfQ0hBUl9DT0RFKCdybWZhJykKIGtGQUVkaXRDb21tYW5kID0gRk9VUl9DSEFSX0NPREUoJ2VkZmEnKQoga0ZBRmlsZVBhcmFtID0gRk9VUl9DSEFSX0NPREUoJ2ZhYWwnKQota0ZBSW5kZXhQYXJhbSA9IEZPVVJfQ0hBUl9DT0RFKCdpbmR4JykgCitrRkFJbmRleFBhcmFtID0gRk9VUl9DSEFSX0NPREUoJ2luZHgnKQoga0FFSW50ZXJuZXRTdWl0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdndXJsJykKIGtBRUlTV2ViU3RhclN1aXRlID0gRk9VUl9DSEFSX0NPREUoJ1dXV1x4YmQnKQoga0FFSVNHZXRVUkwgPSBGT1VSX0NIQVJfQ09ERSgnZ3VybCcpCkBAIC05MTcsNyArOTE3LDcgQEAKIGtleUFFRGVzaXJlZENsYXNzID0gRk9VUl9DSEFSX0NPREUoJ3dhbnQnKQoga2V5QUVDb250YWluZXIgPSBGT1VSX0NIQVJfQ09ERSgnZnJvbScpCiBrZXlBRUtleUZvcm0gPSBGT1VSX0NIQVJfQ09ERSgnZm9ybScpCi1rZXlBRUtleURhdGEgPSBGT1VSX0NIQVJfQ09ERSgnc2VsZCcpIAora2V5QUVLZXlEYXRhID0gRk9VUl9DSEFSX0NPREUoJ3NlbGQnKQoga2V5QUVSYW5nZVN0YXJ0ID0gRk9VUl9DSEFSX0NPREUoJ3N0YXInKQoga2V5QUVSYW5nZVN0b3AgPSBGT1VSX0NIQVJfQ09ERSgnc3RvcCcpCiBrZXlEaXNwb3NlVG9rZW5Qcm9jID0gRk9VUl9DSEFSX0NPREUoJ3h0b2snKQpAQCAtOTI2LDcgKzkyNiw3IEBACiBrZXlBRU1hcmtUb2tlblByb2MgPSBGT1VSX0NIQVJfQ09ERSgnbWtpZCcpCiBrZXlBRU1hcmtQcm9jID0gRk9VUl9DSEFSX0NPREUoJ21hcmsnKQoga2V5QUVBZGp1c3RNYXJrc1Byb2MgPSBGT1VSX0NIQVJfQ09ERSgnYWRqbScpCi1rZXlBRUdldEVyckRlc2NQcm9jID0gRk9VUl9DSEFSX0NPREUoJ2luZGMnKSAKK2tleUFFR2V0RXJyRGVzY1Byb2MgPSBGT1VSX0NIQVJfQ09ERSgnaW5kYycpCiBmb3JtQWJzb2x1dGVQb3NpdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdpbmR4JykKIGZvcm1SZWxhdGl2ZVBvc2l0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3JlbGUnKQogZm9ybVRlc3QgPSBGT1VSX0NIQVJfQ09ERSgndGVzdCcpCkBAIC05NDMsNyArOTQzLDcgQEAKIHR5cGVSYW5nZURlc2NyaXB0b3IgPSBGT1VSX0NIQVJfQ09ERSgncmFuZycpCiB0eXBlTG9naWNhbERlc2NyaXB0b3IgPSBGT1VSX0NIQVJfQ09ERSgnbG9naScpCiB0eXBlQ29tcERlc2NyaXB0b3IgPSBGT1VSX0NIQVJfQ09ERSgnY21wZCcpCi10eXBlT1NMVG9rZW5MaXN0ID0gRk9VUl9DSEFSX0NPREUoJ29zdGwnKSAKK3R5cGVPU0xUb2tlbkxpc3QgPSBGT1VSX0NIQVJfQ09ERSgnb3N0bCcpCiBrQUVJRG9NaW5pbXVtID0gMHgwMDAwCiBrQUVJRG9XaG9zZSA9IDB4MDAwMQoga0FFSURvTWFya2luZyA9IDB4MDAwNApAQCAtOTU3LDQgKzk1Nyw0IEBACiBrZXlBRVdob3NlUmFuZ2VTdGFydCA9IEZPVVJfQ0hBUl9DT0RFKCd3c3RyJykKIGtleUFFV2hvc2VSYW5nZVN0b3AgPSBGT1VSX0NIQVJfQ09ERSgnd3N0cCcpCiBrZXlBRUluZGV4ID0gRk9VUl9DSEFSX0NPREUoJ2tpZHgnKQota2V5QUVUZXN0ID0gRk9VUl9DSEFSX0NPREUoJ2t0c3QnKSAKK2tleUFFVGVzdCA9IEZPVVJfQ0hBUl9DT0RFKCdrdHN0JykKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9DYXJib24vQ2FyYm9uRXZlbnRzLnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9DYXJib25FdmVudHMucHkKaW5kZXggZmY0ZjY5Yy4uMzU3ZWU1ZCAxMDA3NTUKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9DYXJib25FdmVudHMucHkKKysrIGIvTGliL3BsYXQtbWFjL0NhcmJvbi9DYXJib25FdmVudHMucHkKQEAgLTcxLDkgKzcxLDkgQEAKIGtFdmVudFJhd0tleVVwID0gMwoga0V2ZW50UmF3S2V5TW9kaWZpZXJzQ2hhbmdlZCA9IDQKIGtFdmVudEhvdEtleVByZXNzZWQgPSA1Ci1rRXZlbnRIb3RLZXlSZWxlYXNlZCA9IDYgICAgIAora0V2ZW50SG90S2V5UmVsZWFzZWQgPSA2CiBrRXZlbnRLZXlNb2RpZmllck51bUxvY2tCaXQgPSAxNgota0V2ZW50S2V5TW9kaWZpZXJGbkJpdCA9IDE3ICAgIAora0V2ZW50S2V5TW9kaWZpZXJGbkJpdCA9IDE3CiBrRXZlbnRLZXlNb2RpZmllck51bUxvY2tNYXNrID0gMUwgPDwga0V2ZW50S2V5TW9kaWZpZXJOdW1Mb2NrQml0CiBrRXZlbnRLZXlNb2RpZmllckZuTWFzayA9IDFMIDw8IGtFdmVudEtleU1vZGlmaWVyRm5CaXQKIGtFdmVudEFwcEFjdGl2YXRlZCA9IDEKQEAgLTI2MiwxOCArMjYyLDE4IEBACiBrQ29udHJvbEJvdW5kc0NoYW5nZVBvc2l0aW9uQ2hhbmdlZCA9ICgxIDw8IDMpCiBrRXZlbnRUYWJsZXRQb2ludCA9IDEKIGtFdmVudFRhYmxldFByb3hpbWl0eSA9IDIKLWtFdmVudFRhYmxldFBvaW50ZXIgPSAxICAgICAKK2tFdmVudFRhYmxldFBvaW50ZXIgPSAxCiBrRXZlbnRWb2x1bWVNb3VudGVkID0gMQota0V2ZW50Vm9sdW1lVW5tb3VudGVkID0gMiAgICAgCi10eXBlRlNWb2x1bWVSZWZOdW0gPSBGT1VSX0NIQVJfQ09ERSgndm9sbicpIAora0V2ZW50Vm9sdW1lVW5tb3VudGVkID0gMgordHlwZUZTVm9sdW1lUmVmTnVtID0gRk9VUl9DSEFSX0NPREUoJ3ZvbG4nKQoga0V2ZW50QXBwZWFyYW5jZVNjcm9sbEJhclZhcmlhbnRDaGFuZ2VkID0gMQoga0V2ZW50U2VydmljZUNvcHkgPSAxCiBrRXZlbnRTZXJ2aWNlUGFzdGUgPSAyCiBrRXZlbnRTZXJ2aWNlR2V0VHlwZXMgPSAzCiBrRXZlbnRTZXJ2aWNlUGVyZm9ybSA9IDQKLWtFdmVudFBhcmFtRGlyZWN0T2JqZWN0ID0gRk9VUl9DSEFSX0NPREUoJy0tLS0nKSAKK2tFdmVudFBhcmFtRGlyZWN0T2JqZWN0ID0gRk9VUl9DSEFSX0NPREUoJy0tLS0nKQoga0V2ZW50UGFyYW1Qb3N0VGFyZ2V0ID0gRk9VUl9DSEFSX0NPREUoJ3B0cmcnKQotdHlwZUV2ZW50VGFyZ2V0UmVmID0gRk9VUl9DSEFSX0NPREUoJ2V0cmcnKSAKK3R5cGVFdmVudFRhcmdldFJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdldHJnJykKIGtFdmVudFBhcmFtV2luZG93UmVmID0gRk9VUl9DSEFSX0NPREUoJ3dpbmQnKQoga0V2ZW50UGFyYW1HcmFmUG9ydCA9IEZPVVJfQ0hBUl9DT0RFKCdncmFmJykKIGtFdmVudFBhcmFtRHJhZ1JlZiA9IEZPVVJfQ0hBUl9DT0RFKCdkcmFnJykKQEAgLTMwNCw3ICszMDQsNyBAQAogdHlwZUNHQ29udGV4dFJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdjbnR4JykKIHR5cGVISVBvaW50ID0gRk9VUl9DSEFSX0NPREUoJ2hpcHQnKQogdHlwZUhJU2l6ZSA9IEZPVVJfQ0hBUl9DT0RFKCdoaXN6JykKLXR5cGVISVJlY3QgPSBGT1VSX0NIQVJfQ09ERSgnaGlyYycpIAordHlwZUhJUmVjdCA9IEZPVVJfQ0hBUl9DT0RFKCdoaXJjJykKIGtFdmVudFBhcmFtTW91c2VMb2NhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdtbG9jJykKIGtFdmVudFBhcmFtTW91c2VCdXR0b24gPSBGT1VSX0NIQVJfQ09ERSgnbWJ0bicpCiBrRXZlbnRQYXJhbUNsaWNrQ291bnQgPSBGT1VSX0NIQVJfQ09ERSgnY2NudCcpCkBAIC0zMTQsMTMgKzMxNCwxMyBAQAoga0V2ZW50UGFyYW1Nb3VzZUNob3JkID0gRk9VUl9DSEFSX0NPREUoJ2Nob3InKQoga0V2ZW50UGFyYW1UYWJsZXRFdmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndGJsdCcpCiB0eXBlTW91c2VCdXR0b24gPSBGT1VSX0NIQVJfQ09ERSgnbWJ0bicpCi10eXBlTW91c2VXaGVlbEF4aXMgPSBGT1VSX0NIQVJfQ09ERSgnbXdheCcpIAordHlwZU1vdXNlV2hlZWxBeGlzID0gRk9VUl9DSEFSX0NPREUoJ213YXgnKQoga0V2ZW50UGFyYW1LZXlDb2RlID0gRk9VUl9DSEFSX0NPREUoJ2tjb2QnKQoga0V2ZW50UGFyYW1LZXlNYWNDaGFyQ29kZXMgPSBGT1VSX0NIQVJfQ09ERSgna2NocicpCiBrRXZlbnRQYXJhbUtleU1vZGlmaWVycyA9IEZPVVJfQ0hBUl9DT0RFKCdrbW9kJykKIGtFdmVudFBhcmFtS2V5VW5pY29kZXMgPSBGT1VSX0NIQVJfQ09ERSgna3VuaScpCiBrRXZlbnRQYXJhbUtleWJvYXJkVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdrYmR0JykKLXR5cGVFdmVudEhvdEtleUlEID0gRk9VUl9DSEFSX0NPREUoJ2hraWQnKSAKK3R5cGVFdmVudEhvdEtleUlEID0gRk9VUl9DSEFSX0NPREUoJ2hraWQnKQoga0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kUmVmQ29uID0gRk9VUl9DSEFSX0NPREUoJ3RzcmMnKQoga0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kQ29tcG9uZW50SW5zdGFuY2UgPSBGT1VSX0NIQVJfQ09ERSgndHNjaScpCiBrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRTTFJlYyA9IEZPVVJfQ0hBUl9DT0RFKCd0c3NsJykKQEAgLTM1MCw5ICszNTAsOSBAQAoga0V2ZW50UGFyYW1UZXh0SW5wdXRSZXBseVNob3dIaWRlID0gRk9VUl9DSEFSX0NPREUoJ3Ryc2gnKQoga0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kS2V5Ym9hcmRFdmVudCA9IEZPVVJfQ0hBUl9DT0RFKCd0c2tlJykKIGtFdmVudFBhcmFtVGV4dElucHV0U2VuZFRleHRTZXJ2aWNlRW5jb2RpbmcgPSBGT1VSX0NIQVJfQ09ERSgndHNzZScpCi1rRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRUZXh0U2VydmljZU1hY0VuY29kaW5nID0gRk9VUl9DSEFSX0NPREUoJ3Rzc20nKSAKK2tFdmVudFBhcmFtVGV4dElucHV0U2VuZFRleHRTZXJ2aWNlTWFjRW5jb2RpbmcgPSBGT1VSX0NIQVJfQ09ERSgndHNzbScpCiBrRXZlbnRQYXJhbUhJQ29tbWFuZCA9IEZPVVJfQ0hBUl9DT0RFKCdoY21kJykKLXR5cGVISUNvbW1hbmQgPSBGT1VSX0NIQVJfQ09ERSgnaGNtZCcpIAordHlwZUhJQ29tbWFuZCA9IEZPVVJfQ0hBUl9DT0RFKCdoY21kJykKIGtFdmVudFBhcmFtV2luZG93RmVhdHVyZXMgPSBGT1VSX0NIQVJfQ09ERSgnd2Z0cicpCiBrRXZlbnRQYXJhbVdpbmRvd0RlZlBhcnQgPSBGT1VSX0NIQVJfQ09ERSgnd2RwYycpCiBrRXZlbnRQYXJhbUN1cnJlbnRCb3VuZHMgPSBGT1VSX0NIQVJfQ09ERSgnY3JjdCcpCkBAIC0zNzUsNyArMzc1LDcgQEAKIGtFdmVudFBhcmFtQ3VycmVudERvY2tSZWN0ID0gRk9VUl9DSEFSX0NPREUoJ2NkcmMnKQogdHlwZVdpbmRvd1JlZ2lvbkNvZGUgPSBGT1VSX0NIQVJfQ09ERSgnd3NocCcpCiB0eXBlV2luZG93RGVmUGFydENvZGUgPSBGT1VSX0NIQVJfQ09ERSgnd2RwdCcpCi10eXBlQ2xpY2tBY3RpdmF0aW9uUmVzdWx0ID0gRk9VUl9DSEFSX0NPREUoJ2NsYWMnKSAKK3R5cGVDbGlja0FjdGl2YXRpb25SZXN1bHQgPSBGT1VSX0NIQVJfQ09ERSgnY2xhYycpCiBrRXZlbnRQYXJhbUNvbnRyb2xQYXJ0ID0gRk9VUl9DSEFSX0NPREUoJ2NwcnQnKQoga0V2ZW50UGFyYW1Jbml0Q29sbGVjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdpY29sJykKIGtFdmVudFBhcmFtQ29udHJvbE1lc3NhZ2UgPSBGT1VSX0NIQVJfQ09ERSgnY21zZycpCkBAIC00MDIsNyArNDAyLDcgQEAKIGtFdmVudFBhcmFtQ29udHJvbEN1cnJlbnRPd25pbmdXaW5kb3cgPSBGT1VSX0NIQVJfQ09ERSgnY2NvdycpCiB0eXBlQ29udHJvbEFjdGlvblVQUCA9IEZPVVJfQ0hBUl9DT0RFKCdjYXVwJykKIHR5cGVJbmRpY2F0b3JEcmFnQ29uc3RyYWludCA9IEZPVVJfQ0hBUl9DT0RFKCdjaWRjJykKLXR5cGVDb250cm9sUGFydENvZGUgPSBGT1VSX0NIQVJfQ09ERSgnY3BydCcpIAordHlwZUNvbnRyb2xQYXJ0Q29kZSA9IEZPVVJfQ0hBUl9DT0RFKCdjcHJ0JykKIGtFdmVudFBhcmFtQ3VycmVudE1lbnVUcmFja2luZ01vZGUgPSBGT1VSX0NIQVJfQ09ERSgnY210bScpCiBrRXZlbnRQYXJhbU5ld01lbnVUcmFja2luZ01vZGUgPSBGT1VSX0NIQVJfQ09ERSgnbm10bScpCiBrRXZlbnRQYXJhbU1lbnVGaXJzdE9wZW4gPSBGT1VSX0NIQVJfQ09ERSgnMXN0bycpCkBAIC00MjgsMjQgKzQyOCwyNCBAQAogdHlwZU1lbnVUcmFja2luZ01vZGUgPSBGT1VSX0NIQVJfQ09ERSgnbXRtZCcpCiB0eXBlTWVudUV2ZW50T3B0aW9ucyA9IEZPVVJfQ0hBUl9DT0RFKCdtZW9wJykKIHR5cGVUaGVtZU1lbnVTdGF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCd0bW5zJykKLXR5cGVUaGVtZU1lbnVJdGVtVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0bWl0JykgCit0eXBlVGhlbWVNZW51SXRlbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndG1pdCcpCiBrRXZlbnRQYXJhbVByb2Nlc3NJRCA9IEZPVVJfQ0hBUl9DT0RFKCdwc24gJykKIGtFdmVudFBhcmFtTGF1bmNoUmVmQ29uID0gRk9VUl9DSEFSX0NPREUoJ2xyZWYnKQota0V2ZW50UGFyYW1MYXVuY2hFcnIgPSBGT1VSX0NIQVJfQ09ERSgnZXJyICcpIAora0V2ZW50UGFyYW1MYXVuY2hFcnIgPSBGT1VSX0NIQVJfQ09ERSgnZXJyICcpCiBrRXZlbnRQYXJhbVRhYmxldFBvaW50UmVjID0gRk9VUl9DSEFSX0NPREUoJ3RicmMnKQoga0V2ZW50UGFyYW1UYWJsZXRQcm94aW1pdHlSZWMgPSBGT1VSX0NIQVJfQ09ERSgndGJweCcpCiB0eXBlVGFibGV0UG9pbnRSZWMgPSBGT1VSX0NIQVJfQ09ERSgndGJyYycpCiB0eXBlVGFibGV0UHJveGltaXR5UmVjID0gRk9VUl9DSEFSX0NPREUoJ3RicHgnKQoga0V2ZW50UGFyYW1UYWJsZXRQb2ludGVyUmVjID0gRk9VUl9DSEFSX0NPREUoJ3RicmMnKQotdHlwZVRhYmxldFBvaW50ZXJSZWMgPSBGT1VSX0NIQVJfQ09ERSgndGJyYycpIAota0V2ZW50UGFyYW1OZXdTY3JvbGxCYXJWYXJpYW50ID0gRk9VUl9DSEFSX0NPREUoJ25zYnYnKSAKK3R5cGVUYWJsZXRQb2ludGVyUmVjID0gRk9VUl9DSEFSX0NPREUoJ3RicmMnKQora0V2ZW50UGFyYW1OZXdTY3JvbGxCYXJWYXJpYW50ID0gRk9VUl9DSEFSX0NPREUoJ25zYnYnKQoga0V2ZW50UGFyYW1TY3JhcFJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdzY3JwJykKIGtFdmVudFBhcmFtU2VydmljZUNvcHlUeXBlcyA9IEZPVVJfQ0hBUl9DT0RFKCdzdnNkJykKIGtFdmVudFBhcmFtU2VydmljZVBhc3RlVHlwZXMgPSBGT1VSX0NIQVJfQ09ERSgnc3ZwdCcpCiBrRXZlbnRQYXJhbVNlcnZpY2VNZXNzYWdlTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdzdm1nJykKIGtFdmVudFBhcmFtU2VydmljZVVzZXJEYXRhID0gRk9VUl9DSEFSX0NPREUoJ3N2dWQnKQogdHlwZVNjcmFwUmVmID0gRk9VUl9DSEFSX0NPREUoJ3NjcnAnKQotdHlwZUNGTXV0YWJsZUFycmF5UmVmID0gRk9VUl9DSEFSX0NPREUoJ2NmbWEnKSAKK3R5cGVDRk11dGFibGVBcnJheVJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdjZm1hJykKICMgc0hhbmRsZXIgPSBOZXdFdmVudEhhbmRsZXJVUFAoIHggKQoga01vdXNlVHJhY2tpbmdNb3VzZVByZXNzZWQgPSBrTW91c2VUcmFja2luZ01vdXNlRG93bgoga01vdXNlVHJhY2tpbmdNb3VzZVJlbGVhc2VkID0ga01vdXNlVHJhY2tpbmdNb3VzZVVwCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0NvbXBvbmVudHMucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0NvbXBvbmVudHMucHkKaW5kZXggM2ZiY2EwMi4uNzU1NzRjZiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9Db21wb25lbnRzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vQ29tcG9uZW50cy5weQpAQCAtMyw3ICszLDcgQEAKIGRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKIGtBcHBsZU1hbnVmYWN0dXJlciA9IEZPVVJfQ0hBUl9DT0RFKCdhcHBsJykKIGtDb21wb25lbnRSZXNvdXJjZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndGhuZycpCi1rQ29tcG9uZW50QWxpYXNSZXNvdXJjZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndGhnYScpIAora0NvbXBvbmVudEFsaWFzUmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RoZ2EnKQoga0FueUNvbXBvbmVudFR5cGUgPSAwCiBrQW55Q29tcG9uZW50U3ViVHlwZSA9IDAKIGtBbnlDb21wb25lbnRNYW51ZmFjdHVyZXIgPSAwCkBAIC0xOSw3ICsxOSw3IEBACiBrQ29tcG9uZW50VW5yZWdpc3RlclNlbGVjdCA9IC03CiBrQ29tcG9uZW50R2V0TVBXb3JrRnVuY3Rpb25TZWxlY3QgPSAtOAoga0NvbXBvbmVudEV4ZWN1dGVXaXJlZEFjdGlvblNlbGVjdCA9IC05Ci1rQ29tcG9uZW50R2V0UHVibGljUmVzb3VyY2VTZWxlY3QgPSAtMTAgCitrQ29tcG9uZW50R2V0UHVibGljUmVzb3VyY2VTZWxlY3QgPSAtMTAKIGNvbXBvbmVudERvQXV0b1ZlcnNpb24gPSAoMSA8PCAwKQogY29tcG9uZW50V2FudHNVbnJlZ2lzdGVyID0gKDEgPDwgMSkKIGNvbXBvbmVudEF1dG9WZXJzaW9uSW5jbHVkZUZsYWdzID0gKDEgPDwgMikKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9DYXJib24vQ29udHJvbEFjY2Vzc29yLnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9Db250cm9sQWNjZXNzb3IucHkKaW5kZXggNzkxNTQ0ZS4uMDk5ODkyNSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9Db250cm9sQWNjZXNzb3IucHkKKysrIGIvTGliL3BsYXQtbWFjL0NhcmJvbi9Db250cm9sQWNjZXNzb3IucHkKQEAgLTYsMjIgKzYsMjIgQEAKICMgVGhlc2UgbmVlZG4ndCBnbyB0aHJvdWdoIHRoaXMgbW9kdWxlLCBidXQgYXJlIGhlcmUgZm9yIGNvbXBsZXRlbmVzcwogZGVmIFNldENvbnRyb2xEYXRhX0hhbmRsZShjb250cm9sLCBwYXJ0LCBzZWxlY3RvciwgZGF0YSk6CiAgICAgY29udHJvbC5TZXRDb250cm9sRGF0YV9IYW5kbGUocGFydCwgc2VsZWN0b3IsIGRhdGEpCi0gICAgCisKIGRlZiBHZXRDb250cm9sRGF0YV9IYW5kbGUoY29udHJvbCwgcGFydCwgc2VsZWN0b3IpOgogICAgIHJldHVybiBjb250cm9sLkdldENvbnRyb2xEYXRhX0hhbmRsZShwYXJ0LCBzZWxlY3RvcikKLSAgICAKKwogX2FjY2Vzc2RpY3QgPSB7CiAgICAga0NvbnRyb2xQb3B1cEJ1dHRvbk1lbnVIYW5kbGVUYWc6IChTZXRDb250cm9sRGF0YV9IYW5kbGUsIEdldENvbnRyb2xEYXRhX0hhbmRsZSksCiB9CiAKIF9jb2RpbmdkaWN0ID0gewogICAgIGtDb250cm9sUHVzaEJ1dHRvbkRlZmF1bHRUYWcgOiAoImIiLCBOb25lLCBOb25lKSwKLSAgICAKKwogICAgIGtDb250cm9sRWRpdFRleHRUZXh0VGFnOiAoTm9uZSwgTm9uZSwgTm9uZSksCiAgICAga0NvbnRyb2xFZGl0VGV4dFBhc3N3b3JkVGFnOiAoTm9uZSwgTm9uZSwgTm9uZSksCi0gICAgCisKICAgICBrQ29udHJvbFBvcHVwQnV0dG9uTWVudUlEVGFnOiAoImgiLCBOb25lLCBOb25lKSwKLSAgICAKKwogICAgIGtDb250cm9sTGlzdEJveERvdWJsZUNsaWNrVGFnOiAoImIiLCBOb25lLCBOb25lKSwKIH0KIApAQCAtMzgsNyArMzgsNyBAQAogICAgIGlmIHN0cnVjdGZtdDoKICAgICAgICAgZGF0YSA9IHN0cnVjdC5wYWNrKHN0cnVjdGZtdCwgZGF0YSkKICAgICBjb250cm9sLlNldENvbnRyb2xEYXRhKHBhcnQsIHNlbGVjdG9yLCBkYXRhKQotICAgIAorCiBkZWYgR2V0Q29udHJvbERhdGEoY29udHJvbCwgcGFydCwgc2VsZWN0b3IpOgogICAgIGlmIF9hY2Nlc3NkaWN0Lmhhc19rZXkoc2VsZWN0b3IpOgogICAgICAgICBzZXRmdW5jLCBnZXRmdW5jID0gX2FjY2Vzc2RpY3Rbc2VsZWN0b3JdCkBAIC01NCw0ICs1NCwzIEBACiAgICAgaWYgdHlwZShkYXRhKSA9PSB0eXBlKCgpKSBhbmQgbGVuKGRhdGEpID09IDE6CiAgICAgICAgIGRhdGEgPSBkYXRhWzBdCiAgICAgcmV0dXJuIGRhdGEKLSAgICAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9DYXJib24vQ29udHJvbHMucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0NvbnRyb2xzLnB5CmluZGV4IGQ0YmJkYTMuLjZlNWQ4ZWEgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9DYXJib24vQ29udHJvbHMucHkKKysrIGIvTGliL3BsYXQtbWFjL0NhcmJvbi9Db250cm9scy5weQpAQCAtMTcsMjAgKzE3LDIwIEBACiBjb250cm9sTm90aWZ5Tm90aGluZyA9IEZPVVJfQ0hBUl9DT0RFKCduYWRhJykKIGNvbnRyb2xOb3RpZnlDbGljayA9IEZPVVJfQ0hBUl9DT0RFKCdjbGlrJykKIGNvbnRyb2xOb3RpZnlGb2N1cyA9IEZPVVJfQ0hBUl9DT0RFKCdmb2N1JykKLWNvbnRyb2xOb3RpZnlLZXkgPSBGT1VSX0NIQVJfQ09ERSgna2V5ICcpIAota0NvbnRyb2xDYW5BdXRvSW52YWxpZGF0ZSA9IDFMIDw8IDAgCitjb250cm9sTm90aWZ5S2V5ID0gRk9VUl9DSEFSX0NPREUoJ2tleSAnKQora0NvbnRyb2xDYW5BdXRvSW52YWxpZGF0ZSA9IDFMIDw8IDAKIHN0YXRpY1RleHRQcm9jID0gMjU2CiBlZGl0VGV4dFByb2MgPSAyNzIKIGljb25Qcm9jID0gMjg4CiB1c2VySXRlbVByb2MgPSAzMDQKLXBpY3RJdGVtUHJvYyA9IDMyMCAgIAorcGljdEl0ZW1Qcm9jID0gMzIwCiBjRnJhbWVDb2xvciA9IDAKIGNCb2R5Q29sb3IgPSAxCiBjVGV4dENvbG9yID0gMgogY1RodW1iQ29sb3IgPSAzCiBrTnVtYmVyQ3RsQ1RhYkVudHJpZXMgPSA0CiBrQ29udHJvbE5vVmFyaWFudCA9IDAKLWtDb250cm9sVXNlc093bmluZ1dpbmRvd3NGb250VmFyaWFudCA9IDEgPDwgMyAKK2tDb250cm9sVXNlc093bmluZ1dpbmRvd3NGb250VmFyaWFudCA9IDEgPDwgMwoga0NvbnRyb2xOb1BhcnQgPSAwCiBrQ29udHJvbEluZGljYXRvclBhcnQgPSAxMjkKIGtDb250cm9sRGlzYWJsZWRQYXJ0ID0gMjU0CkBAIC00MCw3ICs0MCw3IEBACiBrQ29udHJvbENvbnRlbnRNZXRhUGFydCA9IC0yCiBrQ29udHJvbEZvY3VzTm9QYXJ0ID0gMAoga0NvbnRyb2xGb2N1c05leHRQYXJ0ID0gLTEKLWtDb250cm9sRm9jdXNQcmV2UGFydCA9IC0yICAgIAora0NvbnRyb2xGb2N1c1ByZXZQYXJ0ID0gLTIKIGtDb250cm9sQ29sbGVjdGlvblRhZ0JvdW5kcyA9IEZPVVJfQ0hBUl9DT0RFKCdib3VuJykKIGtDb250cm9sQ29sbGVjdGlvblRhZ1ZhbHVlID0gRk9VUl9DSEFSX0NPREUoJ3ZhbHUnKQoga0NvbnRyb2xDb2xsZWN0aW9uVGFnTWluaW11bSA9IEZPVVJfQ0hBUl9DT0RFKCdtaW4gJykKQEAgLTUzLDcgKzUzLDcgQEAKIGtDb250cm9sQ29sbGVjdGlvblRhZ0lEU2lnbmF0dXJlID0gRk9VUl9DSEFSX0NPREUoJ2lkc2knKQoga0NvbnRyb2xDb2xsZWN0aW9uVGFnSURJRCA9IEZPVVJfQ0hBUl9DT0RFKCdpZGlkJykKIGtDb250cm9sQ29sbGVjdGlvblRhZ0NvbW1hbmQgPSBGT1VSX0NIQVJfQ09ERSgnY21kICcpCi1rQ29udHJvbENvbGxlY3Rpb25UYWdWYXJDb2RlID0gRk9VUl9DSEFSX0NPREUoJ3ZhcmMnKSAKK2tDb250cm9sQ29sbGVjdGlvblRhZ1ZhckNvZGUgPSBGT1VSX0NIQVJfQ09ERSgndmFyYycpCiBrQ29udHJvbENvbnRlbnRUZXh0T25seSA9IDAKIGtDb250cm9sTm9Db250ZW50ID0gMAoga0NvbnRyb2xDb250ZW50SWNvblN1aXRlUmVzID0gMQpAQCAtNjcsMTEgKzY3LDExIEBACiBrQ29udHJvbENvbnRlbnRJQ09OID0gMTMzCiBrQ29udHJvbEtleVNjcmlwdEJlaGF2aW9yQWxsb3dBbnlTY3JpcHQgPSBGT1VSX0NIQVJfQ09ERSgnYW55ICcpCiBrQ29udHJvbEtleVNjcmlwdEJlaGF2aW9yUHJlZmVyc1JvbWFuID0gRk9VUl9DSEFSX0NPREUoJ3BybW4nKQota0NvbnRyb2xLZXlTY3JpcHRCZWhhdmlvclJlcXVpcmVzUm9tYW4gPSBGT1VSX0NIQVJfQ09ERSgncnJtbicpIAora0NvbnRyb2xLZXlTY3JpcHRCZWhhdmlvclJlcXVpcmVzUm9tYW4gPSBGT1VSX0NIQVJfQ09ERSgncnJtbicpCiBrQ29udHJvbEZvbnRCaWdTeXN0ZW1Gb250ID0gLTEKIGtDb250cm9sRm9udFNtYWxsU3lzdGVtRm9udCA9IC0yCiBrQ29udHJvbEZvbnRTbWFsbEJvbGRTeXN0ZW1Gb250ID0gLTMKLWtDb250cm9sRm9udFZpZXdTeXN0ZW1Gb250ID0gLTQgICAgCitrQ29udHJvbEZvbnRWaWV3U3lzdGVtRm9udCA9IC00CiBrQ29udHJvbFVzZUZvbnRNYXNrID0gMHgwMDAxCiBrQ29udHJvbFVzZUZhY2VNYXNrID0gMHgwMDAyCiBrQ29udHJvbFVzZVNpemVNYXNrID0gMHgwMDA0CkBAIC04MSwxMiArODEsMTIgQEAKIGtDb250cm9sVXNlSnVzdE1hc2sgPSAweDAwNDAKIGtDb250cm9sVXNlQWxsTWFzayA9IDB4MDBGRgoga0NvbnRyb2xBZGRGb250U2l6ZU1hc2sgPSAweDAxMDAKLWtDb250cm9sQWRkVG9NZXRhRm9udE1hc2sgPSAweDAyMDAgCi1rQ29udHJvbFVzZVRoZW1lRm9udElETWFzayA9IDB4MDA4MCAKK2tDb250cm9sQWRkVG9NZXRhRm9udE1hc2sgPSAweDAyMDAKK2tDb250cm9sVXNlVGhlbWVGb250SURNYXNrID0gMHgwMDgwCiBrRG9Ob3RBY3RpdmF0ZUFuZElnbm9yZUNsaWNrID0gMAoga0RvTm90QWN0aXZhdGVBbmRIYW5kbGVDbGljayA9IDEKIGtBY3RpdmF0ZUFuZElnbm9yZUNsaWNrID0gMgota0FjdGl2YXRlQW5kSGFuZGxlQ2xpY2sgPSAzICAgICAKK2tBY3RpdmF0ZUFuZEhhbmRsZUNsaWNrID0gMwoga0NvbnRyb2xGb250U3R5bGVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnZm9udCcpCiBrQ29udHJvbEtleUZpbHRlclRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdmbHRyJykKIGtDb250cm9sS2luZFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdraW5kJykKQEAgLTExMCw3ICsxMTAsNyBAQAoga0NvbnRyb2xTdXBwb3J0c1NldEN1cnNvciA9IDEgPDwgMjAKIGtDb250cm9sU3VwcG9ydHNDb250ZXh0dWFsTWVudXMgPSAxIDw8IDIxCiBrQ29udHJvbFN1cHBvcnRzQ2xpY2tBY3RpdmF0aW9uID0gMSA8PCAyMgota0NvbnRyb2xJZGxlc1dpdGhUaW1lciA9IDEgPDwgMjMgCitrQ29udHJvbElkbGVzV2l0aFRpbWVyID0gMSA8PCAyMwogZHJhd0NudGwgPSAwCiB0ZXN0Q250bCA9IDEKIGNhbGNDUmducyA9IDIKQEAgLTE0OSw3ICsxNDksNyBAQAoga0NvbnRyb2xNc2dEcmFnUmVjZWl2ZSA9IDQxCiBrQ29udHJvbE1zZ0Rpc3BsYXlEZWJ1Z0luZm8gPSA0Ngoga0NvbnRyb2xNc2dDb250ZXh0dWFsTWVudUNsaWNrID0gNDcKLWtDb250cm9sTXNnR2V0Q2xpY2tBY3RpdmF0aW9uID0gNDggICAgCitrQ29udHJvbE1zZ0dldENsaWNrQWN0aXZhdGlvbiA9IDQ4CiBrQ29udHJvbFNpemVOb3JtYWwgPSAwCiBrQ29udHJvbFNpemVTbWFsbCA9IDEKIGtDb250cm9sU2l6ZUxhcmdlID0gMgpAQCAtMTY1LDkgKzE2NSw5IEBACiBoQXhpc09ubHkgPSAxCiB2QXhpc09ubHkgPSAyCiBrQ29udHJvbERlZlByb2NQdHIgPSAwCi1rQ29udHJvbERlZk9iamVjdENsYXNzID0gMSAgICAgCitrQ29udHJvbERlZk9iamVjdENsYXNzID0gMQoga0NvbnRyb2xLaW5kU2lnbmF0dXJlQXBwbGUgPSBGT1VSX0NIQVJfQ09ERSgnYXBwbCcpCi1rQ29udHJvbFByb3BlcnR5UGVyc2lzdGVudCA9IDB4MDAwMDAwMDEgCitrQ29udHJvbFByb3BlcnR5UGVyc2lzdGVudCA9IDB4MDAwMDAwMDEKIGtEcmFnVHJhY2tpbmdFbnRlckNvbnRyb2wgPSAyCiBrRHJhZ1RyYWNraW5nSW5Db250cm9sID0gMwoga0RyYWdUcmFja2luZ0xlYXZlQ29udHJvbCA9IDQKQEAgLTE3OCw3ICsxNzgsNyBAQAoga1Jlc2VydmVkQ29udHJvbFBhcnQgPSBrQ29udHJvbERpc2FibGVkUGFydAoga0NvbnRyb2xJbmFjdGl2ZUNvbnRyb2xQYXJ0ID0ga0NvbnRyb2xJbmFjdGl2ZVBhcnQKIGtDb250cm9sVGFiTGlzdFJlc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgndGFiIycpCi1rQ29udHJvbExpc3REZXNjUmVzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdsZGVzJykgCitrQ29udHJvbExpc3REZXNjUmVzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdsZGVzJykKIGtDb250cm9sQ2hlY2tCb3hVbmNoZWNrZWRWYWx1ZSA9IDAKIGtDb250cm9sQ2hlY2tCb3hDaGVja2VkVmFsdWUgPSAxCiBrQ29udHJvbENoZWNrQm94TWl4ZWRWYWx1ZSA9IDIKQEAgLTIyOCw3ICsyMjgsNyBAQAoga0NvbnRyb2xDbG9ja1NlY29uZFllYXJQYXJ0ID0gMTEKIGtDb250cm9sQ2xvY2tBTVBNUGFydCA9IDEyCiBrQ29udHJvbERhdGFCcm93c2VyUGFydCA9IDI0Ci1rQ29udHJvbERhdGFCcm93c2VyRHJhZ2dlZFBhcnQgPSAyNSAgIAora0NvbnRyb2xEYXRhQnJvd3NlckRyYWdnZWRQYXJ0ID0gMjUKIGtDb250cm9sQmV2ZWxCdXR0b25TbWFsbEJldmVsUHJvYyA9IDMyCiBrQ29udHJvbEJldmVsQnV0dG9uTm9ybWFsQmV2ZWxQcm9jID0gMzMKIGtDb250cm9sQmV2ZWxCdXR0b25MYXJnZUJldmVsUHJvYyA9IDM0CkBAIC0yNDUsNyArMjQ1LDcgQEAKIGtDb250cm9sQmVoYXZpb3JTaW5nbGVWYWx1ZU1lbnUgPSAwCiBrQ29udHJvbEJlaGF2aW9yTXVsdGlWYWx1ZU1lbnUgPSAweDQwMDAKIGtDb250cm9sQmVoYXZpb3JPZmZzZXRDb250ZW50cyA9IDB4ODAwMAota0NvbnRyb2xCZWhhdmlvckNvbW1hbmRNZW51ID0gMHgyMDAwIAora0NvbnRyb2xCZWhhdmlvckNvbW1hbmRNZW51ID0gMHgyMDAwCiBrQ29udHJvbEJldmVsQnV0dG9uTWVudU9uQm90dG9tID0gMAoga0NvbnRyb2xCZXZlbEJ1dHRvbk1lbnVPblJpZ2h0ID0gKDEgPDwgMikKIGtDb250cm9sS2luZEJldmVsQnV0dG9uID0gRk9VUl9DSEFSX0NPREUoJ2JldmwnKQpAQCAtMjc5LDEyICsyNzksMTIgQEAKIGtDb250cm9sQmV2ZWxCdXR0b25NZW51VmFsdWVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnbXZhbCcpCiBrQ29udHJvbEJldmVsQnV0dG9uTWVudUhhbmRsZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdtaG5kJykKIGtDb250cm9sQmV2ZWxCdXR0b25NZW51UmVmVGFnID0gRk9VUl9DSEFSX0NPREUoJ21obmQnKQotIyBrQ29udHJvbEJldmVsQnV0dG9uQ2VudGVyUG9wdXBHbHlwaFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdwZ2xjJykgCisjIGtDb250cm9sQmV2ZWxCdXR0b25DZW50ZXJQb3B1cEdseXBoVGFnID0gRk9VUl9DSEFSX0NPREUoJ3BnbGMnKQoga0NvbnRyb2xCZXZlbEJ1dHRvbkxhc3RNZW51VGFnID0gRk9VUl9DSEFSX0NPREUoJ2xtbnUnKQota0NvbnRyb2xCZXZlbEJ1dHRvbk1lbnVEZWxheVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdtZGx5JykgCi1rQ29udHJvbEJldmVsQnV0dG9uU2NhbGVJY29uVGFnID0gRk9VUl9DSEFSX0NPREUoJ3NjYWwnKSAKK2tDb250cm9sQmV2ZWxCdXR0b25NZW51RGVsYXlUYWcgPSBGT1VSX0NIQVJfQ09ERSgnbWRseScpCitrQ29udHJvbEJldmVsQnV0dG9uU2NhbGVJY29uVGFnID0gRk9VUl9DSEFSX0NPREUoJ3NjYWwnKQoga0NvbnRyb2xCZXZlbEJ1dHRvbk93bmVkTWVudVJlZlRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdvbXJmJykKLWtDb250cm9sQmV2ZWxCdXR0b25LaW5kVGFnID0gRk9VUl9DSEFSX0NPREUoJ2JlYmsnKSAKK2tDb250cm9sQmV2ZWxCdXR0b25LaW5kVGFnID0gRk9VUl9DSEFSX0NPREUoJ2JlYmsnKQoga0NvbnRyb2xTbGlkZXJQcm9jID0gNDgKIGtDb250cm9sU2xpZGVyTGl2ZUZlZWRiYWNrID0gKDEgPDwgMCkKIGtDb250cm9sU2xpZGVySGFzVGlja01hcmtzID0gKDEgPDwgMSkKQEAgLTMwMiwxOCArMzAyLDE4IEBACiBrQ29udHJvbERpc2Nsb3N1cmVUcmlhbmdsZVBvaW50UmlnaHQgPSAxCiBrQ29udHJvbERpc2Nsb3N1cmVUcmlhbmdsZVBvaW50TGVmdCA9IDIKIGtDb250cm9sS2luZERpc2Nsb3N1cmVUcmlhbmdsZSA9IEZPVVJfQ0hBUl9DT0RFKCdkaXN0JykKLWtDb250cm9sVHJpYW5nbGVMYXN0VmFsdWVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnbGFzdCcpIAora0NvbnRyb2xUcmlhbmdsZUxhc3RWYWx1ZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdsYXN0JykKIGtDb250cm9sUHJvZ3Jlc3NCYXJQcm9jID0gODAKIGtDb250cm9sUmVsZXZhbmNlQmFyUHJvYyA9IDgxCiBrQ29udHJvbEtpbmRQcm9ncmVzc0JhciA9IEZPVVJfQ0hBUl9DT0RFKCdwcmdiJykKIGtDb250cm9sS2luZFJlbGV2YW5jZUJhciA9IEZPVVJfQ0hBUl9DT0RFKCdyZWxiJykKIGtDb250cm9sUHJvZ3Jlc3NCYXJJbmRldGVybWluYXRlVGFnID0gRk9VUl9DSEFSX0NPREUoJ2luZGUnKQota0NvbnRyb2xQcm9ncmVzc0JhckFuaW1hdGluZ1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdhbmltJykgCitrQ29udHJvbFByb2dyZXNzQmFyQW5pbWF0aW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ2FuaW0nKQoga0NvbnRyb2xMaXR0bGVBcnJvd3NQcm9jID0gOTYKIGtDb250cm9sS2luZExpdHRsZUFycm93cyA9IEZPVVJfQ0hBUl9DT0RFKCdsYXJyJykKIGtDb250cm9sQ2hhc2luZ0Fycm93c1Byb2MgPSAxMTIKIGtDb250cm9sS2luZENoYXNpbmdBcnJvd3MgPSBGT1VSX0NIQVJfQ09ERSgnY2FycicpCi1rQ29udHJvbENoYXNpbmdBcnJvd3NBbmltYXRpbmdUYWcgPSBGT1VSX0NIQVJfQ09ERSgnYW5pbScpIAora0NvbnRyb2xDaGFzaW5nQXJyb3dzQW5pbWF0aW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ2FuaW0nKQoga0NvbnRyb2xUYWJMYXJnZVByb2MgPSAxMjgKIGtDb250cm9sVGFiU21hbGxQcm9jID0gMTI5CiBrQ29udHJvbFRhYkxhcmdlTm9ydGhQcm9jID0gMTI4CkBAIC0zMjMsNyArMzIzLDcgQEAKIGtDb250cm9sVGFiTGFyZ2VFYXN0UHJvYyA9IDEzMgoga0NvbnRyb2xUYWJTbWFsbEVhc3RQcm9jID0gMTMzCiBrQ29udHJvbFRhYkxhcmdlV2VzdFByb2MgPSAxMzQKLWtDb250cm9sVGFiU21hbGxXZXN0UHJvYyA9IDEzNSAgIAora0NvbnRyb2xUYWJTbWFsbFdlc3RQcm9jID0gMTM1CiBrQ29udHJvbFRhYkRpcmVjdGlvbk5vcnRoID0gMAoga0NvbnRyb2xUYWJEaXJlY3Rpb25Tb3V0aCA9IDEKIGtDb250cm9sVGFiRGlyZWN0aW9uRWFzdCA9IDIKQEAgLTMzMywxMSArMzMzLDExIEBACiBrQ29udHJvbEtpbmRUYWJzID0gRk9VUl9DSEFSX0NPREUoJ3RhYnMnKQoga0NvbnRyb2xUYWJDb250ZW50UmVjdFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdyZWN0JykKIGtDb250cm9sVGFiRW5hYmxlZEZsYWdUYWcgPSBGT1VSX0NIQVJfQ09ERSgnZW5hYicpCi1rQ29udHJvbFRhYkZvbnRTdHlsZVRhZyA9IGtDb250cm9sRm9udFN0eWxlVGFnIAota0NvbnRyb2xUYWJJbmZvVGFnID0gRk9VUl9DSEFSX0NPREUoJ3RhYmknKSAKLWtDb250cm9sVGFiSW1hZ2VDb250ZW50VGFnID0gRk9VUl9DSEFSX0NPREUoJ2NvbnQnKSAKK2tDb250cm9sVGFiRm9udFN0eWxlVGFnID0ga0NvbnRyb2xGb250U3R5bGVUYWcKK2tDb250cm9sVGFiSW5mb1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0YWJpJykKK2tDb250cm9sVGFiSW1hZ2VDb250ZW50VGFnID0gRk9VUl9DSEFSX0NPREUoJ2NvbnQnKQoga0NvbnRyb2xUYWJJbmZvVmVyc2lvblplcm8gPSAwCi1rQ29udHJvbFRhYkluZm9WZXJzaW9uT25lID0gMSAgICAgCitrQ29udHJvbFRhYkluZm9WZXJzaW9uT25lID0gMQoga0NvbnRyb2xTZXBhcmF0b3JMaW5lUHJvYyA9IDE0NAoga0NvbnRyb2xLaW5kU2VwYXJhdG9yID0gRk9VUl9DSEFSX0NPREUoJ3NlcGEnKQoga0NvbnRyb2xHcm91cEJveFRleHRUaXRsZVByb2MgPSAxNjAKQEAgLTM1MSwxMyArMzUxLDEzIEBACiBrQ29udHJvbEtpbmRQb3B1cEdyb3VwQm94ID0gRk9VUl9DSEFSX0NPREUoJ3BncnAnKQoga0NvbnRyb2xHcm91cEJveE1lbnVIYW5kbGVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnbWhhbicpCiBrQ29udHJvbEdyb3VwQm94TWVudVJlZlRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdtaGFuJykKLWtDb250cm9sR3JvdXBCb3hGb250U3R5bGVUYWcgPSBrQ29udHJvbEZvbnRTdHlsZVRhZyAKLWtDb250cm9sR3JvdXBCb3hUaXRsZVJlY3RUYWcgPSBGT1VSX0NIQVJfQ09ERSgndHJlYycpIAora0NvbnRyb2xHcm91cEJveEZvbnRTdHlsZVRhZyA9IGtDb250cm9sRm9udFN0eWxlVGFnCitrQ29udHJvbEdyb3VwQm94VGl0bGVSZWN0VGFnID0gRk9VUl9DSEFSX0NPREUoJ3RyZWMnKQoga0NvbnRyb2xJbWFnZVdlbGxQcm9jID0gMTc2CiBrQ29udHJvbEtpbmRJbWFnZVdlbGwgPSBGT1VSX0NIQVJfQ09ERSgnd2VsbCcpCiBrQ29udHJvbEltYWdlV2VsbENvbnRlbnRUYWcgPSBGT1VSX0NIQVJfQ09ERSgnY29udCcpCiBrQ29udHJvbEltYWdlV2VsbFRyYW5zZm9ybVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0cmFuJykKLWtDb250cm9sSW1hZ2VXZWxsSXNEcmFnRGVzdGluYXRpb25UYWcgPSBGT1VSX0NIQVJfQ09ERSgnZHJhZycpIAora0NvbnRyb2xJbWFnZVdlbGxJc0RyYWdEZXN0aW5hdGlvblRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdkcmFnJykKIGtDb250cm9sUG9wdXBBcnJvd0Vhc3RQcm9jID0gMTkyCiBrQ29udHJvbFBvcHVwQXJyb3dXZXN0UHJvYyA9IDE5Mwoga0NvbnRyb2xQb3B1cEFycm93Tm9ydGhQcm9jID0gMTk0CkBAIC0zOTIsNyArMzkyLDcgQEAKIGtDb250cm9sS2luZENsb2NrID0gRk9VUl9DSEFSX0NPREUoJ2NsY2snKQoga0NvbnRyb2xDbG9ja0xvbmdEYXRlVGFnID0gRk9VUl9DSEFSX0NPREUoJ2RhdGUnKQoga0NvbnRyb2xDbG9ja0ZvbnRTdHlsZVRhZyA9IGtDb250cm9sRm9udFN0eWxlVGFnCi1rQ29udHJvbENsb2NrQW5pbWF0aW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ2FuaW0nKSAKK2tDb250cm9sQ2xvY2tBbmltYXRpbmdUYWcgPSBGT1VSX0NIQVJfQ09ERSgnYW5pbScpCiBrQ29udHJvbFVzZXJQYW5lUHJvYyA9IDI1Ngoga0NvbnRyb2xLaW5kVXNlclBhbmUgPSBGT1VSX0NIQVJfQ09ERSgndXBhbicpCiBrQ29udHJvbFVzZXJJdGVtRHJhd1Byb2NUYWcgPSBGT1VSX0NIQVJfQ09ERSgndWlkcCcpCkBAIC00MDMsNjMgKzQwMyw2MyBAQAoga0NvbnRyb2xVc2VyUGFuZUtleURvd25Qcm9jVGFnID0gRk9VUl9DSEFSX0NPREUoJ2tleWQnKQoga0NvbnRyb2xVc2VyUGFuZUFjdGl2YXRlUHJvY1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdhY3RpJykKIGtDb250cm9sVXNlclBhbmVGb2N1c1Byb2NUYWcgPSBGT1VSX0NIQVJfQ09ERSgnZm9jaScpCi1rQ29udHJvbFVzZXJQYW5lQmFja2dyb3VuZFByb2NUYWcgPSBGT1VSX0NIQVJfQ09ERSgnYmFjaycpIAora0NvbnRyb2xVc2VyUGFuZUJhY2tncm91bmRQcm9jVGFnID0gRk9VUl9DSEFSX0NPREUoJ2JhY2snKQoga0NvbnRyb2xFZGl0VGV4dFByb2MgPSAyNzIKIGtDb250cm9sRWRpdFRleHRQYXNzd29yZFByb2MgPSAyNzQKLWtDb250cm9sRWRpdFRleHRJbmxpbmVJbnB1dFByb2MgPSAyNzYgCitrQ29udHJvbEVkaXRUZXh0SW5saW5lSW5wdXRQcm9jID0gMjc2CiBrQ29udHJvbEtpbmRFZGl0VGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdldHh0JykKIGtDb250cm9sRWRpdFRleHRTdHlsZVRhZyA9IGtDb250cm9sRm9udFN0eWxlVGFnCiBrQ29udHJvbEVkaXRUZXh0VGV4dFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0ZXh0JykKIGtDb250cm9sRWRpdFRleHRURUhhbmRsZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0aGFuJykKIGtDb250cm9sRWRpdFRleHRLZXlGaWx0ZXJUYWcgPSBrQ29udHJvbEtleUZpbHRlclRhZwoga0NvbnRyb2xFZGl0VGV4dFNlbGVjdGlvblRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzZWxlJykKLWtDb250cm9sRWRpdFRleHRQYXNzd29yZFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdwYXNzJykgCitrQ29udHJvbEVkaXRUZXh0UGFzc3dvcmRUYWcgPSBGT1VSX0NIQVJfQ09ERSgncGFzcycpCiBrQ29udHJvbEVkaXRUZXh0S2V5U2NyaXB0QmVoYXZpb3JUYWcgPSBGT1VSX0NIQVJfQ09ERSgna3NjcicpCiBrQ29udHJvbEVkaXRUZXh0TG9ja2VkVGFnID0gRk9VUl9DSEFSX0NPREUoJ2xvY2snKQoga0NvbnRyb2xFZGl0VGV4dEZpeGVkVGV4dFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdmdHh0JykKIGtDb250cm9sRWRpdFRleHRWYWxpZGF0aW9uUHJvY1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCd2YWxpJykKIGtDb250cm9sRWRpdFRleHRJbmxpbmVQcmVVcGRhdGVQcm9jVGFnID0gRk9VUl9DSEFSX0NPREUoJ3BydXAnKQota0NvbnRyb2xFZGl0VGV4dElubGluZVBvc3RVcGRhdGVQcm9jVGFnID0gRk9VUl9DSEFSX0NPREUoJ3BvdXAnKSAKK2tDb250cm9sRWRpdFRleHRJbmxpbmVQb3N0VXBkYXRlUHJvY1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdwb3VwJykKIGtDb250cm9sRWRpdFRleHRDRlN0cmluZ1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdjZnN0JykKLWtDb250cm9sRWRpdFRleHRQYXNzd29yZENGU3RyaW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ3B3Y2YnKSAKK2tDb250cm9sRWRpdFRleHRQYXNzd29yZENGU3RyaW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ3B3Y2YnKQoga0NvbnRyb2xTdGF0aWNUZXh0UHJvYyA9IDI4OAoga0NvbnRyb2xLaW5kU3RhdGljVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdzdHh0JykKIGtDb250cm9sU3RhdGljVGV4dFN0eWxlVGFnID0ga0NvbnRyb2xGb250U3R5bGVUYWcKIGtDb250cm9sU3RhdGljVGV4dFRleHRUYWcgPSBGT1VSX0NIQVJfQ09ERSgndGV4dCcpCi1rQ29udHJvbFN0YXRpY1RleHRUZXh0SGVpZ2h0VGFnID0gRk9VUl9DSEFSX0NPREUoJ3RoZWknKSAKLWtDb250cm9sU3RhdGljVGV4dFRydW5jVGFnID0gRk9VUl9DSEFSX0NPREUoJ3RydW4nKSAKLWtDb250cm9sU3RhdGljVGV4dENGU3RyaW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ2Nmc3QnKSAKK2tDb250cm9sU3RhdGljVGV4dFRleHRIZWlnaHRUYWcgPSBGT1VSX0NIQVJfQ09ERSgndGhlaScpCitrQ29udHJvbFN0YXRpY1RleHRUcnVuY1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0cnVuJykKK2tDb250cm9sU3RhdGljVGV4dENGU3RyaW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ2Nmc3QnKQoga0NvbnRyb2xQaWN0dXJlUHJvYyA9IDMwNAota0NvbnRyb2xQaWN0dXJlTm9UcmFja1Byb2MgPSAzMDUgICAKK2tDb250cm9sUGljdHVyZU5vVHJhY2tQcm9jID0gMzA1CiBrQ29udHJvbEtpbmRQaWN0dXJlID0gRk9VUl9DSEFSX0NPREUoJ3BpY3QnKQota0NvbnRyb2xQaWN0dXJlSGFuZGxlVGFnID0gRk9VUl9DSEFSX0NPREUoJ3BpY2gnKSAKK2tDb250cm9sUGljdHVyZUhhbmRsZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdwaWNoJykKIGtDb250cm9sSWNvblByb2MgPSAzMjAKIGtDb250cm9sSWNvbk5vVHJhY2tQcm9jID0gMzIxCiBrQ29udHJvbEljb25TdWl0ZVByb2MgPSAzMjIKLWtDb250cm9sSWNvblN1aXRlTm9UcmFja1Byb2MgPSAzMjMgICAKK2tDb250cm9sSWNvblN1aXRlTm9UcmFja1Byb2MgPSAzMjMKIGtDb250cm9sSWNvblJlZlByb2MgPSAzMjQKLWtDb250cm9sSWNvblJlZk5vVHJhY2tQcm9jID0gMzI1ICAgCitrQ29udHJvbEljb25SZWZOb1RyYWNrUHJvYyA9IDMyNQoga0NvbnRyb2xLaW5kSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdpY29uJykKIGtDb250cm9sSWNvblRyYW5zZm9ybVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0cmZtJykKLWtDb250cm9sSWNvbkFsaWdubWVudFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdhbGduJykgCitrQ29udHJvbEljb25BbGlnbm1lbnRUYWcgPSBGT1VSX0NIQVJfQ09ERSgnYWxnbicpCiBrQ29udHJvbEljb25SZXNvdXJjZUlEVGFnID0gRk9VUl9DSEFSX0NPREUoJ2lyZXMnKQota0NvbnRyb2xJY29uQ29udGVudFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdjb250JykgCitrQ29udHJvbEljb25Db250ZW50VGFnID0gRk9VUl9DSEFSX0NPREUoJ2NvbnQnKQoga0NvbnRyb2xXaW5kb3dIZWFkZXJQcm9jID0gMzM2Ci1rQ29udHJvbFdpbmRvd0xpc3RWaWV3SGVhZGVyUHJvYyA9IDMzNyAKK2tDb250cm9sV2luZG93TGlzdFZpZXdIZWFkZXJQcm9jID0gMzM3CiBrQ29udHJvbEtpbmRXaW5kb3dIZWFkZXIgPSBGT1VSX0NIQVJfQ09ERSgnd2hlZCcpCiBrQ29udHJvbExpc3RCb3hQcm9jID0gMzUyCiBrQ29udHJvbExpc3RCb3hBdXRvU2l6ZVByb2MgPSAzNTMKIGtDb250cm9sS2luZExpc3RCb3ggPSBGT1VSX0NIQVJfQ09ERSgnbGJveCcpCiBrQ29udHJvbExpc3RCb3hMaXN0SGFuZGxlVGFnID0gRk9VUl9DSEFSX0NPREUoJ2xoYW4nKQoga0NvbnRyb2xMaXN0Qm94S2V5RmlsdGVyVGFnID0ga0NvbnRyb2xLZXlGaWx0ZXJUYWcKLWtDb250cm9sTGlzdEJveEZvbnRTdHlsZVRhZyA9IGtDb250cm9sRm9udFN0eWxlVGFnIAora0NvbnRyb2xMaXN0Qm94Rm9udFN0eWxlVGFnID0ga0NvbnRyb2xGb250U3R5bGVUYWcKIGtDb250cm9sTGlzdEJveERvdWJsZUNsaWNrVGFnID0gRk9VUl9DSEFSX0NPREUoJ2RibGMnKQota0NvbnRyb2xMaXN0Qm94TERFRlRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdsZGVmJykgCitrQ29udHJvbExpc3RCb3hMREVGVGFnID0gRk9VUl9DSEFSX0NPREUoJ2xkZWYnKQoga0NvbnRyb2xQdXNoQnV0dG9uUHJvYyA9IDM2OAoga0NvbnRyb2xDaGVja0JveFByb2MgPSAzNjkKIGtDb250cm9sUmFkaW9CdXR0b25Qcm9jID0gMzcwCiBrQ29udHJvbFB1c2hCdXRMZWZ0SWNvblByb2MgPSAzNzQKLWtDb250cm9sUHVzaEJ1dFJpZ2h0SWNvblByb2MgPSAzNzUgICAKK2tDb250cm9sUHVzaEJ1dFJpZ2h0SWNvblByb2MgPSAzNzUKIGtDb250cm9sQ2hlY2tCb3hBdXRvVG9nZ2xlUHJvYyA9IDM3MQoga0NvbnRyb2xSYWRpb0J1dHRvbkF1dG9Ub2dnbGVQcm9jID0gMzcyCiBrQ29udHJvbFB1c2hCdXR0b25JY29uT25MZWZ0ID0gNgpAQCAtNDY5LDExICs0NjksMTEgQEAKIGtDb250cm9sS2luZFJhZGlvQnV0dG9uID0gRk9VUl9DSEFSX0NPREUoJ3JkaW8nKQoga0NvbnRyb2xLaW5kQ2hlY2tCb3ggPSBGT1VSX0NIQVJfQ09ERSgnY2JveCcpCiBrQ29udHJvbFB1c2hCdXR0b25EZWZhdWx0VGFnID0gRk9VUl9DSEFSX0NPREUoJ2RmbHQnKQota0NvbnRyb2xQdXNoQnV0dG9uQ2FuY2VsVGFnID0gRk9VUl9DSEFSX0NPREUoJ2NuY2wnKSAKK2tDb250cm9sUHVzaEJ1dHRvbkNhbmNlbFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdjbmNsJykKIGtDb250cm9sU2Nyb2xsQmFyUHJvYyA9IDM4NAota0NvbnRyb2xTY3JvbGxCYXJMaXZlUHJvYyA9IDM4NiAgIAora0NvbnRyb2xTY3JvbGxCYXJMaXZlUHJvYyA9IDM4Ngoga0NvbnRyb2xLaW5kU2Nyb2xsQmFyID0gRk9VUl9DSEFSX0NPREUoJ3NiYXInKQota0NvbnRyb2xTY3JvbGxCYXJTaG93c0Fycm93c1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdhcnJvJykgCitrQ29udHJvbFNjcm9sbEJhclNob3dzQXJyb3dzVGFnID0gRk9VUl9DSEFSX0NPREUoJ2Fycm8nKQoga0NvbnRyb2xQb3B1cEJ1dHRvblByb2MgPSA0MDAKIGtDb250cm9sUG9wdXBGaXhlZFdpZHRoVmFyaWFudCA9IDEgPDwgMAoga0NvbnRyb2xQb3B1cFZhcmlhYmxlV2lkdGhWYXJpYW50ID0gMSA8PCAxCkBAIC00ODIsMTAgKzQ4MiwxMCBAQAoga0NvbnRyb2xLaW5kUG9wdXBCdXR0b24gPSBGT1VSX0NIQVJfQ09ERSgncG9wYicpCiBrQ29udHJvbFBvcHVwQnV0dG9uTWVudUhhbmRsZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdtaGFuJykKIGtDb250cm9sUG9wdXBCdXR0b25NZW51UmVmVGFnID0gRk9VUl9DSEFSX0NPREUoJ21oYW4nKQota0NvbnRyb2xQb3B1cEJ1dHRvbk1lbnVJRFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdtbmlkJykgCitrQ29udHJvbFBvcHVwQnV0dG9uTWVudUlEVGFnID0gRk9VUl9DSEFSX0NPREUoJ21uaWQnKQoga0NvbnRyb2xQb3B1cEJ1dHRvbkV4dHJhSGVpZ2h0VGFnID0gRk9VUl9DSEFSX0NPREUoJ2V4aHQnKQota0NvbnRyb2xQb3B1cEJ1dHRvbk93bmVkTWVudVJlZlRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdvbXJmJykgCi1rQ29udHJvbFBvcHVwQnV0dG9uQ2hlY2tDdXJyZW50VGFnID0gRk9VUl9DSEFSX0NPREUoJ2NoY2snKSAKK2tDb250cm9sUG9wdXBCdXR0b25Pd25lZE1lbnVSZWZUYWcgPSBGT1VSX0NIQVJfQ09ERSgnb21yZicpCitrQ29udHJvbFBvcHVwQnV0dG9uQ2hlY2tDdXJyZW50VGFnID0gRk9VUl9DSEFSX0NPREUoJ2NoY2snKQoga0NvbnRyb2xSYWRpb0dyb3VwUHJvYyA9IDQxNgoga0NvbnRyb2xLaW5kUmFkaW9Hcm91cCA9IEZPVVJfQ0hBUl9DT0RFKCdyZ3JwJykKIGtDb250cm9sU2Nyb2xsVGV4dEJveFByb2MgPSA0MzIKQEAgLTQ5NSwxNCArNDk1LDE0IEBACiBrQ29udHJvbFNjcm9sbFRleHRCb3hEZWxheUJldHdlZW5BdXRvU2Nyb2xsVGFnID0gRk9VUl9DSEFSX0NPREUoJ3NjZGwnKQoga0NvbnRyb2xTY3JvbGxUZXh0Qm94QXV0b1Njcm9sbEFtb3VudFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzYW10JykKIGtDb250cm9sU2Nyb2xsVGV4dEJveENvbnRlbnRzVGFnID0gRk9VUl9DSEFSX0NPREUoJ3RyZXMnKQota0NvbnRyb2xTY3JvbGxUZXh0Qm94QW5pbWF0aW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ2FuaW0nKSAKK2tDb250cm9sU2Nyb2xsVGV4dEJveEFuaW1hdGluZ1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdhbmltJykKIGtDb250cm9sS2luZERpc2Nsb3N1cmVCdXR0b24gPSBGT1VSX0NIQVJfQ09ERSgnZGlzYicpCiBrQ29udHJvbERpc2Nsb3N1cmVCdXR0b25DbG9zZWQgPSAwCiBrQ29udHJvbERpc2Nsb3N1cmVCdXR0b25EaXNjbG9zZWQgPSAxCiBrQ29udHJvbFJvdW5kQnV0dG9uTm9ybWFsU2l6ZSA9IGtDb250cm9sU2l6ZU5vcm1hbAoga0NvbnRyb2xSb3VuZEJ1dHRvbkxhcmdlU2l6ZSA9IGtDb250cm9sU2l6ZUxhcmdlCiBrQ29udHJvbFJvdW5kQnV0dG9uQ29udGVudFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdjb250JykKLWtDb250cm9sUm91bmRCdXR0b25TaXplVGFnID0ga0NvbnRyb2xTaXplVGFnIAora0NvbnRyb2xSb3VuZEJ1dHRvblNpemVUYWcgPSBrQ29udHJvbFNpemVUYWcKIGtDb250cm9sS2luZFJvdW5kQnV0dG9uID0gRk9VUl9DSEFSX0NPREUoJ3JuZGInKQoga0NvbnRyb2xLaW5kRGF0YUJyb3dzZXIgPSBGT1VSX0NIQVJfQ09ERSgnZGF0YicpCiBlcnJEYXRhQnJvd3Nlck5vdENvbmZpZ3VyZWQgPSAtNDk3MApAQCAtNTExLDcgKzUxMSw3IEBACiBlcnJEYXRhQnJvd3NlclByb3BlcnR5Tm90Rm91bmQgPSAtNDk3MgogZXJyRGF0YUJyb3dzZXJJbnZhbGlkUHJvcGVydHlQYXJ0ID0gLTQ5NzMKIGVyckRhdGFCcm93c2VySW52YWxpZFByb3BlcnR5RGF0YSA9IC00OTc0Ci1lcnJEYXRhQnJvd3NlclByb3BlcnR5Tm90U3VwcG9ydGVkID0gLTQ5NzkgCitlcnJEYXRhQnJvd3NlclByb3BlcnR5Tm90U3VwcG9ydGVkID0gLTQ5NzkKIGtDb250cm9sRGF0YUJyb3dzZXJJbmNsdWRlc0ZyYW1lQW5kRm9jdXNUYWcgPSBGT1VSX0NIQVJfQ09ERSgnYnJkcicpCiBrQ29udHJvbERhdGFCcm93c2VyS2V5RmlsdGVyVGFnID0ga0NvbnRyb2xFZGl0VGV4dEtleUZpbHRlclRhZwoga0NvbnRyb2xEYXRhQnJvd3NlckVkaXRUZXh0S2V5RmlsdGVyVGFnID0ga0NvbnRyb2xEYXRhQnJvd3NlcktleUZpbHRlclRhZwpAQCAtNTI1LDIzICs1MjUsMjMgQEAKIGtEYXRhQnJvd3NlckNtZFRvZ2dsZXNTZWxlY3Rpb24gPSAxIDw8IDMKIGtEYXRhQnJvd3Nlck5vRGlzam9pbnRTZWxlY3Rpb24gPSAxIDw8IDQKIGtEYXRhQnJvd3NlckFsd2F5c0V4dGVuZFNlbGVjdGlvbiA9IDEgPDwgNQota0RhdGFCcm93c2VyTmV2ZXJFbXB0eVNlbGVjdGlvblNldCA9IDEgPDwgNiAKK2tEYXRhQnJvd3Nlck5ldmVyRW1wdHlTZWxlY3Rpb25TZXQgPSAxIDw8IDYKIGtEYXRhQnJvd3Nlck9yZGVyVW5kZWZpbmVkID0gMAoga0RhdGFCcm93c2VyT3JkZXJJbmNyZWFzaW5nID0gMQoga0RhdGFCcm93c2VyT3JkZXJEZWNyZWFzaW5nID0gMgota0RhdGFCcm93c2VyTm9JdGVtID0gMEwgICAgCitrRGF0YUJyb3dzZXJOb0l0ZW0gPSAwTAoga0RhdGFCcm93c2VySXRlbU5vU3RhdGUgPSAwCiAjIGtEYXRhQnJvd3Nlckl0ZW1BbnlTdGF0ZSA9ICh1bnNpZ25lZCBsb25nKSgtMSkKIGtEYXRhQnJvd3Nlckl0ZW1Jc1NlbGVjdGVkID0gMSA8PCAwCiBrRGF0YUJyb3dzZXJDb250YWluZXJJc09wZW4gPSAxIDw8IDEKLWtEYXRhQnJvd3Nlckl0ZW1Jc0RyYWdUYXJnZXQgPSAxIDw8IDIgCitrRGF0YUJyb3dzZXJJdGVtSXNEcmFnVGFyZ2V0ID0gMSA8PCAyCiBrRGF0YUJyb3dzZXJSZXZlYWxPbmx5ID0gMAoga0RhdGFCcm93c2VyUmV2ZWFsQW5kQ2VudGVySW5WaWV3ID0gMSA8PCAwCiBrRGF0YUJyb3dzZXJSZXZlYWxXaXRob3V0U2VsZWN0aW5nID0gMSA8PCAxCiBrRGF0YUJyb3dzZXJJdGVtc0FkZCA9IDAKIGtEYXRhQnJvd3Nlckl0ZW1zQXNzaWduID0gMQoga0RhdGFCcm93c2VySXRlbXNUb2dnbGUgPSAyCi1rRGF0YUJyb3dzZXJJdGVtc1JlbW92ZSA9IDMgICAgIAora0RhdGFCcm93c2VySXRlbXNSZW1vdmUgPSAzCiBrRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3JVcCA9IDAKIGtEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvckRvd24gPSAxCiBrRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3JMZWZ0ID0gMgpAQCAtNTY4LDcgKzU2OCw3IEBACiBrRGF0YUJyb3dzZXJVc2VyVG9nZ2xlZENvbnRhaW5lciA9IDE2CiBrRGF0YUJyb3dzZXJUYXJnZXRDaGFuZ2VkID0gMTUKIGtEYXRhQnJvd3NlclVzZXJTdGF0ZUNoYW5nZWQgPSAxMwota0RhdGFCcm93c2VyU2VsZWN0aW9uU2V0Q2hhbmdlZCA9IDE0ICAKK2tEYXRhQnJvd3NlclNlbGVjdGlvblNldENoYW5nZWQgPSAxNAoga0RhdGFCcm93c2VySXRlbU5vUHJvcGVydHkgPSAwTAoga0RhdGFCcm93c2VySXRlbUlzQWN0aXZlUHJvcGVydHkgPSAxTAoga0RhdGFCcm93c2VySXRlbUlzU2VsZWN0YWJsZVByb3BlcnR5ID0gMkwKQEAgLTU4MCw3ICs1ODAsNyBAQAoga0RhdGFCcm93c2VySXRlbVNlbGZJZGVudGl0eVByb3BlcnR5ID0gOEwKIGtEYXRhQnJvd3NlckNvbnRhaW5lckFsaWFzSURQcm9wZXJ0eSA9IDlMCiBrRGF0YUJyb3dzZXJDb2x1bW5WaWV3UHJldmlld1Byb3BlcnR5ID0gMTBMCi1rRGF0YUJyb3dzZXJJdGVtUGFyZW50Q29udGFpbmVyUHJvcGVydHkgPSAxMUwgCitrRGF0YUJyb3dzZXJJdGVtUGFyZW50Q29udGFpbmVyUHJvcGVydHkgPSAxMUwKIGtEYXRhQnJvd3NlckN1c3RvbVR5cGUgPSAweDNGM0YzRjNGCiBrRGF0YUJyb3dzZXJJY29uVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpY25yJykKIGtEYXRhQnJvd3NlclRleHRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RleHQnKQpAQCAtNTkwLDcgKzU5MCw3IEBACiBrRGF0YUJyb3dzZXJQcm9ncmVzc0JhclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncHJvZycpCiBrRGF0YUJyb3dzZXJSZWxldmFuY2VSYW5rVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdyYW5rJykKIGtEYXRhQnJvd3NlclBvcHVwTWVudVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbWVudScpCi1rRGF0YUJyb3dzZXJJY29uQW5kVGV4dFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndGljbicpIAora0RhdGFCcm93c2VySWNvbkFuZFRleHRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RpY24nKQoga0RhdGFCcm93c2VyUHJvcGVydHlFbmNsb3NpbmdQYXJ0ID0gMEwKIGtEYXRhQnJvd3NlclByb3BlcnR5Q29udGVudFBhcnQgPSBGT1VSX0NIQVJfQ09ERSgnLS0tLScpCiBrRGF0YUJyb3dzZXJQcm9wZXJ0eURpc2Nsb3N1cmVQYXJ0ID0gRk9VUl9DSEFSX0NPREUoJ2Rpc2MnKQpAQCAtNjA0LDcgKzYwNCw3IEBACiBrRGF0YUJyb3dzZXJQcm9wZXJ0eUlzTXV0YWJsZSA9IDEgPDwgMAoga0RhdGFCcm93c2VyRGVmYXVsdFByb3BlcnR5RmxhZ3MgPSAwIDw8IDAKIGtEYXRhQnJvd3NlclVuaXZlcnNhbFByb3BlcnR5RmxhZ3MgPSBrRGF0YUJyb3dzZXJVbml2ZXJzYWxQcm9wZXJ0eUZsYWdzTWFzawota0RhdGFCcm93c2VyUHJvcGVydHlJc0VkaXRhYmxlID0ga0RhdGFCcm93c2VyUHJvcGVydHlJc011dGFibGUgCitrRGF0YUJyb3dzZXJQcm9wZXJ0eUlzRWRpdGFibGUgPSBrRGF0YUJyb3dzZXJQcm9wZXJ0eUlzTXV0YWJsZQoga0RhdGFCcm93c2VyUHJvcGVydHlGbGFnc09mZnNldCA9IDgKIGtEYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NNYXNrID0gMHhGRiA8PCBrRGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzT2Zmc2V0CiBrRGF0YUJyb3dzZXJDaGVja2JveFRyaVN0YXRlID0gMSA8PCBrRGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzT2Zmc2V0CkBAIC02MjAsMTAgKzYyMCwxMCBAQAoga0RhdGFCcm93c2VyVHJ1bmNhdGVUZXh0TWlkZGxlID0gMCA8PCBrRGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzT2Zmc2V0CiBrRGF0YUJyb3dzZXJUcnVuY2F0ZVRleHRBdFN0YXJ0ID0gMSA8PCBrRGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzT2Zmc2V0CiBrRGF0YUJyb3dzZXJQcm9wZXJ0eU1vZGlmaWNhdGlvbkZsYWdzID0ga0RhdGFCcm93c2VyUHJvcGVydHlGbGFnc01hc2sKLWtEYXRhQnJvd3NlclJlbGF0aXZlRGF0ZVRpbWUgPSBrRGF0YUJyb3dzZXJEYXRlVGltZVJlbGF0aXZlIAora0RhdGFCcm93c2VyUmVsYXRpdmVEYXRlVGltZSA9IGtEYXRhQnJvd3NlckRhdGVUaW1lUmVsYXRpdmUKIGtEYXRhQnJvd3NlclZpZXdTcGVjaWZpY0ZsYWdzT2Zmc2V0ID0gMTYKIGtEYXRhQnJvd3NlclZpZXdTcGVjaWZpY0ZsYWdzTWFzayA9IDB4RkYgPDwga0RhdGFCcm93c2VyVmlld1NwZWNpZmljRmxhZ3NPZmZzZXQKLWtEYXRhQnJvd3NlclZpZXdTcGVjaWZpY1Byb3BlcnR5RmxhZ3MgPSBrRGF0YUJyb3dzZXJWaWV3U3BlY2lmaWNGbGFnc01hc2sgCitrRGF0YUJyb3dzZXJWaWV3U3BlY2lmaWNQcm9wZXJ0eUZsYWdzID0ga0RhdGFCcm93c2VyVmlld1NwZWNpZmljRmxhZ3NNYXNrCiBrRGF0YUJyb3dzZXJDbGllbnRQcm9wZXJ0eUZsYWdzT2Zmc2V0ID0gMjQKICMga0RhdGFCcm93c2VyQ2xpZW50UHJvcGVydHlGbGFnc01hc2sgPSAodW5zaWduZWQgbG9uZykoMHhGRiA8PCBrRGF0YUJyb3dzZXJDbGllbnRQcm9wZXJ0eUZsYWdzT2Zmc2V0KQoga0RhdGFCcm93c2VyTGF0ZXN0Q2FsbGJhY2tzID0gMApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9Db3JlRm91bmRhdGlvbi5weSBiL0xpYi9wbGF0LW1hYy9DYXJib24vQ29yZUZvdW5kYXRpb24ucHkKaW5kZXggMjkwN2MxZC4uOGQ5Yzg5NCAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9Db3JlRm91bmRhdGlvbi5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0NvcmVGb3VuZGF0aW9uLnB5CkBAIC0xNiwxMyArMTYsMTMgQEAKIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkgPSAweDA2MDAKIGtDRlN0cmluZ0VuY29kaW5nVW5pY29kZSA9IDB4MDEwMAoga0NGU3RyaW5nRW5jb2RpbmdVVEY4ID0gMHgwODAwMDEwMAota0NGU3RyaW5nRW5jb2RpbmdOb25Mb3NzeUFTQ0lJID0gMHgwQkZGIAora0NGU3RyaW5nRW5jb2RpbmdOb25Mb3NzeUFTQ0lJID0gMHgwQkZGCiBrQ0ZDb21wYXJlQ2FzZUluc2Vuc2l0aXZlID0gMQoga0NGQ29tcGFyZUJhY2t3YXJkcyA9IDQKIGtDRkNvbXBhcmVBbmNob3JlZCA9IDgKIGtDRkNvbXBhcmVOb25saXRlcmFsID0gMTYKIGtDRkNvbXBhcmVMb2NhbGl6ZWQgPSAzMgota0NGQ29tcGFyZU51bWVyaWNhbGx5ID0gNjQgICAgCitrQ0ZDb21wYXJlTnVtZXJpY2FsbHkgPSA2NAoga0NGVVJMUE9TSVhQYXRoU3R5bGUgPSAwCiBrQ0ZVUkxIRlNQYXRoU3R5bGUgPSAxCiBrQ0ZVUkxXaW5kb3dzUGF0aFN0eWxlID0gMgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9Db3JlR3JhcGhpY3MucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0NvcmVHcmFwaGljcy5weQppbmRleCBkN2E2ZjAyLi5mNGNiMGI5IDEwMDc1NQotLS0gYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0NvcmVHcmFwaGljcy5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0NvcmVHcmFwaGljcy5weQpAQCAtMjUsNCArMjUsNCBAQAoga0NHSW50ZXJwb2xhdGlvbkRlZmF1bHQgPSAwCiBrQ0dJbnRlcnBvbGF0aW9uTm9uZSA9IDEKIGtDR0ludGVycG9sYXRpb25Mb3cgPSAyCi1rQ0dJbnRlcnBvbGF0aW9uSGlnaCA9IDMgICAgIAora0NHSW50ZXJwb2xhdGlvbkhpZ2ggPSAzCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0RpYWxvZ3MucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0RpYWxvZ3MucHkKaW5kZXggOWQyZmE4Zi4uZjg0NmQ3YyAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9EaWFsb2dzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vRGlhbG9ncy5weQpAQCAtNDUsNyArNDUsNyBAQAoga0FsZXJ0UGxhaW5BbGVydCA9IDMKIGtBbGVydERlZmF1bHRPS1RleHQgPSAtMQoga0FsZXJ0RGVmYXVsdENhbmNlbFRleHQgPSAtMQota0FsZXJ0RGVmYXVsdE90aGVyVGV4dCA9IC0xICAgIAora0FsZXJ0RGVmYXVsdE90aGVyVGV4dCA9IC0xCiBrQWxlcnRTdGRBbGVydE9LQnV0dG9uID0gMQoga0FsZXJ0U3RkQWxlcnRDYW5jZWxCdXR0b24gPSAyCiBrQWxlcnRTdGRBbGVydE90aGVyQnV0dG9uID0gMwpAQCAtNzEsOCArNzEsOCBAQAoga0RpYWxvZ0ZvbnRVc2VGb250TmFtZU1hc2sgPSAweDAyMDAKIGtEaWFsb2dGb250QWRkVG9NZXRhRm9udE1hc2sgPSAweDA0MDAKIGtEaWFsb2dGb250VXNlVGhlbWVGb250SURNYXNrID0gMHgwMDgwCi1rSElDb21tYW5kT3RoZXIgPSBGT1VSX0NIQVJfQ09ERSgnb3RocicpIAota1N0ZENGU3RyaW5nQWxlcnRWZXJzaW9uT25lID0gMSAgICAgCitrSElDb21tYW5kT3RoZXIgPSBGT1VSX0NIQVJfQ09ERSgnb3RocicpCitrU3RkQ0ZTdHJpbmdBbGVydFZlcnNpb25PbmUgPSAxCiBrU3RkQWxlcnREb05vdERpc3Bvc2VTaGVldCA9IDEgPDwgMAoga1N0ZEFsZXJ0RG9Ob3RBbmltYXRlT25EZWZhdWx0ID0gMSA8PCAxCiBrU3RkQWxlcnREb05vdEFuaW1hdGVPbkNhbmNlbCA9IDEgPDwgMgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9EcmFnY29uc3QucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0RyYWdjb25zdC5weQppbmRleCBlNWM4Yjg5Li4zOGUxMmJlIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0RyYWdjb25zdC5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0RyYWdjb25zdC5weQpAQCAtNiw1NiArNiw1NiBAQAogZmtEcmFnQWN0aW9uQWxsID0gLTEKIAogCi1rRHJhZ0hhc0xlZnRTZW5kZXJXaW5kb3cJPSAoMSA8PCAwKQora0RyYWdIYXNMZWZ0U2VuZGVyV2luZG93ICAgICAgICA9ICgxIDw8IDApCiBrRHJhZ0luc2lkZVNlbmRlckFwcGxpY2F0aW9uID0gKDEgPDwgMSkKLWtEcmFnSW5zaWRlU2VuZGVyV2luZG93CQk9ICgxIDw8IDIpCi1rRHJhZ1JlZ2lvbkFuZEltYWdlCQkJPSAoMSA8PCA0KQotZmxhdm9yU2VuZGVyT25seQkJCT0gKDEgPDwgMCkKLWZsYXZvclNlbmRlclRyYW5zbGF0ZWQJCT0gKDEgPDwgMSkKLWZsYXZvck5vdFNhdmVkCQkJCT0gKDEgPDwgMikKLWZsYXZvclN5c3RlbVRyYW5zbGF0ZWQJCT0gKDEgPDwgOCkKK2tEcmFnSW5zaWRlU2VuZGVyV2luZG93ICAgICAgICAgPSAoMSA8PCAyKQora0RyYWdSZWdpb25BbmRJbWFnZSAgICAgICAgICAgICAgICAgICAgID0gKDEgPDwgNCkKK2ZsYXZvclNlbmRlck9ubHkgICAgICAgICAgICAgICAgICAgICAgICA9ICgxIDw8IDApCitmbGF2b3JTZW5kZXJUcmFuc2xhdGVkICAgICAgICAgID0gKDEgPDwgMSkKK2ZsYXZvck5vdFNhdmVkICAgICAgICAgICAgICAgICAgICAgICAgICA9ICgxIDw8IDIpCitmbGF2b3JTeXN0ZW1UcmFuc2xhdGVkICAgICAgICAgID0gKDEgPDwgOCkKIGtEcmFnSGFzTGVmdFNlbmRlcldpbmRvdyA9ICgxTCA8PCAwKQoga0RyYWdJbnNpZGVTZW5kZXJBcHBsaWNhdGlvbiA9ICgxTCA8PCAxKQota0RyYWdJbnNpZGVTZW5kZXJXaW5kb3cgPSAoMUwgPDwgMikgCitrRHJhZ0luc2lkZVNlbmRlcldpbmRvdyA9ICgxTCA8PCAyKQoga0RyYWdCZWhhdmlvck5vbmUgPSAwCi1rRHJhZ0JlaGF2aW9yWm9vbUJhY2tBbmltYXRpb24gPSAoMUwgPDwgMCkgCi1rRHJhZ1JlZ2lvbkFuZEltYWdlID0gKDFMIDw8IDQpIAora0RyYWdCZWhhdmlvclpvb21CYWNrQW5pbWF0aW9uID0gKDFMIDw8IDApCitrRHJhZ1JlZ2lvbkFuZEltYWdlID0gKDFMIDw8IDQpCiBrRHJhZ1N0YW5kYXJkVHJhbnNsdWNlbmN5ID0gMEwKIGtEcmFnRGFya1RyYW5zbHVjZW5jeSA9IDFMCiBrRHJhZ0RhcmtlclRyYW5zbHVjZW5jeSA9IDJMCi1rRHJhZ09wYXF1ZVRyYW5zbHVjZW5jeSA9IDNMICAgIAora0RyYWdPcGFxdWVUcmFuc2x1Y2VuY3kgPSAzTAoga0RyYWdSZWdpb25CZWdpbiA9IDEKIGtEcmFnUmVnaW9uRHJhdyA9IDIKIGtEcmFnUmVnaW9uSGlkZSA9IDMKIGtEcmFnUmVnaW9uSWRsZSA9IDQKLWtEcmFnUmVnaW9uRW5kID0gNSAgICAgCitrRHJhZ1JlZ2lvbkVuZCA9IDUKIGtab29tTm9BY2NlbGVyYXRpb24gPSAwCiBrWm9vbUFjY2VsZXJhdGUgPSAxCi1rWm9vbURlY2VsZXJhdGUgPSAyICAgICAKK2tab29tRGVjZWxlcmF0ZSA9IDIKIGZsYXZvclNlbmRlck9ubHkgPSAoMSA8PCAwKQogZmxhdm9yU2VuZGVyVHJhbnNsYXRlZCA9ICgxIDw8IDEpCiBmbGF2b3JOb3RTYXZlZCA9ICgxIDw8IDIpCiBmbGF2b3JTeXN0ZW1UcmFuc2xhdGVkID0gKDEgPDwgOCkKLWZsYXZvckRhdGFQcm9taXNlZCA9ICgxIDw8IDkpIAorZmxhdm9yRGF0YVByb21pc2VkID0gKDEgPDwgOSkKIGtEcmFnRmxhdm9yVHlwZUhGUyA9IEZPVVJfQ0hBUl9DT0RFKCdoZnMgJykKIGtEcmFnRmxhdm9yVHlwZVByb21pc2VIRlMgPSBGT1VSX0NIQVJfQ09ERSgncGhmcycpCiBmbGF2b3JUeXBlSEZTID0ga0RyYWdGbGF2b3JUeXBlSEZTCi1mbGF2b3JUeXBlUHJvbWlzZUhGUyA9IGtEcmFnRmxhdm9yVHlwZVByb21pc2VIRlMgCitmbGF2b3JUeXBlUHJvbWlzZUhGUyA9IGtEcmFnRmxhdm9yVHlwZVByb21pc2VIRlMKIGtEcmFnUHJvbWlzZWRGbGF2b3JGaW5kRmlsZSA9IEZPVVJfQ0hBUl9DT0RFKCdyV20xJykKLWtEcmFnUHJvbWlzZWRGbGF2b3IgPSBGT1VSX0NIQVJfQ09ERSgnZnNzUCcpIAora0RyYWdQcm9taXNlZEZsYXZvciA9IEZPVVJfQ0hBUl9DT0RFKCdmc3NQJykKIGtEcmFnUHNldWRvQ3JlYXRvclZvbHVtZU9yRGlyZWN0b3J5ID0gRk9VUl9DSEFSX0NPREUoJ01BQ1MnKQoga0RyYWdQc2V1ZG9GaWxlVHlwZVZvbHVtZSA9IEZPVVJfQ0hBUl9DT0RFKCdkaXNrJykKLWtEcmFnUHNldWRvRmlsZVR5cGVEaXJlY3RvcnkgPSBGT1VSX0NIQVJfQ09ERSgnZm9sZCcpIAotZmxhdm9yVHlwZURpcmVjdG9yeSA9IEZPVVJfQ0hBUl9DT0RFKCdkaXJ5JykgCitrRHJhZ1BzZXVkb0ZpbGVUeXBlRGlyZWN0b3J5ID0gRk9VUl9DSEFSX0NPREUoJ2ZvbGQnKQorZmxhdm9yVHlwZURpcmVjdG9yeSA9IEZPVVJfQ0hBUl9DT0RFKCdkaXJ5JykKIGtGbGF2b3JUeXBlQ2xpcHBpbmdOYW1lID0gRk9VUl9DSEFSX0NPREUoJ2Nsbm0nKQoga0ZsYXZvclR5cGVDbGlwcGluZ0ZpbGVuYW1lID0gRk9VUl9DSEFSX0NPREUoJ2NsZm4nKQoga0ZsYXZvclR5cGVEcmFnVG9UcmFzaE9ubHkgPSBGT1VSX0NIQVJfQ09ERSgnZmR0dCcpCi1rRmxhdm9yVHlwZUZpbmRlck5vVHJhY2tpbmdCZWhhdmlvciA9IEZPVVJfQ0hBUl9DT0RFKCdmbnRiJykgCitrRmxhdm9yVHlwZUZpbmRlck5vVHJhY2tpbmdCZWhhdmlvciA9IEZPVVJfQ0hBUl9DT0RFKCdmbnRiJykKIGtEcmFnVHJhY2tpbmdFbnRlckhhbmRsZXIgPSAxCiBrRHJhZ1RyYWNraW5nRW50ZXJXaW5kb3cgPSAyCiBrRHJhZ1RyYWNraW5nSW5XaW5kb3cgPSAzCiBrRHJhZ1RyYWNraW5nTGVhdmVXaW5kb3cgPSA0Ci1rRHJhZ1RyYWNraW5nTGVhdmVIYW5kbGVyID0gNSAgICAgCitrRHJhZ1RyYWNraW5nTGVhdmVIYW5kbGVyID0gNQoga0RyYWdBY3Rpb25Ob3RoaW5nID0gMEwKIGtEcmFnQWN0aW9uQ29weSA9IDFMCiBrRHJhZ0FjdGlvbkFsaWFzID0gKDFMIDw8IDEpCkBAIC02NiwyMSArNjYsMjEgQEAKICMga0RyYWdBY3Rpb25BbGwgPSAobG9uZykweEZGRkZGRkZGCiBkcmFnSGFzTGVmdFNlbmRlcldpbmRvdyA9IGtEcmFnSGFzTGVmdFNlbmRlcldpbmRvdwogZHJhZ0luc2lkZVNlbmRlckFwcGxpY2F0aW9uID0ga0RyYWdJbnNpZGVTZW5kZXJBcHBsaWNhdGlvbgotZHJhZ0luc2lkZVNlbmRlcldpbmRvdyA9IGtEcmFnSW5zaWRlU2VuZGVyV2luZG93IAorZHJhZ0luc2lkZVNlbmRlcldpbmRvdyA9IGtEcmFnSW5zaWRlU2VuZGVyV2luZG93CiBkcmFnVHJhY2tpbmdFbnRlckhhbmRsZXIgPSBrRHJhZ1RyYWNraW5nRW50ZXJIYW5kbGVyCiBkcmFnVHJhY2tpbmdFbnRlcldpbmRvdyA9IGtEcmFnVHJhY2tpbmdFbnRlcldpbmRvdwogZHJhZ1RyYWNraW5nSW5XaW5kb3cgPSBrRHJhZ1RyYWNraW5nSW5XaW5kb3cKIGRyYWdUcmFja2luZ0xlYXZlV2luZG93ID0ga0RyYWdUcmFja2luZ0xlYXZlV2luZG93Ci1kcmFnVHJhY2tpbmdMZWF2ZUhhbmRsZXIgPSBrRHJhZ1RyYWNraW5nTGVhdmVIYW5kbGVyIAorZHJhZ1RyYWNraW5nTGVhdmVIYW5kbGVyID0ga0RyYWdUcmFja2luZ0xlYXZlSGFuZGxlcgogZHJhZ1JlZ2lvbkJlZ2luID0ga0RyYWdSZWdpb25CZWdpbgogZHJhZ1JlZ2lvbkRyYXcgPSBrRHJhZ1JlZ2lvbkRyYXcKIGRyYWdSZWdpb25IaWRlID0ga0RyYWdSZWdpb25IaWRlCiBkcmFnUmVnaW9uSWRsZSA9IGtEcmFnUmVnaW9uSWRsZQotZHJhZ1JlZ2lvbkVuZCA9IGtEcmFnUmVnaW9uRW5kIAorZHJhZ1JlZ2lvbkVuZCA9IGtEcmFnUmVnaW9uRW5kCiB6b29tTm9BY2NlbGVyYXRpb24gPSBrWm9vbU5vQWNjZWxlcmF0aW9uCiB6b29tQWNjZWxlcmF0ZSA9IGtab29tQWNjZWxlcmF0ZQotem9vbURlY2VsZXJhdGUgPSBrWm9vbURlY2VsZXJhdGUgCit6b29tRGVjZWxlcmF0ZSA9IGtab29tRGVjZWxlcmF0ZQoga0RyYWdTdGFuZGFyZEltYWdlID0ga0RyYWdTdGFuZGFyZFRyYW5zbHVjZW5jeQoga0RyYWdEYXJrSW1hZ2UgPSBrRHJhZ0RhcmtUcmFuc2x1Y2VuY3kKIGtEcmFnRGFya2VySW1hZ2UgPSBrRHJhZ0RhcmtlclRyYW5zbHVjZW5jeQota0RyYWdPcGFxdWVJbWFnZSA9IGtEcmFnT3BhcXVlVHJhbnNsdWNlbmN5IAora0RyYWdPcGFxdWVJbWFnZSA9IGtEcmFnT3BhcXVlVHJhbnNsdWNlbmN5CmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0V2ZW50cy5weSBiL0xpYi9wbGF0LW1hYy9DYXJib24vRXZlbnRzLnB5CmluZGV4IDQ4NTM0NjkuLjI2OWY0ZjEgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9DYXJib24vRXZlbnRzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vRXZlbnRzLnB5CkBAIC0yMSwxNSArMjEsMTUgQEAKIGFjdGl2TWFzayA9IDEgPDwgYWN0aXZhdGVFdnQKIGhpZ2hMZXZlbEV2ZW50TWFzayA9IDB4MDQwMAogb3NNYXNrID0gMSA8PCBvc0V2dAotZXZlcnlFdmVudCA9IDB4RkZGRiAKK2V2ZXJ5RXZlbnQgPSAweEZGRkYKIGNoYXJDb2RlTWFzayA9IDB4MDAwMDAwRkYKIGtleUNvZGVNYXNrID0gMHgwMDAwRkYwMAogYWRiQWRkck1hc2sgPSAweDAwRkYwMDAwCiAjIG9zRXZ0TWVzc2FnZU1hc2sgPSAodW5zaWduZWQgbG9uZykweEZGMDAwMDAwCiBtb3VzZU1vdmVkTWVzc2FnZSA9IDB4MDBGQQogc3VzcGVuZFJlc3VtZU1lc3NhZ2UgPSAweDAwMDEKLXJlc3VtZUZsYWcgPSAxICAgICAKLWNvbnZlcnRDbGlwYm9hcmRGbGFnID0gMiAgICAgCityZXN1bWVGbGFnID0gMQorY29udmVydENsaXBib2FyZEZsYWcgPSAyCiBhY3RpdmVGbGFnQml0ID0gMAogYnRuU3RhdGVCaXQgPSA3CiBjbWRLZXlCaXQgPSA4CkBAIC0zOSw3ICszOSw3IEBACiBjb250cm9sS2V5Qml0ID0gMTIKIHJpZ2h0U2hpZnRLZXlCaXQgPSAxMwogcmlnaHRPcHRpb25LZXlCaXQgPSAxNAotcmlnaHRDb250cm9sS2V5Qml0ID0gMTUgICAgCityaWdodENvbnRyb2xLZXlCaXQgPSAxNQogYWN0aXZlRmxhZyA9IDEgPDwgYWN0aXZlRmxhZ0JpdAogYnRuU3RhdGUgPSAxIDw8IGJ0blN0YXRlQml0CiBjbWRLZXkgPSAxIDw8IGNtZEtleUJpdApAQCAtODcsNyArODcsNyBAQAoga0NoZWNrVW5pY29kZSA9IDB4MjcxMwoga0RpYW1vbmRVbmljb2RlID0gMHgyNUM2CiBrQnVsbGV0VW5pY29kZSA9IDB4MjAyMgota0FwcGxlTG9nb1VuaWNvZGUgPSAweEY4RkYgCitrQXBwbGVMb2dvVW5pY29kZSA9IDB4RjhGRgogbmV0d29ya0V2dCA9IDEwCiBkcml2ZXJFdnQgPSAxMQogYXBwMUV2dCA9IDEyCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0ZpbGVzLnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9GaWxlcy5weQppbmRleCA1NGZlNGI4Li42NzhiYmM3IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0ZpbGVzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vRmlsZXMucHkKQEAgLTksNyArOSw3IEBACiBmc1JkV3JQZXJtID0gMHgwMwogZnNSZFdyU2hQZXJtID0gMHgwNAogZnNSZERlbnlQZXJtID0gMHgxMAotZnNXckRlbnlQZXJtID0gMHgyMCAgCitmc1dyRGVueVBlcm0gPSAweDIwCiBmc1J0UGFySUQgPSAxCiBmc1J0RGlySUQgPSAyCiBmc0F0TWFyayA9IDAKQEAgLTI3LDcgKzI3LDcgQEAKIGZvcmNlUmVhZE1hc2sgPSAweDAwNDAKIG5ld0xpbmVCaXQgPSA3CiBuZXdMaW5lTWFzayA9IDB4MDA4MAotbmV3TGluZUNoYXJNYXNrID0gMHhGRjAwIAorbmV3TGluZUNoYXJNYXNrID0gMHhGRjAwCiBmc1NCUGFydGlhbE5hbWUgPSAxCiBmc1NCRnVsbE5hbWUgPSAyCiBmc1NCRmxBdHRyaWIgPSA0CkBAIC02OSw3ICs2OSw3IEBACiBmc1NCRHJNZERhdEJpdCA9IDEwCiBmc1NCRHJCa0RhdEJpdCA9IDExCiBmc1NCRHJGbmRySW5mb0JpdCA9IDEyCi1mc1NCRHJQYXJJREJpdCA9IDEzICAgIAorZnNTQkRyUGFySURCaXQgPSAxMwogYkxpbWl0RkNCcyA9IDMxCiBiTG9jYWxXTGlzdCA9IDMwCiBiTm9NaW5pRm5kciA9IDI5CkBAIC0xMDYsMTkgKzEwNiwxOSBAQAogYlN1cHBvcnRzTXVsdGlTY3JpcHROYW1lcyA9IDYKIGJTdXBwb3J0c05hbWVkRm9ya3MgPSA3CiBiU3VwcG9ydHNTdWJ0cmVlSXRlcmF0b3JzID0gOAotYkwyUENhbk1hcEZpbGVCbG9ja3MgPSA5ICAgICAKK2JMMlBDYW5NYXBGaWxlQmxvY2tzID0gOQogYlBhcmVudE1vZERhdGVDaGFuZ2VzID0gMTAKLWJBbmNlc3Rvck1vZERhdGVDaGFuZ2VzID0gMTEgICAgCitiQW5jZXN0b3JNb2REYXRlQ2hhbmdlcyA9IDExCiBiU3VwcG9ydHNTeW1ib2xpY0xpbmtzID0gMTMKIGJJc0F1dG9Nb3VudGVkID0gMTQKLWJBbGxvd0NEaURhdGFIYW5kbGVyID0gMTcgICAgCitiQWxsb3dDRGlEYXRhSGFuZGxlciA9IDE3CiBrTGFyZ2VJY29uID0gMQoga0xhcmdlNEJpdEljb24gPSAyCiBrTGFyZ2U4Qml0SWNvbiA9IDMKIGtTbWFsbEljb24gPSA0CiBrU21hbGw0Qml0SWNvbiA9IDUKIGtTbWFsbDhCaXRJY29uID0gNgota2ljbnNJY29uRmFtaWx5ID0gMjM5ICAgCitraWNuc0ljb25GYW1pbHkgPSAyMzkKIGtMYXJnZUljb25TaXplID0gMjU2CiBrTGFyZ2U0Qml0SWNvblNpemUgPSA1MTIKIGtMYXJnZThCaXRJY29uU2l6ZSA9IDEwMjQKQEAgLTIyOSw3ICsyMjksNyBAQAoga2lvQUNBY2Nlc3NPd25lclNlYXJjaEJpdCA9IDAKIGtpb0FDQWNjZXNzT3duZXJTZWFyY2hNYXNrID0gMHgwMDAwMDAwMQoga2Z1bGxQcml2aWxlZ2VzID0gMHgwMDA3MDAwNwota293bmVyUHJpdmlsZWdlcyA9IDB4MDAwMDAwMDcgCitrb3duZXJQcml2aWxlZ2VzID0gMHgwMDAwMDAwNwoga25vVXNlciA9IDAKIGthZG1pbmlzdHJhdG9yVXNlciA9IDEKIGtub0dyb3VwID0gMApAQCAtMjQzLDEyICsyNDMsMTIgQEAKIHZvbE1vdW50Q2hhbmdlZEJpdCA9IDE0CiB2b2xNb3VudENoYW5nZWRNYXNrID0gMHg0MDAwCiB2b2xNb3VudEZTUmVzZXJ2ZWRNYXNrID0gMHgwMEZGCi12b2xNb3VudFN5c1Jlc2VydmVkTWFzayA9IDB4RkYwMCAKLWtBRlBFeHRlbmRlZEZsYWdzQWx0ZXJuYXRlQWRkcmVzc01hc2sgPSAxIAordm9sTW91bnRTeXNSZXNlcnZlZE1hc2sgPSAweEZGMDAKK2tBRlBFeHRlbmRlZEZsYWdzQWx0ZXJuYXRlQWRkcmVzc01hc2sgPSAxCiBrQUZQVGFnVHlwZUlQID0gMHgwMQoga0FGUFRhZ1R5cGVJUFBvcnQgPSAweDAyCiBrQUZQVGFnVHlwZUREUCA9IDB4MDMKLWtBRlBUYWdUeXBlRE5TID0gMHgwNCAgCitrQUZQVGFnVHlwZUROUyA9IDB4MDQKIGtBRlBUYWdMZW5ndGhJUCA9IDB4MDYKIGtBRlBUYWdMZW5ndGhJUFBvcnQgPSAweDA4CiBrQUZQVGFnTGVuZ3RoRERQID0gMHgwNgpAQCAtMjc2LDcgKzI3Niw3IEBACiBrRlNDYXRJbmZvQWxsRGF0ZXMgPSAweDAwMDAwM0UwCiBrRlNDYXRJbmZvR2V0dGFibGVJbmZvID0gMHgwMDAzRkZGRgoga0ZTQ2F0SW5mb1NldHRhYmxlSW5mbyA9IDB4MDAwMDFGRTMKLSMga0ZTQ2F0SW5mb1Jlc2VydmVkID0gKGxvbmcpMHhGRkZDMDAwMCAKKyMga0ZTQ2F0SW5mb1Jlc2VydmVkID0gKGxvbmcpMHhGRkZDMDAwMAoga0ZTTm9kZUxvY2tlZEJpdCA9IDAKIGtGU05vZGVMb2NrZWRNYXNrID0gMHgwMDAxCiBrRlNOb2RlUmVzT3BlbkJpdCA9IDIKQEAgLTMxMSw3ICszMTEsNyBAQAoga0ZTQWxsb2NBbGxPck5vdGhpbmdNYXNrID0gMHgwMDAxCiBrRlNBbGxvY0NvbnRpZ3VvdXNNYXNrID0gMHgwMDAyCiBrRlNBbGxvY05vUm91bmRVcE1hc2sgPSAweDAwMDQKLWtGU0FsbG9jUmVzZXJ2ZWRNYXNrID0gMHhGRkY4IAora0ZTQWxsb2NSZXNlcnZlZE1hc2sgPSAweEZGRjgKIGtGU1ZvbEluZm9Ob25lID0gMHgwMDAwCiBrRlNWb2xJbmZvQ3JlYXRlRGF0ZSA9IDB4MDAwMQoga0ZTVm9sSW5mb01vZERhdGUgPSAweDAwMDIKQEAgLTMzMCw3ICszMzAsNyBAQAoga0ZTVm9sSW5mb0ZTSW5mbyA9IDB4NDAwMAoga0ZTVm9sSW5mb0RyaXZlSW5mbyA9IDB4ODAwMAoga0ZTVm9sSW5mb0dldHRhYmxlSW5mbyA9IDB4RkZGRgota0ZTVm9sSW5mb1NldHRhYmxlSW5mbyA9IDB4MzAwNCAKK2tGU1ZvbEluZm9TZXR0YWJsZUluZm8gPSAweDMwMDQKIGtGU1ZvbEZsYWdEZWZhdWx0Vm9sdW1lQml0ID0gNQoga0ZTVm9sRmxhZ0RlZmF1bHRWb2x1bWVNYXNrID0gMHgwMDIwCiBrRlNWb2xGbGFnRmlsZXNPcGVuQml0ID0gNgpAQCAtMzQxLDE5ICszNDEsMTkgQEAKIGtGU1ZvbEZsYWdTb2Z0d2FyZUxvY2tlZE1hc2sgPSAweDgwMDAKIGtGTkRpcmVjdG9yeU1vZGlmaWVkTWVzc2FnZSA9IDEKIGtGTk5vSW1wbGljaXRBbGxTdWJzY3JpcHRpb24gPSAoMSA8PCAwKQotckFsaWFzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhbGlzJykgCityQWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2FsaXMnKQoga0FSTU1vdW50Vm9sID0gMHgwMDAwMDAwMQoga0FSTU5vVUkgPSAweDAwMDAwMDAyCiBrQVJNTXVsdFZvbHMgPSAweDAwMDAwMDA4CiBrQVJNU2VhcmNoID0gMHgwMDAwMDEwMAoga0FSTVNlYXJjaE1vcmUgPSAweDAwMDAwMjAwCi1rQVJNU2VhcmNoUmVsRmlyc3QgPSAweDAwMDAwNDAwIAora0FSTVNlYXJjaFJlbEZpcnN0ID0gMHgwMDAwMDQwMAogYXNpWm9uZU5hbWUgPSAtMwogYXNpU2VydmVyTmFtZSA9IC0yCiBhc2lWb2x1bWVOYW1lID0gLTEKIGFzaUFsaWFzTmFtZSA9IDAKLWFzaVBhcmVudE5hbWUgPSAxICAgICAKLWtSZXNvbHZlQWxpYXNGaWxlTm9VSSA9IDB4MDAwMDAwMDEgCithc2lQYXJlbnROYW1lID0gMQora1Jlc29sdmVBbGlhc0ZpbGVOb1VJID0gMHgwMDAwMDAwMQoga0NsaXBwaW5nQ3JlYXRvciA9IEZPVVJfQ0hBUl9DT0RFKCdkcmFnJykKIGtDbGlwcGluZ1BpY3R1cmVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2NscHAnKQoga0NsaXBwaW5nVGV4dFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY2xwdCcpCkBAIC0zNjksNyArMzY5LDcgQEAKIGtJbnRlcm5ldExvY2F0aW9uQXBwbGVUYWxrID0gRk9VUl9DSEFSX0NPREUoJ2lsYXQnKQoga0ludGVybmV0TG9jYXRpb25OU0wgPSBGT1VSX0NIQVJfQ09ERSgnaWxucycpCiBrSW50ZXJuZXRMb2NhdGlvbkdlbmVyaWMgPSBGT1VSX0NIQVJfQ09ERSgnaWxnZScpCi1rQ3VzdG9tSWNvblJlc291cmNlID0gLTE2NDU1IAora0N1c3RvbUljb25SZXNvdXJjZSA9IC0xNjQ1NQoga0N1c3RvbUJhZGdlUmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2JhZGcnKQoga0N1c3RvbUJhZGdlUmVzb3VyY2VJRCA9IGtDdXN0b21JY29uUmVzb3VyY2UKIGtDdXN0b21CYWRnZVJlc291cmNlVmVyc2lvbiA9IDAKQEAgLTM4OCw3ICszODgsNyBAQAoga0FwcGxpY2F0aW9uQ1BBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYWNkcCcpCiBrQXBwbGljYXRpb25EQUFsaWFzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhZGRwJykKIGtQYWNrYWdlQWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Zwa2EnKQota0FwcFBhY2thZ2VBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmFwYScpIAora0FwcFBhY2thZ2VBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmFwYScpCiBrU3lzdGVtRm9sZGVyQWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Zhc3knKQoga0FwcGxlTWVudUZvbGRlckFsaWFzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmYWFtJykKIGtTdGFydHVwRm9sZGVyQWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Zhc3QnKQpAQCAtNDEwLDcgKzQxMCw3IEBACiBrTmFtZUxvY2tlZCA9IDB4MTAwMAoga0hhc0J1bmRsZSA9IDB4MjAwMAoga0lzSW52aXNpYmxlID0gMHg0MDAwCi1rSXNBbGlhcyA9IDB4ODAwMCAKK2tJc0FsaWFzID0gMHg4MDAwCiBmT25EZXNrID0ga0lzT25EZXNrCiBmSGFzQnVuZGxlID0ga0hhc0J1bmRsZQogZkludmlzaWJsZSA9IGtJc0ludmlzaWJsZQpAQCAtNDIwLDcgKzQyMCw3IEBACiBrSXNTdGF0aW9uYXJ5ID0ga0lzU3RhdGlvbmVyeQoga0V4dGVuZGVkRmxhZ3NBcmVJbnZhbGlkID0gMHg4MDAwCiBrRXh0ZW5kZWRGbGFnSGFzQ3VzdG9tQmFkZ2UgPSAweDAxMDAKLWtFeHRlbmRlZEZsYWdIYXNSb3V0aW5nSW5mbyA9IDB4MDAwNCAKK2tFeHRlbmRlZEZsYWdIYXNSb3V0aW5nSW5mbyA9IDB4MDAwNAoga0ZpcnN0TWFnaWNCdXN5RmlsZXR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYnp5ICcpCiBrTGFzdE1hZ2ljQnVzeUZpbGV0eXBlID0gRk9VUl9DSEFSX0NPREUoJ2J6eT8nKQoga01hZ2ljQnVzeUNyZWF0aW9uRGF0ZSA9IDB4NEYzQUZEQjAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9DYXJib24vRm9sZGVycy5weSBiL0xpYi9wbGF0LW1hYy9DYXJib24vRm9sZGVycy5weQppbmRleCBmMjJiMmJhLi41MmNmMTU4IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlcnMucHkKKysrIGIvTGliL3BsYXQtbWFjL0NhcmJvbi9Gb2xkZXJzLnB5CkBAIC05LDcgKzksNyBAQAoga0xvY2FsRG9tYWluID0gLTMyNzY1CiBrTmV0d29ya0RvbWFpbiA9IC0zMjc2NAoga1VzZXJEb21haW4gPSAtMzI3NjMKLWtDbGFzc2ljRG9tYWluID0gLTMyNzYyIAora0NsYXNzaWNEb21haW4gPSAtMzI3NjIKIGtDcmVhdGVGb2xkZXIgPSB0cnVlCiBrRG9udENyZWF0ZUZvbGRlciA9IGZhbHNlCiBrU3lzdGVtRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtYWNzJykKQEAgLTI4LDcgKzI4LDcgQEAKIGtGb250c0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZm9udCcpCiBrUHJlZmVyZW5jZXNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3ByZWYnKQoga1N5c3RlbVByZWZlcmVuY2VzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzcHJmJykKLWtUZW1wb3JhcnlGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RlbXAnKSAKK2tUZW1wb3JhcnlGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RlbXAnKQoga0V4dGVuc2lvbkRpc2FibGVkRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdleHREJykKIGtDb250cm9sUGFuZWxEaXNhYmxlZEZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY3RyRCcpCiBrU3lzdGVtRXh0ZW5zaW9uRGlzYWJsZWRGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21hY0QnKQpAQCAtODYsNyArODYsNyBAQAoga1F1aWNrVGltZUV4dGVuc2lvbnNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3F0ZXgnKQoga0Rpc3BsYXlFeHRlbnNpb25zRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkc3BsJykKIGtNdWx0aXByb2Nlc3NpbmdGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21weGYnKQota1ByaW50aW5nUGx1Z0luc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncHBsZycpIAora1ByaW50aW5nUGx1Z0luc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncHBsZycpCiBrRG9tYWluVG9wTGV2ZWxGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2R0b3AnKQoga0RvbWFpbkxpYnJhcnlGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RsaWInKQoga0NvbG9yU3luY0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3luYycpCkBAIC0xMjcsMTUgKzEyNywxNSBAQAoga0ZpbGVTeXN0ZW1TdXBwb3J0Rm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmc3lzJykKIGtBcHBsZVNoYXJlU3VwcG9ydEZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc2hhcicpCiBrQXBwbGVTaGFyZUF1dGhlbnRpY2F0aW9uRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhdXRoJykKLWtNSURJRHJpdmVyc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbWlkaScpIAora01JRElEcml2ZXJzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtaWRpJykKIGtMb2NhbGVzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceGM0bG9jJykKLWtGaW5kQnlDb250ZW50UGx1Z2luc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmJjcCcpIAora0ZpbmRCeUNvbnRlbnRQbHVnaW5zRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmYmNwJykKIGtVc2Vyc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndXNycycpCiBrQ3VycmVudFVzZXJGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2N1c3InKQoga0N1cnJlbnRVc2VyUmVtb3RlRm9sZGVyTG9jYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgncnVzZicpCiBrQ3VycmVudFVzZXJSZW1vdGVGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3J1c3InKQoga1NoYXJlZFVzZXJEYXRhRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzZGF0JykKLWtWb2x1bWVTZXR0aW5nc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndnNmZCcpIAora1ZvbHVtZVNldHRpbmdzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd2c2ZkJykKIGtBcHBsZXNoYXJlQXV0b21vdW50U2VydmVyQWxpYXNlc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3J2XHhjNCcpCiBrUHJlTWFjT1M5MUFwcGxpY2F0aW9uc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXHg4Y3BwcycpCiBrUHJlTWFjT1M5MUluc3RhbGxlckxvZ3NGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ1x4OTRsZ2YnKQpAQCAtMTQ1LDcgKzE0NSw3IEBACiBrUHJlTWFjT1M5MU1hY09TUmVhZE1lc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXHhiNW9yXHhjNCcpCiBrUHJlTWFjT1M5MUludGVybmV0Rm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceDk0bnRceGM0JykKIGtQcmVNYWNPUzkxQXV0b21vdW50ZWRTZXJ2ZXJzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceGE3cnZceGM0JykKLWtQcmVNYWNPUzkxU3RhdGlvbmVyeUZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXHhiZmRzdCcpIAora1ByZU1hY09TOTFTdGF0aW9uZXJ5Rm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceGJmZHN0JykKIGtDcmVhdGVGb2xkZXJBdEJvb3QgPSAweDAwMDAwMDAyCiBrQ3JlYXRlRm9sZGVyQXRCb290Qml0ID0gMQoga0ZvbGRlckNyZWF0ZWRJbnZpc2libGUgPSAweDAwMDAwMDA0CkBAIC0xNzEsNyArMTcxLDcgQEAKIGtTcGVjaWFsRm9sZGVyID0gRk9VUl9DSEFSX0NPREUoJ3NwY2YnKQoga0JsZXNzZWRGb2xkZXIgPSBGT1VSX0NIQVJfQ09ERSgnYmxzZicpCiBrUm9vdEZvbGRlciA9IEZPVVJfQ0hBUl9DT0RFKCdyb3RmJykKLWtDdXJyZW50VXNlckZvbGRlckxvY2F0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2N1c2YnKSAKK2tDdXJyZW50VXNlckZvbGRlckxvY2F0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2N1c2YnKQoga0ZpbmRGb2xkZXJSZWRpcmVjdGlvbkZsYWdVc2VEaXN0aW5jdFVzZXJGb2xkZXJzQml0ID0gMAoga0ZpbmRGb2xkZXJSZWRpcmVjdGlvbkZsYWdVc2VHaXZlblZSZWZBbmREaXJJREFzVXNlckZvbGRlckJpdCA9IDEKIGtGaW5kRm9sZGVyUmVkaXJlY3Rpb25GbGFnc1VzZUdpdmVuVlJlZk51bUFuZERpcklEQXNSZW1vdGVVc2VyRm9sZGVyQml0ID0gMgpAQCAtMTg0LDcgKzE4NCw3IEBACiBrRm9sZGVyTWFuYWdlck5vdGlmaWNhdGlvbk1lc3NhZ2VVc2VyTG9nT3V0ID0gRk9VUl9DSEFSX0NPREUoJ2xvZy0nKQoga0ZvbGRlck1hbmFnZXJOb3RpZmljYXRpb25NZXNzYWdlUG9zdFVzZXJMb2dPdXQgPSBGT1VSX0NIQVJfQ09ERSgnbG9ncCcpCiBrRm9sZGVyTWFuYWdlck5vdGlmaWNhdGlvbkRpc2NhcmRDYWNoZWREYXRhID0gRk9VUl9DSEFSX0NPREUoJ2RjaGUnKQota0ZvbGRlck1hbmFnZXJOb3RpZmljYXRpb25NZXNzYWdlTG9naW5TdGFydHVwID0gRk9VUl9DSEFSX0NPREUoJ3N0dXAnKSAKK2tGb2xkZXJNYW5hZ2VyTm90aWZpY2F0aW9uTWVzc2FnZUxvZ2luU3RhcnR1cCA9IEZPVVJfQ0hBUl9DT0RFKCdzdHVwJykKIGtEb05vdFJlbW92ZVdoZW5DdXJyZW50QXBwbGljYXRpb25RdWl0c0JpdCA9IDAKLWtEb05vdFJlbW92ZVdoZUN1cnJlbnRBcHBsaWNhdGlvblF1aXRzQml0ID0ga0RvTm90UmVtb3ZlV2hlbkN1cnJlbnRBcHBsaWNhdGlvblF1aXRzQml0IAora0RvTm90UmVtb3ZlV2hlQ3VycmVudEFwcGxpY2F0aW9uUXVpdHNCaXQgPSBrRG9Ob3RSZW1vdmVXaGVuQ3VycmVudEFwcGxpY2F0aW9uUXVpdHNCaXQKIGtTdG9wSWZBbnlOb3RpZmljYXRpb25Qcm9jUmV0dXJuc0Vycm9yQml0ID0gMzEKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9DYXJib24vSWNvbnMucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0ljb25zLnB5CmluZGV4IDFlZDhkNTAuLjg2ZGFlNjMgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9DYXJib24vSWNvbnMucHkKKysrIGIvTGliL3BsYXQtbWFjL0NhcmJvbi9JY29ucy5weQpAQCAtMjU0LDcgKzI1NCw3IEBACiBrVHJ1ZVR5cGVGbGF0Rm9udEljb24gPSBGT1VSX0NIQVJfQ09ERSgnc2ZudCcpCiBrVHJ1ZVR5cGVNdWx0aUZsYXRGb250SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCd0dGNmJykKIGtVc2VySURpc2tJY29uID0gRk9VUl9DSEFSX0NPREUoJ3Vkc2snKQota0ludGVybmF0aW9uUmVzb3VyY2VzSWNvbiA9IGtJbnRlcm5hdGlvbmFsUmVzb3VyY2VzSWNvbiAKK2tJbnRlcm5hdGlvblJlc291cmNlc0ljb24gPSBrSW50ZXJuYXRpb25hbFJlc291cmNlc0ljb24KIGtJbnRlcm5ldExvY2F0aW9uSFRUUEljb24gPSBGT1VSX0NIQVJfQ09ERSgnaWxodCcpCiBrSW50ZXJuZXRMb2NhdGlvbkZUUEljb24gPSBGT1VSX0NIQVJfQ09ERSgnaWxmdCcpCiBrSW50ZXJuZXRMb2NhdGlvbkFwcGxlU2hhcmVJY29uID0gRk9VUl9DSEFSX0NPREUoJ2lsYWYnKQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9MYXVuY2hTZXJ2aWNlcy5weSBiL0xpYi9wbGF0LW1hYy9DYXJib24vTGF1bmNoU2VydmljZXMucHkKaW5kZXggMjJiYjQyMS4uZGFmZjQ0NiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9MYXVuY2hTZXJ2aWNlcy5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL0xhdW5jaFNlcnZpY2VzLnB5CkBAIC0yMCwxMCArMjAsMTAgQEAKIGtMU0FwcERvZXNOb3RDbGFpbVR5cGVFcnIgPSAtMTA4MjAKIGtMU0FwcERvZXNOb3RTdXBwb3J0U2NoZW1lV2FybmluZyA9IC0xMDgyMQoga0xTU2VydmVyQ29tbXVuaWNhdGlvbkVyciA9IC0xMDgyMgota0xTQ2Fubm90U2V0SW5mb0VyciA9IC0xMDgyMyAKK2tMU0Nhbm5vdFNldEluZm9FcnIgPSAtMTA4MjMKIGtMU0luaXRpYWxpemVEZWZhdWx0cyA9IDB4MDAwMDAwMDEKLWtMU01pbkNhdEluZm9CaXRtYXAgPSAoa0ZTQ2F0SW5mb05vZGVGbGFncyB8IGtGU0NhdEluZm9QYXJlbnREaXJJRCB8IGtGU0NhdEluZm9GaW5kZXJJbmZvIHwga0ZTQ2F0SW5mb0ZpbmRlclhJbmZvKSAKLSMga0xTSW52YWxpZEV4dGVuc2lvbkluZGV4ID0gKHVuc2lnbmVkIGxvbmcpMHhGRkZGRkZGRiAKK2tMU01pbkNhdEluZm9CaXRtYXAgPSAoa0ZTQ2F0SW5mb05vZGVGbGFncyB8IGtGU0NhdEluZm9QYXJlbnREaXJJRCB8IGtGU0NhdEluZm9GaW5kZXJJbmZvIHwga0ZTQ2F0SW5mb0ZpbmRlclhJbmZvKQorIyBrTFNJbnZhbGlkRXh0ZW5zaW9uSW5kZXggPSAodW5zaWduZWQgbG9uZykweEZGRkZGRkZGCiBrTFNSZXF1ZXN0RXh0ZW5zaW9uID0gMHgwMDAwMDAwMQoga0xTUmVxdWVzdFR5cGVDcmVhdG9yID0gMHgwMDAwMDAwMgoga0xTUmVxdWVzdEJhc2ljRmxhZ3NPbmx5ID0gMHgwMDAwMDAwNApAQCAtMzEsNyArMzEsNyBAQAoga0xTUmVxdWVzdEFsbEZsYWdzID0gMHgwMDAwMDAxMAoga0xTUmVxdWVzdEljb25BbmRLaW5kID0gMHgwMDAwMDAyMAoga0xTUmVxdWVzdEV4dGVuc2lvbkZsYWdzT25seSA9IDB4MDAwMDAwNDAKLSMga0xTUmVxdWVzdEFsbEluZm8gPSAodW5zaWduZWQgbG9uZykweEZGRkZGRkZGIAorIyBrTFNSZXF1ZXN0QWxsSW5mbyA9ICh1bnNpZ25lZCBsb25nKTB4RkZGRkZGRkYKIGtMU0l0ZW1JbmZvSXNQbGFpbkZpbGUgPSAweDAwMDAwMDAxCiBrTFNJdGVtSW5mb0lzUGFja2FnZSA9IDB4MDAwMDAwMDIKIGtMU0l0ZW1JbmZvSXNBcHBsaWNhdGlvbiA9IDB4MDAwMDAwMDQKQEAgLTQ1LDE2ICs0NSwxNiBAQAoga0xTSXRlbUluZm9BcHBQcmVmZXJzQ2xhc3NpYyA9IDB4MDAwMDA0MDAKIGtMU0l0ZW1JbmZvQXBwSXNTY3JpcHRhYmxlID0gMHgwMDAwMDgwMAoga0xTSXRlbUluZm9Jc1ZvbHVtZSA9IDB4MDAwMDEwMDAKLWtMU0l0ZW1JbmZvRXh0ZW5zaW9uSXNIaWRkZW4gPSAweDAwMTAwMDAwIAora0xTSXRlbUluZm9FeHRlbnNpb25Jc0hpZGRlbiA9IDB4MDAxMDAwMDAKIGtMU1JvbGVzTm9uZSA9IDB4MDAwMDAwMDEKIGtMU1JvbGVzVmlld2VyID0gMHgwMDAwMDAwMgoga0xTUm9sZXNFZGl0b3IgPSAweDAwMDAwMDA0Ci0jIGtMU1JvbGVzQWxsID0gKHVuc2lnbmVkIGxvbmcpMHhGRkZGRkZGRiAKKyMga0xTUm9sZXNBbGwgPSAodW5zaWduZWQgbG9uZykweEZGRkZGRkZGCiBrTFNVbmtub3duS2luZElEID0gMAogIyBrTFNVbmtub3duVHlwZSA9IDAKICMga0xTVW5rbm93bkNyZWF0b3IgPSAwCiBrTFNBY2NlcHREZWZhdWx0ID0gMHgwMDAwMDAwMQota0xTQWNjZXB0QWxsb3dMb2dpblVJID0gMHgwMDAwMDAwMiAKK2tMU0FjY2VwdEFsbG93TG9naW5VSSA9IDB4MDAwMDAwMDIKIGtMU0xhdW5jaERlZmF1bHRzID0gMHgwMDAwMDAwMQoga0xTTGF1bmNoQW5kUHJpbnQgPSAweDAwMDAwMDAyCiBrTFNMYXVuY2hSZXNlcnZlZDIgPSAweDAwMDAwMDA0CkBAIC03MSw0ICs3MSw0IEBACiBrTFNMYXVuY2hJbkNsYXNzaWMgPSAweDAwMDQwMDAwCiBrTFNMYXVuY2hOZXdJbnN0YW5jZSA9IDB4MDAwODAwMDAKIGtMU0xhdW5jaEFuZEhpZGUgPSAweDAwMTAwMDAwCi1rTFNMYXVuY2hBbmRIaWRlT3RoZXJzID0gMHgwMDIwMDAwMCAKK2tMU0xhdW5jaEFuZEhpZGVPdGhlcnMgPSAweDAwMjAwMDAwCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0xpc3RzLnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9MaXN0cy5weQppbmRleCA3NjUxOGJhLi43MjMyOTRjIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0xpc3RzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vTGlzdHMucHkKQEAgLTQsNyArNCw3IEBACiBsaXN0Tm90aWZ5Tm90aGluZyA9IEZPVVJfQ0hBUl9DT0RFKCduYWRhJykKIGxpc3ROb3RpZnlDbGljayA9IEZPVVJfQ0hBUl9DT0RFKCdjbGlrJykKIGxpc3ROb3RpZnlEb3VibGVDbGljayA9IEZPVVJfQ0hBUl9DT0RFKCdkYmxjJykKLWxpc3ROb3RpZnlQcmVDbGljayA9IEZPVVJfQ0hBUl9DT0RFKCdwY2xrJykgCitsaXN0Tm90aWZ5UHJlQ2xpY2sgPSBGT1VSX0NIQVJfQ09ERSgncGNsaycpCiBsRHJhd2luZ01vZGVPZmZCaXQgPSAzCiBsRG9WQXV0b3Njcm9sbEJpdCA9IDEKIGxEb0hBdXRvc2Nyb2xsQml0ID0gMApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9NYWNIZWxwLnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9NYWNIZWxwLnB5CmluZGV4IGEyMzFhOGQuLjA2Yjk5MTIgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9DYXJib24vTWFjSGVscC5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL01hY0hlbHAucHkKQEAgLTUxLDggKzUxLDggQEAKIGtITUNvbnRlbnROb3RQcm92aWRlZCA9IDEKIGtITUNvbnRlbnROb3RQcm92aWRlZERvbnRQcm9wYWdhdGUgPSAyCiBrSE1NaW5pbXVtQ29udGVudEluZGV4ID0gMAota0hNTWF4aW11bUNvbnRlbnRJbmRleCA9IDEgICAgIAora0hNTWF4aW11bUNvbnRlbnRJbmRleCA9IDEKIGVyckhNSWxsZWdhbENvbnRlbnRGb3JNaW5pbXVtU3RhdGUgPSAtMTA5ODAKLWVyckhNSWxsZWdhbENvbnRlbnRGb3JNYXhpbXVtU3RhdGUgPSAtMTA5ODEgCitlcnJITUlsbGVnYWxDb250ZW50Rm9yTWF4aW11bVN0YXRlID0gLTEwOTgxCiBrSE1JbGxlZ2FsQ29udGVudEZvck1pbmltdW1TdGF0ZSA9IGVyckhNSWxsZWdhbENvbnRlbnRGb3JNaW5pbXVtU3RhdGUKIGtIZWxwVGFnRXZlbnRIYW5kbGVyVGFnID0gRk9VUl9DSEFSX0NPREUoJ2hldnQnKQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9NYWNUZXh0RWRpdG9yLnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9NYWNUZXh0RWRpdG9yLnB5CmluZGV4IGZjYzZmZDIuLjQ2MDlkOGQgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9DYXJib24vTWFjVGV4dEVkaXRvci5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL01hY1RleHRFZGl0b3IucHkKQEAgLTE0NSw3ICsxNDUsNyBAQAoga1RYTk1vdmVBY3Rpb24gPSAxMgoga1RYTkZvbnRGZWF0dXJlQWN0aW9uID0gMTMKIGtUWE5Gb250VmFyaWF0aW9uQWN0aW9uID0gMTQKLWtUWE5VbmRvTGFzdEFjdGlvbiA9IDEwMjQgIAora1RYTlVuZG9MYXN0QWN0aW9uID0gMTAyNAogIyBrVFhOQ2xlYXJUaGlzQ29udHJvbCA9IChsb25nKTB4RkZGRkZGRkYKICMga1RYTkNsZWFyVGhlc2VGb250RmVhdHVyZXMgPSAobG9uZykweDgwMDAwMDAwCiBrVFhOUmVhZFdyaXRlID0gZmFsc2UKQEAgLTE3Niw3ICsxNzYsNyBAQAoga1RYTkZsdXNoUmlnaHQgPSAyCiBrVFhOQ2VudGVyID0gNAoga1RYTkZ1bGxKdXN0ID0gOAota1RYTkZvcmNlRnVsbEp1c3QgPSAxNiAgICAKK2tUWE5Gb3JjZUZ1bGxKdXN0ID0gMTYKIGtTY3JvbGxCYXJzQWx3YXlzQWN0aXZlID0gdHJ1ZQoga1Njcm9sbEJhcnNTeW5jV2l0aEZvY3VzID0gZmFsc2UKICMga1RYTkRvbnRDYXJlVHlwZVNpemUgPSAobG9uZykweEZGRkZGRkZGCkBAIC0xOTIsNyArMTkyLDcgQEAKIGtUWE5NdWx0aXBsZVN0eWxlc1BlclRleHREb2N1bWVudFJlc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3R5bCcpCiBrVFhOU2hvd1N0YXJ0ID0gZmFsc2UKIGtUWE5TaG93RW5kID0gdHJ1ZQota1RYTkRlZmF1bHRGb250TmFtZSA9IDAgICAgIAora1RYTkRlZmF1bHRGb250TmFtZSA9IDAKIGtUWE5EZWZhdWx0Rm9udFNpemUgPSAweDAwMEMwMDAwCiBrVFhORGVmYXVsdEZvbnRTdHlsZSA9IG5vcm1hbAoga1RYTlFERm9udE5hbWVBdHRyaWJ1dGUgPSBGT1VSX0NIQVJfQ09ERSgnZm50bicpCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL01lZGlhRGVzY3IucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL01lZGlhRGVzY3IucHkKaW5kZXggYWNhY2ZiMS4uMjU0NjM0YiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9NZWRpYURlc2NyLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vTWVkaWFEZXNjci5weQpAQCAtNCw1OCArNCw1OCBAQAogRXJyb3IgPSAnTWVkaWFEZXNjci5FcnJvcicKIAogY2xhc3MgX01lZGlhRGVzY3JpcHRpb25Db2RlYzoKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRydW5jLCBzaXplLCBuYW1lcywgZm10KToKLSAgICAgICAgICAgICAgICBzZWxmLnRydW5jID0gdHJ1bmMKLSAgICAgICAgICAgICAgICBzZWxmLnNpemUgPSBzaXplCi0gICAgICAgICAgICAgICAgc2VsZi5uYW1lcyA9IG5hbWVzCi0gICAgICAgICAgICAgICAgc2VsZi5mbXQgPSBmbXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJ1bmMsIHNpemUsIG5hbWVzLCBmbXQpOgorICAgICAgICBzZWxmLnRydW5jID0gdHJ1bmMKKyAgICAgICAgc2VsZi5zaXplID0gc2l6ZQorICAgICAgICBzZWxmLm5hbWVzID0gbmFtZXMKKyAgICAgICAgc2VsZi5mbXQgPSBmbXQKIAotICAgICAgICBkZWYgZGVjb2RlKHNlbGYsIGRhdGEpOgotICAgICAgICAgICAgICAgIGlmIHNlbGYudHJ1bmM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVs6c2VsZi5zaXplXQotICAgICAgICAgICAgICAgIHZhbHVlcyA9IHN0cnVjdC51bnBhY2soc2VsZi5mbXQsIGRhdGEpCi0gICAgICAgICAgICAgICAgaWYgbGVuKHZhbHVlcykgIT0gbGVuKHNlbGYubmFtZXMpOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICgnRm9ybWF0IGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBudW1iZXIgb2YgbmFtZXMnLCBkZXNjcikKLSAgICAgICAgICAgICAgICBydiA9IHt9Ci0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHZhbHVlcykpOgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZXNbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiB0eXBlKG5hbWUpID09IHR5cGUoKCkpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBjb2QsIGRlYyA9IG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkZWModmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICBydltuYW1lXSA9IHZhbHVlCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJ2CisgICAgZGVmIGRlY29kZShzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi50cnVuYzoKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhWzpzZWxmLnNpemVdCisgICAgICAgIHZhbHVlcyA9IHN0cnVjdC51bnBhY2soc2VsZi5mbXQsIGRhdGEpCisgICAgICAgIGlmIGxlbih2YWx1ZXMpICE9IGxlbihzZWxmLm5hbWVzKToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAoJ0Zvcm1hdCBsZW5ndGggZG9lcyBub3QgbWF0Y2ggbnVtYmVyIG9mIG5hbWVzJywgZGVzY3IpCisgICAgICAgIHJ2ID0ge30KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHZhbHVlcykpOgorICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZXNbaV0KKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2ldCisgICAgICAgICAgICBpZiB0eXBlKG5hbWUpID09IHR5cGUoKCkpOgorICAgICAgICAgICAgICAgIG5hbWUsIGNvZCwgZGVjID0gbmFtZQorICAgICAgICAgICAgICAgIHZhbHVlID0gZGVjKHZhbHVlKQorICAgICAgICAgICAgcnZbbmFtZV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gcnYKIAotICAgICAgICBkZWYgZW5jb2RlKGRpY3QpOgotICAgICAgICAgICAgICAgIGxpc3QgPSBbc2VsZi5mbXRdCi0gICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5uYW1lczoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHR5cGUobmFtZSkgPT0gdHlwZSgoKSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGNvZCwgZGVjID0gbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kID0gZGVjID0gTm9uZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkaWN0W25hbWVdCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBjb2Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29kKHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQodmFsdWUpCi0gICAgICAgICAgICAgICAgcnYgPSBzdHJ1Y3QucGFjaygqbGlzdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcnYKKyAgICBkZWYgZW5jb2RlKGRpY3QpOgorICAgICAgICBsaXN0ID0gW3NlbGYuZm10XQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLm5hbWVzOgorICAgICAgICAgICAgaWYgdHlwZShuYW1lKSA9PSB0eXBlKCgpKToKKyAgICAgICAgICAgICAgICBuYW1lLCBjb2QsIGRlYyA9IG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29kID0gZGVjID0gTm9uZQorICAgICAgICAgICAgdmFsdWUgPSBkaWN0W25hbWVdCisgICAgICAgICAgICBpZiBjb2Q6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2QodmFsdWUpCisgICAgICAgICAgICBsaXN0LmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgcnYgPSBzdHJ1Y3QucGFjaygqbGlzdCkKKyAgICAgICAgcmV0dXJuIHJ2CiAKICMgSGVscGVyIGZ1bmN0aW9ucwogZGVmIF90b2ZpeGVkKGZsb2F0KToKLSAgICAgICAgaGkgPSBpbnQoZmxvYXQpCi0gICAgICAgIGxvID0gaW50KGZsb2F0KjB4MTAwMDApICYgMHhmZmZmCi0gICAgICAgIHJldHVybiAoaGk8PDE2KXxsbworICAgIGhpID0gaW50KGZsb2F0KQorICAgIGxvID0gaW50KGZsb2F0KjB4MTAwMDApICYgMHhmZmZmCisgICAgcmV0dXJuIChoaTw8MTYpfGxvCiAKIGRlZiBfZnJvbWZpeGVkKGZpeGVkKToKLSAgICAgICAgaGkgPSAoZml4ZWQgPj4gMTYpICYgMHhmZmZmCi0gICAgICAgIGxvID0gKGZpeGVkICYgMHhmZmZmKQotICAgICAgICByZXR1cm4gaGkgKyAobG8gLyBmbG9hdCgweDEwMDAwKSkKKyAgICBoaSA9IChmaXhlZCA+PiAxNikgJiAweGZmZmYKKyAgICBsbyA9IChmaXhlZCAmIDB4ZmZmZikKKyAgICByZXR1cm4gaGkgKyAobG8gLyBmbG9hdCgweDEwMDAwKSkKIAogZGVmIF90b3N0cjMxKHN0cik6Ci0gICAgICAgIHJldHVybiBjaHIobGVuKHN0cikpICsgc3RyICsgJ1wwJyooMzEtbGVuKHN0cikpCisgICAgcmV0dXJuIGNocihsZW4oc3RyKSkgKyBzdHIgKyAnXDAnKigzMS1sZW4oc3RyKSkKIAogZGVmIF9mcm9tc3RyMzEoc3RyMzEpOgotICAgICAgICByZXR1cm4gc3RyMzFbMToxK29yZChzdHIzMVswXSldCisgICAgcmV0dXJuIHN0cjMxWzE6MStvcmQoc3RyMzFbMF0pXQogCiBTYW1wbGVEZXNjcmlwdGlvbiA9IF9NZWRpYURlc2NyaXB0aW9uQ29kZWMoCiAgICAgICAgIDEsICAgICAgIyBNYXkgYmUgbG9uZ2VyLCB0cnVuY2F0ZQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9NZW51cy5weSBiL0xpYi9wbGF0LW1hYy9DYXJib24vTWVudXMucHkKaW5kZXggYWJkZGU3OS4uMDFhZmZiMCAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9NZW51cy5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL01lbnVzLnB5CkBAIC0xLDcgKzEsNyBAQAogIyBHZW5lcmF0ZWQgZnJvbSAnTWVudXMuaCcKIAogZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAotbm9NYXJrID0gMCAgICAgCitub01hcmsgPSAwCiBrTWVudURyYXdNc2cgPSAwCiBrTWVudVNpemVNc2cgPSAyCiBrTWVudVBvcFVwTXNnID0gMwpAQCAtMTUsNyArMTUsNyBAQAogbURyYXdJdGVtTXNnID0gNAoga01lbnVDaG9vc2VNc2cgPSAxCiBrTWVudURyYXdJdGVtTXNnID0gNAota1RoZW1lU2F2dnlNZW51UmVzcG9uc2UgPSAweDc0NzMgCitrVGhlbWVTYXZ2eU1lbnVSZXNwb25zZSA9IDB4NzQ3Mwoga01lbnVJbml0TXNnID0gOAoga01lbnVEaXNwb3NlTXNnID0gOQoga01lbnVGaW5kSXRlbU1zZyA9IDEwCkBAIC0yNiwxNCArMjYsMTQgQEAKIGhpZXJNZW51ID0gLTEKIGtJbnNlcnRIaWVyYXJjaGljYWxNZW51ID0gLTEKIG1jdEFsbEl0ZW1zID0gLTk4Ci1tY3RMYXN0SURJbmRpYyA9IC05OSAgIAorbWN0TGFzdElESW5kaWMgPSAtOTkKIGtNZW51U3RkTWVudVByb2MgPSA2Mwoga01lbnVTdGRNZW51QmFyUHJvYyA9IDYzCiBrTWVudU5vTW9kaWZpZXJzID0gMAoga01lbnVTaGlmdE1vZGlmaWVyID0gKDEgPDwgMCkKIGtNZW51T3B0aW9uTW9kaWZpZXIgPSAoMSA8PCAxKQoga01lbnVDb250cm9sTW9kaWZpZXIgPSAoMSA8PCAyKQota01lbnVOb0NvbW1hbmRNb2RpZmllciA9ICgxIDw8IDMpIAora01lbnVOb0NvbW1hbmRNb2RpZmllciA9ICgxIDw8IDMpCiBrTWVudU5vSWNvbiA9IDAKIGtNZW51SWNvblR5cGUgPSAxCiBrTWVudVNocmlua0ljb25UeXBlID0gMgpAQCAtNDMsNyArNDMsNyBAQAoga01lbnVJY29uUmVmVHlwZSA9IDYKIGtNZW51Q0dJbWFnZVJlZlR5cGUgPSA3CiBrTWVudVN5c3RlbUljb25TZWxlY3RvclR5cGUgPSA4Ci1rTWVudUljb25SZXNvdXJjZVR5cGUgPSA5ICAgICAKK2tNZW51SWNvblJlc291cmNlVHlwZSA9IDkKIGtNZW51TnVsbEdseXBoID0gMHgwMAoga01lbnVUYWJSaWdodEdseXBoID0gMHgwMgoga01lbnVUYWJMZWZ0R2x5cGggPSAweDAzCkBAIC0xMDEsNyArMTAxLDcgQEAKIGtNZW51RjEzR2x5cGggPSAweDg3CiBrTWVudUYxNEdseXBoID0gMHg4OAoga01lbnVGMTVHbHlwaCA9IDB4ODkKLWtNZW51Q29udHJvbElTT0dseXBoID0gMHg4QSAgCitrTWVudUNvbnRyb2xJU09HbHlwaCA9IDB4OEEKIGtNZW51QXR0ckV4Y2x1ZGVzTWFya0NvbHVtbiA9ICgxIDw8IDApCiBrTWVudUF0dHJBdXRvRGlzYWJsZSA9ICgxIDw8IDIpCiBrTWVudUF0dHJVc2VQZW5jaWxHbHlwaCA9ICgxIDw8IDMpCkBAIC0xNDcsMTQgKzE0NywxNCBAQAoga01lbnVJdGVtRGF0YUNtZFZpcnR1YWxLZXkgPSAoMSA8PCAyMCkKIGtNZW51SXRlbURhdGFBbGxEYXRhVmVyc2lvbk9uZSA9IDB4MDAwRkZGRkYKIGtNZW51SXRlbURhdGFBbGxEYXRhVmVyc2lvblR3byA9IGtNZW51SXRlbURhdGFBbGxEYXRhVmVyc2lvbk9uZSB8IGtNZW51SXRlbURhdGFDbWRWaXJ0dWFsS2V5Ci1rTWVudURlZlByb2NQdHIgPSAwICAgICAKLWtNZW51UHJvcGVydHlQZXJzaXN0ZW50ID0gMHgwMDAwMDAwMSAKK2tNZW51RGVmUHJvY1B0ciA9IDAKK2tNZW51UHJvcGVydHlQZXJzaXN0ZW50ID0gMHgwMDAwMDAwMQoga0hpZXJhcmNoaWNhbEZvbnRNZW51T3B0aW9uID0gMHgwMDAwMDAwMQogZ2VzdGFsdENvbnRleHR1YWxNZW51QXR0ciA9IEZPVVJfQ0hBUl9DT0RFKCdjbW51JykKIGdlc3RhbHRDb250ZXh0dWFsTWVudVVudXNlZEJpdCA9IDAKIGdlc3RhbHRDb250ZXh0dWFsTWVudVRyYXBBdmFpbGFibGUgPSAxCiBnZXN0YWx0Q29udGV4dHVhbE1lbnVIYXNBdHRyaWJ1dGVBbmRNb2RpZmllcktleXMgPSAyCi1nZXN0YWx0Q29udGV4dHVhbE1lbnVIYXNVbmljb2RlU3VwcG9ydCA9IDMgCitnZXN0YWx0Q29udGV4dHVhbE1lbnVIYXNVbmljb2RlU3VwcG9ydCA9IDMKIGtDTUhlbHBJdGVtTm9IZWxwID0gMAoga0NNSGVscEl0ZW1BcHBsZUd1aWRlID0gMQoga0NNSGVscEl0ZW1PdGhlckhlbHAgPSAyCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL09TQWNvbnN0LnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9PU0Fjb25zdC5weQppbmRleCBjY2NlMDBhLi4zYjY0YzI0IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL09TQWNvbnN0LnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vT1NBY29uc3QucHkKQEAgLTE4LDEwICsxOCwxMCBAQAoga2V5T1NBRGlhbGVjdE5hbWUgPSBGT1VSX0NIQVJfQ09ERSgnZG5hbScpCiBrZXlPU0FEaWFsZWN0Q29kZSA9IEZPVVJfQ0hBUl9DT0RFKCdkY29kJykKIGtleU9TQURpYWxlY3RMYW5nQ29kZSA9IEZPVVJfQ0hBUl9DT0RFKCdkbGNkJykKLWtleU9TQURpYWxlY3RTY3JpcHRDb2RlID0gRk9VUl9DSEFSX0NPREUoJ2RzY2QnKSAKK2tleU9TQURpYWxlY3RTY3JpcHRDb2RlID0gRk9VUl9DSEFSX0NPREUoJ2RzY2QnKQoga09TQU51bGxTY3JpcHQgPSAwTAoga09TQU51bGxNb2RlID0gMAota09TQU1vZGVOdWxsID0gMCAgICAgCitrT1NBTW9kZU51bGwgPSAwCiBrT1NBU3VwcG9ydHNDb21waWxpbmcgPSAweDAwMDIKIGtPU0FTdXBwb3J0c0dldFNvdXJjZSA9IDB4MDAwNAoga09TQVN1cHBvcnRzQUVDb2VyY2lvbiA9IDB4MDAwOApAQCAtMTMwLDQgKzEzMCw0IEBACiBrZXlTdGF0ZW1lbnRSYW5nZSA9IEZPVVJfQ0hBUl9DT0RFKCdkZnNyJykKIGtleUxvY2Fsc05hbWVzID0gRk9VUl9DSEFSX0NPREUoJ2RmbG4nKQoga2V5R2xvYmFsc05hbWVzID0gRk9VUl9DSEFSX0NPREUoJ2RmZ24nKQota2V5UGFyYW1zTmFtZXMgPSBGT1VSX0NIQVJfQ09ERSgnZGZwbicpIAora2V5UGFyYW1zTmFtZXMgPSBGT1VSX0NIQVJfQ09ERSgnZGZwbicpCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL1F0LnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9RdC5weQppbmRleCAyM2Q0NGQyLi41OTBhOTJhIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL1F0LnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vUXQucHkKQEAgLTMsNCArMywzIEBACiAgICAgXyA9IEFkZEZpbGVQcmV2aWV3CiBleGNlcHQ6CiAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJPbGQgKDIuMykgX1F0LnNvIG1vZHVsZSBsb2FkZWQgaW4gc3RlYWQgb2YgbmV3ICgyLjQpIF9RdC5zbyIKLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL1F1aWNrRHJhdy5weSBiL0xpYi9wbGF0LW1hYy9DYXJib24vUXVpY2tEcmF3LnB5CmluZGV4IDkyMDlhMzUuLjY1YzJmOWEgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9DYXJib24vUXVpY2tEcmF3LnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vUXVpY2tEcmF3LnB5CkBAIC0yLDE1ICsyLDE1IEBACiAKIAogZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAotbm9ybWFsCQkJCQkJPSAwCi1ib2xkCQkJCQkJPSAxCi1pdGFsaWMJCQkJCQk9IDIKLXVuZGVybGluZQkJCQkJPSA0Ci1vdXRsaW5lCQkJCQkJPSA4Ci1zaGFkb3cJCQkJCQk9IDB4MTAKLWNvbmRlbnNlCQkJCQk9IDB4MjAKLWV4dGVuZAkJCQkJCT0gMHg0MAotaW52YWxDb2xSZXEgPSAtMSAgICAKK25vcm1hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMAorYm9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxCitpdGFsaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIKK3VuZGVybGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNAorb3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4CitzaGFkb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAKK2NvbmRlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMAorZXh0ZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwCitpbnZhbENvbFJlcSA9IC0xCiBzcmNDb3B5ID0gMAogc3JjT3IgPSAxCiBzcmNYb3IgPSAyCkBAIC02OCw3ICs2OCw3IEBACiBjbHV0VHlwZSA9IDAKIGZpeGVkVHlwZSA9IDEKIGRpcmVjdFR5cGUgPSAyCi1nZERldlR5cGUgPSAwICAgICAKK2dkRGV2VHlwZSA9IDAKIGludGVybGFjZWREZXZpY2UgPSAyCiBod01pcnJvcmVkRGV2aWNlID0gNAogcm91bmRlZERldmljZSA9IDUKQEAgLTg1LDcgKzg1LDcgQEAKIHBIaWxpdGVCaXQgPSAwCiBkZWZRRENvbG9ycyA9IDEyNwogUkdCRGlyZWN0ID0gMTYKLWJhc2VBZGRyMzIgPSA0ICAgICAKK2Jhc2VBZGRyMzIgPSA0CiBzeXNQYXRMaXN0SUQgPSAwCiBpQmVhbUN1cnNvciA9IDEKIGNyb3NzQ3Vyc29yID0gMgpAQCAtMTI1LDcgKzEyNSw3IEBACiBrMUluZGV4ZWRHcmF5UGl4ZWxGb3JtYXQgPSAweDAwMDAwMDIxCiBrMkluZGV4ZWRHcmF5UGl4ZWxGb3JtYXQgPSAweDAwMDAwMDIyCiBrNEluZGV4ZWRHcmF5UGl4ZWxGb3JtYXQgPSAweDAwMDAwMDI0Ci1rOEluZGV4ZWRHcmF5UGl4ZWxGb3JtYXQgPSAweDAwMDAwMDI4IAorazhJbmRleGVkR3JheVBpeGVsRm9ybWF0ID0gMHgwMDAwMDAyOAogazE2TEU1NTVQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdMNTU1JykKIGsxNkxFNTU1MVBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJzU1NTEnKQogazE2QkU1NjVQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdCNTY1JykKQEAgLTE0MSw3ICsxNDEsNyBAQAoga1lWWVU0MjJQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdZVllVJykKIGtVWVZZNDIyUGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnVVlWWScpCiBrWVVWMjExUGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnWTIxMScpCi1rMnZ1eVBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJzJ2dXknKSAKK2sydnV5UGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnMnZ1eScpCiBrQ3Vyc29ySW1hZ2VNYWpvclZlcnNpb24gPSAweDAwMDEKIGtDdXJzb3JJbWFnZU1pbm9yVmVyc2lvbiA9IDB4MDAwMAoga1FEUGFyc2VSZWdpb25Gcm9tVG9wID0gKDEgPDwgMCkKQEAgLTE1Nyw3ICsxNTcsNyBAQAogbm9pc2VYRmVyID0gNTMKIGN1c3RvbVhGZXIgPSA1NAoga1hGZXIxUGl4ZWxBdEFUaW1lID0gMHgwMDAwMDAwMQota1hGZXJDb252ZXJ0UGl4ZWxUb1JHQjMyID0gMHgwMDAwMDAwMiAKK2tYRmVyQ29udmVydFBpeGVsVG9SR0IzMiA9IDB4MDAwMDAwMDIKIGtDdXJzb3JDb21wb25lbnRzVmVyc2lvbiA9IDB4MDAwMTAwMDEKIGtDdXJzb3JDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2N1cnMnKQogY3Vyc29yRG9lc0FuaW1hdGUgPSAxTCA8PCAwCkBAIC0xNzksMjAgKzE3OSwyMCBAQAogCiAKIGRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKLW5vcm1hbAkJCQkJCT0gMAotYm9sZAkJCQkJCT0gMQotaXRhbGljCQkJCQkJPSAyCi11bmRlcmxpbmUJCQkJCT0gNAotb3V0bGluZQkJCQkJCT0gOAotc2hhZG93CQkJCQkJPSAweDEwCi1jb25kZW5zZQkJCQkJPSAweDIwCi1leHRlbmQJCQkJCQk9IDB4NDAKK25vcm1hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMAorYm9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxCitpdGFsaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIKK3VuZGVybGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNAorb3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4CitzaGFkb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAKK2NvbmRlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMAorZXh0ZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwCiBsZWZ0Q2FyZXQgPSAwCiByaWdodENhcmV0ID0gLTEKLWtIaWxpdGUgPSAxICAgICAKK2tIaWxpdGUgPSAxCiBzbUxlZnRDYXJldCA9IDAKIHNtUmlnaHRDYXJldCA9IC0xCi1zbUhpbGl0ZSA9IDEgICAgIAorc21IaWxpdGUgPSAxCiBvbmx5U3R5bGVSdW4gPSAwCiBsZWZ0U3R5bGVSdW4gPSAxCiByaWdodFN0eWxlUnVuID0gMgpAQCAtMjAwLDE3ICsyMDAsMTcgQEAKIHNtT25seVN0eWxlUnVuID0gMAogc21MZWZ0U3R5bGVSdW4gPSAxCiBzbVJpZ2h0U3R5bGVSdW4gPSAyCi1zbU1pZGRsZVN0eWxlUnVuID0gMyAgICAgCitzbU1pZGRsZVN0eWxlUnVuID0gMwogdHJ1bmNFbmQgPSAwCiB0cnVuY01pZGRsZSA9IDB4NDAwMAogc21UcnVuY0VuZCA9IDAKLXNtVHJ1bmNNaWRkbGUgPSAweDQwMDAgCitzbVRydW5jTWlkZGxlID0gMHg0MDAwCiBub3RUcnVuY2F0ZWQgPSAwCiB0cnVuY2F0ZWQgPSAxCiB0cnVuY0VyciA9IC0xCiBzbU5vdFRydW5jYXRlZCA9IDAKIHNtVHJ1bmNhdGVkID0gMQotc21UcnVuY0VyciA9IC0xICAgIAorc21UcnVuY0VyciA9IC0xCiBzbUJyZWFrV29yZCA9IDAKIHNtQnJlYWtDaGFyID0gMQogc21CcmVha092ZXJmbG93ID0gMgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9RdWlja1RpbWUucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL1F1aWNrVGltZS5weQppbmRleCA2YWIwMzA0Li44ZmJhNThjIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL1F1aWNrVGltZS5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL1F1aWNrVGltZS5weQpAQCAtMTE4LDcgKzExOCw3IEBACiBkZkFudGlBbGlhcyA9IDEgPDwgMTMKIGRmS2V5ZWRUZXh0ID0gMSA8PCAxNAogZGZJbnZlcnNlSGlsaXRlID0gMSA8PCAxNQotZGZUZXh0Q29sb3JIaWxpdGUgPSAxIDw8IDE2IAorZGZUZXh0Q29sb3JIaWxpdGUgPSAxIDw8IDE2CiBzZWFyY2hUZXh0RG9udEdvVG9Gb3VuZFRpbWUgPSAxTCA8PCAxNgogc2VhcmNoVGV4dERvbnRIaWxpdGVGb3VuZFRleHQgPSAxTCA8PCAxNwogc2VhcmNoVGV4dE9uZVRyYWNrT25seSA9IDFMIDw8IDE4CkBAIC0xNDQsNyArMTQ0LDcgQEAKIGtUZXh0TW91c2VEb3duID0gMTkKIGtUZXh0VGV4dEJveCA9IDIwCiBrVGV4dEVkaXRTdGF0ZSA9IDIxCi1rVGV4dExlbmd0aCA9IDIyICAgIAora1RleHRMZW5ndGggPSAyMgogazNETWVkaWFSZW5kZXJlckVudHJ5ID0gRk9VUl9DSEFSX0NPREUoJ3JlbmQnKQogazNETWVkaWFSZW5kZXJlck5hbWUgPSBGT1VSX0NIQVJfQ09ERSgnbmFtZScpCiBrM0RNZWRpYVJlbmRlcmVyQ29kZSA9IEZPVVJfQ0hBUl9DT0RFKCdyY29kJykKQEAgLTI5NSw3ICsyOTUsNyBAQAoga0FjdGlvbkxpc3RTZXRNYXRjaGluZ0Zyb21YTUwgPSAxMzMxNgoga0FjdGlvbkxpc3RTZXRGcm9tVVJMID0gMTMzMTcKIGtBY3Rpb25MaXN0RXhjaGFuZ2VMaXN0cyA9IDEzMzE4Ci1rQWN0aW9uTGlzdFNlcnZlclF1ZXJ5ID0gMTMzMTkgCitrQWN0aW9uTGlzdFNlcnZlclF1ZXJ5ID0gMTMzMTkKIGtPcGVyYW5kRXhwcmVzc2lvbiA9IDEKIGtPcGVyYW5kQ29uc3RhbnQgPSAyCiBrT3BlcmFuZFN1YnNjcmliZWRUb0NoYW5uZWwgPSAzCkBAIC00MzAsNyArNDMwLDcgQEAKIGtPcGVyYW5kU3RyaW5nTGVuZ3RoID0gMTAyNDAKIGtPcGVyYW5kU3RyaW5nQ29tcGFyZSA9IDEwMjQxCiBrT3BlcmFuZFN0cmluZ1N1YlN0cmluZyA9IDEwMjQyCi1rT3BlcmFuZFN0cmluZ0NvbmNhdCA9IDEwMjQzIAora09wZXJhbmRTdHJpbmdDb25jYXQgPSAxMDI0Mwoga0ZpcnN0TW92aWVBY3Rpb24gPSBrQWN0aW9uTW92aWVTZXRWb2x1bWUKIGtMYXN0TW92aWVBY3Rpb24gPSBrQWN0aW9uTW92aWVTZXRTY2FsZQoga0ZpcnN0VHJhY2tBY3Rpb24gPSBrQWN0aW9uVHJhY2tTZXRWb2x1bWUKQEAgLTQ3Nyw3ICs0NzcsNyBAQAoga1RhcmdldFNwcml0ZUlEID0gRk9VUl9DSEFSX0NPREUoJ3NwaWQnKQoga1RhcmdldFNwcml0ZUluZGV4ID0gRk9VUl9DSEFSX0NPREUoJ3NwaW4nKQoga1RhcmdldFFEM0ROYW1lZE9iamVjdE5hbWUgPSBGT1VSX0NIQVJfQ09ERSgnbmFuYScpCi1rVGFyZ2V0Q3VycmVudFFURXZlbnRQYXJhbXMgPSBGT1VSX0NIQVJfQ09ERSgnZXZwYScpIAora1RhcmdldEN1cnJlbnRRVEV2ZW50UGFyYW1zID0gRk9VUl9DSEFSX0NPREUoJ2V2cGEnKQoga1FURXZlbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2V2bnQnKQoga0FjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdhY3RuJykKIGtXaGljaEFjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCd3aGljJykKQEAgLTUwOCw3ICs1MDgsNyBAQAoga1FURXZlbnRNb3ZpZUxvYWRlZCA9IEZPVVJfQ0hBUl9DT0RFKCdsb2FkJykKIGtRVEV2ZW50UmVxdWVzdFRvTW9kaWZ5TW92aWUgPSBGT1VSX0NIQVJfQ09ERSgncmVxbScpCiBrUVRFdmVudExpc3RSZWNlaXZlZCA9IEZPVVJfQ0hBUl9DT0RFKCdsaXN0JykKLWtRVEV2ZW50S2V5VXAgPSBGT1VSX0NIQVJfQ09ERSgna2V5VScpIAora1FURXZlbnRLZXlVcCA9IEZPVVJfQ0hBUl9DT0RFKCdrZXlVJykKIGtBY3Rpb25GbGFnQWN0aW9uSXNEZWx0YSA9IDFMIDw8IDEKIGtBY3Rpb25GbGFnUGFyYW1ldGVyV3JhcHNBcm91bmQgPSAxTCA8PCAyCiBrQWN0aW9uRmxhZ0FjdGlvbklzVG9nZ2xlID0gMUwgPDwgMwpAQCAtNTc0LDEyICs1NzQsMTIgQEAKIGNhbGxCYWNrQXREZWZlcnJlZFRhc2sgPSAweDQwMDAKIHF0Y2JOZWVkc1JhdGVDaGFuZ2VzID0gMQogcXRjYk5lZWRzVGltZUNoYW5nZXMgPSAyCi1xdGNiTmVlZHNTdGFydFN0b3BDaGFuZ2VzID0gNCAgICAgCitxdGNiTmVlZHNTdGFydFN0b3BDaGFuZ2VzID0gNAoga2VlcEluUmFtID0gMSA8PCAwCiB1bmtlZXBJblJhbSA9IDEgPDwgMQogZmx1c2hGcm9tUmFtID0gMSA8PCAyCiBsb2FkRm9yd2FyZFRyYWNrRWRpdHMgPSAxIDw8IDMKLWxvYWRCYWNrd2FyZFRyYWNrRWRpdHMgPSAxIDw8IDQgCitsb2FkQmFja3dhcmRUcmFja0VkaXRzID0gMSA8PCA0CiBuZXdNb3ZpZUFjdGl2ZSA9IDEgPDwgMAogbmV3TW92aWVEb250UmVzb2x2ZURhdGFSZWZzID0gMSA8PCAxCiBuZXdNb3ZpZURvbnRBc2tVbnJlc29sdmVkRGF0YVJlZnMgPSAxIDw8IDIKQEAgLTU5Myw3ICs1OTMsNyBAQAogdHJhY2tVc2FnZUluUHJldmlldyA9IDEgPDwgMgogdHJhY2tVc2FnZUluUG9zdGVyID0gMSA8PCAzCiBtZWRpYVNhbXBsZU5vdFN5bmMgPSAxIDw8IDAKLW1lZGlhU2FtcGxlU2hhZG93U3luYyA9IDEgPDwgMSAKK21lZGlhU2FtcGxlU2hhZG93U3luYyA9IDEgPDwgMQogcGFzdGVJblBhcmFsbGVsID0gMSA8PCAwCiBzaG93VXNlclNldHRpbmdzRGlhbG9nID0gMSA8PCAxCiBtb3ZpZVRvRmlsZU9ubHlFeHBvcnQgPSAxIDw8IDIKQEAgLTYxNSwxNyArNjE1LDE3IEBACiBmbGF0dGVuRlNTcGVjUHRySXNEYXRhUmVmUmVjb3JkUHRyID0gMUwgPDwgNAogZmxhdHRlbkNvbXByZXNzTW92aWVSZXNvdXJjZSA9IDFMIDw8IDUKIGZsYXR0ZW5Gb3JjZU1vdmllUmVzb3VyY2VCZWZvcmVNb3ZpZURhdGEgPSAxTCA8PCA2Ci1tb3ZpZUluRGF0YUZvcmtSZXNJRCA9IC0xICAgIAorbW92aWVJbkRhdGFGb3JrUmVzSUQgPSAtMQogbWNUb3BMZWZ0TW92aWUgPSAxIDw8IDAKIG1jU2NhbGVNb3ZpZVRvRml0ID0gMSA8PCAxCiBtY1dpdGhCYWRnZSA9IDEgPDwgMgogbWNOb3RWaXNpYmxlID0gMSA8PCAzCi1tY1dpdGhGcmFtZSA9IDEgPDwgNCAKK21jV2l0aEZyYW1lID0gMSA8PCA0CiBtb3ZpZVNjcmFwRG9udFplcm9TY3JhcCA9IDEgPDwgMAogbW92aWVTY3JhcE9ubHlQdXRNb3ZpZSA9IDEgPDwgMQogZGF0YVJlZlNlbGZSZWZlcmVuY2UgPSAxIDw8IDAKIGRhdGFSZWZXYXNOb3RSZXNvbHZlZCA9IDEgPDwgMQota01vdmllQW5jaG9yRGF0YVJlZklzRGVmYXVsdCA9IDEgPDwgMCAKK2tNb3ZpZUFuY2hvckRhdGFSZWZJc0RlZmF1bHQgPSAxIDw8IDAKIGhpbnRzU2NydWJNb2RlID0gMSA8PCAwCiBoaW50c0xvb3AgPSAxIDw8IDEKIGhpbnRzRG9udFB1cmdlID0gMSA8PCAyCkBAIC02NjcsMTEgKzY2NywxMSBAQAoga0dldE1vdmllSW1wb3J0ZXJBbGxvd05ld0ZpbGUgPSAxTCA8PCAxCiBrR2V0TW92aWVJbXBvcnRlckRvbnRDb25zaWRlckdyYXBoaWNzSW1wb3J0ZXJzID0gMUwgPDwgMgoga0dldE1vdmllSW1wb3J0ZXJEb250Q29uc2lkZXJGaWxlT25seUltcG9ydGVycyA9IDFMIDw8IDYKLWtHZXRNb3ZpZUltcG9ydGVyQXV0b0ltcG9ydE9ubHkgPSAxTCA8PCAxMCAKK2tHZXRNb3ZpZUltcG9ydGVyQXV0b0ltcG9ydE9ubHkgPSAxTCA8PCAxMAoga1FUR2V0TUlNRVR5cGVJbmZvSXNRdWlja1RpbWVNb3ZpZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbW9vdicpCi1rUVRHZXRNSU1FVHlwZUluZm9Jc1VuaGVscGZ1bFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZHVtYicpIAora1FUR2V0TUlNRVR5cGVJbmZvSXNVbmhlbHBmdWxUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2R1bWInKQoga1FUQ29weVVzZXJEYXRhUmVwbGFjZSA9IEZPVVJfQ0hBUl9DT0RFKCdycGxjJykKLWtRVENvcHlVc2VyRGF0YU1lcmdlID0gRk9VUl9DSEFSX0NPREUoJ21lcmcnKSAKK2tRVENvcHlVc2VyRGF0YU1lcmdlID0gRk9VUl9DSEFSX0NPREUoJ21lcmcnKQoga01vdmllTG9hZFN0YXRlRXJyb3IgPSAtMUwKIGtNb3ZpZUxvYWRTdGF0ZUxvYWRpbmcgPSAxMDAwCiBrTW92aWVMb2FkU3RhdGVMb2FkZWQgPSAyMDAwCkBAIC02ODIsNyArNjgyLDcgQEAKIGtRVERvbnRMb29rRm9yTW92aWVJbXBvcnRlcklmR3JhcGhpY3NJbXBvcnRlckZvdW5kID0gMUwgPDwgMQoga1FUQWxsb3dPcGVuaW5nU3RpbGxJbWFnZXNBc01vdmllcyA9IDFMIDw8IDIKIGtRVEFsbG93SW1wb3J0ZXJzVGhhdFdvdWxkQ3JlYXRlTmV3RmlsZSA9IDFMIDw8IDMKLWtRVEFsbG93QWdncmVzc2l2ZUltcG9ydGVycyA9IDFMIDw8IDQgCitrUVRBbGxvd0FnZ3Jlc3NpdmVJbXBvcnRlcnMgPSAxTCA8PCA0CiBwcmVsb2FkQWx3YXlzID0gMUwgPDwgMAogcHJlbG9hZE9ubHlJZkVuYWJsZWQgPSAxTCA8PCAxCiBmdWxsU2NyZWVuSGlkZUN1cnNvciA9IDFMIDw8IDAKQEAgLTY5MywxMyArNjkzLDEzIEBACiBrUmVmQ29uTmF2aWdhdGlvbk5leHQgPSAwCiBrUmVmQ29uTmF2aWdhdGlvblByZXZpb3VzID0gMQoga1JlZkNvblByb3BlcnR5Q2FuSGF2ZUZvY3VzID0gMQota1JlZkNvblByb3BlcnR5SGFzRm9jdXMgPSAyICAgICAKK2tSZWZDb25Qcm9wZXJ0eUhhc0ZvY3VzID0gMgoga1RyYWNrRm9jdXNDYW5FZGl0RmxhZyA9IEZPVVJfQ0hBUl9DT0RFKCdrZWR0JykKIGtUcmFja0RlZmF1bHRGb2N1c0ZsYWdzID0gRk9VUl9DSEFSX0NPREUoJ2tmb2MnKQoga1RyYWNrRm9jdXNEZWZhdWx0UmVmY29uID0gRk9VUl9DSEFSX0NPREUoJ2tyZWYnKQoga1RyYWNrRm9jdXNPbiA9IDEKLWtUcmFja0hhbmRsZXNUYWJzID0gMiAgICAgCi1rRmxhc2hUcmFja1Byb3BlcnR5QWNjZXB0QWxsQ2xpY2tzID0gRk9VUl9DSEFSX0NPREUoJ2NsaWsnKSAKK2tUcmFja0hhbmRsZXNUYWJzID0gMgora0ZsYXNoVHJhY2tQcm9wZXJ0eUFjY2VwdEFsbENsaWNrcyA9IEZPVVJfQ0hBUl9DT0RFKCdjbGlrJykKIGtCYWNrZ3JvdW5kU3ByaXRlTGF5ZXJOdW0gPSAzMjc2Nwoga1Nwcml0ZVByb3BlcnR5TWF0cml4ID0gMQoga1Nwcml0ZVByb3BlcnR5SW1hZ2VEZXNjcmlwdGlvbiA9IDIKQEAgLTc0Niw3ICs3NDYsNyBAQAoga1R3ZWVuUmVjb3JkSXNBdEludGVycnVwdFRpbWUgPSAweDAwMDAwMDAxCiBrRWZmZWN0TmFtZUF0b20gPSBGT1VSX0NIQVJfQ09ERSgnbmFtZScpCiBrRWZmZWN0VHlwZUF0b20gPSBGT1VSX0NIQVJfQ09ERSgndHlwZScpCi1rRWZmZWN0TWFudWZhY3R1cmVyQXRvbSA9IEZPVVJfQ0hBUl9DT0RFKCdtYW51JykgCitrRWZmZWN0TWFudWZhY3R1cmVyQXRvbSA9IEZPVVJfQ0hBUl9DT0RFKCdtYW51JykKIHBkQWN0aW9uQ29uZmlybURpYWxvZyA9IDEKIHBkQWN0aW9uU2V0QXBwbGVNZW51ID0gMgogcGRBY3Rpb25TZXRFZGl0TWVudSA9IDMKQEAgLTc4MSwyMCArNzgxLDIwIEBACiBwZEFjdGlvbkN1c3RvbUdldEVuYWJsZVZhbHVlID0gMzIKIHBkQWN0aW9uQ3VzdG9tU2V0U2FtcGxlVGltZSA9IDMzCiBwZEFjdGlvbkN1c3RvbUdldFZhbHVlID0gMzQKLXBkQWN0aW9uQ3VzdG9tRG9FZGl0Q29tbWFuZCA9IDM1ICAgIAorcGRBY3Rpb25DdXN0b21Eb0VkaXRDb21tYW5kID0gMzUKIHBkU2FtcGxlVGltZURpc3BsYXlPcHRpb25zTm9uZSA9IDB4MDAwMDAwMDAKIHBkQWN0aW9uRm9jdXNPZmYgPSAwCiBwZEFjdGlvbkZvY3VzRmlyc3QgPSAxCiBwZEFjdGlvbkZvY3VzTGFzdCA9IDIKIHBkQWN0aW9uRm9jdXNGb3J3YXJkID0gMwotcGRBY3Rpb25Gb2N1c0JhY2t3YXJkID0gNCAgICAgCi1lbE9wdGlvbnNJbmNsdWRlTm9uZUluTGlzdCA9IDB4MDAwMDAwMDEgCitwZEFjdGlvbkZvY3VzQmFja3dhcmQgPSA0CitlbE9wdGlvbnNJbmNsdWRlTm9uZUluTGlzdCA9IDB4MDAwMDAwMDEKIHBkT3B0aW9uc0NvbGxlY3RPbmVWYWx1ZSA9IDB4MDAwMDAwMDEKIHBkT3B0aW9uc0FsbG93T3B0aW9uYWxJbnRlcnBvbGF0aW9ucyA9IDB4MDAwMDAwMDIKIHBkT3B0aW9uc01vZGFsRGlhbG9nQm94ID0gMHgwMDAwMDAwNAogcGRPcHRpb25zRWRpdEN1cnJlbnRFZmZlY3RPbmx5ID0gMHgwMDAwMDAwOAotcGRPcHRpb25zSGlkZVByZXZpZXcgPSAweDAwMDAwMDEwIAotZWZmZWN0SXNSZWFsdGltZSA9IDAgICAgIAorcGRPcHRpb25zSGlkZVByZXZpZXcgPSAweDAwMDAwMDEwCitlZmZlY3RJc1JlYWx0aW1lID0gMAoga0FjY2Vzc0tleUF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Fja3knKQoga0FjY2Vzc0tleVN5c3RlbUZsYWcgPSAxTCA8PCAwCiBDb25uZWN0aW9uU3BlZWRQcmVmc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY3NwZCcpCkBAIC04MTgsMTQgKzgxOCwxNCBAQAoga1FUUGFyc2VUZXh0SFJFRkNsaWNrUG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgnY2xpaycpCiBrUVRQYXJzZVRleHRIUkVGVXNlQWx0RGVsaW0gPSBGT1VSX0NIQVJfQ09ERSgnYWx0ZCcpCiBrUVRQYXJzZVRleHRIUkVGRGVsaW1pdGVyID0gRk9VUl9DSEFSX0NPREUoJ2RlbG0nKQota1FUUGFyc2VUZXh0SFJFRlJlY29tcG9zZUhSRUYgPSBGT1VSX0NIQVJfQ09ERSgncmhyZicpIAora1FUUGFyc2VUZXh0SFJFRlJlY29tcG9zZUhSRUYgPSBGT1VSX0NIQVJfQ09ERSgncmhyZicpCiBrUVRQYXJzZVRleHRIUkVGVVJMID0gRk9VUl9DSEFSX0NPREUoJ3VybCAnKQoga1FUUGFyc2VUZXh0SFJFRlRhcmdldCA9IEZPVVJfQ0hBUl9DT0RFKCd0YXJnJykKIGtRVFBhcnNlVGV4dEhSRUZDaGFwdGVyID0gRk9VUl9DSEFSX0NPREUoJ2NoYXAnKQoga1FUUGFyc2VUZXh0SFJFRklzQXV0b0hSRUYgPSBGT1VSX0NIQVJfQ09ERSgnYXV0bycpCiBrUVRQYXJzZVRleHRIUkVGSXNTZXJ2ZXJNYXAgPSBGT1VSX0NIQVJfQ09ERSgnc21hcCcpCiBrUVRQYXJzZVRleHRIUkVGSFJFRiA9IEZPVVJfQ0hBUl9DT0RFKCdocmVmJykKLWtRVFBhcnNlVGV4dEhSRUZFTUJFREFyZ3MgPSBGT1VSX0NIQVJfQ09ERSgnbWJlZCcpIAora1FUUGFyc2VUZXh0SFJFRkVNQkVEQXJncyA9IEZPVVJfQ0hBUl9DT0RFKCdtYmVkJykKIGtUcmFja1JlZmVyZW5jZUNoYXB0ZXJMaXN0ID0gRk9VUl9DSEFSX0NPREUoJ2NoYXAnKQoga1RyYWNrUmVmZXJlbmNlVGltZUNvZGUgPSBGT1VSX0NIQVJfQ09ERSgndG1jZCcpCiBrVHJhY2tSZWZlcmVuY2VNb2RpZmllciA9IEZPVVJfQ0hBUl9DT0RFKCdzc3JjJykKQEAgLTkyMCwxNiArOTIwLDE2IEBACiBrUVRSZXN0cmljdGlvbkVkaXREb250UGFzdGUgPSAoMUwgPDwgMikKIGtRVFJlc3RyaWN0aW9uRWRpdERvbnRDbGVhciA9ICgxTCA8PCAzKQoga1FUUmVzdHJpY3Rpb25FZGl0RG9udE1vZGlmeSA9ICgxTCA8PCA0KQota1FUUmVzdHJpY3Rpb25FZGl0RG9udEV4dHJhY3QgPSAoMUwgPDwgNSkgCitrUVRSZXN0cmljdGlvbkVkaXREb250RXh0cmFjdCA9ICgxTCA8PCA1KQogdmlkZW9GbGFnRG9udExlYW5BaGVhZCA9IDFMIDw8IDAKIHR4dFByb2NEZWZhdWx0RGlzcGxheSA9IDAKIHR4dFByb2NEb250RGlzcGxheSA9IDEKLXR4dFByb2NEb0Rpc3BsYXkgPSAyICAgICAKK3R4dFByb2NEb0Rpc3BsYXkgPSAyCiBmaW5kVGV4dEVkZ2VPSyA9IDEgPDwgMAogZmluZFRleHRDYXNlU2Vuc2l0aXZlID0gMSA8PCAxCiBmaW5kVGV4dFJldmVyc2VTZWFyY2ggPSAxIDw8IDIKIGZpbmRUZXh0V3JhcEFyb3VuZCA9IDEgPDwgMwotZmluZFRleHRVc2VPZmZzZXQgPSAxIDw8IDQgCitmaW5kVGV4dFVzZU9mZnNldCA9IDEgPDwgNAogZHJvcFNoYWRvd09mZnNldFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZHJwbycpCiBkcm9wU2hhZG93VHJhbnNsdWNlbmN5VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkcnB0JykKIHNwcml0ZUhpdFRlc3RCb3VuZHMgPSAxTCA8PCAwCkBAIC05MzcsNyArOTM3LDcgQEAKIHNwcml0ZUhpdFRlc3RJbnZpc2libGVTcHJpdGVzID0gMUwgPDwgMgogc3ByaXRlSGl0VGVzdElzQ2xpY2sgPSAxTCA8PCAzCiBzcHJpdGVIaXRUZXN0TG9jSW5EaXNwbGF5Q29vcmRpbmF0ZXMgPSAxTCA8PCA0Ci1zcHJpdGVIaXRUZXN0VHJlYXRBbGxTcHJpdGVzQXNIaXRUZXN0YWJsZSA9IDFMIDw8IDUgCitzcHJpdGVIaXRUZXN0VHJlYXRBbGxTcHJpdGVzQXNIaXRUZXN0YWJsZSA9IDFMIDw8IDUKIGtTcHJpdGVBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzcHJ0JykKIGtTcHJpdGVJbWFnZXNDb250YWluZXJBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbWN0JykKIGtTcHJpdGVJbWFnZUF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ltYWcnKQpAQCAtOTc0LDcgKzk3NCw3IEBACiBrTW92aWVNZWRpYVNsYXZlVHJhY2tEdXJhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzbHRyJykKIGtNb3ZpZU1lZGlhRW5hYmxlRnJhbWVTdGVwcGluZyA9IEZPVVJfQ0hBUl9DT0RFKCdlbmZzJykKIGtNb3ZpZU1lZGlhQmFja2dyb3VuZENvbG9yID0gRk9VUl9DSEFSX0NPREUoJ2JrY2wnKQota01vdmllTWVkaWFQcmVyb2xsVGltZSA9IEZPVVJfQ0hBUl9DT0RFKCdwcmVyJykgCitrTW92aWVNZWRpYVByZXJvbGxUaW1lID0gRk9VUl9DSEFSX0NPREUoJ3ByZXInKQoga01vdmllTWVkaWFGaXROb25lID0gMAoga01vdmllTWVkaWFGaXRTY3JvbGwgPSBGT1VSX0NIQVJfQ09ERSgnc2NybycpCiBrTW92aWVNZWRpYUZpdENsaXBJZk5lY2Vzc2FyeSA9IEZPVVJfQ0hBUl9DT0RFKCdoaWRkJykKQEAgLTk5Miw5ICs5OTIsOSBAQAoga01vdmllUHJvcGVydHlUaW1lID0gRk9VUl9DSEFSX0NPREUoJ3RpbXYnKQoga01vdmllUHJvcGVydHlOYXR1cmFsQm91bmRzID0gRk9VUl9DSEFSX0NPREUoJ25hdGInKQoga01vdmllUHJvcGVydHlNYXRyaXggPSBGT1VSX0NIQVJfQ09ERSgnbXRyeCcpCi1rTW92aWVQcm9wZXJ0eVRyYWNrTGlzdCA9IEZPVVJfQ0hBUl9DT0RFKCd0bHN0JykgCitrTW92aWVQcm9wZXJ0eVRyYWNrTGlzdCA9IEZPVVJfQ0hBUl9DT0RFKCd0bHN0JykKIGtUcmFja1Byb3BlcnR5TWVkaWFUeXBlID0gRk9VUl9DSEFSX0NPREUoJ210eXAnKQota1RyYWNrUHJvcGVydHlJbnN0YW50aWF0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2luc3QnKSAKK2tUcmFja1Byb3BlcnR5SW5zdGFudGlhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdpbnN0JykKIE1vdmllQ29udHJvbGxlckNvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncGxheScpCiBrTW92aWVDb250cm9sbGVyUVRWUkZsYWcgPSAxIDw8IDAKIGtNb3ZpZUNvbnRyb2xsZXJEb250RGlzcGxheVRvVXNlciA9IDEgPDwgMQpAQCAtMTA3NCw3ICsxMDc0LDcgQEAKIG1jQWN0aW9uRXZhbHVhdGVFeHByZXNzaW9uV2l0aFR5cGUgPSA4OQogbWNBY3Rpb25HZXRNb3ZpZU5hbWUgPSA5MAogbWNBY3Rpb25HZXRNb3ZpZUlEID0gOTEKLW1jQWN0aW9uR2V0TW92aWVBY3RpdmUgPSA5MiAgICAKK21jQWN0aW9uR2V0TW92aWVBY3RpdmUgPSA5MgogbWNGbGFnU3VwcHJlc3NNb3ZpZUZyYW1lID0gMSA8PCAwCiBtY0ZsYWdTdXBwcmVzc1N0ZXBCdXR0b25zID0gMSA8PCAxCiBtY0ZsYWdTdXBwcmVzc1NwZWFrZXJCdXR0b24gPSAxIDw8IDIKQEAgLTExMTQsNyArMTExNCw3IEBACiBrUVRBcHBNZXNzYWdlV2luZG93Q2xvc2VSZXF1ZXN0ZWQgPSAzCiBrUVRBcHBNZXNzYWdlRXhpdEZ1bGxTY3JlZW5SZXF1ZXN0ZWQgPSA0CiBrUVRBcHBNZXNzYWdlRGlzcGxheUNoYW5uZWxzID0gNQota1FUQXBwTWVzc2FnZUVudGVyRnVsbFNjcmVlblJlcXVlc3RlZCA9IDYgCitrUVRBcHBNZXNzYWdlRW50ZXJGdWxsU2NyZWVuUmVxdWVzdGVkID0gNgoga0ZldGNoQXNCb29sZWFuUHRyID0gMQoga0ZldGNoQXNTaG9ydFB0ciA9IDIKIGtGZXRjaEFzTG9uZ1B0ciA9IDMKQEAgLTEzMjQsNyArMTMyNCw3IEBACiBrNDIyWXBDYkNyMTZDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgndjIxNicpCiBrNDIyWXBDYkNyMTBDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgndjIxMCcpCiBrNDQ0WXBDYkNyMTBDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgndjQxMCcpCi1rNDQ0NFlwQ2JDckE4UkNvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdyNDA4JykgCitrNDQ0NFlwQ2JDckE4UkNvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdyNDA4JykKIGtCbHVySW1hZ2VGaWx0ZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2JsdXInKQoga1NoYXJwZW5JbWFnZUZpbHRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc2hycCcpCiBrRWRnZURldGVjdEltYWdlRmlsdGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdlZGdlJykKQEAgLTEzNTksMTAgKzEzNTksMTAgQEAKIGs0OFJHQlBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ2I0OHInKQogazMyQWxwaGFHcmF5UGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnYjMyYScpCiBrMTZHcmF5UGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnYjE2ZycpCi1rNDIyWXBDYkNyOFBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJzJ2dXknKSAKK2s0MjJZcENiQ3I4UGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnMnZ1eScpCiBrNDQ0NFlwQ2JDckE4UGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgndjQwOCcpCi1rNDQ0NFlwQ2JDckE4UlBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ3I0MDgnKSAKLWtZVVY0MjBQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCd5NDIwJykgCitrNDQ0NFlwQ2JDckE4UlBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ3I0MDgnKQora1lVVjQyMFBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ3k0MjAnKQogY29kZWNJbmZvRG9lczEgPSAoMUwgPDwgMCkKIGNvZGVjSW5mb0RvZXMyID0gKDFMIDw8IDEpCiBjb2RlY0luZm9Eb2VzNCA9ICgxTCA8PCAyKQpAQCAtMTM4Niw3ICsxMzg2LDcgQEAKIGNvZGVjSW5mb0RvZXNXYXJwID0gKDFMIDw8IDIwKQogY29kZWNJbmZvRG9lc1JlY29tcHJlc3MgPSAoMUwgPDwgMjEpCiBjb2RlY0luZm9Eb2VzU3Bvb2wgPSAoMUwgPDwgMjIpCi1jb2RlY0luZm9Eb2VzUmF0ZUNvbnN0cmFpbiA9ICgxTCA8PCAyMykgCitjb2RlY0luZm9Eb2VzUmF0ZUNvbnN0cmFpbiA9ICgxTCA8PCAyMykKIGNvZGVjSW5mb0RlcHRoMSA9ICgxTCA8PCAwKQogY29kZWNJbmZvRGVwdGgyID0gKDFMIDw8IDEpCiBjb2RlY0luZm9EZXB0aDQgPSAoMUwgPDwgMikKQEAgLTE0MDAsNyArMTQwMCw3IEBACiBjb2RlY0luZm9EZXB0aDQwID0gKDFMIDw8IDEwKQogY29kZWNJbmZvU3RvcmVzQ2x1dCA9ICgxTCA8PCAxMSkKIGNvZGVjSW5mb0RvZXNMb3NzbGVzcyA9ICgxTCA8PCAxMikKLWNvZGVjSW5mb1NlcXVlbmNlU2Vuc2l0aXZlID0gKDFMIDw8IDEzKSAKK2NvZGVjSW5mb1NlcXVlbmNlU2Vuc2l0aXZlID0gKDFMIDw8IDEzKQogY29kZWNGbGFnVXNlSW1hZ2VCdWZmZXIgPSAoMUwgPDwgMCkKIGNvZGVjRmxhZ1VzZVNjcmVlbkJ1ZmZlciA9ICgxTCA8PCAxKQogY29kZWNGbGFnVXBkYXRlUHJldmlvdXMgPSAoMUwgPDwgMikKQEAgLTE0MTYsNyArMTQxNiw3IEBACiBjb2RlY0ZsYWdJbnRlcmxhY2VVcGRhdGUgPSAoMUwgPDwgMTEpCiBjb2RlY0ZsYWdDYXRjaFVwRGlmZiA9ICgxTCA8PCAxMikKIGNvZGVjRmxhZ1N1cHBvcnREaXNhYmxlID0gKDFMIDw8IDEzKQotY29kZWNGbGFnUmVlbmFibGUgPSAoMUwgPDwgMTQpIAorY29kZWNGbGFnUmVlbmFibGUgPSAoMUwgPDwgMTQpCiBjb2RlY0ZsYWdPdXRVcGRhdGVPbk5leHRJZGxlID0gKDFMIDw8IDkpCiBjb2RlY0ZsYWdPdXRVcGRhdGVPbkRhdGFTb3VyY2VDaGFuZ2UgPSAoMUwgPDwgMTApCiBjb2RlY0ZsYWdTZXF1ZW5jZVNlbnNpdGl2ZSA9ICgxTCA8PCAxMSkKQEAgLTE0MjYsMjEgKzE0MjYsMjEgQEAKIGNvZGVjRmxhZ1VzZWRJbWFnZUJ1ZmZlciA9ICgxTCA8PCAxNSkKIGNvZGVjTWluaW11bURhdGFTaXplID0gMzI3NjhMCiBjb21wcmVzc29yQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbWNvJykKLWRlY29tcHJlc3NvckNvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnaW1kYycpIAorZGVjb21wcmVzc29yQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbWRjJykKIGNvZGVjTG9zc2xlc3NRdWFsaXR5ID0gMHgwMDAwMDQwMAogY29kZWNNYXhRdWFsaXR5ID0gMHgwMDAwMDNGRgogY29kZWNNaW5RdWFsaXR5ID0gMHgwMDAwMDAwMAogY29kZWNMb3dRdWFsaXR5ID0gMHgwMDAwMDEwMAogY29kZWNOb3JtYWxRdWFsaXR5ID0gMHgwMDAwMDIwMAogY29kZWNIaWdoUXVhbGl0eSA9IDB4MDAwMDAzMDAKLWNvZGVjTG9ja0JpdHNTaGllbGRDdXJzb3IgPSAoMSA8PCAwKSAKK2NvZGVjTG9ja0JpdHNTaGllbGRDdXJzb3IgPSAoMSA8PCAwKQogY29kZWNDb21wbGV0aW9uU291cmNlID0gKDEgPDwgMCkKIGNvZGVjQ29tcGxldGlvbkRlc3QgPSAoMSA8PCAxKQogY29kZWNDb21wbGV0aW9uRG9udFVuc2hpZWxkID0gKDEgPDwgMikKIGNvZGVjQ29tcGxldGlvbldlbnRPZmZzY3JlZW4gPSAoMSA8PCAzKQogY29kZWNDb21wbGV0aW9uVW5sb2NrQml0cyA9ICgxIDw8IDQpCiBjb2RlY0NvbXBsZXRpb25Gb3JjZUNoYWluRmx1c2ggPSAoMSA8PCA1KQotY29kZWNDb21wbGV0aW9uRHJvcHBlZCA9ICgxIDw8IDYpIAorY29kZWNDb21wbGV0aW9uRHJvcHBlZCA9ICgxIDw8IDYpCiBjb2RlY1Byb2dyZXNzT3BlbiA9IDAKIGNvZGVjUHJvZ3Jlc3NVcGRhdGVQZXJjZW50ID0gMQogY29kZWNQcm9ncmVzc0Nsb3NlID0gMgpAQCAtMTQ3MywxNCArMTQ3MywxNCBAQAogY29kZWNEU2VxdWVuY2VFbmFibGVTdWJQaXhlbFBvc2l0aW9uaW5nID0gKDFMIDw8IDkpCiBrSUNNU2VxdWVuY2VUYXNrV2VpZ2h0ID0gRk9VUl9DSEFSX0NPREUoJ3R3ZWknKQoga0lDTVNlcXVlbmNlVGFza05hbWUgPSBGT1VSX0NIQVJfQ09ERSgndG5hbScpCi1rSUNNU2VxdWVuY2VVc2VyUHJlZmVycmVkQ29kZWNzID0gRk9VUl9DSEFSX0NPREUoJ3B1bnQnKSAKK2tJQ01TZXF1ZW5jZVVzZXJQcmVmZXJyZWRDb2RlY3MgPSBGT1VSX0NIQVJfQ09ERSgncHVudCcpCiBrSW1hZ2VEZXNjcmlwdGlvblNhbXBsZUZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdpZGZtJykKIGtJbWFnZURlc2NyaXB0aW9uQ2xhc3NpY0F0b21Gb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnYXRvbScpCiBrSW1hZ2VEZXNjcmlwdGlvblFUQXRvbUZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdxdGF0JykKIGtJbWFnZURlc2NyaXB0aW9uRWZmZWN0RGF0YUZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdmeGF0JykKIGtJbWFnZURlc2NyaXB0aW9uUHJpdmF0ZURhdGFGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgncHJpdicpCiBrSW1hZ2VEZXNjcmlwdGlvbkFsdGVybmF0ZUNvZGVjID0gRk9VUl9DSEFSX0NPREUoJ3N1YnMnKQota0ltYWdlRGVzY3JpcHRpb25Db2xvclNwYWNlID0gRk9VUl9DSEFSX0NPREUoJ2NzcGMnKSAKK2tJbWFnZURlc2NyaXB0aW9uQ29sb3JTcGFjZSA9IEZPVVJfQ0hBUl9DT0RFKCdjc3BjJykKIHNmcEl0ZW1QcmV2aWV3QXJlYVVzZXIgPSAxMQogc2ZwSXRlbVByZXZpZXdTdGF0aWNUZXh0ID0gMTIKIHNmcEl0ZW1QcmV2aWV3RGl2aWRlclVzZXIgPSAxMwpAQCAtMTUwMCwxNCArMTUwMCwxNCBAQAoga0lDTUFwcFRoZW5UZW1wTWVtb3J5ID0gMUwgPDwgMTMKIGtRVFVzZVBsYXRmb3JtRGVmYXVsdEdhbW1hTGV2ZWwgPSAwCiBrUVRVc2VTb3VyY2VHYW1tYUxldmVsID0gLTFMCi1rUVRDQ0lSNjAxVmlkZW9HYW1tYUxldmVsID0gMHgwMDAyMzMzMyAKK2tRVENDSVI2MDFWaWRlb0dhbW1hTGV2ZWwgPSAweDAwMDIzMzMzCiBpZGVudGl0eU1hdHJpeFR5cGUgPSAweDAwCiB0cmFuc2xhdGVNYXRyaXhUeXBlID0gMHgwMQogc2NhbGVNYXRyaXhUeXBlID0gMHgwMgogc2NhbGVUcmFuc2xhdGVNYXRyaXhUeXBlID0gMHgwMwogbGluZWFyTWF0cml4VHlwZSA9IDB4MDQKIGxpbmVhclRyYW5zbGF0ZU1hdHJpeFR5cGUgPSAweDA1Ci1wZXJzcGVjdGl2ZU1hdHJpeFR5cGUgPSAweDA2ICAKK3BlcnNwZWN0aXZlTWF0cml4VHlwZSA9IDB4MDYKIEdyYXBoaWNzSW1wb3J0ZXJDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2dyaXAnKQogZ3JhcGhpY3NJbXBvcnRlclVzZXNJbWFnZURlY29tcHJlc3NvciA9IDFMIDw8IDIzCiBxdWlja1RpbWVJbWFnZUZpbGVJbWFnZURlc2NyaXB0aW9uQXRvbSA9IEZPVVJfQ0hBUl9DT0RFKCdpZHNjJykKQEAgLTE1MzAsMTIgKzE1MzAsMTIgQEAKIGtRVFBob3Rvc2hvcExheWVyQ2xpcHBpbmcgPSBGT1VSX0NIQVJfQ09ERSgnbGNscCcpCiBrUVRQaG90b3Nob3BMYXllckZsYWdzID0gRk9VUl9DSEFSX0NPREUoJ2xmbGcnKQoga1FUUGhvdG9zaG9wTGF5ZXJOYW1lID0gRk9VUl9DSEFSX0NPREUoJ1x4YTlsbm0nKQota1FUUGhvdG9zaG9wTGF5ZXJVbmljb2RlTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdsdW5pJykgCitrUVRQaG90b3Nob3BMYXllclVuaWNvZGVOYW1lID0gRk9VUl9DSEFSX0NPREUoJ2x1bmknKQoga1FUSW5kZXhlZEltYWdlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdudGg/JykKIGtRVEluZGV4ZWRJbWFnZUlzVGh1bWJuYWlsID0gRk9VUl9DSEFSX0NPREUoJ249dGgnKQoga1FUSW5kZXhlZEltYWdlSXNMYXllciA9IEZPVVJfQ0hBUl9DT0RFKCduPWx5JykKIGtRVEluZGV4ZWRJbWFnZUlzUGFnZSA9IEZPVVJfQ0hBUl9DT0RFKCduPXBnJykKLWtRVEluZGV4ZWRJbWFnZUlzTXVsdGlSZXNvbHV0aW9uID0gRk9VUl9DSEFSX0NPREUoJ249cnMnKSAKK2tRVEluZGV4ZWRJbWFnZUlzTXVsdGlSZXNvbHV0aW9uID0gRk9VUl9DSEFSX0NPREUoJ249cnMnKQoga1FUVElGRlVzZXJEYXRhUHJlZml4ID0gMHg3NDY5MDAwMAoga1FUVElGRkV4aWZVc2VyRGF0YVByZWZpeCA9IDB4NjU3ODAwMDAKIGtRVFRJRkZFeGlmR1BTVXNlckRhdGFQcmVmaXggPSAweDY3NzAwMDAwCkBAIC0xNTQ4LDE0ICsxNTQ4LDE0IEBACiBrUVRUSUZGVXNlckRhdGFQcmltYXJ5Q2hyb21hdGljaXRpZXMgPSAweDc0NjkwMTNGCiBrUVRUSUZGVXNlckRhdGFUcmFuc2ZlclJhbmdlID0gMHg3NDY5MDE1Ngoga1FUVElGRlVzZXJEYXRhWUNiQ3JQb3NpdGlvbmluZyA9IDB4NzQ2OTAyMTMKLWtRVFRJRkZVc2VyRGF0YVJlZmVyZW5jZUJsYWNrV2hpdGUgPSAweDc0NjkwMjE0IAora1FUVElGRlVzZXJEYXRhUmVmZXJlbmNlQmxhY2tXaGl0ZSA9IDB4NzQ2OTAyMTQKIGtRVFRJRkZVc2VyRGF0YU1vZGVsUGl4ZWxTY2FsZSA9IDB4NzQ2OTgzMEUKIGtRVFRJRkZVc2VyRGF0YU1vZGVsVHJhbnNmb3JtYXRpb24gPSAweDc0Njk4NUQ4CiBrUVRUSUZGVXNlckRhdGFNb2RlbFRpZXBvaW50ID0gMHg3NDY5ODQ4Mgoga1FUVElGRlVzZXJEYXRhR2VvS2V5RGlyZWN0b3J5ID0gMHg3NDY5ODdBRgoga1FUVElGRlVzZXJEYXRhR2VvRG91YmxlUGFyYW1zID0gMHg3NDY5ODdCMAoga1FUVElGRlVzZXJEYXRhR2VvQXNjaWlQYXJhbXMgPSAweDc0Njk4N0IxCi1rUVRUSUZGVXNlckRhdGFJbnRlcmdyYXBoTWF0cml4ID0gMHg3NDY5ODQ4MCAKK2tRVFRJRkZVc2VyRGF0YUludGVyZ3JhcGhNYXRyaXggPSAweDc0Njk4NDgwCiBrUVRFeGlmVXNlckRhdGFFeGlmVmVyc2lvbiA9IDB4NjU3ODkwMDAKIGtRVEV4aWZVc2VyRGF0YUZsYXNoUGl4VmVyc2lvbiA9IDB4NjU3OEEwMDAKIGtRVEV4aWZVc2VyRGF0YUNvbG9yU3BhY2UgPSAweDY1NzhBMDAxCkBAIC0xNTk0LDcgKzE1OTQsNyBAQAoga1FURXhpZlVzZXJEYXRhRXhwb3N1cmVJbmRleCA9IDB4NjU3OEEyMTUKIGtRVEV4aWZVc2VyRGF0YVNlbnNpbmdNZXRob2QgPSAweDY1NzhBMjE3CiBrUVRFeGlmVXNlckRhdGFGaWxlU291cmNlID0gMHg2NTc4QTMwMAota1FURXhpZlVzZXJEYXRhU2NlbmVUeXBlID0gMHg2NTc4QTMwMSAKK2tRVEV4aWZVc2VyRGF0YVNjZW5lVHlwZSA9IDB4NjU3OEEzMDEKIGtRVEV4aWZVc2VyRGF0YUdQU1ZlcnNpb25JRCA9IDB4MDY3NzAwMDAKIGtRVEV4aWZVc2VyRGF0YUdQU0xhdGl0dWRlUmVmID0gMHgwNjc3MDAwMQoga1FURXhpZlVzZXJEYXRhR1BTTGF0aXR1ZGUgPSAweDA2NzcwMDAyCkBAIC0xNjIxLDcgKzE2MjEsNyBAQAoga1FURXhpZlVzZXJEYXRhR1BTRGVzdEJlYXJpbmdSZWYgPSAweDA2NzcwMDE3CiBrUVRFeGlmVXNlckRhdGFHUFNEZXN0QmVhcmluZyA9IDB4MDY3NzAwMTgKIGtRVEV4aWZVc2VyRGF0YUdQU0Rlc3REaXN0YW5jZVJlZiA9IDB4MDY3NzAwMTkKLWtRVEV4aWZVc2VyRGF0YUdQU0Rlc3REaXN0YW5jZSA9IDB4MDY3NzAwMUEgCitrUVRFeGlmVXNlckRhdGFHUFNEZXN0RGlzdGFuY2UgPSAweDA2NzcwMDFBCiBHcmFwaGljc0V4cG9ydGVyQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdncmV4JykKIGtCYXNlR3JhcGhpY3NFeHBvcnRlclN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYmFzZScpCiBncmFwaGljc0V4cG9ydGVySXNCYXNlRXhwb3J0ZXIgPSAxTCA8PCAwCkBAIC0xNjM4LDcgKzE2MzgsNyBAQAoga1FUVElGRkNvbXByZXNzaW9uTWV0aG9kID0gRk9VUl9DSEFSX0NPREUoJ3RpZmMnKQoga1FUVElGRkNvbXByZXNzaW9uX05vbmUgPSAxCiBrUVRUSUZGQ29tcHJlc3Npb25fUGFja0JpdHMgPSAzMjc3M0wKLWtRVFRJRkZMaXR0bGVFbmRpYW4gPSBGT1VSX0NIQVJfQ09ERSgndGlmZScpIAora1FUVElGRkxpdHRsZUVuZGlhbiA9IEZPVVJfQ0hBUl9DT0RFKCd0aWZlJykKIGtRVFBOR0ZpbHRlclByZWZlcmVuY2UgPSBGT1VSX0NIQVJfQ09ERSgncG5nZicpCiBrUVRQTkdGaWx0ZXJCZXN0Rm9yQ29sb3JUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2JmbHQnKQoga1FUUE5HRmlsdGVyTm9uZSA9IDAKQEAgLTE3OTUsMTAgKzE3OTUsMTAgQEAKIHN5c3RlbVRpY2tDbG9jayA9IEZPVVJfQ0hBUl9DT0RFKCd0aWNrJykKIHN5c3RlbVNlY29uZENsb2NrID0gRk9VUl9DSEFSX0NPREUoJ3NlY28nKQogc3lzdGVtTWlsbGlzZWNvbmRDbG9jayA9IEZPVVJfQ0hBUl9DT0RFKCdtaWxsJykKLXN5c3RlbU1pY3Jvc2Vjb25kQ2xvY2sgPSBGT1VSX0NIQVJfQ09ERSgnbWljcicpIAorc3lzdGVtTWljcm9zZWNvbmRDbG9jayA9IEZPVVJfQ0hBUl9DT0RFKCdtaWNyJykKIGtDbG9ja1JhdGVJc0xpbmVhciA9IDEKIGtDbG9ja0ltcGxlbWVudHNDYWxsQmFja3MgPSAyCi1rQ2xvY2tDYW5IYW5kbGVJbnRlcm1pdHRlbnRTb3VuZCA9IDQgIAora0Nsb2NrQ2FuSGFuZGxlSW50ZXJtaXR0ZW50U291bmQgPSA0CiBTdGFuZGFyZENvbXByZXNzaW9uVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzY2RpJykKIFN0YW5kYXJkQ29tcHJlc3Npb25TdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ltYWcnKQogU3RhbmRhcmRDb21wcmVzc2lvblN1YlR5cGVTb3VuZCA9IEZPVVJfQ0hBUl9DT0RFKCdzb3VuJykKQEAgLTE4NjEsMjEgKzE4NjEsMjEgQEAKIHNjU291bmRWQlJDb21wcmVzc2lvbk9LID0gRk9VUl9DSEFSX0NPREUoJ2N2YnInKQogc2NTb3VuZElucHV0U2FtcGxlUmF0ZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3NpcicpCiBzY1NvdW5kU2FtcGxlUmF0ZUNoYW5nZU9LID0gRk9VUl9DSEFSX0NPREUoJ3Jjb2snKQotc2NBdmFpbGFibGVDb21wcmVzc2lvbkxpc3RUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2F2YWknKSAKK3NjQXZhaWxhYmxlQ29tcHJlc3Npb25MaXN0VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhdmFpJykKIHNjR2V0Q29tcHJlc3Npb24gPSAxCiBzY1Nob3dNb3Rpb25TZXR0aW5ncyA9IDFMIDw8IDAKIHNjU2V0dGluZ3NDaGFuZ2VkSXRlbSA9IC0xCiBzY0NvbXByZXNzRmxhZ0lnbm9yZUlkZW50aWNhbEZyYW1lcyA9IDEKIGtRVFNldHRpbmdzVmlkZW8gPSBGT1VSX0NIQVJfQ09ERSgndmlkZScpCiBrUVRTZXR0aW5nc1NvdW5kID0gRk9VUl9DSEFSX0NPREUoJ3NvdW4nKQota1FUU2V0dGluZ3NDb21wb25lbnRWZXJzaW9uID0gRk9VUl9DSEFSX0NPREUoJ3ZlcnMnKSAKK2tRVFNldHRpbmdzQ29tcG9uZW50VmVyc2lvbiA9IEZPVVJfQ0hBUl9DT0RFKCd2ZXJzJykKIFR3ZWVuQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0d2VuJykKIFRDU291cmNlUmVmTmFtZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbmFtZScpCiB0Y0Ryb3BGcmFtZSA9IDEgPDwgMAogdGMyNEhvdXJNYXggPSAxIDw8IDEKIHRjTmVnVGltZXNPSyA9IDEgPDwgMgogdGNDb3VudGVyID0gMSA8PCAzCi10Y3ROZWdGbGFnID0gMHg4MCAgCit0Y3ROZWdGbGFnID0gMHg4MAogdGNkZlNob3dUaW1lQ29kZSA9IDEgPDwgMAogTW92aWVJbXBvcnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2VhdCAnKQogTW92aWVFeHBvcnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NwaXQnKQpAQCAtMTkzOCw3ICsxOTM4LDcgQEAKIGtRVE1lZGlhQ29uZmlnVXNlUGx1Z2luQnlEZWZhdWx0ID0gKDFMIDw8IDI5KQoga1FUTWVkaWFDb25maWdEZWZhdWx0c01hc2sgPSAoa1FUTWVkaWFDb25maWdVc2VBcHBCeURlZmF1bHQgfCBrUVRNZWRpYUNvbmZpZ1VzZVBsdWdpbkJ5RGVmYXVsdCkKIGtRVE1lZGlhQ29uZmlnRGVmYXVsdHNTaGlmdCA9IDEyCi1rUVRNZWRpYUNvbmZpZ0hhc0ZpbGVIYXNRVEF0b21zID0gKDFMIDw8IDMwKSAKK2tRVE1lZGlhQ29uZmlnSGFzRmlsZUhhc1FUQXRvbXMgPSAoMUwgPDwgMzApCiBrUVRNZWRpYUNvbmZpZ1N0cmVhbUdyb3VwSUQgPSBGT1VSX0NIQVJfQ09ERSgnc3RybScpCiBrUVRNZWRpYUNvbmZpZ0ludGVyYWN0aXZlR3JvdXBJRCA9IEZPVVJfQ0hBUl9DT0RFKCdpbnRyJykKIGtRVE1lZGlhQ29uZmlnVmlkZW9Hcm91cElEID0gRk9VUl9DSEFSX0NPREUoJ2V5ZXMnKQpAQCAtMTk1MCw3ICsxOTUwLDcgQEAKIGtRVE1lZGlhSW5mb05ldEdyb3VwID0gRk9VUl9DSEFSX0NPREUoJ25ldCAnKQoga1FUTWVkaWFJbmZvV2luR3JvdXAgPSBGT1VSX0NIQVJfQ09ERSgnd2luICcpCiBrUVRNZWRpYUluZm9NYWNHcm91cCA9IEZPVVJfQ0hBUl9DT0RFKCdtYWMgJykKLWtRVE1lZGlhSW5mb01pc2NHcm91cCA9IDB4M0YzRjNGM0YgCitrUVRNZWRpYUluZm9NaXNjR3JvdXAgPSAweDNGM0YzRjNGCiBrTWltZUluZm9NaW1lVHlwZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdtaW1lJykKIGtNaW1lSW5mb0ZpbGVFeHRlbnNpb25UYWcgPSBGT1VSX0NIQVJfQ09ERSgnZXh0ICcpCiBrTWltZUluZm9EZXNjcmlwdGlvblRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdkZXNjJykKQEAgLTIwMDgsNyArMjAwOCw3IEBACiBrUVRTZXR0aW5nc1RpbWVEdXJhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdkdXJhJykKIGtRVFNldHRpbmdzQXVkaW9DRFRyYWNrID0gRk9VUl9DSEFSX0NPREUoJ3RyYWsnKQoga1FUU2V0dGluZ3NBdWRpb0NEVHJhY2tSYXRlU2hpZnQgPSBGT1VSX0NIQVJfQ09ERSgncnNoZicpCi1rUVRTZXR0aW5nc0RWRXhwb3J0RFZGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnZHZjZicpIAora1FUU2V0dGluZ3NEVkV4cG9ydERWRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ2R2Y2YnKQoga1FUUHJlc2V0c0xpc3RSZXNvdXJjZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3RnIycpCiBrUVRQcmVzZXRzUGxhdGZvcm1MaXN0UmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3N0Z3AnKQoga1FUUHJlc2V0SW5mb0lzRGl2aWRlciA9IDEKQEAgLTIwMjEsOSArMjAyMSw5IEBACiBtb3ZpZUV4cG9ydEhlaWdodCA9IEZPVVJfQ0hBUl9DT0RFKCdoZWd0JykKIG1vdmllRXhwb3J0RHVyYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnZHVyYScpCiBtb3ZpZUV4cG9ydFZpZGVvRmlsdGVyID0gRk9VUl9DSEFSX0NPREUoJ2lmbHQnKQotbW92aWVFeHBvcnRUaW1lU2NhbGUgPSBGT1VSX0NIQVJfQ09ERSgndG1zYycpIAota1FUQnJvd3NlckluZm9DYW5Vc2VTeXN0ZW1Gb2xkZXJQbHVnaW4gPSAoMUwgPDwgMCkgCi1rUVRQcmVGbGlnaHRPcGVuQ29tcG9uZW50ID0gKDFMIDw8IDEpIAorbW92aWVFeHBvcnRUaW1lU2NhbGUgPSBGT1VSX0NIQVJfQ09ERSgndG1zYycpCitrUVRCcm93c2VySW5mb0NhblVzZVN5c3RlbUZvbGRlclBsdWdpbiA9ICgxTCA8PCAwKQora1FUUHJlRmxpZ2h0T3BlbkNvbXBvbmVudCA9ICgxTCA8PCAxKQogcG5vdENvbXBvbmVudFdhbnRzRXZlbnRzID0gMQogcG5vdENvbXBvbmVudE5lZWRzTm9DYWNoZSA9IDIKIFNob3dGaWxlUHJldmlld0NvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncG5vdCcpCkBAIC0yMDQ3LDI5ICsyMDQ3LDI5IEBACiBrRGF0YVJlZkV4dGVuc2lvbkluaXRpYWxpemF0aW9uRGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdkYXRhJykKIGtEYXRhUmVmRXh0ZW5zaW9uUXVpY2tUaW1lTWVkaWFUeXBlID0gRk9VUl9DSEFSX0NPREUoJ210eXAnKQoga0RhdGFIQ2hva2VUb01vdmllRGF0YVJhdGUgPSAxIDw8IDAKLWtEYXRhSENob2tlVG9QYXJhbSA9IDEgPDwgMSAKK2tEYXRhSENob2tlVG9QYXJhbSA9IDEgPDwgMQoga0RhdGFIRXh0ZW5kZWRTY2hlZHVsZSA9IEZPVVJfQ0hBUl9DT0RFKCd4dG5kJykKIGtEYXRhSEluZm9GbGFnTmV2ZXJTdHJlYW1zID0gMSA8PCAwCiBrRGF0YUhJbmZvRmxhZ0NhblVwZGF0ZURhdGFSZWZzID0gMSA8PCAxCi1rRGF0YUhJbmZvRmxhZ05lZWRzTmV0d29ya0JhbmR3aWR0aCA9IDEgPDwgMiAKK2tEYXRhSEluZm9GbGFnTmVlZHNOZXR3b3JrQmFuZHdpZHRoID0gMSA8PCAyCiBrRGF0YUhGaWxlVHlwZU1hY09TRmlsZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZnR5cCcpCiBrRGF0YUhGaWxlVHlwZUV4dGVuc2lvbiA9IEZPVVJfQ0hBUl9DT0RFKCdmZXh0JykKIGtEYXRhSEZpbGVUeXBlTUlNRSA9IEZPVVJfQ0hBUl9DT0RFKCdtaW1lJykKIGtEYXRhSENyZWF0ZUZpbGVCdXREb250Q3JlYXRlUmVzRmlsZSA9ICgxTCA8PCAwKQota0RhdGFITW92aWVVc2FnZURvQXBwZW5kTURBVCA9IDFMIDw8IDAgCitrRGF0YUhNb3ZpZVVzYWdlRG9BcHBlbmRNREFUID0gMUwgPDwgMAoga0RhdGFIVGVtcFVzZVNhbWVEaXJlY3RvcnkgPSAxTCA8PCAwCiBrRGF0YUhUZW1wVXNlU2FtZVZvbHVtZSA9IDFMIDw8IDEKIGtEYXRhSFRlbXBDcmVhdGVGaWxlID0gMUwgPDwgMgota0RhdGFIVGVtcE9wZW5GaWxlID0gMUwgPDwgMyAKLWtEYXRhSEdldERhdGFSYXRlSW5maW5pdGVSYXRlID0gMHg3RkZGRkZGRiAKLWtEYXRhSFNldFRpbWVIaW50c1NraXBCYW5kd2lkdGhSZXF1ZXN0ID0gMSA8PCAwIAora0RhdGFIVGVtcE9wZW5GaWxlID0gMUwgPDwgMwora0RhdGFIR2V0RGF0YVJhdGVJbmZpbml0ZVJhdGUgPSAweDdGRkZGRkZGCitrRGF0YUhTZXRUaW1lSGludHNTa2lwQmFuZHdpZHRoUmVxdWVzdCA9IDEgPDwgMAogdmlkZW9EaWdpdGl6ZXJDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3ZkaWcnKQogdmRpZ0ludGVyZmFjZVJldiA9IDIKIG50c2NJbiA9IDAKIGN1cnJlbnRJbiA9IDAKIHBhbEluID0gMQogc2VjYW1JbiA9IDIKLW50c2NSZWFsbHlJbiA9IDMgICAgIAorbnRzY1JlYWxseUluID0gMwogY29tcG9zaXRlSW4gPSAwCiBzVmlkZW9JbiA9IDEKIHJnYkNvbXBvbmVudEluID0gMgpAQCAtMjA4MSwxNiArMjA4MSwxNiBAQAogdmRQbGF5VGhydU9mZiA9IDAKIHZkUGxheVRocnVPbiA9IDEKIHZkRGlnaXRpemVyQlcgPSAwCi12ZERpZ2l0aXplclJHQiA9IDEgICAgIAordmREaWdpdGl6ZXJSR0IgPSAxCiB2ZEJyb2FkY2FzdE1vZGUgPSAwCi12ZFZUUk1vZGUgPSAxICAgICAKK3ZkVlRSTW9kZSA9IDEKIHZkVXNlQW55RmllbGQgPSAwCiB2ZFVzZU9kZEZpZWxkID0gMQotdmRVc2VFdmVuRmllbGQgPSAyICAgICAKK3ZkVXNlRXZlbkZpZWxkID0gMgogdmRUeXBlQmFzaWMgPSAwCiB2ZFR5cGVBbHBoYSA9IDEKIHZkVHlwZU1hc2sgPSAyCi12ZFR5cGVLZXkgPSAzICAgICAKK3ZkVHlwZUtleSA9IDMKIGRpZ2lJbkRvZXNOVFNDID0gMUwgPDwgMAogZGlnaUluRG9lc1BBTCA9IDFMIDw8IDEKIGRpZ2lJbkRvZXNTRUNBTSA9IDFMIDw8IDIKQEAgLTIxMDEsNyArMjEwMSw3IEBACiBkaWdpSW5WVFJfQnJvYWRjYXN0ID0gMUwgPDwgMTEKIGRpZ2lJbkRvZXNDb2xvciA9IDFMIDw8IDEyCiBkaWdpSW5Eb2VzQlcgPSAxTCA8PCAxMwotZGlnaUluU2lnbmFsTG9jayA9IDFMIDw8IDMxIAorZGlnaUluU2lnbmFsTG9jayA9IDFMIDw8IDMxCiBkaWdpT3V0RG9lczEgPSAxTCA8PCAwCiBkaWdpT3V0RG9lczIgPSAxTCA8PCAxCiBkaWdpT3V0RG9lczQgPSAxTCA8PCAyCkBAIC0yMTMyLDcgKzIxMzIsNyBAQAogZGlnaU91dERvZXNDb21wcmVzc09ubHkgPSAxTCA8PCAyOAogZGlnaU91dERvZXNQbGF5VGhydUR1cmluZ0NvbXByZXNzID0gMUwgPDwgMjkKIGRpZ2lPdXREb2VzQ29tcHJlc3NQYXJ0aWFsbHlWaXNpYmxlID0gMUwgPDwgMzAKLWRpZ2lPdXREb2VzTm90TmVlZENvcHlPZkNvbXByZXNzRGF0YSA9IDFMIDw8IDMxIAorZGlnaU91dERvZXNOb3ROZWVkQ29weU9mQ29tcHJlc3NEYXRhID0gMUwgPDwgMzEKIGRtYURlcHRoMSA9IDEKIGRtYURlcHRoMiA9IDIKIGRtYURlcHRoNCA9IDQKQEAgLTIxNDQsNyArMjE0NCw3IEBACiBkbWFEZXB0aDhHcmF5ID0gMjU2CiBrVkRJR0NvbnRyb2xsZWRGcmFtZVJhdGUgPSAtMQogdmREZXZpY2VGbGFnU2hvd0lucHV0c0FzRGV2aWNlcyA9ICgxIDw8IDApCi12ZERldmljZUZsYWdIaWRlRGV2aWNlID0gKDEgPDwgMSkgCit2ZERldmljZUZsYWdIaWRlRGV2aWNlID0gKDEgPDwgMSkKIHZkRmxhZ0NhcHR1cmVTdGFydGluZyA9ICgxIDw8IDApCiB2ZEZsYWdDYXB0dXJlU3RvcHBpbmcgPSAoMSA8PCAxKQogdmRGbGFnQ2FwdHVyZUlzRm9yUHJldmlldyA9ICgxIDw8IDIpCkBAIC0yMTUyLDcgKzIxNTIsNyBAQAogdmRGbGFnQ2FwdHVyZUxvd0xhdGVuY3kgPSAoMSA8PCA0KQogdmRGbGFnQ2FwdHVyZUFsd2F5c1VzZVRpbWVCYXNlID0gKDEgPDwgNSkKIHZkRmxhZ0NhcHR1cmVTZXRTZXR0aW5nc0JlZ2luID0gKDEgPDwgNikKLXZkRmxhZ0NhcHR1cmVTZXRTZXR0aW5nc0VuZCA9ICgxIDw8IDcpIAordmRGbGFnQ2FwdHVyZVNldFNldHRpbmdzRW5kID0gKDEgPDwgNykKIHhtbFBhcnNlQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdwYXJzJykKIHhtbFBhcnNlQ29tcG9uZW50U3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd4bWwgJykKIHhtbElkZW50aWZpZXJJbnZhbGlkID0gMApAQCAtMjE2NCw3ICsyMTY0LDcgQEAKIGVsZW1lbnRGbGFnUHJlc2VydmVXaGl0ZVNwYWNlID0gMUwgPDwgMQogeG1sUGFyc2VGbGFnQWxsb3dVcHBlcmNhc2UgPSAxTCA8PCAwCiB4bWxQYXJzZUZsYWdBbGxvd1VucXVvdGVkQXR0cmlidXRlVmFsdWVzID0gMUwgPDwgMQoteG1sUGFyc2VGbGFnRXZlbnRQYXJzZU9ubHkgPSAxTCA8PCAyIAoreG1sUGFyc2VGbGFnRXZlbnRQYXJzZU9ubHkgPSAxTCA8PCAyCiBhdHRyaWJ1dGVWYWx1ZUtpbmRDaGFyU3RyaW5nID0gMAogYXR0cmlidXRlVmFsdWVLaW5kSW50ZWdlciA9IDFMIDw8IDAKIGF0dHJpYnV0ZVZhbHVlS2luZFBlcmNlbnQgPSAxTCA8PCAxCkBAIC0yMTk1LDcgKzIxOTUsNyBAQAogc2VxR3JhYlByZXZpZXcgPSAyCiBzZXFHcmFiUGxheUR1cmluZ1JlY29yZCA9IDQKIHNlcUdyYWJMb3dMYXRlbmN5Q2FwdHVyZSA9IDgKLXNlcUdyYWJBbHdheXNVc2VUaW1lQmFzZSA9IDE2ICAgIAorc2VxR3JhYkFsd2F5c1VzZVRpbWVCYXNlID0gMTYKIHNlcUdyYWJIYXNCb3VuZHMgPSAxCiBzZXFHcmFiSGFzVm9sdW1lID0gMgogc2VxR3JhYkhhc0Rpc2NyZXRlU2FtcGxlcyA9IDQKQEAgLTIyMjcsOSArMjIyNyw5IEBACiBjaGFubmVsUGxheUhpZ2hRdWFsaXR5ID0gMgogY2hhbm5lbFBsYXlBbGxEYXRhID0gNAogc2dTZXRTZXR0aW5nc0JlZ2luID0gKDEgPDwgMCkKLXNnU2V0U2V0dGluZ3NFbmQgPSAoMSA8PCAxKSAKK3NnU2V0U2V0dGluZ3NFbmQgPSAoMSA8PCAxKQoga1NHU21hbGxlc3RESVRMU2l6ZSA9IC0xCi1rU0dMYXJnZXN0RElUTFNpemUgPSAtMiAgICAKK2tTR0xhcmdlc3RESVRMU2l6ZSA9IC0yCiBzZ0NoYW5uZWxBdG9tID0gRk9VUl9DSEFSX0NPREUoJ2NoYW4nKQogc2dDaGFubmVsU2V0dGluZ3NBdG9tID0gRk9VUl9DSEFSX0NPREUoJ2N0b20nKQogc2dDaGFubmVsRGVzY3JpcHRpb24gPSBGT1VSX0NIQVJfQ09ERSgnY2RzYycpCkBAIC0yMjc3LDcgKzIyNzcsNyBAQAoga1FUVk9EZWNvbXByZXNzb3JzID0gRk9VUl9DSEFSX0NPREUoJ2RlY28nKQoga1FUVk9EZWNvbXByZXNzb3JUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RldHknKQoga1FUVk9EZWNvbXByZXNzb3JDb250aW51b3VzID0gRk9VUl9DSEFSX0NPREUoJ2NvbnQnKQota1FUVk9EZWNvbXByZXNzb3JDb21wb25lbnQgPSBGT1VSX0NIQVJfQ09ERSgnY21wdCcpIAora1FUVk9EZWNvbXByZXNzb3JDb21wb25lbnQgPSBGT1VSX0NIQVJfQ09ERSgnY21wdCcpCiBrQ2xvY2tHZXRUaW1lU2VsZWN0ID0gMHgwMDAxCiBrQ2xvY2tOZXdDYWxsQmFja1NlbGVjdCA9IDB4MDAwMgoga0Nsb2NrRGlzcG9zZUNhbGxCYWNrU2VsZWN0ID0gMHgwMDAzCkBAIC0yODA0LDcgKzI4MDQsNyBAQAogbUhpdFRlc3RCb3VuZHMgPSAxTCA8PCAwCiBtSGl0VGVzdEltYWdlID0gMUwgPDwgMQogbUhpdFRlc3RJbnZpc2libGUgPSAxTCA8PCAyCi1tSGl0VGVzdElzQ2xpY2sgPSAxTCA8PCAzIAorbUhpdFRlc3RJc0NsaWNrID0gMUwgPDwgMwogbU9wYXF1ZSA9IDFMIDw8IDAKIG1JbnZpc2libGUgPSAxTCA8PCAxCiBrTWVkaWFRVElkbGVGcmVxdWVuY3lTZWxlY3RvciA9IEZPVVJfQ0hBUl9DT0RFKCdpZGZxJykKQEAgLTI4MTUsNyArMjgxNSw3IEBACiBrTWVkaWFWaWRlb1BhcmFtU2F0dXJhdGlvbiA9IDUKIGtNZWRpYVZpZGVvUGFyYW1CbGFja0xldmVsID0gNgoga01lZGlhVmlkZW9QYXJhbVdoaXRlTGV2ZWwgPSA3Ci1rTUhJbmZvRW5jb2RlZEZyYW1lUmF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdvcmF0JykgCitrTUhJbmZvRW5jb2RlZEZyYW1lUmF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdvcmF0JykKIGtFbXB0eVB1cmdhYmxlQ2h1bmtzT3ZlckFsbG93YW5jZSA9IDEKIGtDYWxsQ29tcG9uZW50RXhlY3V0ZVdpcmVkQWN0aW9uU2VsZWN0ID0gLTkKIGtNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzU2VsZWN0ID0gMHgwNDE1CkBAIC0yOTM3LDcgKzI5MzcsNyBAQAoga0luc3RLbm9iTWlzc2luZ1Vua25vd24gPSAwCiBrSW5zdEtub2JNaXNzaW5nRGVmYXVsdCA9ICgxIDw8IDApCiBrTXVzaWNMb29wVHlwZU5vcm1hbCA9IDAKLWtNdXNpY0xvb3BUeXBlUGFsaW5kcm9tZSA9IDEgICAgIAora011c2ljTG9vcFR5cGVQYWxpbmRyb21lID0gMQogaW5zdFNhbXBsZVByZVByb2Nlc3NGbGFnID0gMSA8PCAwCiBrUVRNSURJQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtaWRpJykKIGtPTVNDb21wb25lbnRTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ09NUyAnKQpAQCAtMjk0NiwxOCArMjk0NiwxOCBAQAoga09TWE1JRElDb21wb25lbnRTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ29zeG0nKQoga011c2ljUGFja2V0UG9ydExvc3QgPSAxCiBrTXVzaWNQYWNrZXRQb3J0Rm91bmQgPSAyCi1rTXVzaWNQYWNrZXRUaW1lR2FwID0gMyAgICAgCitrTXVzaWNQYWNrZXRUaW1lR2FwID0gMwoga0FwcGxlU3lzZXhJRCA9IDB4MTEKIGtBcHBsZVN5c2V4Q21kU2FtcGxlU2l6ZSA9IDB4MDAwMQoga0FwcGxlU3lzZXhDbWRTYW1wbGVCcmVhayA9IDB4MDAwMgoga0FwcGxlU3lzZXhDbWRBdG9taWNJbnN0cnVtZW50ID0gMHgwMDEwCi1rQXBwbGVTeXNleENtZERldmVsb3BlciA9IDB4N0YwMCAKK2tBcHBsZVN5c2V4Q21kRGV2ZWxvcGVyID0gMHg3RjAwCiBrU3ludGhlc2l6ZXJDb25uZWN0aW9uRk1TID0gMQoga1N5bnRoZXNpemVyQ29ubmVjdGlvbk1NZ3IgPSAyCiBrU3ludGhlc2l6ZXJDb25uZWN0aW9uT01TID0gNAoga1N5bnRoZXNpemVyQ29ubmVjdGlvblFUID0gOAoga1N5bnRoZXNpemVyQ29ubmVjdGlvbk9TWE1JREkgPSAxNgota1N5bnRoZXNpemVyQ29ubmVjdGlvblVuYXZhaWxhYmxlID0gMjU2IAora1N5bnRoZXNpemVyQ29ubmVjdGlvblVuYXZhaWxhYmxlID0gMjU2CiBrTXVzaWNDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ211c2knKQoga0luc3RydW1lbnRDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2luc3QnKQoga1NvZnRTeW50aENvbXBvbmVudFN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3MgICcpCkBAIC0yOTc2LDcgKzI5NzYsNyBAQAoga1N5bnRoZXNpemVyT2ZmbGluZSA9IDEgPDwgMTIKIGtTeW50aGVzaXplckdNID0gMSA8PCAxNAoga1N5bnRoZXNpemVyRExTID0gMSA8PCAxNQota1N5bnRoZXNpemVyU291bmRMb2NhbGl6YXRpb24gPSAxIDw8IDE2IAora1N5bnRoZXNpemVyU291bmRMb2NhbGl6YXRpb24gPSAxIDw8IDE2CiBrQ29udHJvbGxlck1vZHVsYXRpb25XaGVlbCA9IDEKIGtDb250cm9sbGVyQnJlYXRoID0gMgoga0NvbnRyb2xsZXJGb290ID0gNApAQCAtMzA4MSw4ICszMDgxLDggQEAKIGtRVE1TS25vYlZvbHVtZUF0dGFja1ZlbFNjYWxpbmdJRCA9IDB4MDIwMDAwM0YKIGtRVE1TS25vYkxhc3RJRFBsdXMxID0gMHgwMjAwMDA0MAoga0NvbnRyb2xsZXJNYXhpbXVtID0gMHgwMDAwN0ZGRgotIyBrQ29udHJvbGxlck1pbmltdW0gPSAobG9uZykweEZGRkY4MDAwIAota1ZvaWNlQ291bnREeW5hbWljID0gLTEgICAgCisjIGtDb250cm9sbGVyTWluaW11bSA9IChsb25nKTB4RkZGRjgwMDAKK2tWb2ljZUNvdW50RHluYW1pYyA9IC0xCiBrRmlyc3RHTUluc3RydW1lbnQgPSAweDAwMDAwMDAxCiBrTGFzdEdNSW5zdHJ1bWVudCA9IDB4MDAwMDAwODAKIGtGaXJzdEdTSW5zdHJ1bWVudCA9IDB4MDAwMDAwODEKQEAgLTMxMTYsOSArMzExNiw5IEBACiBrS25vYlR5cGVNaWxsaXNlY29uZHMgPSA3IDw8IDEyCiBrS25vYlR5cGVQZXJjZW50YWdlID0gOCA8PCAxMgoga0tub2JUeXBlSGVydHogPSA5IDw8IDEyCi1rS25vYlR5cGVCdXR0b24gPSAxMCA8PCAxMiAKK2tLbm9iVHlwZUJ1dHRvbiA9IDEwIDw8IDEyCiBrVW5rbm93bktub2JWYWx1ZSA9IDB4N0ZGRkZGRkYKLWtEZWZhdWx0S25vYlZhbHVlID0gMHg3RkZGRkZGRSAKK2tEZWZhdWx0S25vYlZhbHVlID0gMHg3RkZGRkZGRQogbm90SW1wbGVtZW50ZWRNdXNpY0VyciA9ICgweDgwMDAwMDAwIHwgKDB4RkZGRiAmIChub3RJbXBsZW1lbnRlZE11c2ljT1NFcnIpKSkKIGNhbnRTZW5kVG9TeW50aGVzaXplckVyciA9ICgweDgwMDAwMDAwIHwgKDB4RkZGRiAmIChjYW50U2VuZFRvU3ludGhlc2l6ZXJPU0VycikpKQogY2FudFJlY2VpdmVGcm9tU3ludGhlc2l6ZXJFcnIgPSAoMHg4MDAwMDAwMCB8ICgweEZGRkYgJiAoY2FudFJlY2VpdmVGcm9tU3ludGhlc2l6ZXJPU0VycikpKQpAQCAtMzE0MiwxMyArMzE0MiwxMyBAQAoga0dldEF0b21pY0luc3ROb0tub2JMaXN0ID0gMSA8PCAyCiBrR2V0QXRvbWljSW5zdE5vSW5zdHJ1bWVudEluZm8gPSAxIDw8IDMKIGtHZXRBdG9taWNJbnN0T3JpZ2luYWxLbm9iTGlzdCA9IDEgPDwgNAota0dldEF0b21pY0luc3RBbGxLbm9icyA9IDEgPDwgNSAKK2tHZXRBdG9taWNJbnN0QWxsS25vYnMgPSAxIDw8IDUKIGtTZXRBdG9taWNJbnN0S2VlcE9yaWdpbmFsSW5zdHJ1bWVudCA9IDEgPDwgMAoga1NldEF0b21pY0luc3RTaGFyZUFjcm9zc1BhcnRzID0gMSA8PCAxCiBrU2V0QXRvbWljSW5zdENhbGxlclRvc3NlcyA9IDEgPDwgMgoga1NldEF0b21pY0luc3RDYWxsZXJHdWFyYW50ZWVzID0gMSA8PCAzCiBrU2V0QXRvbWljSW5zdEludGVycnVwdFNhZmUgPSAxIDw8IDQKLWtTZXRBdG9taWNJbnN0RG9udFByZXByb2Nlc3MgPSAxIDw8IDcgCitrU2V0QXRvbWljSW5zdERvbnRQcmVwcm9jZXNzID0gMSA8PCA3CiBrSW5zdHJ1bWVudE5hbWVzTW9kaWZpYWJsZSA9IDEKIGtJbnN0cnVtZW50TmFtZXNCb3RoID0gMgoga0dlbmVyaWNNdXNpY0NvbXBvbmVudFN1YnR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZ2VuZScpCkBAIC0zMTk2LDEzICszMTk2LDEzIEBACiBrR2VuZXJpY011c2ljQ2FsbEluc3RydW1lbnQgPSAxIDw8IDYKIGtHZW5lcmljTXVzaWNDYWxsTnVtYmVyID0gMSA8PCA3CiBrR2VuZXJpY011c2ljQ2FsbFJPTUluc3RydW1lbnQgPSAxIDw8IDgKLWtHZW5lcmljTXVzaWNBbGxEZWZhdWx0cyA9IDEgPDwgOSAKK2tHZW5lcmljTXVzaWNBbGxEZWZhdWx0cyA9IDEgPDwgOQoga0dldEluc3RydW1lbnRJbmZvTm9CdWlsdEluID0gMSA8PCAwCiBrR2V0SW5zdHJ1bWVudEluZm9NaWRpVXNlckluc3QgPSAxIDw8IDEKIGtHZXRJbnN0cnVtZW50SW5mb05vSVRleHQgPSAxIDw8IDIKIGtOb3RlUmVxdWVzdE5vR00gPSAxCiBrTm90ZVJlcXVlc3ROb1N5bnRoVHlwZSA9IDIKLWtOb3RlUmVxdWVzdFN5bnRoTXVzdE1hdGNoID0gNCAgICAgCitrTm90ZVJlcXVlc3RTeW50aE11c3RNYXRjaCA9IDQKIGtOb3RlUmVxdWVzdFNwZWNpZnlNSURJQ2hhbm5lbCA9IDB4ODAKIGtQaWNrRG9udE1peCA9IDEKIGtQaWNrU2FtZVN5bnRoID0gMgpAQCAtMzIxMCwxMSArMzIxMCwxMSBAQAoga1BpY2tFZGl0QWxsb3dFZGl0ID0gOAoga1BpY2tFZGl0QWxsb3dQaWNrID0gMTYKIGtQaWNrRWRpdFN5bnRoR2xvYmFsID0gMzIKLWtQaWNrRWRpdENvbnRyb2xsZXJzID0gNjQgICAgCitrUGlja0VkaXRDb250cm9sbGVycyA9IDY0CiBrTm90ZUFsbG9jYXRvckNvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbm90YScpCiBrTkFEdW1teU9uZVNlbGVjdCA9IDI5CiBrTkFEdW1teVR3b1NlbGVjdCA9IDMwCi1rVHVuZVF1ZXVlRGVwdGggPSA4ICAgICAKK2tUdW5lUXVldWVEZXB0aCA9IDgKIGtUdW5lUGxheWVyQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0dW5lJykKIGtUdW5lU3RhcnROb3cgPSAxCiBrVHVuZURvbnRDbGlwTm90ZXMgPSAyCkBAIC0zMjI3LDkgKzMyMjcsOSBAQAoga1R1bmVTdG9wRmFkZSA9IDEKIGtUdW5lU3RvcFN1c3RhaW4gPSAyCiBrVHVuZVN0b3BJbnN0YW50ID0gNAota1R1bmVTdG9wUmVsZWFzZUNoYW5uZWxzID0gOCAgICAgCitrVHVuZVN0b3BSZWxlYXNlQ2hhbm5lbHMgPSA4CiBrVHVuZU1peE11dGUgPSAxCi1rVHVuZU1peFNvbG8gPSAyICAgICAKK2tUdW5lTWl4U29sbyA9IDIKIGtSZXN0RXZlbnRUeXBlID0gMHgwMDAwMDAwMAoga05vdGVFdmVudFR5cGUgPSAweDAwMDAwMDAxCiBrQ29udHJvbEV2ZW50VHlwZSA9IDB4MDAwMDAwMDIKQEAgLTMzNDcsMTAgKzMzNDcsMTAgQEAKIGtHZW5lcmFsRXZlbnRQYXJ0Q2hhbmdlID0gOQoga0dlbmVyYWxFdmVudE5vT3AgPSAxMAoga0dlbmVyYWxFdmVudFVzZWROb3RlcyA9IDExCi1rR2VuZXJhbEV2ZW50UGFydE1peCA9IDEyICAgIAora0dlbmVyYWxFdmVudFBhcnRNaXggPSAxMgoga01hcmtlckV2ZW50RW5kID0gMAoga01hcmtlckV2ZW50QmVhdCA9IDEKLWtNYXJrZXJFdmVudFRlbXBvID0gMiAgICAgCitrTWFya2VyRXZlbnRUZW1wbyA9IDIKIGtDdXJyZW50bHlOYXRpdmVFbmRpYW4gPSAxCiBrQ3VycmVudGx5Tm90TmF0aXZlRW5kaWFuID0gMgoga1FUTUlESUdldE1JRElQb3J0c1NlbGVjdCA9IDB4MDAwMQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9SZXNvdXJjZXMucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL1Jlc291cmNlcy5weQppbmRleCA4MDMwMzk2Li4yY2Q4NzYxIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL1Jlc291cmNlcy5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL1Jlc291cmNlcy5weQpAQCAtOCw3ICs4LDcgQEAKIHJlc0NoYW5nZWQgPSAyCiBtYXBSZWFkT25seSA9IDEyOAogbWFwQ29tcGFjdCA9IDY0Ci1tYXBDaGFuZ2VkID0gMzIgICAgCittYXBDaGFuZ2VkID0gMzIKIHJlc1N5c1JlZkJpdCA9IDcKIHJlc1N5c0hlYXBCaXQgPSA2CiByZXNQdXJnZWFibGVCaXQgPSA1CkBAIC0xOCwxMCArMTgsMTAgQEAKIHJlc0NoYW5nZWRCaXQgPSAxCiBtYXBSZWFkT25seUJpdCA9IDcKIG1hcENvbXBhY3RCaXQgPSA2Ci1tYXBDaGFuZ2VkQml0ID0gNSAgICAgCittYXBDaGFuZ2VkQml0ID0gNQoga1Jlc0ZpbGVOb3RPcGVuZWQgPSAtMQota1N5c3RlbVJlc0ZpbGUgPSAwICAgICAKK2tTeXN0ZW1SZXNGaWxlID0gMAoga1JzcmNDaGFpbkJlbG93U3lzdGVtTWFwID0gMAoga1JzcmNDaGFpbkJlbG93QXBwbGljYXRpb25NYXAgPSAxCiBrUnNyY0NoYWluQWJvdmVBcHBsaWNhdGlvbk1hcCA9IDIKLWtSc3JjQ2hhaW5BYm92ZUFsbE1hcHMgPSA0ICAgICAKK2tSc3JjQ2hhaW5BYm92ZUFsbE1hcHMgPSA0CmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL1NvdW5kLnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9Tb3VuZC5weQppbmRleCBmZmU5ZWZhLi4wZTdiMmZiIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL1NvdW5kLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vU291bmQucHkKQEAgLTEsOCArMSw4IEBACiAjIEdlbmVyYXRlZCBmcm9tICdTb3VuZC5oJwogCiBkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4Ci1zb3VuZExpc3RSc3JjID0gRk9VUl9DSEFSX0NPREUoJ3NuZCAnKSAKLWtTaW1wbGVCZWVwSUQgPSAxICAgICAKK3NvdW5kTGlzdFJzcmMgPSBGT1VSX0NIQVJfQ09ERSgnc25kICcpCitrU2ltcGxlQmVlcElEID0gMQogIyByYXRlNDhraHogPSAobG9uZykweEJCODAwMDAwCiAjIHJhdGU0NGtoeiA9IChsb25nKTB4QUM0NDAwMDAKIHJhdGUzMmtoeiA9IDB4N0QwMDAwMDAKQEAgLTExLDIxICsxMSwyMSBAQAogcmF0ZTE2a2h6ID0gMHgzRTgwMDAwMAogcmF0ZTExa2h6ID0gMHgyQjc3NDVEMQogcmF0ZTExMDI1aHogPSAweDJCMTEwMDAwCi1yYXRlOGtoeiA9IDB4MUY0MDAwMDAgCi1zYW1wbGVkU3ludGggPSA1ICAgICAKK3JhdGU4a2h6ID0gMHgxRjQwMDAwMAorc2FtcGxlZFN5bnRoID0gNQogc3F1YXJlV2F2ZVN5bnRoID0gMQogd2F2ZVRhYmxlU3ludGggPSAzCiBNQUNFM3NudGhJRCA9IDExCiBNQUNFNnNudGhJRCA9IDEzCi1rTWlkZGxlQyA9IDYwICAgIAora01pZGRsZUMgPSA2MAoga05vVm9sdW1lID0gMAota0Z1bGxWb2x1bWUgPSAweDAxMDAgCitrRnVsbFZvbHVtZSA9IDB4MDEwMAogc3RkUUxlbmd0aCA9IDEyOAogZGF0YU9mZnNldEZsYWcgPSAweDgwMDAKLWtVc2VPcHRpb25hbE91dHB1dERldmljZSA9IC0xICAgIAora1VzZU9wdGlvbmFsT3V0cHV0RGV2aWNlID0gLTEKIG5vdENvbXByZXNzZWQgPSAwCiBmaXhlZENvbXByZXNzaW9uID0gLTEKLXZhcmlhYmxlQ29tcHJlc3Npb24gPSAtMiAgICAKK3ZhcmlhYmxlQ29tcHJlc3Npb24gPSAtMgogdHdvVG9PbmUgPSAxCiBlaWdodFRvVGhyZWUgPSAyCiB0aHJlZVRvT25lID0gMwpAQCAtMzUsMTcgKzM1LDE3IEBACiBzdGF0ZUJsb2NrU2l6ZSA9IDY0CiBsZWZ0T3ZlckJsb2NrU2l6ZSA9IDMyCiBmaXJzdFNvdW5kRm9ybWF0ID0gMHgwMDAxCi1zZWNvbmRTb3VuZEZvcm1hdCA9IDB4MDAwMiAKK3NlY29uZFNvdW5kRm9ybWF0ID0gMHgwMDAyCiBkYkJ1ZmZlclJlYWR5ID0gMHgwMDAwMDAwMQotZGJMYXN0QnVmZmVyID0gMHgwMDAwMDAwNCAKK2RiTGFzdEJ1ZmZlciA9IDB4MDAwMDAwMDQKIHN5c0JlZXBEaXNhYmxlID0gMHgwMDAwCiBzeXNCZWVwRW5hYmxlID0gKDEgPDwgMCkKLXN5c0JlZXBTeW5jaHJvbm91cyA9ICgxIDw8IDEpIAorc3lzQmVlcFN5bmNocm9ub3VzID0gKDEgPDwgMSkKIHVuaXRUeXBlTm9TZWxlY3Rpb24gPSAweEZGRkYKIHVuaXRUeXBlU2Vjb25kcyA9IDB4MDAwMAogc3RkU0ggPSAweDAwCiBleHRTSCA9IDB4RkYKLWNtcFNIID0gMHhGRSAgCitjbXBTSCA9IDB4RkUKIG51bGxDbWQgPSAwCiBxdWlldENtZCA9IDMKIGZsdXNoQ21kID0gNApAQCAtODQsNyArODQsNyBAQAogZG91YmxlQnVmZmVyQ21kID0gODQKIGdldFJhdGVDbWQgPSA4NQogc2l6ZUNtZCA9IDkwCi1jb252ZXJ0Q21kID0gOTEgICAgCitjb252ZXJ0Q21kID0gOTEKIHdhdmVJbml0Q2hhbm5lbE1hc2sgPSAweDA3CiB3YXZlSW5pdENoYW5uZWwwID0gMHgwNAogd2F2ZUluaXRDaGFubmVsMSA9IDB4MDUKQEAgLTkzLDcgKzkzLDcgQEAKIGluaXRDaGFuMCA9IHdhdmVJbml0Q2hhbm5lbDAKIGluaXRDaGFuMSA9IHdhdmVJbml0Q2hhbm5lbDEKIGluaXRDaGFuMiA9IHdhdmVJbml0Q2hhbm5lbDIKLWluaXRDaGFuMyA9IHdhdmVJbml0Q2hhbm5lbDMgCitpbml0Q2hhbjMgPSB3YXZlSW5pdENoYW5uZWwzCiBvdXRzaWRlQ21wU0ggPSAwCiBpbnNpZGVDbXBTSCA9IDEKIGFjZVN1Y2Nlc3MgPSAwCkBAIC0xMDIsNyArMTAyLDcgQEAKIGFjZUJhZENvbXAgPSAzCiBhY2VCYWRFbmNvZGUgPSA0CiBhY2VCYWREZXN0ID0gNQotYWNlQmFkQ21kID0gNiAgICAgCithY2VCYWRDbWQgPSA2CiBpbml0Q2hhbkxlZnQgPSAweDAwMDIKIGluaXRDaGFuUmlnaHQgPSAweDAwMDMKIGluaXROb0ludGVycCA9IDB4MDAwNApAQCAtMTE0LDcgKzExNCw3IEBACiBpbml0UGFuTWFzayA9IDB4MDAwMwogaW5pdFNSYXRlTWFzayA9IDB4MDAzMAogaW5pdFN0ZXJlb01hc2sgPSAweDAwQzAKLWluaXRDb21wTWFzayA9IDB4RkYwMCAKK2luaXRDb21wTWFzayA9IDB4RkYwMAogc2lBY3RpdmVDaGFubmVscyA9IEZPVVJfQ0hBUl9DT0RFKCdjaGFjJykKIHNpQWN0aXZlTGV2ZWxzID0gRk9VUl9DSEFSX0NPREUoJ2xtYWMnKQogc2lBR0NPbk9mZiA9IEZPVVJfQ0hBUl9DT0RFKCdhZ2MgJykKQEAgLTIwMCwxMSArMjAwLDExIEBACiBzaVdpZGVTdGVyZW8gPSBGT1VSX0NIQVJfQ09ERSgnd2lkZScpCiBzaVN1cHBvcnRlZEV4dGVuZGVkRmxhZ3MgPSBGT1VSX0NIQVJfQ09ERSgnZXhmbCcpCiBzaVJhdGVDb252ZXJ0ZXJSb2xsT2ZmU2xvcGUgPSBGT1VSX0NIQVJfQ09ERSgncmNkYicpCi1zaU91dHB1dExhdGVuY3kgPSBGT1VSX0NIQVJfQ09ERSgnb2x0ZScpIAorc2lPdXRwdXRMYXRlbmN5ID0gRk9VUl9DSEFSX0NPREUoJ29sdGUnKQogc2lDbG9zZURyaXZlciA9IEZPVVJfQ0hBUl9DT0RFKCdjbG9zJykKIHNpSW5pdGlhbGl6ZURyaXZlciA9IEZPVVJfQ0hBUl9DT0RFKCdpbml0JykKIHNpUGF1c2VSZWNvcmRpbmcgPSBGT1VSX0NIQVJfQ09ERSgncGF1cycpCi1zaVVzZXJJbnRlcnJ1cHRQcm9jID0gRk9VUl9DSEFSX0NPREUoJ3VzZXInKSAKK3NpVXNlckludGVycnVwdFByb2MgPSBGT1VSX0NIQVJfQ09ERSgndXNlcicpCiAjIGtJbnZhbGlkU291cmNlID0gKGxvbmcpMHhGRkZGRkZGRgoga05vU291cmNlID0gRk9VUl9DSEFSX0NPREUoJ25vbmUnKQoga0NEU291cmNlID0gRk9VUl9DSEFSX0NPREUoJ2NkICAnKQpAQCAtMjE5LDcgKzIxOSw3IEBACiBrUENDYXJkU291cmNlID0gRk9VUl9DSEFSX0NPREUoJ3BjbSAnKQoga1pvb21WaWRlb1NvdXJjZSA9IEZPVVJfQ0hBUl9DT0RFKCd6dnBjJykKIGtEVkRTb3VyY2UgPSBGT1VSX0NIQVJfQ09ERSgnZHZkYScpCi1rTWljcm9waG9uZUFycmF5ID0gRk9VUl9DSEFSX0NPREUoJ21pY2EnKSAKK2tNaWNyb3Bob25lQXJyYXkgPSBGT1VSX0NIQVJfQ09ERSgnbWljYScpCiBrTm9Tb3VuZENvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnKioqKicpCiBrU291bmRDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NpZnQnKQoga1NvdW5kQ29tcG9uZW50UFBDVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCduaWZ0JykKQEAgLTI4Nyw3ICsyODcsNyBAQAoga1R3b3NDb21wbGVtZW50ID0gazE2Qml0QmlnRW5kaWFuRm9ybWF0CiBrTGl0dGxlRW5kaWFuRm9ybWF0ID0gazE2Qml0TGl0dGxlRW5kaWFuRm9ybWF0CiBrTVBFR0xheWVyM0Zvcm1hdCA9IDB4NkQ3MzAwNTUKLWtGdWxsTVBFR0xheTNGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnLm1wMycpIAora0Z1bGxNUEVHTGF5M0Zvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCcubXAzJykKIGsxNkJpdE5hdGl2ZUVuZGlhbkZvcm1hdCA9IGsxNkJpdExpdHRsZUVuZGlhbkZvcm1hdAogazE2Qml0Tm9uTmF0aXZlRW5kaWFuRm9ybWF0ID0gazE2Qml0QmlnRW5kaWFuRm9ybWF0CiBrMTZCaXROYXRpdmVFbmRpYW5Gb3JtYXQgPSBrMTZCaXRCaWdFbmRpYW5Gb3JtYXQKQEAgLTMyMyw4ICszMjMsOCBAQAoga1NvdW5kQ29udmVydGVyTWl4ZXIgPSAoMSA8PCAxMSkKIGtQYWdpbmdNaXhlciA9ICgxIDw8IDEyKQoga1ZNQXdhcmVNaXhlciA9ICgxIDw8IDEzKQota0V4dGVuZGVkU291bmREYXRhID0gKDEgPDwgMTQpIAota0Jlc3RRdWFsaXR5ID0gKDEgPDwgMCkgCitrRXh0ZW5kZWRTb3VuZERhdGEgPSAoMSA8PCAxNCkKK2tCZXN0UXVhbGl0eSA9ICgxIDw8IDApCiBrSW5wdXRNYXNrID0gMHgwMDAwMDBGRgoga091dHB1dE1hc2sgPSAweDAwMDBGRjAwCiBrT3V0cHV0U2hpZnQgPSA4CkBAIC0zMzcsNyArMzM3LDcgQEAKIGtBVkRpc3BsYXlIZWFkcGhvbmVSZW1vdmUgPSAwCiBrQVZEaXNwbGF5SGVhZHBob25lSW5zZXJ0ID0gMQoga0FWRGlzcGxheVBsYWluVGFsa1JlbW92ZSA9IDIKLWtBVkRpc3BsYXlQbGFpblRhbGtJbnNlcnQgPSAzICAgICAKK2tBVkRpc3BsYXlQbGFpblRhbGtJbnNlcnQgPSAzCiBhdWRpb0FsbENoYW5uZWxzID0gMAogYXVkaW9MZWZ0Q2hhbm5lbCA9IDEKIGF1ZGlvUmlnaHRDaGFubmVsID0gMgpAQCAtMzQ1LDIxICszNDUsMjEgQEAKIGF1ZGlvTXV0ZWQgPSAxCiBhdWRpb0RvZXNNb25vID0gKDFMIDw8IDApCiBhdWRpb0RvZXNTdGVyZW8gPSAoMUwgPDwgMSkKLWF1ZGlvRG9lc0luZGVwZW5kZW50Q2hhbm5lbHMgPSAoMUwgPDwgMikgCithdWRpb0RvZXNJbmRlcGVuZGVudENoYW5uZWxzID0gKDFMIDw8IDIpCiBzaUNEUXVhbGl0eSA9IEZPVVJfQ0hBUl9DT0RFKCdjZCAgJykKIHNpQmVzdFF1YWxpdHkgPSBGT1VSX0NIQVJfQ09ERSgnYmVzdCcpCiBzaUJldHRlclF1YWxpdHkgPSBGT1VSX0NIQVJfQ09ERSgnYmV0cicpCiBzaUdvb2RRdWFsaXR5ID0gRk9VUl9DSEFSX0NPREUoJ2dvb2QnKQotc2lOb25lUXVhbGl0eSA9IEZPVVJfQ0hBUl9DT0RFKCdub25lJykgCitzaU5vbmVRdWFsaXR5ID0gRk9VUl9DSEFSX0NPREUoJ25vbmUnKQogc2lEZXZpY2VJc0Nvbm5lY3RlZCA9IDEKIHNpRGV2aWNlTm90Q29ubmVjdGVkID0gMAogc2lEb250S25vd0lmQ29ubmVjdGVkID0gLTEKIHNpUmVhZFBlcm1pc3Npb24gPSAwCi1zaVdyaXRlUGVybWlzc2lvbiA9IDEgICAgIAorc2lXcml0ZVBlcm1pc3Npb24gPSAxCiBrU291bmRDb252ZXJ0ZXJEaWRudEZpbGxCdWZmZXIgPSAoMSA8PCAwKQota1NvdW5kQ29udmVydGVySGFzTGVmdE92ZXJEYXRhID0gKDEgPDwgMSkgCitrU291bmRDb252ZXJ0ZXJIYXNMZWZ0T3ZlckRhdGEgPSAoMSA8PCAxKQoga0V4dGVuZGVkU291bmRTYW1wbGVDb3VudE5vdFZhbGlkID0gMUwgPDwgMAota0V4dGVuZGVkU291bmRCdWZmZXJTaXplVmFsaWQgPSAxTCA8PCAxIAora0V4dGVuZGVkU291bmRCdWZmZXJTaXplVmFsaWQgPSAxTCA8PCAxCiBrU2NoZWR1bGVkU291bmREb1NjaGVkdWxlZCA9IDEgPDwgMAoga1NjaGVkdWxlZFNvdW5kRG9DYWxsQmFjayA9IDEgPDwgMQoga1NjaGVkdWxlZFNvdW5kRXh0ZW5kZWRIZHIgPSAxIDw8IDIKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9DYXJib24vVGV4dEVkaXQucHkgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL1RleHRFZGl0LnB5CmluZGV4IGViNWZiOTIuLjE3Njc5NWEgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9DYXJib24vVGV4dEVkaXQucHkKKysrIGIvTGliL3BsYXQtbWFjL0NhcmJvbi9UZXh0RWRpdC5weQpAQCAtNywyNiArNywyNiBAQAogdGVGbHVzaERlZmF1bHQgPSAwCiB0ZUNlbnRlciA9IDEKIHRlRmx1c2hSaWdodCA9IC0xCi10ZUZsdXNoTGVmdCA9IC0yICAgIAordGVGbHVzaExlZnQgPSAtMgogZm9udEJpdCA9IDAKIGZhY2VCaXQgPSAxCiBzaXplQml0ID0gMgogY2xyQml0ID0gMwogYWRkU2l6ZUJpdCA9IDQKLXRvZ2dsZUJpdCA9IDUgICAgIAordG9nZ2xlQml0ID0gNQogZG9Gb250ID0gMQogZG9GYWNlID0gMgogZG9TaXplID0gNAogZG9Db2xvciA9IDgKIGRvQWxsID0gMTUKIGFkZFNpemUgPSAxNgotZG9Ub2dnbGUgPSAzMiAgICAKK2RvVG9nZ2xlID0gMzIKIEVPTEhvb2sgPSAwCiBEUkFXSG9vayA9IDQKIFdJRFRISG9vayA9IDgKIEhJVFRFU1RIb29rID0gMTIKIG5XSURUSEhvb2sgPSAyNAotVGV4dFdpZHRoSG9vayA9IDI4ICAgIAorVGV4dFdpZHRoSG9vayA9IDI4CiBpbnRFT0xIb29rID0gMAogaW50RHJhd0hvb2sgPSAxCiBpbnRXaWR0aEhvb2sgPSAyCkBAIC0zNCwyNCArMzQsMjQgQEAKIGludE5XaWR0aEhvb2sgPSA2CiBpbnRUZXh0V2lkdGhIb29rID0gNwogaW50SW5saW5lSW5wdXRUU01URVByZVVwZGF0ZUhvb2sgPSA4Ci1pbnRJbmxpbmVJbnB1dFRTTVRFUG9zdFVwZGF0ZUhvb2sgPSA5IAoraW50SW5saW5lSW5wdXRUU01URVBvc3RVcGRhdGVIb29rID0gOQogdGVGQXV0b1Njcm9sbCA9IDAKIHRlRlRleHRCdWZmZXJpbmcgPSAxCiB0ZUZPdXRsaW5lSGlsaXRlID0gMgogdGVGSW5saW5lSW5wdXQgPSAzCiB0ZUZVc2VXaGl0ZUJhY2tncm91bmQgPSA0CiB0ZUZVc2VJbmxpbmVJbnB1dCA9IDUKLXRlRklubGluZUlucHV0QXV0b1Njcm9sbCA9IDYgICAgIAotdGVGSWRsZVdpdGhFdmVudExvb3BUaW1lciA9IDcgICAgIAordGVGSW5saW5lSW5wdXRBdXRvU2Nyb2xsID0gNgordGVGSWRsZVdpdGhFdmVudExvb3BUaW1lciA9IDcKIHRlQml0Q2xlYXIgPSAwCiB0ZUJpdFNldCA9IDEKLXRlQml0VGVzdCA9IC0xICAgIAordGVCaXRUZXN0ID0gLTEKIHRlV29yZFNlbGVjdCA9IDQKIHRlV29yZERyYWcgPSA4CiB0ZUZyb21GaW5kID0gMTIKLXRlRnJvbVJlY2FsID0gMTYgICAgCit0ZUZyb21SZWNhbCA9IDE2CiB0ZUZpbmQgPSAwCiB0ZUhpZ2hsaWdodCA9IDEKIHRlRHJhdyA9IC0xCi10ZUNhcmV0ID0gLTIgICAgCi10ZUZVc2VUZXh0U2VydmljZXMgPSA0ICAgICAKK3RlQ2FyZXQgPSAtMgordGVGVXNlVGV4dFNlcnZpY2VzID0gNApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9XaW5kb3dzLnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9XaW5kb3dzLnB5CmluZGV4IGFmOGVhZjIuLmIwOWQ1MzcgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9DYXJib24vV2luZG93cy5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL1dpbmRvd3MucHkKQEAgLTQ0LDcgKzQ0LDcgQEAKIGtXaW5kb3dEZWZQcm9jVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdXREVGJykKIGtTdGFuZGFyZFdpbmRvd0RlZmluaXRpb24gPSAwCiBrUm91bmRXaW5kb3dEZWZpbml0aW9uID0gMQota0Zsb2F0aW5nV2luZG93RGVmaW5pdGlvbiA9IDEyNCAgIAora0Zsb2F0aW5nV2luZG93RGVmaW5pdGlvbiA9IDEyNAoga0RvY3VtZW50V2luZG93VmFyaWFudENvZGUgPSAwCiBrTW9kYWxEaWFsb2dWYXJpYW50Q29kZSA9IDEKIGtQbGFpbkRpYWxvZ1ZhcmlhbnRDb2RlID0gMgpAQCAtMTA5LDcgKzEwOSw3IEBACiBrV2luZG93RmxvYXRTaWRlRnVsbFpvb21Qcm9jID0gMTA4NQoga1dpbmRvd0Zsb2F0U2lkZUZ1bGxab29tR3Jvd1Byb2MgPSAxMDg3CiBrV2luZG93U2hlZXRQcm9jID0gMTA4OAota1dpbmRvd1NoZWV0QWxlcnRQcm9jID0gMTEyMCAgCitrV2luZG93U2hlZXRBbGVydFByb2MgPSAxMTIwCiBrV2luZG93U2ltcGxlUHJvYyA9IDExMDQKIGtXaW5kb3dTaW1wbGVGcmFtZVByb2MgPSAxMTA1CiBrV2luZG93Tm9Qb3NpdGlvbiA9IDB4MDAwMApAQCAtMTQ1LDcgKzE0NSw3IEBACiBrV2luZG93Q29udGVudFJnbiA9IDMzCiBrV2luZG93VXBkYXRlUmduID0gMzQKIGtXaW5kb3dPcGFxdWVSZ24gPSAzNQota1dpbmRvd0dsb2JhbFBvcnRSZ24gPSA0MCAgICAKK2tXaW5kb3dHbG9iYWxQb3J0UmduID0gNDAKIGRpYWxvZ0tpbmQgPSAyCiB1c2VyS2luZCA9IDgKIGtEaWFsb2dXaW5kb3dLaW5kID0gMgpAQCAtMTYzLDcgKzE2Myw3IEBACiBpbkNvbGxhcHNlQm94ID0gMTEKIGluUHJveHlJY29uID0gMTIKIGluVG9vbGJhckJ1dHRvbiA9IDEzCi1pblN0cnVjdHVyZSA9IDE1ICAgIAoraW5TdHJ1Y3R1cmUgPSAxNQogd05vSGl0ID0gMAogd0luQ29udGVudCA9IDEKIHdJbkRyYWcgPSAyCkBAIC0xNzQsNyArMTc0LDcgQEAKIHdJbkNvbGxhcHNlQm94ID0gOQogd0luUHJveHlJY29uID0gMTAKIHdJblRvb2xiYXJCdXR0b24gPSAxMQotd0luU3RydWN0dXJlID0gMTMgICAgCit3SW5TdHJ1Y3R1cmUgPSAxMwoga1dpbmRvd01zZ0RyYXcgPSAwCiBrV2luZG93TXNnSGl0VGVzdCA9IDEKIGtXaW5kb3dNc2dDYWxjdWxhdGVTaGFwZSA9IDIKQEAgLTE4OSw4ICsxODksOCBAQAoga1dpbmRvd01zZ0RyYXdJbkN1cnJlbnRQb3J0ID0gMTEKIGtXaW5kb3dNc2dTZXR1cFByb3h5RHJhZ0ltYWdlID0gMTIKIGtXaW5kb3dNc2dTdGF0ZUNoYW5nZWQgPSAxMwota1dpbmRvd01zZ01lYXN1cmVUaXRsZSA9IDE0ICAgIAota1dpbmRvd01zZ0dldEdyb3dJbWFnZVJlZ2lvbiA9IDE5ICAgIAora1dpbmRvd01zZ01lYXN1cmVUaXRsZSA9IDE0CitrV2luZG93TXNnR2V0R3Jvd0ltYWdlUmVnaW9uID0gMTkKIHdEcmF3ID0gMAogd0hpdCA9IDEKIHdDYWxjUmducyA9IDIKQEAgLTIxNCw3ICsyMTQsNyBAQAoga1dpbmRvd1dhbnRzRGlzcG9zZUF0UHJvY2Vzc0RlYXRoID0gKDEgPDwgMTIpCiBrV2luZG93U3VwcG9ydHNHZXRHcm93SW1hZ2VSZWdpb24gPSAoMSA8PCAxMykKIGtXaW5kb3dEZWZTdXBwb3J0c0NvbG9yR3JhZlBvcnQgPSAweDQwMDAwMDAyCi1rV2luZG93SXNPcGFxdWUgPSAoMSA8PCAxNCkgCitrV2luZG93SXNPcGFxdWUgPSAoMSA8PCAxNCkKIGtXaW5kb3dTdXBwb3J0c1NldEdyb3dJbWFnZVJlZ2lvbiA9ICgxIDw8IDEzKQogZGVza1BhdElEID0gMTYKIHdDb250ZW50Q29sb3IgPSAwCkBAIC0yMjgsMTAgKzIyOCwxMCBAQAoga1dpbmRvd0lzQ29sbGFwc2VkU3RhdGUgPSAoMSA8PCAwTCkKIGtTdG9yZWRXaW5kb3dTeXN0ZW1UYWcgPSBGT1VSX0NIQVJfQ09ERSgnYXBwbCcpCiBrU3RvcmVkQmFzaWNXaW5kb3dEZXNjcmlwdGlvbklEID0gRk9VUl9DSEFSX0NPREUoJ3NiYXMnKQota1N0b3JlZFdpbmRvd1Bhc2NhbFRpdGxlSUQgPSBGT1VSX0NIQVJfQ09ERSgnczI1NScpIAora1N0b3JlZFdpbmRvd1Bhc2NhbFRpdGxlSUQgPSBGT1VSX0NIQVJfQ09ERSgnczI1NScpCiBrV2luZG93RGVmUHJvY1B0ciA9IDAKIGtXaW5kb3dEZWZPYmplY3RDbGFzcyA9IDEKLWtXaW5kb3dEZWZQcm9jSUQgPSAyICAgICAKK2tXaW5kb3dEZWZQcm9jSUQgPSAyCiBrV2luZG93TW9kYWxpdHlOb25lID0gMAoga1dpbmRvd01vZGFsaXR5U3lzdGVtTW9kYWwgPSAxCiBrV2luZG93TW9kYWxpdHlBcHBNb2RhbCA9IDIKQEAgLTI1Miw3ICsyNTIsNyBAQAoga1dpbmRvd1BhaW50UHJvY09wdGlvbnNOb25lID0gMAoga1Njcm9sbFdpbmRvd05vT3B0aW9ucyA9IDAKIGtTY3JvbGxXaW5kb3dJbnZhbGlkYXRlID0gKDFMIDw8IDApCi1rU2Nyb2xsV2luZG93RXJhc2VUb1BvcnRCYWNrZ3JvdW5kID0gKDFMIDw8IDEpIAora1Njcm9sbFdpbmRvd0VyYXNlVG9Qb3J0QmFja2dyb3VuZCA9ICgxTCA8PCAxKQoga1dpbmRvd01lbnVJbmNsdWRlUm90YXRlID0gMSA8PCAwCiBrV2luZG93Wm9vbVRyYW5zaXRpb25FZmZlY3QgPSAxCiBrV2luZG93U2hlZXRUcmFuc2l0aW9uRWZmZWN0ID0gMgpAQCAtMjczLDcgKzI3Myw3IEBACiBrV2luZG93TGF0ZW50VmlzaWJsZUFwcEhpZGRlbiA9IDEgPDwgMwoga1dpbmRvd0xhdGVudFZpc2libGVDb2xsYXBzZWRPd25lciA9IDEgPDwgNAoga1dpbmRvd0xhdGVudFZpc2libGVDb2xsYXBzZWRHcm91cCA9IDEgPDwgNQota1dpbmRvd1Byb3BlcnR5UGVyc2lzdGVudCA9IDB4MDAwMDAwMDEgCitrV2luZG93UHJvcGVydHlQZXJzaXN0ZW50ID0gMHgwMDAwMDAwMQoga1dpbmRvd0dyb3VwQXR0clNlbGVjdGFibGUgPSBrV2luZG93R3JvdXBBdHRyU2VsZWN0QXNMYXllcgoga1dpbmRvd0dyb3VwQXR0clBvc2l0aW9uRml4ZWQgPSBrV2luZG93R3JvdXBBdHRyTW92ZVRvZ2V0aGVyCiBrV2luZG93R3JvdXBBdHRyWk9yZGVyRml4ZWQgPSBrV2luZG93R3JvdXBBdHRyTGF5ZXJUb2dldGhlcgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL0NhcmJvbi9fX2luaXRfXy5weSBiL0xpYi9wbGF0LW1hYy9DYXJib24vX19pbml0X18ucHkKaW5kZXggZDBjZmVjMy4uODAxOGMxOCAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9fX2luaXRfXy5weQorKysgYi9MaWIvcGxhdC1tYWMvQ2FyYm9uL19faW5pdF9fLnB5CkBAIC0xLDQgKzEsNCBAQAogIyBGaWx0ZXIgb3V0IHdhcm5pbmdzIGFib3V0IHNpZ25lZC91bnNpZ25lZCBjb25zdGFudHMKIGltcG9ydCB3YXJuaW5ncwogd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIiLCBGdXR1cmVXYXJuaW5nLCAiLipDb250cm9scyIpCi13YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIiIsIEZ1dHVyZVdhcm5pbmcsICIuKk1hY1RleHRFZGl0b3IiKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiIiwgRnV0dXJlV2FybmluZywgIi4qTWFjVGV4dEVkaXRvciIpCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvRWFzeURpYWxvZ3MucHkgYi9MaWIvcGxhdC1tYWMvRWFzeURpYWxvZ3MucHkKaW5kZXggMTNkZjdmMy4uYzYyMmQzMCAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0Vhc3lEaWFsb2dzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9FYXN5RGlhbG9ncy5weQpAQCAtMzczLDIyICszNzMsMjIgQEAKICMjICAgICAgICAgICAgICAgICAgTWFjT1MuSGFuZGxlRXZlbnQoZXYpCiAjIwogZGVmIF9zZXRtZW51KGNvbnRyb2wsIGl0ZW1zKToKLSAgICAgICAgbWhhbmRsZSA9IGNvbnRyb2wuR2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xzLmtDb250cm9sTWVudVBhcnQsCi0gICAgICAgICAgICAgICAgQ29udHJvbHMua0NvbnRyb2xQb3B1cEJ1dHRvbk1lbnVIYW5kbGVUYWcpCi0gICAgICAgIG1lbnUgPSBNZW51LmFzX01lbnUobWhhbmRsZSkKLSAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6Ci0gICAgICAgICAgICBpZiB0eXBlKGl0ZW0pID09IHR5cGUoKCkpOgotICAgICAgICAgICAgICAgIGxhYmVsID0gaXRlbVswXQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBsYWJlbCA9IGl0ZW0KLSAgICAgICAgICAgIGlmIGxhYmVsWy0xXSA9PSAnPScgb3IgbGFiZWxbLTFdID09ICc6JzoKLSAgICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsWzotMV0KLSAgICAgICAgICAgIG1lbnUuQXBwZW5kTWVudShsYWJlbCkKKyAgICBtaGFuZGxlID0gY29udHJvbC5HZXRDb250cm9sRGF0YV9IYW5kbGUoQ29udHJvbHMua0NvbnRyb2xNZW51UGFydCwKKyAgICAgICAgICAgIENvbnRyb2xzLmtDb250cm9sUG9wdXBCdXR0b25NZW51SGFuZGxlVGFnKQorICAgIG1lbnUgPSBNZW51LmFzX01lbnUobWhhbmRsZSkKKyAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgaWYgdHlwZShpdGVtKSA9PSB0eXBlKCgpKToKKyAgICAgICAgICAgIGxhYmVsID0gaXRlbVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGFiZWwgPSBpdGVtCisgICAgICAgIGlmIGxhYmVsWy0xXSA9PSAnPScgb3IgbGFiZWxbLTFdID09ICc6JzoKKyAgICAgICAgICAgIGxhYmVsID0gbGFiZWxbOi0xXQorICAgICAgICBtZW51LkFwcGVuZE1lbnUobGFiZWwpCiAjIyAgICAgICAgICBtaGFuZGxlLCBtaWQgPSBtZW51LmdldHBvcHVwaW5mbygpCiAjIyAgICAgICAgICBjb250cm9sLlNldENvbnRyb2xEYXRhX0hhbmRsZShDb250cm9scy5rQ29udHJvbE1lbnVQYXJ0LAogIyMgICAgICAgICAgICAgICAgICBDb250cm9scy5rQ29udHJvbFBvcHVwQnV0dG9uTWVudUhhbmRsZVRhZywgbWhhbmRsZSkKLSAgICAgICAgY29udHJvbC5TZXRDb250cm9sTWluaW11bSgxKQotICAgICAgICBjb250cm9sLlNldENvbnRyb2xNYXhpbXVtKGxlbihpdGVtcykrMSkKKyAgICBjb250cm9sLlNldENvbnRyb2xNaW5pbXVtKDEpCisgICAgY29udHJvbC5TZXRDb250cm9sTWF4aW11bShsZW4oaXRlbXMpKzEpCiAKIGRlZiBfc2VsZWN0b3B0aW9uKGQsIG9wdGlvbmxpc3QsIGlkeCk6CiAgICAgaWYgaWR4IDwgMCBvciBpZHggPj0gbGVuKG9wdGlvbmxpc3QpOgpAQCAtODM2LDQgKzgzNiwzIEBACiAgICAgICAgIHRlc3QoKQogICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgTWVzc2FnZSgiT3BlcmF0aW9uIENhbmNlbGVkLiIpCi0KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9GcmFtZVdvcmsucHkgYi9MaWIvcGxhdC1tYWMvRnJhbWVXb3JrLnB5CmluZGV4IDcyNDI3MDQuLjBhOGMxYjggMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9GcmFtZVdvcmsucHkKKysrIGIvTGliL3BsYXQtbWFjL0ZyYW1lV29yay5weQpAQCAtNjM1LDcgKzYzNSw3IEBACiAgICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnQ6CiAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50Lm1lbnUuRGlzYWJsZU1lbnVJdGVtKHNlbGYuX3BhcmVudF9pdGVtKQogICAgICAgICBpZiBzZWxmLmJhciBhbmQgc2VsZi5iYXIucGFyZW50OgotICAgICAgICAgICAgICAgIHNlbGYuYmFyLnBhcmVudC5uZWVkbWVudWJhcnJlZHJhdyA9IDEKKyAgICAgICAgICAgIHNlbGYuYmFyLnBhcmVudC5uZWVkbWVudWJhcnJlZHJhdyA9IDEKIAogY2xhc3MgUG9wdXBNZW51KE1lbnUpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXIpOgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL01pbmlBRUZyYW1lLnB5IGIvTGliL3BsYXQtbWFjL01pbmlBRUZyYW1lLnB5CmluZGV4IDNjNWVkOWEuLjk4MjQ3Y2IgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9NaW5pQUVGcmFtZS5weQorKysgYi9MaWIvcGxhdC1tYWMvTWluaUFFRnJhbWUucHkKQEAgLTU5LDkgKzU5LDkgQEAKICAgICAgICAgc2VsZi5xdWl0dGluZyA9IDEKIAogICAgIGRlZiBkb29uZWV2ZW50KHNlbGYsIG1hc2sgPSBldmVyeUV2ZW50LCB0aW1lb3V0ID0gNjAqNjApOgotICAgICAgICAgICAgZ290LCBldmVudCA9IEV2dC5XYWl0TmV4dEV2ZW50KG1hc2ssIHRpbWVvdXQpCi0gICAgICAgICAgICBpZiBnb3Q6Ci0gICAgICAgICAgICAgICAgc2VsZi5sb3dsZXZlbGhhbmRsZXIoZXZlbnQpCisgICAgICAgIGdvdCwgZXZlbnQgPSBFdnQuV2FpdE5leHRFdmVudChtYXNrLCB0aW1lb3V0KQorICAgICAgICBpZiBnb3Q6CisgICAgICAgICAgICBzZWxmLmxvd2xldmVsaGFuZGxlcihldmVudCkKIAogICAgIGRlZiBsb3dsZXZlbGhhbmRsZXIoc2VsZiwgZXZlbnQpOgogICAgICAgICB3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzID0gZXZlbnQKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9QaXhNYXBXcmFwcGVyLnB5IGIvTGliL3BsYXQtbWFjL1BpeE1hcFdyYXBwZXIucHkKaW5kZXggYTJkMTNmZS4uN2VkYmFjMiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL1BpeE1hcFdyYXBwZXIucHkKKysrIGIvTGliL3BsYXQtbWFjL1BpeE1hcFdyYXBwZXIucHkKQEAgLTEsNSArMSw1IEBACiAiIiJQaXhNYXBXcmFwcGVyIC0gZGVmaW5lcyB0aGUgUGl4TWFwV3JhcHBlciBjbGFzcywgd2hpY2ggd3JhcHMgYW4gb3BhcXVlCi1RdWlja0RyYXcgUGl4TWFwIGRhdGEgc3RydWN0dXJlIGluIGEgaGFuZHkgUHl0aG9uIGNsYXNzLiAgQWxzbyBwcm92aWRlcyAKK1F1aWNrRHJhdyBQaXhNYXAgZGF0YSBzdHJ1Y3R1cmUgaW4gYSBoYW5keSBQeXRob24gY2xhc3MuICBBbHNvIHByb3ZpZGVzCiBtZXRob2RzIHRvIGNvbnZlcnQgdG8vZnJvbSBwaXhlbCBkYXRhIChmcm9tLCBlLmcuLCB0aGUgaW1nIG1vZHVsZSkgb3IgYQogUHl0aG9uIEltYWdpbmcgTGlicmFyeSBJbWFnZSBvYmplY3QuCiAKQEAgLTc3LDcgKzc3LDcgQEAKICAgICAgICAgICAgIDIsIDUsICAgICAgICAgICAgICAgICAgICMgY21wQ291bnQsIGNtcFNpemUsCiAgICAgICAgICAgICAwLCAwLCAwKSAgICAgICAgICAgICAgICAjIHBsYW5lQnl0ZXMsIHBtVGFibGUsIHBtUmVzZXJ2ZWQKICAgICAgICAgc2VsZi5fX2RpY3RfX1snX3BtJ10gPSBRZC5SYXdCaXRNYXAoc2VsZi5faGVhZGVyKQotICAgIAorCiAgICAgZGVmIF9zdHVmZihzZWxmLCBlbGVtZW50LCBieXRlcyk6CiAgICAgICAgIG9mZnNldCA9IF9wbUVsZW1PZmZzZXRbZWxlbWVudF0KICAgICAgICAgZm10ID0gX3BtRWxlbUZvcm1hdFtlbGVtZW50XQpAQCAtODUsNyArODUsNyBAQAogICAgICAgICAgICAgKyBzdHJ1Y3QucGFjayhmbXQsIGJ5dGVzKSBcCiAgICAgICAgICAgICArIHNlbGYuX2hlYWRlcltvZmZzZXQgKyBzdHJ1Y3QuY2FsY3NpemUoZm10KTpdCiAgICAgICAgIHNlbGYuX19kaWN0X19bJ19wbSddID0gTm9uZQotICAgIAorCiAgICAgZGVmIF91bnN0dWZmKHNlbGYsIGVsZW1lbnQpOgogICAgICAgICBvZmZzZXQgPSBfcG1FbGVtT2Zmc2V0W2VsZW1lbnRdCiAgICAgICAgIGZtdCA9IF9wbUVsZW1Gb3JtYXRbZWxlbWVudF0KQEAgLTExMyw3ICsxMTMsNyBAQAogICAgICAgICAgICAgIyBhbnkgb3RoZXIgcG0gYXR0cmlidXRlIC0tIGp1c3Qgc3R1ZmYKICAgICAgICAgICAgIHNlbGYuX3N0dWZmKGF0dHIsIHZhbCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuX19kaWN0X19bYXR0cl0gPSB2YWwgICAKKyAgICAgICAgICAgIHNlbGYuX19kaWN0X19bYXR0cl0gPSB2YWwKIAogICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICAgaWYgYXR0ciA9PSAncm93Qnl0ZXMnOgpAQCAtMTMzLDkgKzEzMyw5IEBACiAgICAgICAgICAgICAjIGFueSBvdGhlciBwbSBhdHRyaWJ1dGUgLS0ganVzdCB1bnN0dWZmCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdW5zdHVmZihhdHRyKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X19bYXR0cl0gIAorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X19bYXR0cl0KIAotICAgICAgICAKKwogICAgIGRlZiBQaXhNYXAoc2VsZik6CiAgICAgICAgICJSZXR1cm4gYSBRdWlja0RyYXcgUGl4TWFwIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBkYXRhLiIKICAgICAgICAgaWYgbm90IHNlbGYuX19kaWN0X19bJ19wbSddOgpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgICAgIHJldHVybiBzZWxmLl9fZGljdF9fWydfcG0nXQogCiAgICAgZGVmIGJsaXQoc2VsZiwgeDE9MCx5MT0wLHgyPU5vbmUseTI9Tm9uZSwgcG9ydD1Ob25lKToKLSAgICAgICAgIiIiRHJhdyB0aGlzIHBpeG1hcCBpbnRvIHRoZSBnaXZlbiAoZGVmYXVsdCBjdXJyZW50KSBncmFmcG9ydC4iIiIgCisgICAgICAgICIiIkRyYXcgdGhpcyBwaXhtYXAgaW50byB0aGUgZ2l2ZW4gKGRlZmF1bHQgY3VycmVudCkgZ3JhZnBvcnQuIiIiCiAgICAgICAgIHNyYyA9IHNlbGYuYm91bmRzCiAgICAgICAgIGRlc3QgPSBbeDEseTEseDIseTJdCiAgICAgICAgIGlmIHgyID09IE5vbmU6CkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAgICAgaWYgbm90IHBvcnQ6IHBvcnQgPSBRZC5HZXRQb3J0KCkKICAgICAgICAgUWQuQ29weUJpdHMoc2VsZi5QaXhNYXAoKSwgcG9ydC5HZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMoKSwgc3JjLCB0dXBsZShkZXN0KSwKICAgICAgICAgICAgICAgICBRdWlja0RyYXcuc3JjQ29weSwgTm9uZSkKLSAgICAKKwogICAgIGRlZiBmcm9tc3RyaW5nKHNlbGYscyx3aWR0aCxoZWlnaHQsZm9ybWF0PWltZ2Zvcm1hdC5tYWNyZ2IpOgogICAgICAgICAiIiJTdHVmZiB0aGlzIHBpeG1hcCB3aXRoIHJhdyBwaXhlbCBkYXRhIGZyb20gYSBzdHJpbmcuCiAgICAgICAgIFN1cHBseSB3aWR0aCwgaGVpZ2h0LCBhbmQgb25lIG9mIHRoZSBpbWdmb3JtYXQgc3BlY2lmaWVycy4iIiIKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgICAgICAiIiJJbml0aWFsaXplIHRoaXMgUGl4TWFwIGZyb20gYSBQSUwgSW1hZ2Ugb2JqZWN0LiIiIgogICAgICAgICAjIFdlIG5lZWQgZGF0YSBpbiBBUkdCIGZvcm1hdDsgUElMIGNhbid0IGN1cnJlbnRseSBkbyB0aGF0LAogICAgICAgICAjIGJ1dCBpdCBjYW4gZG8gUkdCQSwgd2hpY2ggd2UgY2FuIHVzZSBieSBpbnNlcnRpbmcgb25lIG51bGwKLSAgICAgICAgIyB1cCBmcm9udHBtID0gCisgICAgICAgICMgdXAgZnJvbnRwbSA9CiAgICAgICAgIGlmIGltLm1vZGUgIT0gJ1JHQkEnOiBpbSA9IGltLmNvbnZlcnQoJ1JHQkEnKQogICAgICAgICBkYXRhID0gY2hyKDApICsgaW0udG9zdHJpbmcoKQogICAgICAgICBzZWxmLmZyb21zdHJpbmcoZGF0YSwgaW0uc2l6ZVswXSwgaW0uc2l6ZVsxXSkKQEAgLTIxMiw0ICsyMTIsMyBAQAogICAgIHBtLmZyb21JbWFnZSggSW1hZ2Uub3BlbihwYXRoKSApCiAgICAgcG0uYmxpdCgyMCwyMCkKICAgICByZXR1cm4gcG0KLQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2FlcGFjay5weSBiL0xpYi9wbGF0LW1hYy9hZXBhY2sucHkKaW5kZXggMjJkZmQyMS4uNTI5YTBhNCAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2FlcGFjay5weQorKysgYi9MaWIvcGxhdC1tYWMvYWVwYWNrLnB5CkBAIC03NCwxNiArNzQsMTYgQEAKIAogZGVmIHBhY2soeCwgZm9yY2V0eXBlID0gTm9uZSk6CiAgICAgIiIiUGFjayBhIHB5dGhvbiBvYmplY3QgaW50byBhbiBBRSBkZXNjcmlwdG9yIiIiCi0gICAgCisKICAgICBpZiBmb3JjZXR5cGU6CiAgICAgICAgIGlmIHR5cGUoeCkgaXMgU3RyaW5nVHlwZToKICAgICAgICAgICAgIHJldHVybiBBRS5BRUNyZWF0ZURlc2MoZm9yY2V0eXBlLCB4KQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHBhY2soeCkuQUVDb2VyY2VEZXNjKGZvcmNldHlwZSkKLSAgICAgICAgICAgIAorCiAgICAgaWYgeCA9PSBOb25lOgogICAgICAgICByZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdudWxsJywgJycpCi0gICAgICAgIAorCiAgICAgaWYgaXNpbnN0YW5jZSh4LCBBRURlc2NUeXBlKToKICAgICAgICAgcmV0dXJuIHgKICAgICBpZiBpc2luc3RhbmNlKHgsIEZTU1R5cGUpOgpAQCAtMTI4LDExICsxMjgsMTEgQEAKIGRlZiB1bnBhY2soZGVzYywgZm9ybW9kdWxlbmFtZT0iIik6CiAgICAgIiIiVW5wYWNrIGFuIEFFIGRlc2NyaXB0b3IgdG8gYSBweXRob24gb2JqZWN0IiIiCiAgICAgdCA9IGRlc2MudHlwZQotICAgIAorCiAgICAgaWYgdW5wYWNrZXJfY29lcmNpb25zLmhhc19rZXkodCk6CiAgICAgICAgIGRlc2MgPSBkZXNjLkFFQ29lcmNlRGVzYyh1bnBhY2tlcl9jb2VyY2lvbnNbdF0pCiAgICAgICAgIHQgPSBkZXNjLnR5cGUgIyBUaGlzIGlzIGEgZ3Vlc3MgYnkgSmFjay4uLi4KLSAgICAKKwogICAgIGlmIHQgPT0gdHlwZUFFTGlzdDoKICAgICAgICAgbCA9IFtdCiAgICAgICAgIGZvciBpIGluIHJhbmdlKGRlc2MuQUVDb3VudEl0ZW1zKCkpOgpAQCAtMjQ4LDcgKzI0OCw3IEBACiAgICAgICAgIHJlY29yZCA9IGRlc2MuQUVDb2VyY2VEZXNjKCdyZWNvJykKICAgICAgICAgcmV0dXJuIG1rbG9naWNhbCh1bnBhY2socmVjb3JkLCBmb3Jtb2R1bGVuYW1lKSkKICAgICByZXR1cm4gbWt1bmtub3duKGRlc2MudHlwZSwgZGVzYy5kYXRhKQotICAgIAorCiBkZWYgY29lcmNlKGRhdGEsIGVnZGF0YSk6CiAgICAgIiIiQ29lcmNlIGEgcHl0aG9uIG9iamVjdCB0byBhbm90aGVyIHR5cGUgdXNpbmcgdGhlIEFFIGNvZXJjZXJzIiIiCiAgICAgcGRhdGEgPSBwYWNrKGRhdGEpCkBAIC0zMTEsMTAgKzMxMSwxMCBAQAogCiBkZWYgbWtzdHlsZWR0ZXh0KGRpY3QpOgogICAgIHJldHVybiBhZXR5cGVzLlN0eWxlZFRleHQoZGljdFsna3N0eSddLCBkaWN0WydrdHh0J10pCi0gICAgCisKIGRlZiBta2FldGV4dChkaWN0KToKICAgICByZXR1cm4gYWV0eXBlcy5BRVRleHQoZGljdFtrZXlBRVNjcmlwdFRhZ10sIGRpY3Rba2V5QUVTdHlsZXNdLCBkaWN0W2tleUFFVGV4dF0pCi0gICAgCisKIGRlZiBta2luc2VydGlvbmxvYyhkaWN0KToKICAgICByZXR1cm4gYWV0eXBlcy5JbnNlcnRpb25Mb2MoZGljdFtrZXlBRU9iamVjdF0sIGRpY3Rba2V5QUVQb3NpdGlvbl0pCiAKQEAgLTM1NSw3ICszNTUsNyBAQAogICAgICAgICBhc3NlcnQgaXNzdWJjbGFzcyhjbGFzc3R5cGUsIE9iamVjdFNwZWNpZmllcikKICAgICAgICAgbmV3b2JqLl9fY2xhc3NfXyA9IGNsYXNzdHlwZQogICAgIHJldHVybiBuZXdvYmoKLSAgICAKKwogZGVmIG1rdHlwZSh0eXBlY29kZSwgbW9kdWxlbmFtZT1Ob25lKToKICAgICBpZiBtb2R1bGVuYW1lOgogICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKG1vZHVsZW5hbWUpCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvYWV0b29scy5weSBiL0xpYi9wbGF0LW1hYy9hZXRvb2xzLnB5CmluZGV4IDM0N2I1MjMuLjc5ZjM5NzggMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9hZXRvb2xzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9hZXRvb2xzLnB5CkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICAgICAgICAgIGFyZ3VtZW50c1trZXlkaWN0W2tdXSA9IHYKICAgICAgICAgZWxpZiBrICE9ICctLS0tJyBhbmQgayBub3QgaW4gb2s6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdVbmtub3duIGtleXdvcmQgYXJndW1lbnQ6ICVzJyVrCi0gICAgICAgICAgICAKKwogZGVmIGVudW1zdWJzdChhcmd1bWVudHMsIGtleSwgZWRpY3QpOgogICAgICIiIlN1YnN0aXR1dGUgYSBzaW5nbGUgZW51bSBrZXl3b3JkIGFyZ3VtZW50LCBpZiBpdCBvY2N1cnMiIiIKICAgICBpZiBub3QgYXJndW1lbnRzLmhhc19rZXkoa2V5KSBvciBlZGljdCBpcyBOb25lOgpAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgICAgIGFyZ3VtZW50c1trZXldID0gRW51bShlZGljdFt2XSkKICAgICBlbGlmIG5vdCB2IGluIG9rOgogICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdVbmtub3duIGVudW1lcmF0b3I6ICVzJyV2Ci0gICAgICAgIAorCiBkZWYgZGVjb2RlZXJyb3IoYXJndW1lbnRzKToKICAgICAiIiJDcmVhdGUgdGhlICdiZXN0JyBhcmd1bWVudCBmb3IgYSByYWlzZSBNYWNPUy5FcnJvciIiIgogICAgIGVycm4gPSBhcmd1bWVudHNbJ2Vycm4nXQpAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgICAgIGVycl9hMyA9IGFyZ3VtZW50c1snZXJvYiddCiAgICAgZWxzZToKICAgICAgICAgZXJyX2EzID0gTm9uZQotICAgIAorCiAgICAgcmV0dXJuIChlcnJfYTEsIGVycl9hMiwgZXJyX2EzKQogCiBjbGFzcyBUYWxrVG86CkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICBfbW9kdWxlTmFtZSA9IE5vbmUgICMgQ2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcwogICAgIF9lbGVtZGljdCA9IHt9ICAgICAgIyBDYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzCiAgICAgX3Byb3BkaWN0ID0ge30gICAgICAjIENhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMKLSAgICAKKwogICAgIF9fZXZlbnRsb29wX2luaXRpYWxpemVkID0gMAogICAgIGRlZiBfX2Vuc3VyZV9XTUF2YWlsYWJsZShrbGFzcyk6CiAgICAgICAgIGlmIGtsYXNzLl9fZXZlbnRsb29wX2luaXRpYWxpemVkOiByZXR1cm4gMQpAQCAtMTU2LDEwICsxNTYsMTAgQEAKICAgICAgICAgRXZ0LldhaXROZXh0RXZlbnQoMCwwKQogICAgICAgICByZXR1cm4gMQogICAgIF9fZW5zdXJlX1dNQXZhaWxhYmxlID0gY2xhc3NtZXRob2QoX19lbnN1cmVfV01BdmFpbGFibGUpCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2lnbmF0dXJlPU5vbmUsIHN0YXJ0PTAsIHRpbWVvdXQ9MCk6CiAgICAgICAgICIiIkNyZWF0ZSBhIGNvbW11bmljYXRpb24gY2hhbm5lbCB3aXRoIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbi4KLSAgICAgICAgCisKICAgICAgICAgQWRkcmVzc2luZyB0aGUgYXBwbGljYXRpb24gaXMgZG9uZSBieSBzcGVjaWZ5aW5nIGVpdGhlciBhCiAgICAgICAgIDQtYnl0ZSBzaWduYXR1cmUsIGFuIEFFRGVzYyBvciBhbiBvYmplY3QgdGhhdCB3aWxsIF9fYWVwYWNrX18KICAgICAgICAgdG8gYW4gQUVEZXNjLgpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICAgICAgICBzZWxmLnNlbmRfdGltZW91dCA9IEFwcGxlRXZlbnRzLmtBRURlZmF1bHRUaW1lb3V0CiAgICAgICAgIGlmIHN0YXJ0OgogICAgICAgICAgICAgc2VsZi5fc3RhcnQoKQotICAgICAgICAKKwogICAgIGRlZiBfc3RhcnQoc2VsZik6CiAgICAgICAgICIiIlN0YXJ0IHRoZSBhcHBsaWNhdGlvbiwgaWYgaXQgaXMgbm90IHJ1bm5pbmcgeWV0IiIiCiAgICAgICAgIHRyeToKQEAgLTE5OSwxOSArMTk5LDE5IEBACiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCi0gICAgICAgICAgICAKKwogICAgIGRlZiBzdGFydChzZWxmKToKICAgICAgICAgIiIiRGVwcmVjYXRlZCwgdXNlZCBfc3RhcnQoKSIiIgogICAgICAgICBzZWxmLl9zdGFydCgpCi0gICAgICAgICAgICAKKwogICAgIGRlZiBuZXdldmVudChzZWxmLCBjb2RlLCBzdWJjb2RlLCBwYXJhbWV0ZXJzID0ge30sIGF0dHJpYnV0ZXMgPSB7fSk6CiAgICAgICAgICIiIkNyZWF0ZSBhIGNvbXBsZXRlIHN0cnVjdHVyZSBmb3IgYW4gYXBwbGUgZXZlbnQiIiIKLSAgICAgICAgCisKICAgICAgICAgZXZlbnQgPSBBRS5BRUNyZWF0ZUFwcGxlRXZlbnQoY29kZSwgc3ViY29kZSwgc2VsZi50YXJnZXQsCiAgICAgICAgICAgICAgICAgICBBcHBsZUV2ZW50cy5rQXV0b0dlbmVyYXRlUmV0dXJuSUQsIEFwcGxlRXZlbnRzLmtBbnlUcmFuc2FjdGlvbklEKQogICAgICAgICBwYWNrZXZlbnQoZXZlbnQsIHBhcmFtZXRlcnMsIGF0dHJpYnV0ZXMpCiAgICAgICAgIHJldHVybiBldmVudAotICAgIAorCiAgICAgZGVmIHNlbmRldmVudChzZWxmLCBldmVudCk6CiAgICAgICAgICIiIlNlbmQgYSBwcmUtY3JlYXRlZCBhcHBsZWV2ZW50LCBhd2FpdCB0aGUgcmVwbHkgYW5kIHVucGFjayBpdCIiIgogICAgICAgICBpZiBub3Qgc2VsZi5fX2Vuc3VyZV9XTUF2YWlsYWJsZSgpOgpAQCAtMjIwLDExICsyMjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfdGltZW91dCkKICAgICAgICAgcGFyYW1ldGVycywgYXR0cmlidXRlcyA9IHVucGFja2V2ZW50KHJlcGx5LCBzZWxmLl9tb2R1bGVOYW1lKQogICAgICAgICByZXR1cm4gcmVwbHksIHBhcmFtZXRlcnMsIGF0dHJpYnV0ZXMKLSAgICAgICAgCisKICAgICBkZWYgc2VuZChzZWxmLCBjb2RlLCBzdWJjb2RlLCBwYXJhbWV0ZXJzID0ge30sIGF0dHJpYnV0ZXMgPSB7fSk6CiAgICAgICAgICIiIlNlbmQgYW4gYXBwbGVldmVudCBnaXZlbiBjb2RlL3N1YmNvZGUvcGFycy9hdHRycyBhbmQgdW5wYWNrIHRoZSByZXBseSIiIgogICAgICAgICByZXR1cm4gc2VsZi5zZW5kZXZlbnQoc2VsZi5uZXdldmVudChjb2RlLCBzdWJjb2RlLCBwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzKSkKLSAgICAKKwogICAgICMKICAgICAjIFRoZSBmb2xsb3dpbmcgZXZlbnRzIGFyZSBzb21laG93ICJzdGFuZGFyZCIgYW5kIGRvbid0IHNlZW0gdG8gYXBwZWFyIGluIGFueQogICAgICMgc3VpdGUuLi4KQEAgLTI1Niw5ICsyNTYsOSBAQAogICAgICAgICAgICAgaWYgYXM6CiAgICAgICAgICAgICAgICAgaXRlbS5fX2NsYXNzX18gPSBhcwogICAgICAgICAgICAgcmV0dXJuIGl0ZW0KLSAgICAKKwogICAgIGdldCA9IF9nZXQKLSAgICAgICAgICAgIAorCiAgICAgX2FyZ21hcF9zZXQgPSB7CiAgICAgICAgICd0bycgOiAnZGF0YScsCiAgICAgfQpAQCAtMjgzLDEyICsyODMsMTIgQEAKICAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAogICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKICAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KLSAgICAgICAgICAgIAorCiAgICAgc2V0ID0gX3NldAogCiAgICAgIyBNYWdpYyBnbHVlIHRvIGFsbG93IHN1aXRlLWdlbmVyYXRlZCBjbGFzc2VzIHRvIGZ1bmN0aW9uIHNvbWV3aGF0CiAgICAgIyBsaWtlIHRoZSAiYXBwbGljYXRpb24iIGNsYXNzIGluIE9TQS4KLSAgICAKKwogICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICAgaWYgc2VsZi5fZWxlbWRpY3QuaGFzX2tleShuYW1lKToKICAgICAgICAgICAgIGNscyA9IHNlbGYuX2VsZW1kaWN0W25hbWVdCkBAIC0yOTcsNyArMjk3LDcgQEAKICAgICAgICAgICAgIGNscyA9IHNlbGYuX3Byb3BkaWN0W25hbWVdCiAgICAgICAgICAgICByZXR1cm4gY2xzKCkKICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKLSAgICAgICAgCisKICMgVGlueSBGaW5kZXIgY2xhc3MsIGZvciBsb2NhbCB1c2Ugb25seQogCiBjbGFzcyBfbWluaUZpbmRlcihUYWxrVG8pOgpAQCAtMzIxLDcgKzMyMSw3IEBACiAgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgogICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogI3Bhc3MKLSAgICAKKwogX2ZpbmRlciA9IF9taW5pRmluZGVyKCdNQUNTJykKIAogZGVmIF9sYXVuY2goYXBwZmlsZSk6CkBAIC0zMzIsMTIgKzMzMiwxMiBAQAogY2xhc3MgX2FwcGxpY2F0aW9uX2ZpbGUoQ29tcG9uZW50SXRlbSk6CiAgICAgIiIiYXBwbGljYXRpb24gZmlsZSAtIEFuIGFwcGxpY2F0aW9uJ3MgZmlsZSBvbiBkaXNrIiIiCiAgICAgd2FudCA9ICdhcHBmJwotICAgIAorCiBfYXBwbGljYXRpb25fZmlsZS5fcHJvcGRpY3QgPSB7CiB9CiBfYXBwbGljYXRpb25fZmlsZS5fZWxlbWRpY3QgPSB7CiB9Ci0gICAgCisKICMgVGVzdCBwcm9ncmFtCiAjIFhYWFggU2hvdWxkIHRlc3QgbW9yZSwgcmVhbGx5Li4uCiAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9hZXR5cGVzLnB5IGIvTGliL3BsYXQtbWFjL2FldHlwZXMucHkKaW5kZXggYjkzODZmMy4uYzYwYjM5YyAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2FldHlwZXMucHkKKysrIGIvTGliL3BsYXQtbWFjL2FldHlwZXMucHkKQEAgLTEyLDcgKzEyLDcgQEAKIGRlZiBwYWNrKCphcmdzLCAqKmt3YXJncyk6CiAgICAgZnJvbSBhZXBhY2sgaW1wb3J0IHBhY2sKICAgICByZXR1cm4gcGFjayggKmFyZ3MsICoqa3dhcmdzKQotICAgIAorCiBkZWYgbmljZShzKToKICAgICAiIiInbmljZScgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IiIiCiAgICAgaWYgdHlwZShzKSBpcyBTdHJpbmdUeXBlOiByZXR1cm4gcmVwcihzKQpAQCAtMjAsMjkgKzIwLDI5IEBACiAKIGNsYXNzIFVua25vd246CiAgICAgIiIiQW4gdW5pbnRlcnByZXRlZCBBRSBvYmplY3QiIiIKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlLCBkYXRhKToKICAgICAgICAgc2VsZi50eXBlID0gdHlwZQogICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCi0gICAgCisKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiVW5rbm93biglciwgJXIpIiAlIChzZWxmLnR5cGUsIHNlbGYuZGF0YSkKLSAgICAKKwogICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgogICAgICAgICByZXR1cm4gcGFjayhzZWxmLmRhdGEsIHNlbGYudHlwZSkKIAogY2xhc3MgRW51bToKICAgICAiIiJBbiBBRSBlbnVtZXJhdGlvbiB2YWx1ZSIiIgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudW0pOgogICAgICAgICBzZWxmLmVudW0gPSAiJS00LjRzIiAlIHN0cihlbnVtKQotICAgIAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIkVudW0oJXIpIiAlIChzZWxmLmVudW0sKQotICAgIAorCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIHJldHVybiBzdHJpbmcuc3RyaXAoc2VsZi5lbnVtKQotICAgIAorCiAgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CiAgICAgICAgIHJldHVybiBwYWNrKHNlbGYuZW51bSwgdHlwZUVudW1lcmF0aW9uKQogCkBAIC01OCwzNiArNTgsMzYgQEAKICAgICBkZWYgX19pbml0X18oc2VsZiwgb2YsIHBvcyk6CiAgICAgICAgIHNlbGYub2YgPSBvZgogICAgICAgICBzZWxmLnBvcyA9IHBvcwotICAgIAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIkluc2VydGlvbkxvYyglciwgJXIpIiAlIChzZWxmLm9mLCBzZWxmLnBvcykKLSAgICAgICAgCisKICAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKICAgICAgICAgcmVjID0geydrb2JqJzogc2VsZi5vZiwgJ2twb3MnOiBzZWxmLnBvc30KICAgICAgICAgcmV0dXJuIHBhY2socmVjLCBmb3JjZXR5cGU9J2luc2wnKQotICAgICAgICAKKwogIyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGRzcDoKIGRlZiBiZWdpbm5pbmcob2YpOgogICAgIHJldHVybiBJbnNlcnRpb25Mb2Mob2YsIEVudW0oJ2JnbmcnKSkKLSAgICAKKwogZGVmIGVuZChvZik6CiAgICAgcmV0dXJuIEluc2VydGlvbkxvYyhvZiwgRW51bSgnZW5kICcpKQogCiBjbGFzcyBCb29sZWFuOgogICAgICIiIkFuIEFFIGJvb2xlYW4gdmFsdWUiIiIKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBib29sKToKICAgICAgICAgc2VsZi5ib29sID0gKG5vdCBub3QgYm9vbCkKLSAgICAKKwogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICJCb29sZWFuKCVyKSIgJSAoc2VsZi5ib29sLCkKLSAgICAKKwogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmJvb2w6CiAgICAgICAgICAgICByZXR1cm4gIlRydWUiCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gIkZhbHNlIgotICAgIAorCiAgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CiAgICAgICAgIHJldHVybiBwYWNrKHN0cnVjdC5wYWNrKCdiJywgc2VsZi5ib29sKSwgJ2Jvb2wnKQogCkBAIC0xMDAsMTYgKzEwMCwxNiBAQAogCiBjbGFzcyBUeXBlOgogICAgICIiIkFuIEFFIDQtY2hhciB0eXBlbmFtZSBvYmplY3QiIiIKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlKToKICAgICAgICAgc2VsZi50eXBlID0gIiUtNC40cyIgJSBzdHIodHlwZSkKLSAgICAKKwogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICJUeXBlKCVyKSIgJSAoc2VsZi50eXBlLCkKLSAgICAKKwogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gc3RyaW5nLnN0cmlwKHNlbGYudHlwZSkKLSAgICAKKwogICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgogICAgICAgICByZXR1cm4gcGFjayhzZWxmLnR5cGUsIHR5cGVUeXBlKQogCkBAIC0xMjMsMTYgKzEyMywxNiBAQAogCiBjbGFzcyBLZXl3b3JkOgogICAgICIiIkFuIEFFIDQtY2hhciBrZXl3b3JkIG9iamVjdCIiIgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleXdvcmQpOgogICAgICAgICBzZWxmLmtleXdvcmQgPSAiJS00LjRzIiAlIHN0cihrZXl3b3JkKQotICAgIAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIktleXdvcmQoJXIpIiAlIGBzZWxmLmtleXdvcmRgCi0gICAgCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIHN0cmluZy5zdHJpcChzZWxmLmtleXdvcmQpCi0gICAgCisKICAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIHBhY2soc2VsZi5rZXl3b3JkLCB0eXBlS2V5d29yZCkKIApAQCAtMTQxLDE3ICsxNDEsMTcgQEAKIAogY2xhc3MgUmFuZ2U6CiAgICAgIiIiQW4gQUUgcmFuZ2Ugb2JqZWN0IiIiCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIHN0b3ApOgogICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKICAgICAgICAgc2VsZi5zdG9wID0gc3RvcAotICAgIAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIlJhbmdlKCVyLCAlcikiICUgKHNlbGYuc3RhcnQsIHNlbGYuc3RvcCkKLSAgICAKKwogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIiVzIHRocnUgJXMiICUgKG5pY2Uoc2VsZi5zdGFydCksIG5pY2Uoc2VsZi5zdG9wKSkKLSAgICAKKwogICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgogICAgICAgICByZXR1cm4gcGFjayh7J3N0YXInOiBzZWxmLnN0YXJ0LCAnc3RvcCc6IHNlbGYuc3RvcH0sICdyYW5nJykKIApAQCAtMTYwLDE4ICsxNjAsMTggQEAKIAogY2xhc3MgQ29tcGFyaXNvbjoKICAgICAiIiJBbiBBRSBDb21wYXJpc29uIiIiCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgb2JqMSwgcmVsbywgb2JqMik6CiAgICAgICAgIHNlbGYub2JqMSA9IG9iajEKICAgICAgICAgc2VsZi5yZWxvID0gIiUtNC40cyIgJSBzdHIocmVsbykKICAgICAgICAgc2VsZi5vYmoyID0gb2JqMgotICAgIAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIkNvbXBhcmlzb24oJXIsICVyLCAlcikiICUgKHNlbGYub2JqMSwgc2VsZi5yZWxvLCBzZWxmLm9iajIpCi0gICAgCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICIlcyAlcyAlcyIgJSAobmljZShzZWxmLm9iajEpLCBzdHJpbmcuc3RyaXAoc2VsZi5yZWxvKSwgbmljZShzZWxmLm9iajIpKQotICAgIAorCiAgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CiAgICAgICAgIHJldHVybiBwYWNrKHsnb2JqMSc6IHNlbGYub2JqMSwKICAgICAgICAgICAgICAgICAgJ3JlbG8nOiBta2VudW0oc2VsZi5yZWxvKSwKQEAgLTE4MCw0OCArMTgwLDQ4IEBACiAKIGRlZiBJc0NvbXBhcmlzb24oeCk6CiAgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgQ29tcGFyaXNvbikKLSAgICAKKwogY2xhc3MgTkNvbXBhcmlzb24oQ29tcGFyaXNvbik6CiAgICAgIyBUaGUgY2xhc3MgYXR0cmlidXRlICdyZWxvJyBtdXN0IGJlIHNldCBpbiBhIHN1YmNsYXNzCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgb2JqMSwgb2JqMik6CiAgICAgICAgIENvbXBhcmlzb24uX19pbml0X18ob2JqMSwgc2VsZi5yZWxvLCBvYmoyKQogCiBjbGFzcyBPcmRpbmFsOgogICAgICIiIkFuIEFFIE9yZGluYWwiIiIKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhYnNvKToKICMgICAgICAgc2VsZi5vYmoxID0gb2JqMQogICAgICAgICBzZWxmLmFic28gPSAiJS00LjRzIiAlIHN0cihhYnNvKQotICAgIAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIk9yZGluYWwoJXIpIiAlIChzZWxmLmFic28sKQotICAgIAorCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiJXMiICUgKHN0cmluZy5zdHJpcChzZWxmLmFic28pKQotICAgIAorCiAgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CiAgICAgICAgIHJldHVybiBwYWNrKHNlbGYuYWJzbywgJ2Fic28nKQogCiBkZWYgSXNPcmRpbmFsKHgpOgogICAgIHJldHVybiBpc2luc3RhbmNlKHgsIE9yZGluYWwpCi0gICAgCisKIGNsYXNzIE5PcmRpbmFsKE9yZGluYWwpOgogICAgICMgVGhlIGNsYXNzIGF0dHJpYnV0ZSAnYWJzbycgbXVzdCBiZSBzZXQgaW4gYSBzdWJjbGFzcwotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICBPcmRpbmFsLl9faW5pdF9fKHNlbGYsIHNlbGYuYWJzbykKIAogY2xhc3MgTG9naWNhbDoKICAgICAiIiJBbiBBRSBsb2dpY2FsIGV4cHJlc3Npb24gb2JqZWN0IiIiCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nYywgdGVybSk6CiAgICAgICAgIHNlbGYubG9nYyA9ICIlLTQuNHMiICUgc3RyKGxvZ2MpCiAgICAgICAgIHNlbGYudGVybSA9IHRlcm0KLSAgICAKKwogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICJMb2dpY2FsKCVyLCAlcikiICUgKHNlbGYubG9nYywgc2VsZi50ZXJtKQotICAgIAorCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIGlmIHR5cGUoc2VsZi50ZXJtKSA9PSBMaXN0VHlwZSBhbmQgbGVuKHNlbGYudGVybSkgPT0gMjoKICAgICAgICAgICAgIHJldHVybiAiJXMgJXMgJXMiICUgKG5pY2Uoc2VsZi50ZXJtWzBdKSwKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZShzZWxmLnRlcm1bMV0pKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuICIlcyglcykiICUgKHN0cmluZy5zdHJpcChzZWxmLmxvZ2MpLCBuaWNlKHNlbGYudGVybSkpCi0gICAgCisKICAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIHBhY2soeydsb2djJzogbWtlbnVtKHNlbGYubG9nYyksICd0ZXJtJzogc2VsZi50ZXJtfSwgJ2xvZ2knKQogCkBAIC0yMzgsMTcgKzIzOCwxNyBAQAogCiBjbGFzcyBTdHlsZWRUZXh0OgogICAgICIiIkFuIEFFIG9iamVjdCByZXNwcmVzZW50aW5nIHRleHQgaW4gYSBjZXJ0YWluIHN0eWxlIiIiCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgc3R5bGUsIHRleHQpOgogICAgICAgICBzZWxmLnN0eWxlID0gc3R5bGUKICAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAotICAgIAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIlN0eWxlZFRleHQoJXIsICVyKSIgJSAoc2VsZi5zdHlsZSwgc2VsZi50ZXh0KQotICAgIAorCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLnRleHQKLSAgICAKKwogICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgogICAgICAgICByZXR1cm4gcGFjayh7J2tzdHknOiBzZWxmLnN0eWxlLCAna3R4dCc6IHNlbGYudGV4dH0sICdTVFhUJykKIApAQCAtMjU3LDE4ICsyNTcsMTggQEAKIAogY2xhc3MgQUVUZXh0OgogICAgICIiIkFuIEFFIHRleHQgb2JqZWN0IHdpdGggc3R5bGUsIHNjcmlwdCBhbmQgbGFuZ3VhZ2Ugc3BlY2lmaWVkIiIiCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2NyaXB0LCBzdHlsZSwgdGV4dCk6CiAgICAgICAgIHNlbGYuc2NyaXB0ID0gc2NyaXB0CiAgICAgICAgIHNlbGYuc3R5bGUgPSBzdHlsZQogICAgICAgICBzZWxmLnRleHQgPSB0ZXh0Ci0gICAgCisKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiQUVUZXh0KCVyLCAlciwgJXIpIiAlIChzZWxmLnNjcmlwdCwgc2VsZi5zdHlsZSwgc2VsZi50ZXh0KQotICAgIAorCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLnRleHQKLSAgICAKKwogICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgogICAgICAgICByZXR1cm4gcGFjayh7a2V5QUVTY3JpcHRUYWc6IHNlbGYuc2NyaXB0LCBrZXlBRVN0eWxlczogc2VsZi5zdHlsZSwKICAgICAgICAgICAgICAgICAga2V5QUVUZXh0OiBzZWxmLnRleHR9LCB0eXBlQUVUZXh0KQpAQCAtMjc4LDE4ICsyNzgsMTggQEAKIAogY2xhc3MgSW50bFRleHQ6CiAgICAgIiIiQSB0ZXh0IG9iamVjdCB3aXRoIHNjcmlwdCBhbmQgbGFuZ3VhZ2Ugc3BlY2lmaWVkIiIiCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2NyaXB0LCBsYW5ndWFnZSwgdGV4dCk6CiAgICAgICAgIHNlbGYuc2NyaXB0ID0gc2NyaXB0CiAgICAgICAgIHNlbGYubGFuZ3VhZ2UgPSBsYW5ndWFnZQogICAgICAgICBzZWxmLnRleHQgPSB0ZXh0Ci0gICAgCisKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiSW50bFRleHQoJXIsICVyLCAlcikiICUgKHNlbGYuc2NyaXB0LCBzZWxmLmxhbmd1YWdlLCBzZWxmLnRleHQpCi0gICAgCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYudGV4dAotICAgIAorCiAgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CiAgICAgICAgIHJldHVybiBwYWNrKHN0cnVjdC5wYWNrKCdoaCcsIHNlbGYuc2NyaXB0LCBzZWxmLmxhbmd1YWdlKStzZWxmLnRleHQsCiAgICAgICAgICAgICB0eXBlSW50bFRleHQpCkBAIC0yOTksMTcgKzI5OSwxNyBAQAogCiBjbGFzcyBJbnRsV3JpdGluZ0NvZGU6CiAgICAgIiIiQW4gb2JqZWN0IHJlcHJlc2VudGluZyBzY3JpcHQgYW5kIGxhbmd1YWdlIiIiCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2NyaXB0LCBsYW5ndWFnZSk6CiAgICAgICAgIHNlbGYuc2NyaXB0ID0gc2NyaXB0CiAgICAgICAgIHNlbGYubGFuZ3VhZ2UgPSBsYW5ndWFnZQotICAgIAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIkludGxXcml0aW5nQ29kZSglciwgJXIpIiAlIChzZWxmLnNjcmlwdCwgc2VsZi5sYW5ndWFnZSkKLSAgICAKKwogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gInNjcmlwdCBzeXN0ZW0gJWQsIGxhbmd1YWdlICVkIiUoc2VsZi5zY3JpcHQsIHNlbGYubGFuZ3VhZ2UpCi0gICAgCisKICAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2hoJywgc2VsZi5zY3JpcHQsIHNlbGYubGFuZ3VhZ2UpLAogICAgICAgICAgICAgdHlwZUludGxXcml0aW5nQ29kZSkKQEAgLTMxOSwxNyArMzE5LDE3IEBACiAKIGNsYXNzIFFEUG9pbnQ6CiAgICAgIiIiQSBwb2ludCIiIgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHYsIGgpOgogICAgICAgICBzZWxmLnYgPSB2CiAgICAgICAgIHNlbGYuaCA9IGgKLSAgICAKKwogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICJRRFBvaW50KCVyLCAlcikiICUgKHNlbGYudiwgc2VsZi5oKQotICAgIAorCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiKCVkLCAlZCkiJShzZWxmLnYsIHNlbGYuaCkKLSAgICAKKwogICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgogICAgICAgICByZXR1cm4gcGFjayhzdHJ1Y3QucGFjaygnaGgnLCBzZWxmLnYsIHNlbGYuaCksCiAgICAgICAgICAgICB0eXBlUURQb2ludCkKQEAgLTMzOSwxOSArMzM5LDE5IEBACiAKIGNsYXNzIFFEUmVjdGFuZ2xlOgogICAgICIiIkEgcmVjdGFuZ2xlIiIiCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgdjAsIGgwLCB2MSwgaDEpOgogICAgICAgICBzZWxmLnYwID0gdjAKICAgICAgICAgc2VsZi5oMCA9IGgwCiAgICAgICAgIHNlbGYudjEgPSB2MQogICAgICAgICBzZWxmLmgxID0gaDEKLSAgICAKKwogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICJRRFJlY3RhbmdsZSglciwgJXIsICVyLCAlcikiICUgKHNlbGYudjAsIHNlbGYuaDAsIHNlbGYudjEsIHNlbGYuaDEpCi0gICAgCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICIoJWQsICVkKS0oJWQsICVkKSIlKHNlbGYudjAsIHNlbGYuaDAsIHNlbGYudjEsIHNlbGYuaDEpCi0gICAgCisKICAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2hoaGgnLCBzZWxmLnYwLCBzZWxmLmgwLCBzZWxmLnYxLCBzZWxmLmgxKSwKICAgICAgICAgICAgIHR5cGVRRFJlY3RhbmdsZSkKQEAgLTM2MSwxOCArMzYxLDE4IEBACiAKIGNsYXNzIFJHQkNvbG9yOgogICAgICIiIkFuIFJHQiBjb2xvciIiIgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHIsIGcsIGIpOgogICAgICAgICBzZWxmLnIgPSByCiAgICAgICAgIHNlbGYuZyA9IGcKICAgICAgICAgc2VsZi5iID0gYgotICAgICAgICAgICAgCisKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiUkdCQ29sb3IoJXIsICVyLCAlcikiICUgKHNlbGYuciwgc2VsZi5nLCBzZWxmLmIpCi0gICAgCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICIweCV4IHJlZCwgMHgleCBncmVlbiwgMHgleCBibHVlIiUgKHNlbGYuciwgc2VsZi5nLCBzZWxmLmIpCi0gICAgCisKICAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2hoaCcsIHNlbGYuciwgc2VsZi5nLCBzZWxmLmIpLAogICAgICAgICAgICAgdHlwZVJHQkNvbG9yKQpAQCAtMzgxLDM2ICszODEsMzYgQEAKICAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBSR0JDb2xvcikKIAogY2xhc3MgT2JqZWN0U3BlY2lmaWVyOgotICAgIAorCiAgICAgIiIiQSBjbGFzcyBmb3IgY29uc3RydWN0aW5nIGFuZCBtYW5pcHVsYXRpb24gQUUgb2JqZWN0IHNwZWNpZmllcnMgaW4gcHl0aG9uLgotICAgIAorCiAgICAgQW4gb2JqZWN0IHNwZWNpZmllciBpcyBhY3R1YWxseSBhIHJlY29yZCB3aXRoIGZvdXIgZmllbGRzOgotICAgIAorCiAgICAga2V5IHR5cGUgICAgZGVzY3JpcHRpb24KICAgICAtLS0gLS0tLSAgICAtLS0tLS0tLS0tLQotICAgIAorCiAgICAgJ3dhbnQnICB0eXBlICAgIDQtY2hhciBjbGFzcyBjb2RlIG9mIHRoaW5nIHdlIHdhbnQsCiAgICAgICAgICAgICBlLmcuIHdvcmQsIHBhcmFncmFwaCBvciBwcm9wZXJ0eQotICAgIAorCiAgICAgJ2Zvcm0nICBlbnVtICAgIGhvdyB3ZSBzcGVjaWZ5IHdoaWNoICd3YW50JyB0aGluZyhzKSB3ZSB3YW50LAogICAgICAgICAgICAgZS5nLiBieSBpbmRleCwgYnkgcmFuZ2UsIGJ5IG5hbWUsIG9yIGJ5IHByb3BlcnR5IHNwZWNpZmllcgotICAgIAorCiAgICAgJ3NlbGQnICBhbnkgd2hpY2ggdGhpbmcocykgd2Ugd2FudCwKICAgICAgICAgICAgIGUuZy4gaXRzIGluZGV4LCBpdHMgbmFtZSwgb3IgaXRzIHByb3BlcnR5IHNwZWNpZmllcgotICAgIAorCiAgICAgJ2Zyb20nICBvYmplY3QgIHRoZSBvYmplY3QgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLAogICAgICAgICAgICAgb3IgbnVsbCwgbWVhbmluZyBsb29rIGZvciBpdCBpbiB0aGUgYXBwbGljYXRpb24KLSAgICAKKwogICAgIE5vdGUgdGhhdCB3ZSBkb24ndCBjYWxsIHRoaXMgY2xhc3MgcGxhaW4gIk9iamVjdCIsIHNpbmNlIHRoYXQgbmFtZQogICAgIGlzIGxpa2VseSB0byBiZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KICAgICAiIiIKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3YW50LCBmb3JtLCBzZWxkLCBmciA9IE5vbmUpOgogICAgICAgICBzZWxmLndhbnQgPSB3YW50CiAgICAgICAgIHNlbGYuZm9ybSA9IGZvcm0KICAgICAgICAgc2VsZi5zZWxkID0gc2VsZAogICAgICAgICBzZWxmLmZyID0gZnIKLSAgICAKKwogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgcyA9ICJPYmplY3RTcGVjaWZpZXIoJXIsICVyLCAlciIgJSAoc2VsZi53YW50LCBzZWxmLmZvcm0sIHNlbGYuc2VsZCkKICAgICAgICAgaWYgc2VsZi5mcjoKQEAgLTQxOCw3ICs0MTgsNyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcyA9IHMgKyAiKSIKICAgICAgICAgcmV0dXJuIHMKLSAgICAKKwogICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgogICAgICAgICByZXR1cm4gcGFjayh7J3dhbnQnOiBta3R5cGUoc2VsZi53YW50KSwKICAgICAgICAgICAgICAgICAgJ2Zvcm0nOiBta2VudW0oc2VsZi5mb3JtKSwKQEAgLTQ0MSw3ICs0NDEsNyBAQAogICAgICAgICAgICAgcmV0dXJuICJQcm9wZXJ0eSglciwgJXIpIiAlIChzZWxmLnNlbGQudHlwZSwgc2VsZi5mcikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiAiUHJvcGVydHkoJXIpIiAlIChzZWxmLnNlbGQudHlwZSwpCi0gICAgCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgaWYgc2VsZi5mcjoKICAgICAgICAgICAgIHJldHVybiAiUHJvcGVydHkgJXMgb2YgJXMiICUgKHN0cihzZWxmLnNlbGQpLCBzdHIoc2VsZi5mcikpCkBAIC00NjAsNyArNDYwLDcgQEAKICAgICAgICAgI2V4Y2VwdDoKICAgICAgICAgIyAgIHNlbGYud2FudCA9ICdwcm9wJwogICAgICAgICBzZWxmLndhbnQgPSAncHJvcCcKLSAgICAgICAgT2JqZWN0U3BlY2lmaWVyLl9faW5pdF9fKHNlbGYsIHNlbGYud2FudCwgJ3Byb3AnLCAKKyAgICAgICAgT2JqZWN0U3BlY2lmaWVyLl9faW5pdF9fKHNlbGYsIHNlbGYud2FudCwgJ3Byb3AnLAogICAgICAgICAgICAgICAgICAgICBta3R5cGUoc2VsZi53aGljaCksIGZyKQogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgpAQCAtNDcwLDcgKzQ3MCw3IEBACiAgICAgICAgIGlmIHNlbGYud2FudCAhPSAncHJvcCc6CiAgICAgICAgICAgICBydiA9IHJ2ICsgIiwgd2FudD0lciIgJSAoc2VsZi53YW50LCkKICAgICAgICAgcmV0dXJuIHJ2ICsgIikiCi0gICAgCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgaWYgc2VsZi5mcjoKICAgICAgICAgICAgIHJldHVybiAiUHJvcGVydHkgJXMgb2YgJXMiICUgKHN0cihzZWxmLnNlbGQpLCBzdHIoc2VsZi5mcikpCkBAIC00NzksNyArNDc5LDcgQEAKIAogCiBjbGFzcyBTZWxlY3RhYmxlSXRlbShPYmplY3RTcGVjaWZpZXIpOgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdhbnQsIHNlbGQsIGZyID0gTm9uZSk6CiAgICAgICAgIHQgPSB0eXBlKHNlbGQpCiAgICAgICAgIGlmIHQgPT0gU3RyaW5nVHlwZToKQEAgLTUwNiwxMiArNTA2LDEyIEBACiAgICAgX2VsZW1kaWN0ID0ge30KICAgICBkZWYgX19pbml0X18oc2VsZiwgd2hpY2gsIGZyID0gTm9uZSk6CiAgICAgICAgIFNlbGVjdGFibGVJdGVtLl9faW5pdF9fKHNlbGYsIHNlbGYud2FudCwgd2hpY2gsIGZyKQotICAgIAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICBpZiBub3Qgc2VsZi5mcjoKICAgICAgICAgICAgIHJldHVybiAiJXMoJXIpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5zZWxkKQogICAgICAgICByZXR1cm4gIiVzKCVyLCAlcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnNlbGQsIHNlbGYuZnIpCi0gICAgCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgc2VsZCA9IHNlbGYuc2VsZAogICAgICAgICBpZiB0eXBlKHNlbGQpID09IFN0cmluZ1R5cGU6CkBAIC01MjgsNyArNTI4LDcgQEAKICAgICAgICAgcyA9ICIlcyAlcyIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNzKQogICAgICAgICBpZiBzZWxmLmZyOiBzID0gcyArICIgb2YgJXMiICUgc3RyKHNlbGYuZnIpCiAgICAgICAgIHJldHVybiBzCi0gICAgICAgIAorCiAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgICBpZiBzZWxmLl9lbGVtZGljdC5oYXNfa2V5KG5hbWUpOgogICAgICAgICAgICAgY2xzID0gc2VsZi5fZWxlbWRpY3RbbmFtZV0KQEAgLTUzNywxOSArNTM3LDE5IEBACiAgICAgICAgICAgICBjbHMgPSBzZWxmLl9wcm9wZGljdFtuYW1lXQogICAgICAgICAgICAgcmV0dXJuIGNscyhzZWxmKQogICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQotICAgICAgICAKLSAgICAgICAgCisKKwogY2xhc3MgRGVsYXllZENvbXBvbmVudEl0ZW06CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbXBjbGFzcywgZnIpOgogICAgICAgICBzZWxmLmNvbXBjbGFzcyA9IGNvbXBjbGFzcwogICAgICAgICBzZWxmLmZyID0gZnIKLSAgICAgICAgCisKICAgICBkZWYgX19jYWxsX18oc2VsZiwgd2hpY2gpOgogICAgICAgICByZXR1cm4gc2VsZi5jb21wY2xhc3Mod2hpY2gsIHNlbGYuZnIpCi0gICAgICAgIAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIiVzKD8/PywgJXIpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5mcikKLSAgICAgICAgCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICJzZWxlY3RvciBmb3IgZWxlbWVudCAlcyBvZiAlcyIlKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZi5mcikpCiAKQEAgLTU2Niw0ICs1NjYsMyBAQAogZXhlYyB0ZW1wbGF0ZSAlICgiRG9jdW1lbnQiLCAnZG9jdScpCiBleGVjIHRlbXBsYXRlICUgKCJGaWxlIiwgJ2ZpbGUnKQogZXhlYyB0ZW1wbGF0ZSAlICgiSW5zZXJ0aW9uUG9pbnQiLCAnY2lucycpCi0KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9hcHBsZXNpbmdsZS5weSBiL0xpYi9wbGF0LW1hYy9hcHBsZXNpbmdsZS5weQppbmRleCBhZGJjZTBjLi43YmJlOGFmIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvYXBwbGVzaW5nbGUucHkKKysrIGIvTGliL3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5CkBAIC03OCw3ICs3OCw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5kYXRhZm9yayA9IGRhdGEKICAgICAgICAgICAgIGVsaWYgcmVzdHlwZSA9PSBBU19SRVNPVVJDRUZPUks6CiAgICAgICAgICAgICAgICAgc2VsZi5yZXNvdXJjZWZvcmsgPSBkYXRhCi0gICAgICAgIAorCiAgICAgZGVmIHRvZmlsZShzZWxmLCBwYXRoLCByZXNvbmx5PUZhbHNlKToKICAgICAgICAgb3V0ZmlsZSA9IG9wZW4ocGF0aCwgJ3diJykKICAgICAgICAgZGF0YSA9IEZhbHNlCkBAIC05OSwxNSArOTksMTUgQEAKICAgICAgICAgICAgICAgICBmcCA9IE1hY09TLm9wZW5yZihwYXRoLCAnKndiJykKICAgICAgICAgICAgICAgICBmcC53cml0ZShzZWxmLnJlc291cmNlZm9yaykKICAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCi0gICAgCisKIGRlZiBkZWNvZGUoaW5maWxlLCBvdXRwYXRoLCByZXNvbmx5PUZhbHNlLCB2ZXJib3NlPUZhbHNlKToKICAgICAiIiJkZWNvZGUoaW5maWxlLCBvdXRwYXRoIFssIHJlc29ubHk9RmFsc2UsIHZlcmJvc2U9RmFsc2VdKQogCiAgICAgQ3JlYXRlcyBhIGRlY29kZWQgZmlsZSBmcm9tIGFuIEFwcGxlU2luZ2xlIGVuY29kZWQgZmlsZS4KLSAgICBJZiByZXNvbmx5IGlzIFRydWUsIHRoZW4gaXQgd2lsbCBjcmVhdGUgYSByZWd1bGFyIGZpbGUgYXQgCisgICAgSWYgcmVzb25seSBpcyBUcnVlLCB0aGVuIGl0IHdpbGwgY3JlYXRlIGEgcmVndWxhciBmaWxlIGF0CiAgICAgb3V0cGF0aCBjb250YWluaW5nIG9ubHkgdGhlIHJlc291cmNlIGZvcmsgZnJvbSBpbmZpbGUuCiAgICAgT3RoZXJ3aXNlIGl0IHdpbGwgY3JlYXRlIGFuIEFwcGxlRG91YmxlIGZpbGUgYXQgb3V0cGF0aAotICAgIHdpdGggdGhlIGRhdGEgYW5kIHJlc291cmNlIGZvcmtzIGZyb20gaW5maWxlLiAgT24gcGxhdGZvcm1zIAorICAgIHdpdGggdGhlIGRhdGEgYW5kIHJlc291cmNlIGZvcmtzIGZyb20gaW5maWxlLiAgT24gcGxhdGZvcm1zCiAgICAgd2l0aG91dCB0aGUgTWFjT1MgbW9kdWxlLCBpdCB3aWxsIGNyZWF0ZSBpbnBhdGggYW5kIGlucGF0aCsnLnJzcmMnCiAgICAgd2l0aCB0aGUgZGF0YSBhbmQgcmVzb3VyY2UgZm9ya3MgcmVzcGVjdGl2ZWx5LgogCkBAIC0xMjEsNyArMTIxLDcgQEAKIAogICAgIGFzID0gQXBwbGVTaW5nbGUoaW5maWxlLCB2ZXJib3NlPXZlcmJvc2UpCiAgICAgYXMudG9maWxlKG91dHBhdGgsIHJlc29ubHk9cmVzb25seSkKLSAgICAKKwogZGVmIF90ZXN0KCk6CiAgICAgaWYgbGVuKHN5cy5hcmd2KSA8IDMgb3Igc3lzLmFyZ3ZbMV0gPT0gJy1yJyBhbmQgbGVuKHN5cy5hcmd2KSAhPSA0OgogICAgICAgICBwcmludCAnVXNhZ2U6IGFwcGxlc2luZ2xlLnB5IFstcl0gYXBwbGVzaW5nbGVmaWxlIGRlY29kZWRmaWxlJwpAQCAtMTMyLDYgKzEzMiw2IEBACiAgICAgZWxzZToKICAgICAgICAgcmVzb25seSA9IEZhbHNlCiAgICAgZGVjb2RlKHN5cy5hcmd2WzFdLCBzeXMuYXJndlsyXSwgcmVzb25seT1yZXNvbmx5KQotICAgIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9hcHBsZXRyYXdtYWluLnB5IGIvTGliL3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHkKaW5kZXggODgyNTljMS4uMWJlOTE4NyAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHkKKysrIGIvTGliL3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHkKQEAgLTIzLDcgKzIzLDcgQEAKICAgICBfZGlyID0gb3MucGF0aC5zcGxpdChzeXMuYXJndlswXSlbMF0KICMKICMgQWRkIHRoZSBSZXNvdXJjZXMgZGlyZWN0b3J5IHRvIHRoZSBwYXRoLiBUaGlzIGlzIHdoZXJlIGZpbGVzIGluc3RhbGxlZAotIyBieSBCdWlsZEFwcGxldC5weSB3aXRoIHRoZSAtLWV4dHJhIG9wdGlvbiBzaG93IHVwLCBhbmQgaWYgdGhvc2UgZmlsZXMgYXJlIAorIyBieSBCdWlsZEFwcGxldC5weSB3aXRoIHRoZSAtLWV4dHJhIG9wdGlvbiBzaG93IHVwLCBhbmQgaWYgdGhvc2UgZmlsZXMgYXJlCiAjIG1vZHVsZXMgdGhpcyBzeXMucGF0aCBtb2RpZmljYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGJlIGFibGUgdG8gaW1wb3J0IHRoZW0uCiAjCiBzeXMucGF0aC5pbnNlcnQoMCwgX2RpcikKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9iZ2VubG9jYXRpb25zLnB5IGIvTGliL3BsYXQtbWFjL2JnZW5sb2NhdGlvbnMucHkKaW5kZXggMTllMWYwMi4uZTdmYTM1NCAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2JnZW5sb2NhdGlvbnMucHkKKysrIGIvTGliL3BsYXQtbWFjL2JnZW5sb2NhdGlvbnMucHkKQEAgLTMxLDEzICszMSwxMyBAQAogIyBDcmVhdG9yIGZvciBDIGZpbGVzOgogQ1JFQVRPUj0iQ1dJRSIKIAotIyBUaGUgcHJldmlvdXMgZGVmaW5pdGlvbnMgY2FuIGJlIG92ZXJyaWRlbiBieSBjcmVhdGluZyBhIG1vZHVsZSAKLSMgYmdlbmxvY2F0aW9uc2N1c3RvbWl6ZS5weSBhbmQgcHV0dGluZyBpdCBpbiBzaXRlLXBhY2thZ2VzIChvciBhbnl3ZXJlIGVsc2UgCisjIFRoZSBwcmV2aW91cyBkZWZpbml0aW9ucyBjYW4gYmUgb3ZlcnJpZGVuIGJ5IGNyZWF0aW5nIGEgbW9kdWxlCisjIGJnZW5sb2NhdGlvbnNjdXN0b21pemUucHkgYW5kIHB1dHRpbmcgaXQgaW4gc2l0ZS1wYWNrYWdlcyAob3IgYW55d2VyZSBlbHNlCiAjIG9uIHN5cy5wYXRoLCBhY3R1YWxseSkKIHRyeToKLQlmcm9tIGJnZW5sb2NhdGlvbnNjdXN0b21pemUgaW1wb3J0ICoKKyAgICBmcm9tIGJnZW5sb2NhdGlvbnNjdXN0b21pemUgaW1wb3J0ICoKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLQlwYXNzCisgICAgcGFzcwogCiBpZiBub3Qgb3MucGF0aC5leGlzdHMoQkdFTkRJUik6CiAgICAgcmFpc2UgRXJyb3IsICJQbGVhc2UgZml4IGJnZW5sb2NhdGlvbnMucHksIEJHRU5ESVIgZG9lcyBub3QgZXhpc3Q6ICVzIiAlIEJHRU5ESVIKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICByYWlzZSBFcnJvciwgIlBsZWFzZSBmaXggYmdlbmxvY2F0aW9ucy5weSwgSU5DTFVERURJUiBkb2VzIG5vdCBleGlzdDogJXMiICUgSU5DTFVERURJUgogaWYgbm90IG9zLnBhdGguZXhpc3RzKFRPT0xCT1hESVIpOgogICAgIHJhaXNlIEVycm9yLCAiUGxlYXNlIGZpeCBiZ2VubG9jYXRpb25zLnB5LCBUT09MQk9YRElSIGRvZXMgbm90IGV4aXN0OiAlcyIgJSBUT09MQk9YRElSCi0gICAgCisKICMgU2lnaCwgZHVlIHRvIHRoZSB3YXkgdGhlc2UgYXJlIHVzZWQgbWFrZSBzdXJlIHRoZXkgZW5kIHdpdGggOiBvciAvLgogaWYgQkdFTkRJUlstMV0gIT0gb3Muc2VwOgogICAgIEJHRU5ESVIgPSBCR0VORElSICsgb3Muc2VwCkBAIC01Myw0ICs1MywzIEBACiAgICAgSU5DTFVERURJUiA9IElOQ0xVREVESVIgKyBvcy5zZXAKIGlmIFRPT0xCT1hESVJbLTFdICE9IG9zLnNlcDoKICAgICBUT09MQk9YRElSID0gVE9PTEJPWERJUiArIG9zLnNlcAotICAgIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2J1aWxkdG9vbHMucHkgYi9MaWIvcGxhdC1tYWMvYnVpbGR0b29scy5weQppbmRleCAzNjU3NzJhLi4xN2U0MDc2IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvYnVpbGR0b29scy5weQorKysgYi9MaWIvcGxhdC1tYWMvYnVpbGR0b29scy5weQpAQCAtNTgsMTAgKzU4LDEwIEBACiAgICAgICAgIHJhaXNlIEJ1aWxkRXJyb3IsICJUZW1wbGF0ZSAlciBub3QgZm91bmQgb24gc3lzLnBhdGgiICUgKHRlbXBsYXRlLCkKICAgICBmaWxlID0gZmlsZS5hc19wYXRobmFtZSgpCiAgICAgcmV0dXJuIGZpbGUKLSAgICAKLWRlZiBwcm9jZXNzKHRlbXBsYXRlLCBmaWxlbmFtZSwgZGVzdG5hbWUsIGNvcHlfY29kZWZyYWdtZW50PTAsIAorCitkZWYgcHJvY2Vzcyh0ZW1wbGF0ZSwgZmlsZW5hbWUsIGRlc3RuYW1lLCBjb3B5X2NvZGVmcmFnbWVudD0wLAogICAgICAgICByc3JjbmFtZT1Ob25lLCBvdGhlcnM9W10sIHJhdz0wLCBwcm9ncmVzcz0iZGVmYXVsdCIpOgotICAgIAorCiAgICAgaWYgcHJvZ3Jlc3MgPT0gImRlZmF1bHQiOgogICAgICAgICBwcm9ncmVzcyA9IEVhc3lEaWFsb2dzLlByb2dyZXNzQmFyKCJQcm9jZXNzaW5nICVzLi4uIiVvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXSwgMTIwKQogICAgICAgICBwcm9ncmVzcy5sYWJlbCgiQ29tcGlsaW5nLi4uIikKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgcmFpc2UgQnVpbGRFcnJvciwgIkJ1aWxkQXBwbGV0IGNvdWxkIGRlc3Ryb3kgeW91ciBzb3VyY2VmaWxlIG9uIE9TWCwgcGxlYXNlIHJlbmFtZTogJXMiICUgZmlsZW5hbWUKICAgICAjIFJlYWQgdGhlIHNvdXJjZSBhbmQgY29tcGlsZSBpdAogICAgICMgKHRoZXJlJ3Mgbm8gcG9pbnQgb3ZlcndyaXRpbmcgdGhlIGRlc3RpbmF0aW9uIGlmIGl0IGhhcyBhIHN5bnRheCBlcnJvcikKLSAgICAKKwogICAgIGZwID0gb3BlbihmaWxlbmFtZSwgJ3JVJykKICAgICB0ZXh0ID0gZnAucmVhZCgpCiAgICAgZnAuY2xvc2UoKQpAQCAtODIsMTcgKzgyLDE3IEBACiAgICAgICAgIHJhaXNlIEJ1aWxkRXJyb3IsICJTeW50YXggZXJyb3IgaW4gc2NyaXB0ICVzOiAlcyIgJSAoZmlsZW5hbWUsIGFyZykKICAgICBleGNlcHQgRU9GRXJyb3I6CiAgICAgICAgIHJhaXNlIEJ1aWxkRXJyb3IsICJFbmQtb2YtZmlsZSBpbiBzY3JpcHQgJXMiICUgKGZpbGVuYW1lLCkKLSAgICAKKwogICAgICMgU2V0IHRoZSBkZXN0aW5hdGlvbiBmaWxlIG5hbWUuIE5vdGUgdGhhdCBiYXNlbmFtZQogICAgICMgZG9lcyBjb250YWluIHRoZSB3aG9sZSBmaWxlcGF0aCwgb25seSBhIC5weSBpcyBzdHJpcHBlZC4KLSAgICAKKwogICAgIGlmIHN0cmluZy5sb3dlcihmaWxlbmFtZVstMzpdKSA9PSAiLnB5IjoKICAgICAgICAgYmFzZW5hbWUgPSBmaWxlbmFtZVs6LTNdCiAgICAgICAgIGlmIE1hY09TLnJ1bnRpbWVtb2RlbCAhPSAnbWFjaG8nIGFuZCBub3QgZGVzdG5hbWU6CiAgICAgICAgICAgICBkZXN0bmFtZSA9IGJhc2VuYW1lCiAgICAgZWxzZToKICAgICAgICAgYmFzZW5hbWUgPSBmaWxlbmFtZQotICAgICAgICAKKwogICAgIGlmIG5vdCBkZXN0bmFtZToKICAgICAgICAgaWYgTWFjT1MucnVudGltZW1vZGVsID09ICdtYWNobyc6CiAgICAgICAgICAgICBkZXN0bmFtZSA9IGJhc2VuYW1lICsgJy5hcHAnCkBAIC0xMDAsMTYgKzEwMCwxNiBAQAogICAgICAgICAgICAgZGVzdG5hbWUgPSBiYXNlbmFtZSArICcuYXBwbGV0JwogICAgIGlmIG5vdCByc3JjbmFtZToKICAgICAgICAgcnNyY25hbWUgPSBiYXNlbmFtZSArICcucnNyYycKLSAgICAgICAgCisKICAgICAjIFRyeSByZW1vdmluZyB0aGUgb3V0cHV0IGZpbGUuIFRoaXMgZmFpbHMgaW4gTWFjaE8sIGJ1dCBpdCBzaG91bGQKICAgICAjIGRvIGFueSBoYXJtLgogICAgIHRyeToKICAgICAgICAgb3MucmVtb3ZlKGRlc3RuYW1lKQogICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgcGFzcwotICAgIHByb2Nlc3NfY29tbW9uKHRlbXBsYXRlLCBwcm9ncmVzcywgY29kZSwgcnNyY25hbWUsIGRlc3RuYW1lLCAwLCAKKyAgICBwcm9jZXNzX2NvbW1vbih0ZW1wbGF0ZSwgcHJvZ3Jlc3MsIGNvZGUsIHJzcmNuYW1lLCBkZXN0bmFtZSwgMCwKICAgICAgICAgY29weV9jb2RlZnJhZ21lbnQsIHJhdywgb3RoZXJzLCBmaWxlbmFtZSkKLSAgICAKKwogCiBkZWYgdXBkYXRlKHRlbXBsYXRlLCBmaWxlbmFtZSwgb3V0cHV0KToKICAgICBpZiBNYWNPUy5ydW50aW1lbW9kZWwgPT0gJ21hY2hvJzoKQEAgLTEyMCw3ICsxMjAsNyBAQAogICAgICAgICBwcm9ncmVzcyA9IE5vbmUKICAgICBpZiBub3Qgb3V0cHV0OgogICAgICAgICBvdXRwdXQgPSBmaWxlbmFtZSArICcgKHVwZGF0ZWQpJwotICAgIAorCiAgICAgIyBUcnkgcmVtb3ZpbmcgdGhlIG91dHB1dCBmaWxlCiAgICAgdHJ5OgogICAgICAgICBvcy5yZW1vdmUob3V0cHV0KQpAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgcHJvY2Vzc19jb21tb24odGVtcGxhdGUsIHByb2dyZXNzLCBOb25lLCBmaWxlbmFtZSwgb3V0cHV0LCAxLCAxKQogCiAKLWRlZiBwcm9jZXNzX2NvbW1vbih0ZW1wbGF0ZSwgcHJvZ3Jlc3MsIGNvZGUsIHJzcmNuYW1lLCBkZXN0bmFtZSwgaXNfdXBkYXRlLCAKK2RlZiBwcm9jZXNzX2NvbW1vbih0ZW1wbGF0ZSwgcHJvZ3Jlc3MsIGNvZGUsIHJzcmNuYW1lLCBkZXN0bmFtZSwgaXNfdXBkYXRlLAogICAgICAgICBjb3B5X2NvZGVmcmFnbWVudCwgcmF3PTAsIG90aGVycz1bXSwgZmlsZW5hbWU9Tm9uZSk6CiAgICAgaWYgTWFjT1MucnVudGltZW1vZGVsID09ICdtYWNobyc6CiAgICAgICAgIHJldHVybiBwcm9jZXNzX2NvbW1vbl9tYWNobyh0ZW1wbGF0ZSwgcHJvZ3Jlc3MsIGNvZGUsIHJzcmNuYW1lLCBkZXN0bmFtZSwKQEAgLTEzOSwxMiArMTM5LDEyIEBACiAgICAgIyBDcmVhdGUgRlNTcGVjcyBmb3IgdGhlIHZhcmlvdXMgZmlsZXMKICAgICB0ZW1wbGF0ZV9mc3IsIGQxLCBkMiA9IENhcmJvbi5GaWxlLkZTUmVzb2x2ZUFsaWFzRmlsZSh0ZW1wbGF0ZSwgMSkKICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlX2Zzci5hc19wYXRobmFtZSgpCi0gICAgCisKICAgICAjIENvcHkgZGF0YSAobm90IHJlc291cmNlcywgeWV0KSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgIGlmIHByb2dyZXNzOgogICAgICAgICBwcm9ncmVzcy5sYWJlbCgiQ29weSBkYXRhIGZvcmsuLi4iKQogICAgICAgICBwcm9ncmVzcy5zZXQoMTApCi0gICAgCisKICAgICBpZiBjb3B5X2NvZGVmcmFnbWVudDoKICAgICAgICAgdG1wbCA9IG9wZW4odGVtcGxhdGUsICJyYiIpCiAgICAgICAgIGRlc3QgPSBvcGVuKGRlc3RuYW1lLCAid2IiKQpAQCAtMTU1LDkgKzE1NSw5IEBACiAgICAgICAgIHRtcGwuY2xvc2UoKQogICAgICAgICBkZWwgZGVzdAogICAgICAgICBkZWwgdG1wbAotICAgIAorCiAgICAgIyBPcGVuIHRoZSBvdXRwdXQgcmVzb3VyY2UgZm9yawotICAgIAorCiAgICAgaWYgcHJvZ3Jlc3M6CiAgICAgICAgIHByb2dyZXNzLmxhYmVsKCJDb3B5IHJlc291cmNlcy4uLiIpCiAgICAgICAgIHByb2dyZXNzLnNldCgyMCkKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAgICBkZXN0ZGlyLCBkZXN0ZmlsZSA9IG9zLnBhdGguc3BsaXQoZGVzdG5hbWUpCiAgICAgICAgIFJlcy5GU0NyZWF0ZVJlc291cmNlRmlsZShkZXN0ZGlyLCB1bmljb2RlKGRlc3RmaWxlKSwgUkVTT1VSQ0VfRk9SS19OQU1FKQogICAgICAgICBvdXRwdXQgPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKGRlc3RuYW1lLCBSRVNPVVJDRV9GT1JLX05BTUUsIFdSSVRFKQotICAgIAorCiAgICAgIyBDb3B5IHRoZSByZXNvdXJjZXMgZnJvbSB0aGUgdGFyZ2V0IHNwZWNpZmljIHJlc291cmNlIHRlbXBsYXRlLCBpZiBhbnkKICAgICB0eXBlc2ZvdW5kLCBvd25lcnR5cGUgPSBbXSwgTm9uZQogICAgIHRyeToKQEAgLTE4MywyNyArMTgzLDI3IEBACiAgICAgICAgICAgICBza2lwX29sZGZpbGUgPSBbXQogICAgICAgICB0eXBlc2ZvdW5kLCBvd25lcnR5cGUgPSBjb3B5cmVzKGlucHV0LCBvdXRwdXQsIHNraXBfb2xkZmlsZSwgMCwgcHJvZ3Jlc3MpCiAgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUoaW5wdXQpCi0gICAgCisKICAgICAjIENoZWNrIHdoaWNoIHJlc291cmNlLXR5cGVzIHdlIHNob3VsZCBub3QgY29weSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgIHNraXB0eXBlcyA9IFtdCiAgICAgaWYgJ3ZlcnMnIGluIHR5cGVzZm91bmQ6IHNraXB0eXBlcy5hcHBlbmQoJ3ZlcnMnKQogICAgIGlmICdTSVpFJyBpbiB0eXBlc2ZvdW5kOiBza2lwdHlwZXMuYXBwZW5kKCdTSVpFJykKLSAgICBpZiAnQk5ETCcgaW4gdHlwZXNmb3VuZDogc2tpcHR5cGVzID0gc2tpcHR5cGVzICsgWydCTkRMJywgJ0ZSRUYnLCAnaWNsNCcsIAorICAgIGlmICdCTkRMJyBpbiB0eXBlc2ZvdW5kOiBza2lwdHlwZXMgPSBza2lwdHlwZXMgKyBbJ0JOREwnLCAnRlJFRicsICdpY2w0JywKICAgICAgICAgICAgICdpY2w4JywgJ2ljczQnLCAnaWNzOCcsICdJQ04jJywgJ2ljcyMnXQogICAgIGlmIG5vdCBjb3B5X2NvZGVmcmFnbWVudDoKICAgICAgICAgc2tpcHR5cGVzLmFwcGVuZCgnY2ZyZycpCiAjIyAgc2tpcG93bmVyID0gKG93bmVydHlwZSA8PiBOb25lKQotICAgIAorCiAgICAgIyBDb3B5IHRoZSByZXNvdXJjZXMgZnJvbSB0aGUgdGVtcGxhdGUKLSAgICAKKwogICAgIGlucHV0ID0gUmVzLkZTT3BlblJlc291cmNlRmlsZSh0ZW1wbGF0ZSwgUkVTT1VSQ0VfRk9SS19OQU1FLCBSRUFEKQogICAgIGR1bW15LCB0bXBsb3duZXIgPSBjb3B5cmVzKGlucHV0LCBvdXRwdXQsIHNraXB0eXBlcywgMSwgcHJvZ3Jlc3MpCi0gICAgICAgIAorCiAgICAgUmVzLkNsb3NlUmVzRmlsZShpbnB1dCkKICMjICBpZiBvd25lcnR5cGUgPT0gTm9uZToKICMjICAgICAgcmFpc2UgQnVpbGRFcnJvciwgIk5vIG93bmVyIHJlc291cmNlIGZvdW5kIGluIGVpdGhlciByZXNvdXJjZSBmaWxlIG9yIHRlbXBsYXRlIgogICAgICMgTWFrZSBzdXJlIHdlJ3JlIG1hbmlwdWxhdGluZyB0aGUgb3V0cHV0IHJlc291cmNlIGZpbGUgbm93Ci0gICAgCisKICAgICBSZXMuVXNlUmVzRmlsZShvdXRwdXQpCiAKICAgICBpZiBvd25lcnR5cGUgPT0gTm9uZToKQEAgLTIxMywyNyArMjEzLDI3IEBACiAgICAgICAgIG5ld3JlcyA9IFJlcy5SZXNvdXJjZSgnXDAnKQogICAgICAgICBuZXdyZXMuQWRkUmVzb3VyY2UoREVGQVVMVF9BUFBMRVRfQ1JFQVRPUiwgMCwgIk93bmVyIHJlc291cmNlIikKICAgICAgICAgb3duZXJ0eXBlID0gREVGQVVMVF9BUFBMRVRfQ1JFQVRPUgotICAgIAorCiAgICAgaWYgY29kZToKICAgICAgICAgIyBEZWxldGUgYW55IGV4aXN0aW5nICdQWUMgJyByZXNvdXJjZSBuYW1lZCBfX21haW5fXwotICAgICAgICAKKwogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXMgPSBSZXMuR2V0MU5hbWVkUmVzb3VyY2UoUkVTVFlQRSwgUkVTTkFNRSkKICAgICAgICAgICAgIHJlcy5SZW1vdmVSZXNvdXJjZSgpCiAgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3I6CiAgICAgICAgICAgICBwYXNzCi0gICAgICAgIAorCiAgICAgICAgICMgQ3JlYXRlIHRoZSByYXcgZGF0YSBmb3IgdGhlIHJlc291cmNlIGZyb20gdGhlIGNvZGUgb2JqZWN0CiAgICAgICAgIGlmIHByb2dyZXNzOgogICAgICAgICAgICAgcHJvZ3Jlc3MubGFiZWwoIldyaXRlIFBZQyByZXNvdXJjZS4uLiIpCiAgICAgICAgICAgICBwcm9ncmVzcy5zZXQoMTIwKQotICAgICAgICAKKwogICAgICAgICBkYXRhID0gbWFyc2hhbC5kdW1wcyhjb2RlKQogICAgICAgICBkZWwgY29kZQogICAgICAgICBkYXRhID0gKE1BR0lDICsgJ1wwXDBcMFwwJykgKyBkYXRhCi0gICAgICAgIAorCiAgICAgICAgICMgQ3JlYXRlIHRoZSByZXNvdXJjZSBhbmQgd3JpdGUgaXQKLSAgICAgICAgCisKICAgICAgICAgaWQgPSAwCiAgICAgICAgIHdoaWxlIGlkIDwgMTI4OgogICAgICAgICAgICAgaWQgPSBSZXMuVW5pcXVlMUlEKFJFU1RZUEUpCkBAIC0yNDQsMTEgKzI0NCwxMSBAQAogICAgICAgICByZXMuU2V0UmVzQXR0cnMoYXR0cnMpCiAgICAgICAgIHJlcy5Xcml0ZVJlc291cmNlKCkKICAgICAgICAgcmVzLlJlbGVhc2VSZXNvdXJjZSgpCi0gICAgCisKICAgICAjIENsb3NlIHRoZSBvdXRwdXQgZmlsZQotICAgIAorCiAgICAgUmVzLkNsb3NlUmVzRmlsZShvdXRwdXQpCi0gICAgCisKICAgICAjIE5vdyBzZXQgdGhlIGNyZWF0b3IsIHR5cGUgYW5kIGJ1bmRsZSBiaXQgb2YgdGhlIGRlc3RpbmF0aW9uLgogICAgICMgRG9uZSB3aXRoIEZTU3BlYydzLCBGU1JlZiBGSW5mbyBpc24ndCBnb29kIGVub3VnaCB5ZXQgKDIuM2ExKykKICAgICBkZXN0X2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhkZXN0bmFtZSkKQEAgLTI1OCwxMyArMjU4LDEzIEBACiAgICAgZGVzdF9maW5mby5GbGFncyA9IGRlc3RfZmluZm8uRmxhZ3MgfCBDYXJib24uRmlsZXMua0hhc0J1bmRsZSB8IENhcmJvbi5GaWxlcy5rSXNTaGFyZWQKICAgICBkZXN0X2ZpbmZvLkZsYWdzID0gZGVzdF9maW5mby5GbGFncyAmIH5DYXJib24uRmlsZXMua0hhc0JlZW5Jbml0ZWQKICAgICBkZXN0X2Zzcy5GU3BTZXRGSW5mbyhkZXN0X2ZpbmZvKQotICAgIAorCiAgICAgbWFjb3N0b29scy50b3VjaGVkKGRlc3RuYW1lKQogICAgIGlmIHByb2dyZXNzOgogICAgICAgICBwcm9ncmVzcy5sYWJlbCgiRG9uZS4iKQogICAgICAgICBwcm9ncmVzcy5pbmMoMCkKIAotZGVmIHByb2Nlc3NfY29tbW9uX21hY2hvKHRlbXBsYXRlLCBwcm9ncmVzcywgY29kZSwgcnNyY25hbWUsIGRlc3RuYW1lLCBpc191cGRhdGUsIAorZGVmIHByb2Nlc3NfY29tbW9uX21hY2hvKHRlbXBsYXRlLCBwcm9ncmVzcywgY29kZSwgcnNyY25hbWUsIGRlc3RuYW1lLCBpc191cGRhdGUsCiAgICAgICAgIHJhdz0wLCBvdGhlcnM9W10sIGZpbGVuYW1lPU5vbmUpOgogICAgICMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgZmlsZW5hbWUKICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgpAQCAtMzA0LDcgKzMwNCw3IEBACiAgICAgYnVpbGRlci5uYW1lID0gc2hvcnRuYW1lCiAgICAgaWYgcnNyY25hbWU6CiAgICAgICAgIHJlYWxyc3JjbmFtZSA9IG1hY3Jlc291cmNlLnJlc291cmNlX3BhdGhuYW1lKHJzcmNuYW1lKQotICAgICAgICBidWlsZGVyLmZpbGVzLmFwcGVuZCgocmVhbHJzcmNuYW1lLCAKKyAgICAgICAgYnVpbGRlci5maWxlcy5hcHBlbmQoKHJlYWxyc3JjbmFtZSwKICAgICAgICAgICAgIG9zLnBhdGguam9pbignQ29udGVudHMvUmVzb3VyY2VzJywgb3MucGF0aC5iYXNlbmFtZShyc3JjbmFtZSkpKSkKICAgICBmb3IgbyBpbiBvdGhlcnM6CiAgICAgICAgIGlmIHR5cGUobykgPT0gc3RyOgpAQCAtMzIwLDEwICszMjAsMTAgQEAKICAgICAgICAgYnVpbGRlci5hcmd2X2VtdWxhdGlvbiA9IDEKICAgICBidWlsZGVyLnNldHVwKCkKICAgICBidWlsZGVyLmJ1aWxkKCkKLSAgICBpZiBwcm9ncmVzczogCisgICAgaWYgcHJvZ3Jlc3M6CiAgICAgICAgIHByb2dyZXNzLmxhYmVsKCdEb25lLicpCiAgICAgICAgIHByb2dyZXNzLmluYygwKQotICAgIAorCiAjIyAgbWFjb3N0b29scy50b3VjaGVkKGRlc3RfZnNzKQogCiAjIENvcHkgcmVzb3VyY2VzIGJldHdlZW4gdHdvIHJlc291cmNlIGZpbGUgZGVzY3JpcHRvcnMuCkBAIC00MDYsNyArNDA2LDcgQEAKICAgICAgICAgICAgICAgICBwcm9ncmVzcy5sYWJlbCgnQ29weSAnK3RoaXMpCiAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MuaW5jKDApCiAgICAgICAgICAgICBzaHV0aWwuY29weTIoc3JjcGF0aCwgZHN0cGF0aCkKLSAgICAgICAgICAgIAorCiBkZWYgd3JpdGVweWNmaWxlKGNvZGVvYmplY3QsIGNmaWxlKToKICAgICBpbXBvcnQgbWFyc2hhbAogICAgIGZjID0gb3BlbihjZmlsZSwgJ3diJykKQEAgLTQxNyw0ICs0MTcsMyBAQAogICAgIGZjLnNlZWsoMCwgMCkKICAgICBmYy53cml0ZShNQUdJQykKICAgICBmYy5jbG9zZSgpCi0KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9jZm1maWxlLnB5IGIvTGliL3BsYXQtbWFjL2NmbWZpbGUucHkKaW5kZXggMzE3MDQ2YS4uZmQxYTNlOCAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2NmbWZpbGUucHkKKysrIGIvTGliL3BsYXQtbWFjL2NmbWZpbGUucHkKQEAgLTE4LDE5ICsxOCwxOSBAQAogQlVGU0laRSA9IDB4ODAwMDAKIAogZGVmIG1lcmdlY2ZtZmlsZXMoc3JjbGlzdCwgZHN0LCBhcmNoaXRlY3R1cmUgPSAnZmF0Jyk6Ci0gICAgIiIiTWVyZ2UgYWxsIGZpbGVzIGluIHNyY2xpc3QgaW50byBhIG5ldyBmaWxlIGRzdC4gCi0gICAgCisgICAgIiIiTWVyZ2UgYWxsIGZpbGVzIGluIHNyY2xpc3QgaW50byBhIG5ldyBmaWxlIGRzdC4KKwogICAgIElmIGFyY2hpdGVjdHVyZSBpcyBnaXZlbiwgb25seSBjb2RlIGZyYWdtZW50cyBvZiB0aGF0IHR5cGUgd2lsbCBiZSB1c2VkOgogICAgICJwd3BjIiBmb3IgUFBDLCAibTY4ayIgZm9yIGNmbTY4ay4gVGhpcyBkb2VzIG5vdCB3b3JrIGZvciAiY2xhc3NpYyIKICAgICA2OGsgY29kZSwgc2luY2UgaXQgZG9lcyBub3QgdXNlIGNvZGUgZnJhZ21lbnRzIHRvIGJlZ2luIHdpdGguCiAgICAgSWYgYXJjaGl0ZWN0dXJlIGlzIE5vbmUsIGFsbCBmcmFnbWVudHMgd2lsbCBiZSB1c2VkLCBlbmFibGluZyBGQVQgYmluYXJpZXMuCiAgICAgIiIiCi0gICAgCisKICAgICBzcmNsaXN0ID0gbGlzdChzcmNsaXN0KQogICAgIGZvciBpIGluIHJhbmdlKGxlbihzcmNsaXN0KSk6CiAgICAgICAgIHNyY2xpc3RbaV0gPSBDYXJib24uRmlsZS5wYXRobmFtZShzcmNsaXN0W2ldKQogICAgIGRzdCA9IENhcmJvbi5GaWxlLnBhdGhuYW1lKGRzdCkKLSAgICAKKwogICAgIGRzdGZpbGUgPSBvcGVuKGRzdCwgIndiIikKICAgICByZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShkc3QsIDMpCiAgICAgdHJ5OgpAQCAtNDMsOSArNDMsOSBAQAogICAgICAgICAgICAgICAgIGlmIGZyYWcuYXJjaGl0ZWN0dXJlID09ICdtNjhrJyBhbmQgYXJjaGl0ZWN0dXJlID09ICdwd3BjJzoKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBkc3RjZnJnLmFwcGVuZChmcmFnKQotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgZnJhZy5jb3B5ZGF0YShkc3RmaWxlKQotICAgICAgICAgICAgICAgIAorCiAgICAgICAgIGNmcmdyZXMgPSBSZXMuUmVzb3VyY2UoZHN0Y2ZyZy5idWlsZCgpKQogICAgICAgICBSZXMuVXNlUmVzRmlsZShyZikKICAgICAgICAgY2ZyZ3Jlcy5BZGRSZXNvdXJjZSgnY2ZyZycsIDAsICIiKQpAQCAtNTUsNyArNTUsNyBAQAogCiAKIGNsYXNzIENmcmdSZXNvdXJjZToKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoID0gTm9uZSk6CiAgICAgICAgIHNlbGYudmVyc2lvbiA9IDEKICAgICAgICAgc2VsZi5mcmFnbWVudHMgPSBbXQpAQCAtNzQsNDMgKzc0LDQzIEBACiAgICAgICAgICAgICAgICAgUmVzLlVzZVJlc0ZpbGUoY3VycmVudHJlc3JlZikKICAgICAgICAgICAgIHNlbGYucGFyc2UoZGF0YSkKICAgICAgICAgICAgIGlmIHNlbGYudmVyc2lvbiA8PiAxOgotICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5rbm93biAnY2ZyZycgcmVzb3VyY2UgZm9ybWF0IiAgIAotICAgIAorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5rbm93biAnY2ZyZycgcmVzb3VyY2UgZm9ybWF0IgorCiAgICAgZGVmIHBhcnNlKHNlbGYsIGRhdGEpOgotICAgICAgICAocmVzMSwgcmVzMiwgc2VsZi52ZXJzaW9uLCAKLSAgICAgICAgICAgIHJlczMsIHJlczQsIHJlczUsIHJlczYsIAorICAgICAgICAocmVzMSwgcmVzMiwgc2VsZi52ZXJzaW9uLAorICAgICAgICAgICAgcmVzMywgcmVzNCwgcmVzNSwgcmVzNiwKICAgICAgICAgICAgIHNlbGYubWVtYmVyQ291bnQpID0gc3RydWN0LnVucGFjaygiOGwiLCBkYXRhWzozMl0pCiAgICAgICAgIGRhdGEgPSBkYXRhWzMyOl0KICAgICAgICAgd2hpbGUgZGF0YToKICAgICAgICAgICAgIGZyYWcgPSBGcmFnbWVudERlc2NyaXB0b3Ioc2VsZi5wYXRoLCBkYXRhKQogICAgICAgICAgICAgZGF0YSA9IGRhdGFbZnJhZy5tZW1iZXJTaXplOl0KICAgICAgICAgICAgIHNlbGYuZnJhZ21lbnRzLmFwcGVuZChmcmFnKQotICAgIAorCiAgICAgZGVmIGJ1aWxkKHNlbGYpOgogICAgICAgICBzZWxmLm1lbWJlckNvdW50ID0gbGVuKHNlbGYuZnJhZ21lbnRzKQogICAgICAgICBkYXRhID0gc3RydWN0LnBhY2soIjhsIiwgMCwgMCwgc2VsZi52ZXJzaW9uLCAwLCAwLCAwLCAwLCBzZWxmLm1lbWJlckNvdW50KQogICAgICAgICBmb3IgZnJhZyBpbiBzZWxmLmZyYWdtZW50czoKICAgICAgICAgICAgIGRhdGEgPSBkYXRhICsgZnJhZy5idWlsZCgpCiAgICAgICAgIHJldHVybiBkYXRhCi0gICAgCisKICAgICBkZWYgYXBwZW5kKHNlbGYsIGZyYWcpOgogICAgICAgICBzZWxmLmZyYWdtZW50cy5hcHBlbmQoZnJhZykKIAogCiBjbGFzcyBGcmFnbWVudERlc2NyaXB0b3I6Ci0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZGF0YSA9IE5vbmUpOgogICAgICAgICBzZWxmLnBhdGggPSBwYXRoCiAgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBzZWxmLnBhcnNlKGRhdGEpCi0gICAgCisKICAgICBkZWYgcGFyc2Uoc2VsZiwgZGF0YSk6CiAgICAgICAgIHNlbGYuYXJjaGl0ZWN0dXJlID0gZGF0YVs6NF0KLSAgICAgICAgKCAgIHNlbGYudXBkYXRlbGV2ZWwsIAotICAgICAgICAgICAgc2VsZi5jdXJyZW50VmVyc2lvbiwgCi0gICAgICAgICAgICBzZWxmLm9sZERlZlZlcnNpb24sIAorICAgICAgICAoICAgc2VsZi51cGRhdGVsZXZlbCwKKyAgICAgICAgICAgIHNlbGYuY3VycmVudFZlcnNpb24sCisgICAgICAgICAgICBzZWxmLm9sZERlZlZlcnNpb24sCiAgICAgICAgICAgICBzZWxmLnN0YWNrc2l6ZSwKLSAgICAgICAgICAgIHNlbGYuYXBwbGliZGlyLCAKKyAgICAgICAgICAgIHNlbGYuYXBwbGliZGlyLAogICAgICAgICAgICAgc2VsZi5mcmFndHlwZSwKICAgICAgICAgICAgIHNlbGYud2hlcmUsCiAgICAgICAgICAgICBzZWxmLm9mZnNldCwKQEAgLTExOSwxNSArMTE5LDE1IEBACiAgICAgICAgICAgICBzZWxmLm1lbWJlclNpemUsKSA9IHN0cnVjdC51bnBhY2soIjRsaEJCNGxoIiwgZGF0YVs0OjQyXSkKICAgICAgICAgcG5hbWUgPSBkYXRhWzQyOnNlbGYubWVtYmVyU2l6ZV0KICAgICAgICAgc2VsZi5uYW1lID0gcG5hbWVbMToxK29yZChwbmFtZVswXSldCi0gICAgCisKICAgICBkZWYgYnVpbGQoc2VsZik6CiAgICAgICAgIGRhdGEgPSBzZWxmLmFyY2hpdGVjdHVyZQogICAgICAgICBkYXRhID0gZGF0YSArIHN0cnVjdC5wYWNrKCI0bGhCQjRsIiwKLSAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZWxldmVsLCAKLSAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRWZXJzaW9uLCAKLSAgICAgICAgICAgICAgICBzZWxmLm9sZERlZlZlcnNpb24sIAorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlbGV2ZWwsCisgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50VmVyc2lvbiwKKyAgICAgICAgICAgICAgICBzZWxmLm9sZERlZlZlcnNpb24sCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFja3NpemUsCi0gICAgICAgICAgICAgICAgc2VsZi5hcHBsaWJkaXIsIAorICAgICAgICAgICAgICAgIHNlbGYuYXBwbGliZGlyLAogICAgICAgICAgICAgICAgIHNlbGYuZnJhZ3R5cGUsCiAgICAgICAgICAgICAgICAgc2VsZi53aGVyZSwKICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCwKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgICAgICBkYXRhID0gZGF0YSArIHNlbGYubmFtZQogICAgICAgICBkYXRhID0gZGF0YSArICdcMDAwJyAqIChzZWxmLm1lbWJlclNpemUgLSBsZW4oZGF0YSkpCiAgICAgICAgIHJldHVybiBkYXRhCi0gICAgCisKICAgICBkZWYgZ2V0ZnJhZ21lbnQoc2VsZik6CiAgICAgICAgIGlmIHNlbGYud2hlcmUgPD4gMToKICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiY2FuJ3QgcmVhZCBmcmFnbWVudCwgdW5zdXBwb3J0ZWQgbG9jYXRpb24iCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAgICAgICAgIGZyYWcgPSBmLnJlYWQoKQogICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgcmV0dXJuIGZyYWcKLSAgICAKKwogICAgIGRlZiBjb3B5ZGF0YShzZWxmLCBvdXRmaWxlKToKICAgICAgICAgaWYgc2VsZi53aGVyZSA8PiAxOgogICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJjYW4ndCByZWFkIGZyYWdtZW50LCB1bnN1cHBvcnRlZCBsb2NhdGlvbiIKQEAgLTE2MSwxNyArMTYxLDE3IEBACiAgICAgICAgIGlmIHNlbGYubGVuZ3RoID09IDA6CiAgICAgICAgICAgICBpbmZpbGUuc2VlaygwLCAyKQogICAgICAgICAgICAgc2VsZi5sZW5ndGggPSBpbmZpbGUudGVsbCgpCi0gICAgICAgIAorCiAgICAgICAgICMgUG9zaXRpb24gaW5wdXQgZmlsZSBhbmQgcmVjb3JkIG5ldyBvZmZzZXQgZnJvbSBvdXRwdXQgZmlsZQogICAgICAgICBpbmZpbGUuc2VlayhzZWxmLm9mZnNldCkKLSAgICAgICAgCisKICAgICAgICAgIyBwYWQgdG8gMTYgYnl0ZSBib3VuZGFyaWVzCiAgICAgICAgIG9mZnNldCA9IG91dGZpbGUudGVsbCgpCiAgICAgICAgIGlmIG9mZnNldCAlIDE2OgogICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMTYgLSAob2Zmc2V0ICUgMTYpCiAgICAgICAgIG91dGZpbGUuc2VlayhvZmZzZXQpCiAgICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0Ci0gICAgICAgIAorCiAgICAgICAgIGwgPSBzZWxmLmxlbmd0aAogICAgICAgICB3aGlsZSBsOgogICAgICAgICAgICAgaWYgbCA+IEJVRlNJWkU6CkBAIC0xODEsNCArMTgxLDMgQEAKICAgICAgICAgICAgICAgICBvdXRmaWxlLndyaXRlKGluZmlsZS5yZWFkKGwpKQogICAgICAgICAgICAgICAgIGwgPSAwCiAgICAgICAgIGluZmlsZS5jbG9zZSgpCi0KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9maW5kZXJ0b29scy5weSBiL0xpYi9wbGF0LW1hYy9maW5kZXJ0b29scy5weQppbmRleCBiMzIyM2JkLi41NGIxYmRlIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvZmluZGVydG9vbHMucHkKKysrIGIvTGliL3BsYXQtbWFjL2ZpbmRlcnRvb2xzLnB5CkBAIC0zNCwyMiArMzQsMjIgQEAKICAgICBnbG9iYWwgX2ZpbmRlcl90YWxrZXIKICAgICBpZiBub3QgX2ZpbmRlcl90YWxrZXI6CiAgICAgICAgIF9maW5kZXJfdGFsa2VyID0gRmluZGVyLkZpbmRlcigpCi0gICAgX2ZpbmRlcl90YWxrZXIuc2VuZF9mbGFncyA9ICggX2ZpbmRlcl90YWxrZXIuc2VuZF9mbGFncyB8IAorICAgIF9maW5kZXJfdGFsa2VyLnNlbmRfZmxhZ3MgPSAoIF9maW5kZXJfdGFsa2VyLnNlbmRfZmxhZ3MgfAogICAgICAgICBBcHBsZUV2ZW50cy5rQUVDYW5JbnRlcmFjdCB8IEFwcGxlRXZlbnRzLmtBRUNhblN3aXRjaExheWVyKQogICAgIHJldHVybiBfZmluZGVyX3RhbGtlcgotICAgIAorCiBkZWYgbGF1bmNoKGZpbGUpOgogICAgICIiIk9wZW4gYSBmaWxlIHRocnUgdGhlIGZpbmRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjIiIiCiAgICAgZmluZGVyID0gX2dldGZpbmRlcigpCiAgICAgZnNzID0gQ2FyYm9uLkZpbGUuRlNTcGVjKGZpbGUpCiAgICAgcmV0dXJuIGZpbmRlci5vcGVuKGZzcykKLSAgICAKKwogZGVmIFByaW50KGZpbGUpOgogICAgICIiIlByaW50IGEgZmlsZSB0aHJ1IHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYyIiIgogICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQogICAgIGZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhmaWxlKQogICAgIHJldHVybiBmaW5kZXIuX3ByaW50KGZzcykKLSAgICAKKwogZGVmIGNvcHkoc3JjLCBkc3RkaXIpOgogICAgICIiIkNvcHkgYSBmaWxlIHRvIGEgZm9sZGVyIiIiCiAgICAgZmluZGVyID0gX2dldGZpbmRlcigpCkBAIC03MywxNyArNzMsMTcgQEAKICAgICAgICAgc3JjX2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhzcmMpCiAgICAgZHN0X2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhkc3RkaXIpCiAgICAgcmV0dXJuIGZpbmRlci5tb3ZlKHNyY19mc3MsIHRvPWRzdF9mc3MpCi0gICAgCisKIGRlZiBzbGVlcCgpOgogICAgICIiIlB1dCB0aGUgbWFjIHRvIHNsZWVwIiIiCiAgICAgZmluZGVyID0gX2dldGZpbmRlcigpCiAgICAgZmluZGVyLnNsZWVwKCkKLSAgICAKKwogZGVmIHNodXRkb3duKCk6CiAgICAgIiIiU2h1dCB0aGUgbWFjIGRvd24iIiIKICAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKICAgICBmaW5kZXIuc2h1dF9kb3duKCkKLSAgICAKKwogZGVmIHJlc3RhcnQoKToKICAgICAiIiJSZXN0YXJ0IHRoZSBtYWMiIiIKICAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKQEAgLTEwMCwxNiArMTAwLDE2IEBACiAgICAgZnNyID0gQ2FyYm9uLkZpbGUuRlNSZWYoZmlsZSkKICAgICBmaWxlX2FsaWFzID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKICAgICByZXR1cm4gZmluZGVyLnJldmVhbChmaWxlX2FsaWFzKQotICAgIAorCiBkZWYgc2VsZWN0KGZpbGUpOgogICAgICIiInNlbGVjdCBhIGZpbGUgaW4gdGhlIGZpbmRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUsIGZzcmVmIG9yIGZzc3BlYy4iIiIKICAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKICAgICBmc3IgPSBDYXJib24uRmlsZS5GU1JlZihmaWxlKQogICAgIGZpbGVfYWxpYXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQogICAgIHJldHVybiBmaW5kZXIuc2VsZWN0KGZpbGVfYWxpYXMpCi0gICAgCisKIGRlZiB1cGRhdGUoZmlsZSk6Ci0gICAgIiIiVXBkYXRlIHRoZSBkaXNwbGF5IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpIHRvIG1hdGNoIAorICAgICIiIlVwZGF0ZSB0aGUgZGlzcGxheSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdChzKSB0byBtYXRjaAogICAgIHRoZWlyIG9uLWRpc2sgcmVwcmVzZW50YXRpb24uIFNwZWNpZnkgZmlsZSBieSBuYW1lLCBmc3JlZiBvciBmc3NwZWMuIiIiCiAgICAgZmluZGVyID0gX2dldGZpbmRlcigpCiAgICAgZnNyID0gQ2FyYm9uLkZpbGUuRlNSZWYoZmlsZSkKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAgICByZXR1cm4gX2dldGNvbW1lbnQob2JqZWN0X2FsaWFzKQogICAgIGVsc2U6CiAgICAgICAgIHJldHVybiBfc2V0Y29tbWVudChvYmplY3RfYWxpYXMsIGNvbW1lbnQpCi0gICAgCisKIGRlZiBfc2V0Y29tbWVudChvYmplY3RfYWxpYXMsIGNvbW1lbnQpOgogICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQogICAgIGFyZ3MgPSB7fQpAQCAtMjE5LDExICsyMTksMTEgQEAKICAgICAgICAgaWYgbiA9PSBwcm9jZXNzbmFtZToKICAgICAgICAgICAgIHJldHVybiAxCiAgICAgcmV0dXJuIDAKLSAgICAKKwogZGVmIHByb2Nlc3NpbmZvKHByb2Nlc3NuYW1lKToKICAgICAiIiJSZXR1cm4gYW4gb2JqZWN0IHdpdGggYWxsIHByb2Nlc3MgcHJvcGVydGllcyBhcyBhdHRyaWJ1dGVzIGZvciBwcm9jZXNzbmFtZS4gTWFjT1M5IiIiCiAgICAgcCA9IF9wcm9jZXNzKCkKLSAgICAKKwogICAgIGlmIHByb2Nlc3NuYW1lID09ICJGaW5kZXIiOgogICAgICAgICBwLnBhcnRpdGlvbiA9IE5vbmUKICAgICAgICAgcC51c2VkID0gTm9uZQpAQCAtMjM4LDcgKzIzOCw3IEBACiAgICAgcC5hY2NlcHRoaWdobGV2ZWwgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncmV2dCcpICAgI0lzIHRoZSBwcm9jZXNzIGhpZ2gtbGV2ZWwgZXZlbnQgYXdhcmUgKGFjY2VwdHMgb3BlbiBhcHBsaWNhdGlvbiwgb3BlbiBkb2N1bWVudCwgcHJpbnQgZG9jdW1lbnQsIGFuZCBxdWl0KT8KICAgICBwLmhhc3NjcmlwdGluZyA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdoc2NyJykgICAgICAjRG9lcyB0aGUgcHJvY2VzcyBoYXZlIGEgc2NyaXB0aW5nIHRlcm1pbm9sb2d5LCBpLmUuLCBjYW4gaXQgYmUgc2NyaXB0ZWQ/CiAgICAgcmV0dXJuIHAKLSAgICAKKwogZGVmIF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsIHByb3BlcnR5KToKICAgICAiIiJyZXR1cm4gdGhlIHBhcnRpdGlvbiBzaXplIGFuZCBtZW1vcnkgdXNlZCBmb3IgcHJvY2Vzc25hbWUiIiIKICAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKQEAgLTI1Niw3ICsyNTYsNyBAQAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjICAgTWVzcyBhcm91bmQgd2l0aCBGaW5kZXIgd2luZG93cy4KLSAgICAKKwogZGVmIG9wZW53aW5kb3cob2JqZWN0KToKICAgICAiIiJPcGVuIGEgRmluZGVyIHdpbmRvdyBmb3Igb2JqZWN0LCBTcGVjaWZ5IG9iamVjdCBieSBuYW1lIG9yIGZzc3BlYy4iIiIKICAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKQEAgLTI3MSw3ICsyNzEsNyBAQAogICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQogICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgogICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotICAgIAorCiBkZWYgY2xvc2V3aW5kb3cob2JqZWN0KToKICAgICAiIiJDbG9zZSBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciwgU3BlY2lmeSBieSBwYXRoLiIiIgogICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQpAQCAtMjk1LDcgKzI5NSw3IEBACiAgICAgaWYgbm90IHBvczoKICAgICAgICAgcmV0dXJuIF9nZXRsb2NhdGlvbihvYmplY3RfYWxpYXMpCiAgICAgcmV0dXJuIF9zZXRsb2NhdGlvbihvYmplY3RfYWxpYXMsIHBvcykKLSAgICAKKwogZGVmIF9zZXRsb2NhdGlvbihvYmplY3RfYWxpYXMsICh4LCB5KSk6CiAgICAgIiIiX3NldGxvY2F0aW9uOiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBpY29uIGZvciB0aGUgb2JqZWN0LiIiIgogICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQpAQCAtMzA5LDcgKzMwOSw3IEBACiAgICAgaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CiAgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCiAgICAgcmV0dXJuICh4LHkpCi0gICAgCisKIGRlZiBfZ2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzKToKICAgICAiIiJfZ2V0bG9jYXRpb246IGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGljb24gZm9yIHRoZSBvYmplY3QuIiIiCiAgICAgZmluZGVyID0gX2dldGZpbmRlcigpCkBAIC0zMzQsNyArMzM0LDcgQEAKICAgICBpZiBpbmRleCA8IDAgb3IgaW5kZXggPiA3OgogICAgICAgICBpbmRleCA9IDAKICAgICByZXR1cm4gX3NldGxhYmVsKG9iamVjdF9hbGlhcywgaW5kZXgpCi0gICAgCisKIGRlZiBfZ2V0bGFiZWwob2JqZWN0X2FsaWFzKToKICAgICAiIiJsYWJlbDogR2V0IHRoZSBsYWJlbCBmb3IgdGhlIG9iamVjdC4iIiIKICAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKQEAgLTM3OCw3ICszNzgsNyBAQAogICAgIGlmIHZpZXcgPT0gTm9uZToKICAgICAgICAgcmV0dXJuIF9nZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlhcykKICAgICByZXR1cm4gX3NldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzLCB2aWV3KQotICAgIAorCiBkZWYgX3NldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzLCB2aWV3PTApOgogICAgICIiInNldCB0aGUgd2luZG93dmlldyIiIgogICAgIGF0dHJzID0ge30KQEAgLTM5MCwxMyArMzkwLDEzIEBACiAgICAgZWxzZToKICAgICAgICAgX3YgPSBhZXR5cGVzLlR5cGUoJ2lpbWcnKQogICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQotICAgIGFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdjZm9sJyksIAorICAgIGFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdjZm9sJyksCiAgICAgICAgICAgICBmb3JtID0gJ2FsaXMnLCBzZWxkID0gZm9sZGVyX2FsaWFzLCBmcj1Ob25lKQotICAgIGFlb2JqXzEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdwcm9wJyksIAorICAgIGFlb2JqXzEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdwcm9wJyksCiAgICAgICAgICAgICBmb3JtID0gJ3Byb3AnLCBzZWxkID0gYWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCi0gICAgYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisgICAgYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ3Byb3AnKSwKICAgICAgICAgICAgIGZvcm0gPSAncHJvcCcsIHNlbGQgPSBhZXR5cGVzLlR5cGUoJ3B2ZXcnKSwgZnI9YWVvYmpfMSkKLSAgICBhZW9ial8zID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudCA9IGFldHlwZXMuVHlwZSgncHJvcCcpLCAKKyAgICBhZW9ial8zID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudCA9IGFldHlwZXMuVHlwZSgncHJvcCcpLAogICAgICAgICAgICAgZm9ybSA9ICdwcm9wJywgc2VsZCA9IF92LCBmcj1Ob25lKQogICAgIF9jb2RlID0gJ2NvcmUnCiAgICAgX3N1YmNvZGUgPSAnc2V0ZCcKQEAgLTQzNyw3ICs0MzcsNyBAQAogICAgIGlmIG5vdCBzaXplOgogICAgICAgICByZXR1cm4gX2dldHdpbmRvd3NpemUoZm9sZGVyX2FsaWFzKQogICAgIHJldHVybiBfc2V0d2luZG93c2l6ZShmb2xkZXJfYWxpYXMsIHNpemUpCi0gICAgCisKIGRlZiBfc2V0d2luZG93c2l6ZShmb2xkZXJfYWxpYXMsICh3LCBoKSk6CiAgICAgIiIiU2V0IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyIHRvICh3LCBoKSIiIgogICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQpAQCAtNDQ4LDkgKzQ0OCw5IEBACiAgICAgYWV2YXIwMCA9IFt3LCBoXQogICAgIGFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLAogICAgICAgICAgICAgZm9ybT0iYWxpcyIsIHNlbGQ9Zm9sZGVyX2FsaWFzLCBmcj1Ob25lKQotICAgIGFlb2JqXzEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCAKKyAgICBhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKICAgICAgICAgICAgIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wKQotICAgIGFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCAKKyAgICBhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKICAgICAgICAgICAgIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncHRzeicpLCBmcj1hZW9ial8xKQogICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzIKICAgICBhcmdzWyJkYXRhIl0gPSBhZXZhcjAwCkBAIC00NTgsMTcgKzQ1OCwxNyBAQAogICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgogICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQogICAgIHJldHVybiAodywgaCkKLSAgICAgICAgCisKIGRlZiBfZ2V0d2luZG93c2l6ZShmb2xkZXJfYWxpYXMpOgogICAgICIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byAodywgaCkiIiIKICAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKICAgICBhcmdzID0ge30KICAgICBhdHRycyA9IHt9Ci0gICAgYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIAorICAgIGFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLAogICAgICAgICAgICAgZm9ybT0iYWxpcyIsIHNlbGQ9Zm9sZGVyX2FsaWFzLCBmcj1Ob25lKQotICAgIGFlb2JqXzEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCAKKyAgICBhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKICAgICAgICAgICAgIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wKQotICAgIGFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCAKKyAgICBhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKICAgICAgICAgICAgIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncG9zbicpLCBmcj1hZW9ial8xKQogICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzIKICAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoJ2NvcmUnLCAnZ2V0ZCcsIGFyZ3MsIGF0dHJzKQpAQCAtNDg4LDE3ICs0ODgsMTcgQEAKICAgICAgICAgIyBwb3MgbWlnaHQgYmUgYSBRRFBvaW50IG9iamVjdCBhcyByZXR1cm5lZCBieSBfZ2V0d2luZG93cG9zaXRpb24KICAgICAgICAgcG9zID0gKHBvcy5oLCBwb3MudikKICAgICByZXR1cm4gX3NldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcywgcG9zKQotICAgICAgICAgICAgCisKIGRlZiBfc2V0d2luZG93cG9zaXRpb24oZm9sZGVyX2FsaWFzLCAoeCwgeSkpOgogICAgICIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byAodywgaCkuIiIiCiAgICAgZmluZGVyID0gX2dldGZpbmRlcigpCiAgICAgYXJncyA9IHt9CiAgICAgYXR0cnMgPSB7fQotICAgIGFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCAKKyAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwKICAgICAgICAgICAgIGZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKLSAgICBhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisgICAgYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksCiAgICAgICAgICAgICBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKLSAgICBhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisgICAgYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksCiAgICAgICAgICAgICBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMSkKICAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8yCiAgICAgYXJnc1siZGF0YSJdID0gW3gsIHldCkBAIC01MTMsMTEgKzUxMywxMSBAQAogICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQogICAgIGFyZ3MgPSB7fQogICAgIGF0dHJzID0ge30KLSAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCisgICAgYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksCiAgICAgICAgICAgICBmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCi0gICAgYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorICAgIGFlb2JqXzEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLAogICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCi0gICAgYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorICAgIGFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLAogICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdHN6JyksIGZyPWFlb2JqXzEpCiAgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMgogICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCkBAIC01MzYsMTUgKzUzNiwxNSBAQAogICAgIGlmIGljb25kYXRhID09IE5vbmU6CiAgICAgICAgIHJldHVybiBfZ2V0aWNvbihvYmplY3RfYWxpYXMpCiAgICAgcmV0dXJuIF9zZXRpY29uKG9iamVjdF9hbGlhcywgaWNvbmRhdGEpCi0gICAgCisKIGRlZiBfZ2V0aWNvbihvYmplY3RfYWxpYXMpOgogICAgICIiImdldCB0aGUgaWNvbmRhdGEgZm9yIG9iamVjdC4gQmluYXJ5IGRhdGEgb2Ygc29tZSBzb3J0LiIiIgogICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQogICAgIGFyZ3MgPSB7fQogICAgIGF0dHJzID0ge30KLSAgICBhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksIAorICAgIGFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2NvYmonKSwKICAgICAgICAgICAgIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKLSAgICBhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorICAgIGFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKICAgICAgICAgICAgIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnaWltZycpLCBmcj1hZW9ial8wMCkKICAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8wMQogICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCkBAIC01NTgsOSArNTU4LDkgQEAKICAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKICAgICBhcmdzID0ge30KICAgICBhdHRycyA9IHt9Ci0gICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCAKKyAgICBhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksCiAgICAgICAgICAgICBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCi0gICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCAKKyAgICBhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksCiAgICAgICAgICAgICBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2lpbWcnKSwgZnI9YWVvYmpfMDApCiAgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMDEKICAgICBhcmdzWyJkYXRhIl0gPSBpY29uZGF0YQpAQCAtNTczLDcgKzU3Myw3IEBACiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgICBWb2x1bWVzIGFuZCBzZXJ2ZXJzLgotICAgIAorCiBkZWYgbW91bnR2b2x1bWUodm9sdW1lLCBzZXJ2ZXI9Tm9uZSwgdXNlcm5hbWU9Tm9uZSwgcGFzc3dvcmQ9Tm9uZSk6CiAgICAgIiIibW91bnQgYSB2b2x1bWUsIGxvY2FsIG9yIG9uIGEgc2VydmVyIG9uIEFwcGxlVGFsay4KICAgICBOb3RlOiBtb3VudGluZyBhIEFTSVAgc2VydmVyIHJlcXVpcmVzIGEgZGlmZmVyZW50IG9wZXJhdGlvbi4KQEAgLTU5OCw3ICs1OTgsNyBAQAogZGVmIHVubW91bnR2b2x1bWUodm9sdW1lKToKICAgICAiIiJ1bm1vdW50IGEgdm9sdW1lIHRoYXQncyBvbiB0aGUgZGVza3RvcCIiIgogICAgIHB1dGF3YXkodm9sdW1lKQotICAgIAorCiBkZWYgcHV0YXdheShvYmplY3QpOgogICAgICIiInB1dGggdGhlIG9iamVjdCBhd2F5LCB3aGVyZWV2ZXIgaXQgY2FtZSBmcm9tLiIiIgogICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQpAQCAtNjc1LDcgKzY3NSw3IEBACiAgICAgICAgIGlmIGFyZ3NbJy0tLS0nXSA9PSAxOgogICAgICAgICAgICAgc3RhdHVzID0gMAogICAgIHJldHVybiBzdGF0dXMKLSAgICAKKwogZGVmIG1vdmV0b3RyYXNoKHBhdGgpOgogICAgICIiIm1vdmUgdGhlIG9iamVjdCB0byB0aGUgdHJhc2giIiIKICAgICBmc3MgPSBDYXJib24uRmlsZS5GU1NwZWMocGF0aCkKQEAgLTc2Niw3ICs3NjYsNyBAQAogICAgICMgc2V0IHRoZSBzb3VuZHZvbHVtZSBpbiBhIHNpbXBsZSB3YXkKICAgICBwcmludCAnXHRTeXN0ZW0gYmVlcCB2b2x1bWUnCiAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgNyk6Ci0gICAgICAgIHZvbHVtZWxldmVsKGkpICAgICAgCisgICAgICAgIHZvbHVtZWxldmVsKGkpCiAgICAgICAgIE1hY09TLlN5c0JlZXAoKQogCiAgICAgIyBGaW5kZXIncyB3aW5kb3dzLCBmaWxlIGxvY2F0aW9uLCBmaWxlIGF0dHJpYnV0ZXMKQEAgLTgwNSw3ICs4MDUsNyBAQAogICAgIHByaW50ICdcdCcsIGNvbW1lbnQoZikgICAgICAjIHByaW50IHRoZSBGaW5kZXIgY29tbWVudCB0aGlzIGZpbGUgaGFzCiAgICAgcyA9ICdUaGlzIGlzIGEgY29tbWVudCBubyBvbmUgcmVhZHMhJwogICAgIGNvbW1lbnQoZiwgcykgICAgICAgICAgICMgc2V0IHRoZSBGaW5kZXIgY29tbWVudAotICAgIAorCiBkZWYgX3Rlc3QzKCk6CiAgICAgcHJpbnQgJ01hY09TOSBvciBiZXR0ZXIgc3BlY2lmaWMgZnVuY3Rpb25zJwogICAgICMgcHJvY2Vzc2VzCkBAIC04MTMsNyArODEzLDcgQEAKICAgICBwcmludCAnUmV0dXJuIGEgbGlzdCBvZiBjdXJyZW50IGFjdGl2ZSBwcm9jZXNzZXM6JwogICAgIGZvciBwIGluIHByOgogICAgICAgICBwcmludCAnXHQnLCBwCi0gICAgCisKICAgICAjIGdldCBhdHRyaWJ1dGVzIG9mIHRoZSBmaXJzdCBwcm9jZXNzIGluIHRoZSBsaXN0CiAgICAgcHJpbnQgJ0F0dHJpYnV0ZXMgb2YgdGhlIGZpcnN0IHByb2Nlc3MgaW4gdGhlIGxpc3Q6JwogICAgIHBpbmZvID0gcHJvY2Vzc2luZm8ocHJbMF1bMF0pCkBAIC04MjksNCArODI5LDMgQEAKICAgICBfdGVzdCgpCiAgICAgX3Rlc3QyKCkKICAgICBfdGVzdDMoKQotICAgIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2dlbnN1aXRlbW9kdWxlLnB5IGIvTGliL3BsYXQtbWFjL2dlbnN1aXRlbW9kdWxlLnB5CmluZGV4IGFiM2MwNzAuLjg3MTMyYzUgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9nZW5zdWl0ZW1vZHVsZS5weQorKysgYi9MaWIvcGxhdC1tYWMvZ2Vuc3VpdGVtb2R1bGUucHkKQEAgLTMxLDcgKzMxLDcgQEAKIGRlZiB1c2FnZSgpOgogICAgIHN5cy5zdGRlcnIud3JpdGUoIlVzYWdlOiAlcyBbb3B0c10gYXBwbGljYXRpb24tb3ItcmVzb3VyY2UtZmlsZVxuIiAlIHN5cy5hcmd2WzBdKQogICAgIHN5cy5zdGRlcnIud3JpdGUoIiIiT3B0aW9uczoKLS0tb3V0cHV0IHBrZ2RpciAgUGF0aG5hbWUgb2YgdGhlIG91dHB1dCBwYWNrYWdlIChzaG9ydDogLW8pICAKKy0tb3V0cHV0IHBrZ2RpciAgUGF0aG5hbWUgb2YgdGhlIG91dHB1dCBwYWNrYWdlIChzaG9ydDogLW8pCiAtLXJlc291cmNlICAgICAgIFBhcnNlIHJlc291cmNlIGZpbGUgaW4gc3RlYWQgb2YgbGF1bmNoaW5nIGFwcGxpY2F0aW9uICgtcikKIC0tYmFzZSBwYWNrYWdlICAgVXNlIGFub3RoZXIgYmFzZSBwYWNrYWdlIGluIHN0ZWFkIG9mIGRlZmF1bHQgU3RkU3VpdGVzICgtYikKIC0tZWRpdCBvbGQ9bmV3ICAgRWRpdCBzdWl0ZSBuYW1lcywgdXNlIGVtcHR5IG5ldyB0byBza2lwIGEgc3VpdGUgKC1lKQpAQCAtNDksNyArNDksNyBAQAogICAgICAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCBTSE9SVE9QVFMsIExPTkdPUFRTKQogICAgICAgICBleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgogICAgICAgICAgICAgdXNhZ2UoKQotICAgICAgICAKKwogICAgICAgICBwcm9jZXNzX2Z1bmMgPSBwcm9jZXNzZmlsZQogICAgICAgICBiYXNlcGtnbmFtZSA9ICdTdGRTdWl0ZXMnCiAgICAgICAgIG91dHB1dCA9IE5vbmUKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgY3JlYXRvcnNpZ25hdHVyZSA9IE5vbmUKICAgICAgICAgZHVtcCA9IE5vbmUKICAgICAgICAgdmVyYm9zZSA9IE5vbmUKLSAgICAgICAgCisKICAgICAgICAgZm9yIG8sIGEgaW4gb3B0czoKICAgICAgICAgICAgIGlmIG8gaW4gKCctcicsICctLXJlc291cmNlJyk6CiAgICAgICAgICAgICAgICAgcHJvY2Vzc19mdW5jID0gcHJvY2Vzc2ZpbGVfZnJvbXJlc291cmNlCkBAIC03OSwxOSArNzksMTkgQEAKICAgICAgICAgICAgICAgICBkdW1wID0gc3lzLnN0ZG91dAogICAgICAgICAgICAgaWYgbyBpbiAoJy12JywgJy0tdmVyYm9zZScpOgogICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBzeXMuc3RkZXJyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAorCisKICAgICAgICAgaWYgb3V0cHV0IGFuZCBsZW4oYXJncykgPiAxOgogICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6IGNhbm5vdCBzcGVjaWZ5IC0tb3V0cHV0IHdpdGggbXVsdGlwbGUgaW5wdXRzXG4iICUgc3lzLmFyZ3ZbMF0pCiAgICAgICAgICAgICBzeXMuZXhpdCgxKQotICAgICAgICAgICAgCisKICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6Ci0gICAgICAgICAgICBwcm9jZXNzX2Z1bmMoZmlsZW5hbWUsIG91dHB1dD1vdXRwdXQsIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLCAKKyAgICAgICAgICAgIHByb2Nlc3NfZnVuYyhmaWxlbmFtZSwgb3V0cHV0PW91dHB1dCwgYmFzZXBrZ25hbWU9YmFzZXBrZ25hbWUsCiAgICAgICAgICAgICAgICAgZWRpdF9tb2RuYW1lcz1lZGl0X21vZG5hbWVzLCBjcmVhdG9yc2lnbmF0dXJlPWNyZWF0b3JzaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgZHVtcD1kdW1wLCB2ZXJib3NlPXZlcmJvc2UpCiAgICAgZWxzZToKICAgICAgICAgbWFpbl9pbnRlcmFjdGl2ZSgpCi0gICAgICAgIAorCiBkZWYgbWFpbl9pbnRlcmFjdGl2ZShpbnRlcmFjdD0wLCBiYXNlcGtnbmFtZT0nU3RkU3VpdGVzJyk6CiAgICAgaWYgaW50ZXJhY3Q6CiAgICAgICAgICMgQXNrIGZvciBzYXZlLWZpbGVuYW1lIGZvciBlYWNoIG1vZHVsZQpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgIHByaW50ICJSZXRyeSwgbWFudWFsbHkgcGFyc2luZyByZXNvdXJjZXMiCiAgICAgICAgIHByb2Nlc3NmaWxlX2Zyb21yZXNvdXJjZShmaWxlbmFtZSwgZWRpdF9tb2RuYW1lcz1lZGl0X21vZG5hbWVzLAogICAgICAgICAgICAgYmFzZXBrZ25hbWU9YmFzZXBrZ25hbWUsIHZlcmJvc2U9c3lzLnN0ZGVycikKLSAgICAgICAgICAgIAorCiBkZWYgaXNfc2NyaXB0YWJsZShhcHBsaWNhdGlvbik6CiAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHNjcmlwdGFibGUiIiIKICAgICBpZiBvcy5wYXRoLmlzZGlyKGFwcGxpY2F0aW9uKToKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgIFVzZVJlc0ZpbGUoY3VycmYpCiAgICAgcmV0dXJuIG5fdGVybWlub2xvZ3kgPiAwCiAKLWRlZiBwcm9jZXNzZmlsZV9mcm9tcmVzb3VyY2UoZnVsbG5hbWUsIG91dHB1dD1Ob25lLCBiYXNlcGtnbmFtZT1Ob25lLCAKK2RlZiBwcm9jZXNzZmlsZV9mcm9tcmVzb3VyY2UoZnVsbG5hbWUsIG91dHB1dD1Ob25lLCBiYXNlcGtnbmFtZT1Ob25lLAogICAgICAgICBlZGl0X21vZG5hbWVzPU5vbmUsIGNyZWF0b3JzaWduYXR1cmU9Tm9uZSwgZHVtcD1Ob25lLCB2ZXJib3NlPU5vbmUpOgogICAgICIiIlByb2Nlc3MgYWxsIHJlc291cmNlcyBpbiBhIHNpbmdsZSBmaWxlIiIiCiAgICAgaWYgbm90IGlzX3NjcmlwdGFibGUoZnVsbG5hbWUpIGFuZCB2ZXJib3NlOgpAQCAtMTU5LDcgKzE1OSw3IEBACiAgICAgICAgIGZvciBpIGluIHJhbmdlKENvdW50MVJlc291cmNlcygnYWV1dCcpKToKICAgICAgICAgICAgIHJlcyA9IEdldDFJbmRSZXNvdXJjZSgnYWV1dCcsIDEraSkKICAgICAgICAgICAgIHJlc291cmNlcy5hcHBlbmQocmVzKQotICAgICAgICBpZiB2ZXJib3NlOiAKKyAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50ID4+dmVyYm9zZSwgIlxuTElTVElORyBhZXRlK2FldXQgUkVTT1VSQ0VTIElOIiwgcmVwcihmdWxsbmFtZSkKICAgICAgICAgYWV0ZWxpc3QgPSBbXQogICAgICAgICBmb3IgcmVzIGluIHJlc291cmNlczoKQEAgLTE3NiwxMSArMTc2LDExIEBACiAgICAgVXNlUmVzRmlsZShjdXIpCiAgICAgaWYgZHVtcDoKICAgICAgICAgZHVtcGFldGVsaXN0KGFldGVsaXN0LCBkdW1wKQotICAgIGNvbXBpbGVhZXRlbGlzdChhZXRlbGlzdCwgZnVsbG5hbWUsIG91dHB1dD1vdXRwdXQsIAorICAgIGNvbXBpbGVhZXRlbGlzdChhZXRlbGlzdCwgZnVsbG5hbWUsIG91dHB1dD1vdXRwdXQsCiAgICAgICAgIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLCBlZGl0X21vZG5hbWVzPWVkaXRfbW9kbmFtZXMsCiAgICAgICAgIGNyZWF0b3JzaWduYXR1cmU9Y3JlYXRvcnNpZ25hdHVyZSwgdmVyYm9zZT12ZXJib3NlKQogCi1kZWYgcHJvY2Vzc2ZpbGUoZnVsbG5hbWUsIG91dHB1dD1Ob25lLCBiYXNlcGtnbmFtZT1Ob25lLCAKK2RlZiBwcm9jZXNzZmlsZShmdWxsbmFtZSwgb3V0cHV0PU5vbmUsIGJhc2Vwa2duYW1lPU5vbmUsCiAgICAgICAgIGVkaXRfbW9kbmFtZXM9Tm9uZSwgY3JlYXRvcnNpZ25hdHVyZT1Ob25lLCBkdW1wPU5vbmUsCiAgICAgICAgIHZlcmJvc2U9Tm9uZSk6CiAgICAgIiIiQXNrIGFuIGFwcGxpY2F0aW9uIGZvciBpdHMgdGVybWlub2xvZ3kgYW5kIHByb2Nlc3MgdGhhdCIiIgpAQCAtMjA0LDcgKzIwNCw3IEBACiAgICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgIHByaW50ID4+dmVyYm9zZSwgIkxhdW5jaGVkIiwgZnVsbG5hbWUKICAgICAgICAgcmF3ID0gYWV0b29scy51bnBhY2soYWVkZXNjb2JqKQotICAgICAgICBpZiBub3QgcmF3OiAKKyAgICAgICAgaWYgbm90IHJhdzoKICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgcHJpbnQgPj52ZXJib3NlLCAnVW5wYWNrIHJldHVybmVkIGVtcHR5IHZhbHVlOicsIHJhdwogICAgICAgICAgICAgcmV0dXJuCkBAIC0yMTgsOSArMjE4LDkgQEAKICAgICAgICAgZHVtcGFldGVsaXN0KFthZXRlXSwgZHVtcCkKICAgICAgICAgcmV0dXJuCiAgICAgY29tcGlsZWFldGUoYWV0ZSwgTm9uZSwgZnVsbG5hbWUsIG91dHB1dD1vdXRwdXQsIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLAotICAgICAgICBjcmVhdG9yc2lnbmF0dXJlPWNyZWF0b3JzaWduYXR1cmUsIGVkaXRfbW9kbmFtZXM9ZWRpdF9tb2RuYW1lcywgCisgICAgICAgIGNyZWF0b3JzaWduYXR1cmU9Y3JlYXRvcnNpZ25hdHVyZSwgZWRpdF9tb2RuYW1lcz1lZGl0X21vZG5hbWVzLAogICAgICAgICB2ZXJib3NlPXZlcmJvc2UpCi0gICAgICAgIAorCiBkZWYgZ2V0YXBwdGVybWlub2xvZ3koZnVsbG5hbWUsIHZlcmJvc2U9Tm9uZSk6CiAgICAgIiIiR2V0IGFwcGxpY2F0aW9uIHRlcm1pbm9sb2d5IGJ5IHNlbmRpbmcgYW4gQXBwbGVFdmVudCIiIgogICAgICMgRmlyc3QgY2hlY2sgdGhhdCB3ZSBhY3R1YWxseSBjYW4gc2VuZCBBcHBsZUV2ZW50cwpAQCAtMjUxLDE5ICsyNTEsMTkgQEAKICAgICAjcmVwbHkyID0gdGFsa2VyLnNlbmQoImFzY3IiLCAiZ2R1dCIpCiAgICAgIyBOb3cgcGljayB0aGUgYml0cyBvdXQgb2YgdGhlIHJldHVybiB0aGF0IHdlIG5lZWQuCiAgICAgcmV0dXJuIHJlcGx5WzFdWyctLS0tJ10sIGNyCi0gICAgCiAKLWRlZiBjb21waWxlYWV0ZWxpc3QoYWV0ZWxpc3QsIGZ1bGxuYW1lLCBvdXRwdXQ9Tm9uZSwgYmFzZXBrZ25hbWU9Tm9uZSwgCisKK2RlZiBjb21waWxlYWV0ZWxpc3QoYWV0ZWxpc3QsIGZ1bGxuYW1lLCBvdXRwdXQ9Tm9uZSwgYmFzZXBrZ25hbWU9Tm9uZSwKICAgICAgICAgICAgIGVkaXRfbW9kbmFtZXM9Tm9uZSwgY3JlYXRvcnNpZ25hdHVyZT1Ob25lLCB2ZXJib3NlPU5vbmUpOgogICAgIGZvciBhZXRlLCByZXNpbmZvIGluIGFldGVsaXN0OgotICAgICAgICBjb21waWxlYWV0ZShhZXRlLCByZXNpbmZvLCBmdWxsbmFtZSwgb3V0cHV0PW91dHB1dCwgCisgICAgICAgIGNvbXBpbGVhZXRlKGFldGUsIHJlc2luZm8sIGZ1bGxuYW1lLCBvdXRwdXQ9b3V0cHV0LAogICAgICAgICAgICAgYmFzZXBrZ25hbWU9YmFzZXBrZ25hbWUsIGVkaXRfbW9kbmFtZXM9ZWRpdF9tb2RuYW1lcywKICAgICAgICAgICAgIGNyZWF0b3JzaWduYXR1cmU9Y3JlYXRvcnNpZ25hdHVyZSwgdmVyYm9zZT12ZXJib3NlKQogCiBkZWYgZHVtcGFldGVsaXN0KGFldGVsaXN0LCBvdXRwdXQpOgogICAgIGltcG9ydCBwcHJpbnQKICAgICBwcHJpbnQucHByaW50KGFldGVsaXN0LCBvdXRwdXQpCi0gICAgCisKIGRlZiBkZWNvZGUoZGF0YSwgdmVyYm9zZT1Ob25lKToKICAgICAiIiJEZWNvZGUgYSByZXNvdXJjZSBpbnRvIGEgcHl0aG9uIGRhdGEgc3RydWN0dXJlIiIiCiAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKGRhdGEpCkBAIC00MjcsNyArNDI3LDcgQEAKICAgICAoZ2V0bGlzdCwgInN1aXRlcyIsIGdldHN1aXRlKQogICAgIF0KIAotZGVmIGNvbXBpbGVhZXRlKGFldGUsIHJlc2luZm8sIGZuYW1lLCBvdXRwdXQ9Tm9uZSwgYmFzZXBrZ25hbWU9Tm9uZSwgCitkZWYgY29tcGlsZWFldGUoYWV0ZSwgcmVzaW5mbywgZm5hbWUsIG91dHB1dD1Ob25lLCBiYXNlcGtnbmFtZT1Ob25lLAogICAgICAgICBlZGl0X21vZG5hbWVzPU5vbmUsIGNyZWF0b3JzaWduYXR1cmU9Tm9uZSwgdmVyYm9zZT1Ob25lKToKICAgICAiIiJHZW5lcmF0ZSBjb2RlIGZvciBhIGZ1bGwgYWV0ZSByZXNvdXJjZS4gZm5hbWUgcGFzc2VkIGZvciBkb2MgcHVycG9zZXMiIiIKICAgICBbdmVyc2lvbiwgbGFuZ3VhZ2UsIHNjcmlwdCwgc3VpdGVzXSA9IGFldGUKQEAgLTUwMCw3ICs1MDAsNyBAQAogICAgIGZwLndyaXRlKCJ9XG5cbiIpCiAgICAgZm9yIGNvZGUsIG1vZG5hbWUgaW4gc3VpdGVsaXN0OgogICAgICAgICBmcC53cml0ZSgiZnJvbSAlcyBpbXBvcnQgKlxuIiVtb2RuYW1lKQotICAgIAorCiAgICAgIyBHZW5lcmF0ZSBwcm9wZXJ0eSBkaWN0cyBhbmQgZWxlbWVudCBkaWN0cyBmb3IgYWxsIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCiAgICAgZnAud3JpdGUoIlxuZGVmIGdldGJhc2VjbGFzc2VzKHYpOlxuIikKICAgICBmcC53cml0ZSgiICAgIGlmIG5vdCBnZXRhdHRyKHYsICdfcHJvcGRpY3QnLCBOb25lKTpcbiIpCkBAIC01MzQsNyArNTM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25fY2xhc3MgPSB2CiAgICAgICAgIGZwLndyaXRlKCJ9XG4iKQogCi0gICAgCisKICAgICBpZiBzdWl0ZWxpc3Q6CiAgICAgICAgIGZwLndyaXRlKCJcblxuY2xhc3MgJXMoJXNfRXZlbnRzIiUocGFja2FnZW5hbWUsIHN1aXRlbGlzdFswXVsxXSkpCiAgICAgICAgIGZvciBjb2RlLCBtb2RuYW1lIGluIHN1aXRlbGlzdFsxOl06CkBAIC01NTQsMjIgKzU1NCwyMiBAQAogICAgICAgICBzZWxmLmVkaXRfbW9kbmFtZXMgPSBlZGl0X21vZG5hbWVzCiAgICAgICAgIHNlbGYub3V0cHV0ID0gb3V0cHV0CiAgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKLSAgICAgICAgCisKICAgICAgICAgIyBTZXQgYnkgcHJlY29tcGlsZXN1aXRlCiAgICAgICAgIHNlbGYucGF0aG5hbWUgPSBOb25lCiAgICAgICAgIHNlbGYubW9kbmFtZSA9IE5vbmUKLSAgICAgICAgCisKICAgICAgICAgIyBTZXQgYnkgY29tcGlsZXN1aXRlCiAgICAgICAgIHNlbGYuZnAgPSBOb25lCiAgICAgICAgIHNlbGYuYmFzZW1vZHVsZSA9IE5vbmUKICAgICAgICAgc2VsZi5lbnVtc25lZWRlZCA9IHt9Ci0gICAgICAgICAgICAKKwogICAgIGRlZiBwcmVjb21waWxlc3VpdGUoc2VsZik6CiAgICAgICAgICIiIlBhcnNlIGEgc2luZ2xlIHN1aXRlIHdpdGhvdXQgZ2VuZXJhdGluZyB0aGUgb3V0cHV0LiBUaGlzIHN0ZXAgaXMgbmVlZGVkCiAgICAgICAgIHNvIHdlIGNhbiByZXNvbHZlIHJlY3Vyc2l2ZSByZWZlcmVuY2VzIGJ5IHN1aXRlcyB0byBlbnVtcy9jb21wcy9ldGMgZGVjbGFyZWQKICAgICAgICAgaW4gb3RoZXIgc3VpdGVzIiIiCiAgICAgICAgIFtuYW1lLCBkZXNjLCBjb2RlLCBsZXZlbCwgdmVyc2lvbiwgZXZlbnRzLCBjbGFzc2VzLCBjb21wcywgZW51bXNdID0gc2VsZi5zdWl0ZQotICAgICAgICAKKwogICAgICAgICBtb2RuYW1lID0gaWRlbnRpZnkobmFtZSkKICAgICAgICAgaWYgbGVuKG1vZG5hbWUpID4gMjg6CiAgICAgICAgICAgICBtb2RuYW1lID0gbW9kbmFtZVs6MjddCkBAIC01ODYsOSArNTg2LDkgQEAKICAgICAgICAgICAgICAgICBzZWxmLnBhdGhuYW1lID0gTm9uZQogICAgICAgICBpZiBub3Qgc2VsZi5wYXRobmFtZToKICAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lLCBOb25lCi0gICAgCisKICAgICAgICAgc2VsZi5tb2RuYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLnNwbGl0KHNlbGYucGF0aG5hbWUpWzFdKVswXQotICAgICAgICAKKwogICAgICAgICBpZiBzZWxmLmJhc2VwYWNrYWdlIGFuZCBzZWxmLmJhc2VwYWNrYWdlLl9jb2RlX3RvX21vZHVsZS5oYXNfa2V5KGNvZGUpOgogICAgICAgICAgICAgIyBXZSBhcmUgYW4gZXh0ZW5zaW9uIG9mIGEgYmFzZWNsYXNzICh1c3VhbGx5IGFuIGFwcGxpY2F0aW9uIGV4dGVuZGluZwogICAgICAgICAgICAgIyBTdGFuZGFyZF9TdWl0ZSBvciBzbykuIEltcG9ydCBldmVyeXRoaW5nIGZyb20gb3VyIGJhc2UgbW9kdWxlCkBAIC01OTYsMTEgKzU5NiwxMSBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBXZSBhcmUgbm90IGFuIGV4dGVuc2lvbi4KICAgICAgICAgICAgIGJhc2Vtb2R1bGUgPSBOb25lCi0gICAgCisKICAgICAgICAgc2VsZi5lbnVtc25lZWRlZCA9IHt9CiAgICAgICAgIGZvciBldmVudCBpbiBldmVudHM6CiAgICAgICAgICAgICBzZWxmLmZpbmRlbnVtc2luZXZlbnQoZXZlbnQpCi0gICAgCisKICAgICAgICAgb2JqYyA9IE9iamVjdENvbXBpbGVyKE5vbmUsIHNlbGYubW9kbmFtZSwgYmFzZW1vZHVsZSwgaW50ZXJhY3Q9KHNlbGYuZWRpdF9tb2RuYW1lcyBpcyBOb25lKSwKICAgICAgICAgICAgIHZlcmJvc2U9c2VsZi52ZXJib3NlKQogICAgICAgICBmb3IgY2xzIGluIGNsYXNzZXM6CkBAIC02MTEsMTYgKzYxMSwxNiBAQAogICAgICAgICAgICAgb2JqYy5jb21waWxlY29tcGFyaXNvbihjb21wKQogICAgICAgICBmb3IgZW51bSBpbiBlbnVtczoKICAgICAgICAgICAgIG9iamMuY29tcGlsZWVudW1lcmF0aW9uKGVudW0pCi0gICAgICAgIAorCiAgICAgICAgIGZvciBlbnVtIGluIHNlbGYuZW51bXNuZWVkZWQua2V5cygpOgogICAgICAgICAgICAgb2JqYy5jaGVja2ZvcmVudW0oZW51bSkKLSAgICAgICAgICAgIAorCiAgICAgICAgIG9iamMuZHVtcGluZGV4KCkKLSAgICAgICAgCisKICAgICAgICAgcHJlY29tcGluZm8gPSBvYmpjLmdldHByZWNvbXBpbmZvKHNlbGYubW9kbmFtZSkKLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIGNvZGUsIHNlbGYubW9kbmFtZSwgcHJlY29tcGluZm8KLSAgICAKKwogICAgIGRlZiBjb21waWxlc3VpdGUoc2VsZiwgbWFqb3IsIG1pbm9yLCBsYW5ndWFnZSwgc2NyaXB0LCBmbmFtZSwgcHJlY29tcGluZm8pOgogICAgICAgICAiIiJHZW5lcmF0ZSBjb2RlIGZvciBhIHNpbmdsZSBzdWl0ZSIiIgogICAgICAgICBbbmFtZSwgZGVzYywgY29kZSwgbGV2ZWwsIHZlcnNpb24sIGV2ZW50cywgY2xhc3NlcywgY29tcHMsIGVudW1zXSA9IHNlbGYuc3VpdGUKQEAgLTYzNywyMiArNjM3LDIyIEBACiAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgc3lub255bSwgdGhlIG90aGVyIG9uZSBpcyBiZXR0ZXIKICAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICAgcmV0dXJuIDAKLSAgICAgICAgICAgIAorCiAgICAgICAgIGV2ZW50cy5zb3J0KCkKICAgICAgICAgY2xhc3Nlcy5zb3J0KGNsYXNzX3NvcnRlcikKICAgICAgICAgY29tcHMuc29ydCgpCiAgICAgICAgIGVudW1zLnNvcnQoKQotICAgICAgICAKKwogICAgICAgICBzZWxmLmZwID0gZnAgPSBvcGVuKHNlbGYucGF0aG5hbWUsICd3JykKICAgICAgICAgTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUoc2VsZi5wYXRobmFtZSwgJ1B5dGgnLCAnVEVYVCcpCi0gICAgICAgIAorCiAgICAgICAgIGZwLndyaXRlKCciIiJTdWl0ZSAlczogJXNcbicgJSAoYXNjaWkobmFtZSksIGFzY2lpKGRlc2MpKSkKICAgICAgICAgZnAud3JpdGUoIkxldmVsICVkLCB2ZXJzaW9uICVkXG5cbiIgJSAobGV2ZWwsIHZlcnNpb24pKQogICAgICAgICBmcC53cml0ZSgiR2VuZXJhdGVkIGZyb20gJXNcbiIlYXNjaWkoZm5hbWUpKQogICAgICAgICBmcC53cml0ZSgiQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gJWQvJWQsIGxhbmd1YWdlICVkLCBzY3JpcHQgJWRcbiIgJSBcCiAgICAgICAgICAgICAobWFqb3IsIG1pbm9yLCBsYW5ndWFnZSwgc2NyaXB0KSkKICAgICAgICAgZnAud3JpdGUoJyIiIlxuXG4nKQotICAgICAgICAKKwogICAgICAgICBmcC53cml0ZSgnaW1wb3J0IGFldG9vbHNcbicpCiAgICAgICAgIGZwLndyaXRlKCdpbXBvcnQgTWFjT1NcblxuJykKICAgICAgICAgZnAud3JpdGUoIl9jb2RlID0gJXJcblxuIiUgKGNvZGUsKSkKQEAgLTY3MCwxNCArNjcwLDE0IEBACiAgICAgICAgICAgICBiYXNlbW9kdWxlID0gTm9uZQogICAgICAgICBzZWxmLmJhc2Vtb2R1bGUgPSBiYXNlbW9kdWxlCiAgICAgICAgIHNlbGYuY29tcGlsZWNsYXNzaGVhZGVyKCkKLSAgICAKKwogICAgICAgICBzZWxmLmVudW1zbmVlZGVkID0ge30KICAgICAgICAgaWYgZXZlbnRzOgogICAgICAgICAgICAgZm9yIGV2ZW50IGluIGV2ZW50czoKICAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVldmVudChldmVudCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGZwLndyaXRlKCIgICAgcGFzc1xuXG4iKQotICAgIAorCiAgICAgICAgIG9iamMgPSBPYmplY3RDb21waWxlcihmcCwgc2VsZi5tb2RuYW1lLCBiYXNlbW9kdWxlLCBwcmVjb21waW5mbywgaW50ZXJhY3Q9KHNlbGYuZWRpdF9tb2RuYW1lcyBpcyBOb25lKSwKICAgICAgICAgICAgIHZlcmJvc2U9c2VsZi52ZXJib3NlKQogICAgICAgICBmb3IgY2xzIGluIGNsYXNzZXM6CkBAIC02ODgsMTIgKzY4OCwxMiBAQAogICAgICAgICAgICAgb2JqYy5jb21waWxlY29tcGFyaXNvbihjb21wKQogICAgICAgICBmb3IgZW51bSBpbiBlbnVtczoKICAgICAgICAgICAgIG9iamMuY29tcGlsZWVudW1lcmF0aW9uKGVudW0pCi0gICAgICAgIAorCiAgICAgICAgIGZvciBlbnVtIGluIHNlbGYuZW51bXNuZWVkZWQua2V5cygpOgogICAgICAgICAgICAgb2JqYy5jaGVja2ZvcmVudW0oZW51bSkKLSAgICAgICAgICAgIAorCiAgICAgICAgIG9iamMuZHVtcGluZGV4KCkKLSAgICAgICAgCisKICAgICBkZWYgY29tcGlsZWNsYXNzaGVhZGVyKHNlbGYpOgogICAgICAgICAiIiJHZW5lcmF0ZSBjbGFzcyBib2lsZXJwbGF0ZSIiIgogICAgICAgICBjbGFzc25hbWUgPSAnJXNfRXZlbnRzJyVzZWxmLm1vZG5hbWUKQEAgLTcwMyw3ICs3MDMsNyBAQAogICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiY2xhc3MgJXMoJXMpOlxuXG4iJShjbGFzc25hbWUsIGJhc2VjbGFzc25hbWUpKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiY2xhc3MgJXM6XG5cbiIlY2xhc3NuYW1lKQotICAgICAgICAKKwogICAgIGRlZiBjb21waWxlZXZlbnQoc2VsZiwgZXZlbnQpOgogICAgICAgICAiIiJHZW5lcmF0ZSBjb2RlIGZvciBhIHNpbmdsZSBldmVudCIiIgogICAgICAgICBbbmFtZSwgZGVzYywgY29kZSwgc3ViY29kZSwgcmV0dXJucywgYWNjZXB0cywgYXJndW1lbnRzXSA9IGV2ZW50CkBAIC03MTcsMTMgKzcxNywxMyBAQAogICAgICAgICAgICAgZm9yIGEgaW4gYXJndW1lbnRzOgogICAgICAgICAgICAgICAgIGZwLndyaXRlKCIgICAgICAgICVyIDogJXIsXG4iJShpZGVudGlmeShhWzBdKSwgYVsxXSkpCiAgICAgICAgICAgICBmcC53cml0ZSgiICAgIH1cblxuIikKLSAgICAgICAgICAgIAorCiAgICAgICAgICMKICAgICAgICAgIyBHZW5lcmF0ZSBmdW5jdGlvbiBoZWFkZXIKICAgICAgICAgIwogICAgICAgICBoYXNfYXJnID0gKG5vdCBpc19udWxsKGFjY2VwdHMpKQogICAgICAgICBvcHRfYXJnID0gKGhhc19hcmcgYW5kIGlzX29wdGlvbmFsKGFjY2VwdHMpKQotICAgICAgICAKKwogICAgICAgICBmcC53cml0ZSgiICAgIGRlZiAlcyhzZWxmLCAiJWZ1bmNuYW1lKQogICAgICAgICBpZiBoYXNfYXJnOgogICAgICAgICAgICAgaWYgbm90IG9wdF9hcmc6CkBAIC04MDMsNyArODAzLDcgQEAKICAgICAgICAgICAgIGZwLndyaXRlKCIgICAgICAgICAgICAjIFhYWFggU2hvdWxkIGRvIGVudW0gcmVtYXBwaW5nIGhlcmUuLi5cbiIpCiAgICAgICAgIGZwLndyaXRlKCIgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddXG4iKQogICAgICAgICBmcC53cml0ZSgiXG4iKQotICAgICAgICAgICAgCisKICAgICBkZWYgZmluZGVudW1zaW5ldmVudChzZWxmLCBldmVudCk6CiAgICAgICAgICIiIkZpbmQgYWxsIGVudW1zIGZvciBhIHNpbmdsZSBldmVudCIiIgogICAgICAgICBbbmFtZSwgZGVzYywgY29kZSwgc3ViY29kZSwgcmV0dXJucywgYWNjZXB0cywgYXJndW1lbnRzXSA9IGV2ZW50CkBAIC04MTIsNyArODEyLDcgQEAKICAgICAgICAgICAgICAgICBlbmFtZSA9IGFbMl1bMF0KICAgICAgICAgICAgICAgICBpZiBlbmFtZSA8PiAnKioqKic6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW51bXNuZWVkZWRbZW5hbWVdID0gMQotICAgIAorCiAjCiAjIFRoaXMgY2xhc3Mgc3RvcmVzIHRoZSBjb2RlPC0+bmFtZSB0cmFuc2xhdGlvbnMgZm9yIGEgc2luZ2xlIG1vZHVsZS4gSXQgaXMgdXNlZAogIyB0byBrZWVwIHRoZSBpbmZvcm1hdGlvbiB3aGlsZSB3ZSdyZSBjb21waWxpbmcgdGhlIG1vZHVsZSwgYnV0IHdlIGFsc28ga2VlcCB0aGVzZSBvYmplY3RzCkBAIC04MjEsNyArODIxLDcgQEAKICMgaGFuZC4KICMKIGNsYXNzIENvZGVOYW1lTWFwcGVyOgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGludGVyYWN0PTEsIHZlcmJvc2U9Tm9uZSk6CiAgICAgICAgIHNlbGYuY29kZTJuYW1lID0gewogICAgICAgICAgICAgInByb3BlcnR5IiA6IHt9LApAQCAtODM5LDIxICs4MzksMjEgQEAKICAgICAgICAgc2VsZi5zdGFyX2ltcG9ydGVkID0gMAogICAgICAgICBzZWxmLmNhbl9pbnRlcmFjdCA9IGludGVyYWN0CiAgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKLSAgICAgICAgCisKICAgICBkZWYgYWRkbmFtZWNvZGUoc2VsZiwgdHlwZSwgbmFtZSwgY29kZSk6CiAgICAgICAgIHNlbGYubmFtZTJjb2RlW3R5cGVdW25hbWVdID0gY29kZQogICAgICAgICBpZiBub3Qgc2VsZi5jb2RlMm5hbWVbdHlwZV0uaGFzX2tleShjb2RlKToKICAgICAgICAgICAgIHNlbGYuY29kZTJuYW1lW3R5cGVdW2NvZGVdID0gbmFtZQotICAgICAgICAKKwogICAgIGRlZiBoYXNuYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICBmb3IgZGljdCBpbiBzZWxmLm5hbWUyY29kZS52YWx1ZXMoKToKICAgICAgICAgICAgIGlmIGRpY3QuaGFzX2tleShuYW1lKToKICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgCisKICAgICBkZWYgaGFzY29kZShzZWxmLCB0eXBlLCBjb2RlKToKICAgICAgICAgcmV0dXJuIHNlbGYuY29kZTJuYW1lW3R5cGVdLmhhc19rZXkoY29kZSkKLSAgICAgICAgCisKICAgICBkZWYgZmluZGNvZGVuYW1lKHNlbGYsIHR5cGUsIGNvZGUpOgogICAgICAgICBpZiBub3Qgc2VsZi5oYXNjb2RlKHR5cGUsIGNvZGUpOgogICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUsIE5vbmUKQEAgLTg2MywxMCArODYzLDEwIEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBxdWFsbmFtZSA9IG5hbWUKICAgICAgICAgcmV0dXJuIG5hbWUsIHF1YWxuYW1lLCBzZWxmLm1vZHVsZW5hbWUKLSAgICAgICAgCisKICAgICBkZWYgZ2V0YWxsKHNlbGYsIHR5cGUpOgogICAgICAgICByZXR1cm4gc2VsZi5jb2RlMm5hbWVbdHlwZV0uaXRlbXMoKQotICAgICAgICAgICAgCisKICAgICBkZWYgYWRkbW9kdWxlKHNlbGYsIG1vZHVsZSwgbmFtZSwgc3Rhcl9pbXBvcnRlZCk6CiAgICAgICAgIHNlbGYubW9kdWxlbmFtZSA9IG5hbWUKICAgICAgICAgc2VsZi5zdGFyX2ltcG9ydGVkID0gc3Rhcl9pbXBvcnRlZApAQCAtODc4LDE0ICs4NzgsMTQgQEAKICAgICAgICAgICAgIHNlbGYuYWRkbmFtZWNvZGUoJ2VudW0nLCAnX0VudW1fJytpZGVudGlmeShjb2RlKSwgY29kZSkKICAgICAgICAgZm9yIGNvZGUsIG5hbWUgaW4gbW9kdWxlLl9jb21wZGVjbGFyYXRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgICBzZWxmLmFkZG5hbWVjb2RlKCdjb21wYXJpc29uJywgbmFtZSwgY29kZSkKLSAgICAgICAgCisKICAgICBkZWYgcHJlcGFyZWZvcmV4cG9ydChzZWxmLCBuYW1lPU5vbmUpOgogICAgICAgICBpZiBub3Qgc2VsZi5tb2R1bGVuYW1lOgogICAgICAgICAgICAgc2VsZi5tb2R1bGVuYW1lID0gbmFtZQogICAgICAgICByZXR1cm4gc2VsZgotICAgICAgICAgICAgCisKIGNsYXNzIE9iamVjdENvbXBpbGVyOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgbW9kbmFtZSwgYmFzZXN1aXRlLCBvdGhlcm5hbWVtYXBwZXJzPU5vbmUsIGludGVyYWN0PTEsIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgbW9kbmFtZSwgYmFzZXN1aXRlLCBvdGhlcm5hbWVtYXBwZXJzPU5vbmUsIGludGVyYWN0PTEsCiAgICAgICAgICAgICB2ZXJib3NlPU5vbmUpOgogICAgICAgICBzZWxmLmZwID0gZnAKICAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQpAQCAtOTAxLDcgKzkwMSw3IEBACiAgICAgICAgICAgICBiYXNlbWFwcGVyID0gQ29kZU5hbWVNYXBwZXIoc2VsZi5jYW5faW50ZXJhY3QsIHNlbGYudmVyYm9zZSkKICAgICAgICAgICAgIGJhc2VtYXBwZXIuYWRkbW9kdWxlKGJhc2VzdWl0ZSwgJycsIDEpCiAgICAgICAgICAgICBzZWxmLm5hbWVtYXBwZXJzLmFwcGVuZChiYXNlbWFwcGVyKQotICAgICAgICAKKwogICAgIGRlZiBnZXRwcmVjb21waW5mbyhzZWxmLCBtb2RuYW1lKToKICAgICAgICAgbGlzdCA9IFtdCiAgICAgICAgIGZvciBtYXBwZXIgaW4gc2VsZi5uYW1lbWFwcGVyczoKQEAgLTkwOSw3ICs5MDksNyBAQAogICAgICAgICAgICAgaWYgZW1hcHBlcjoKICAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChlbWFwcGVyKQogICAgICAgICByZXR1cm4gbGlzdAotICAgICAgICAKKwogICAgIGRlZiBmaW5kY29kZW5hbWUoc2VsZiwgdHlwZSwgY29kZSk6CiAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAjIEZpcnN0IHRyeTogY2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IGtub3cgYWJvdXQgdGhpcyBjb2RlLgpAQCAtOTM1LDcgKzkzNSw3IEBACiAgICAgICAgICAgICAgICAgbWFwcGVyID0gQ29kZU5hbWVNYXBwZXIoc2VsZi5jYW5faW50ZXJhY3QsIHNlbGYudmVyYm9zZSkKICAgICAgICAgICAgICAgICBtYXBwZXIuYWRkbW9kdWxlKG0sIG0uX19uYW1lX18sIDApCiAgICAgICAgICAgICAgICAgc2VsZi5uYW1lbWFwcGVycy5hcHBlbmQobWFwcGVyKQotICAgICAgICAgICAgICAgIAorCiAgICAgZGVmIGhhc25hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgIGZvciBtYXBwZXIgaW4gc2VsZi5vdGhlcm5hbWVtYXBwZXJzOgogICAgICAgICAgICAgaWYgbWFwcGVyLmhhc25hbWUobmFtZSkgYW5kIG1hcHBlci5tb2R1bGVuYW1lICE9IHNlbGYubW9kdWxlbmFtZToKQEAgLTk0Myw3ICs5NDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYudmVyYm9zZSwgIkR1cGxpY2F0ZSBQeXRob24gaWRlbnRpZmllcjoiLCBuYW1lLCBzZWxmLm1vZHVsZW5hbWUsIG1hcHBlci5tb2R1bGVuYW1lCiAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgCisKICAgICBkZWYgYXNrZGVmaW5pdGlvbm1vZHVsZShzZWxmLCB0eXBlLCBjb2RlKToKICAgICAgICAgaWYgbm90IHNlbGYuY2FuX2ludGVyYWN0OgogICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgpAQCAtOTU4LDcgKzk1OCw3IEBACiAgICAgICAgIG0gPSBfX2ltcG9ydF9fKG1vZG5hbWUpCiAgICAgICAgIHNlbGYuZnAud3JpdGUoImltcG9ydCAlc1xuIiVtb2RuYW1lKQogICAgICAgICByZXR1cm4gbQotICAgICAgICAKKwogICAgIGRlZiBjb21waWxlY2xhc3Moc2VsZiwgY2xzKToKICAgICAgICAgW25hbWUsIGNvZGUsIGRlc2MsIHByb3BlcnRpZXMsIGVsZW1lbnRzXSA9IGNscwogICAgICAgICBwbmFtZSA9IGlkZW50aWZ5KG5hbWUpCkBAIC05ODAsNyArOTgwLDcgQEAKICAgICAgICAgZWxlbWVudHMuc29ydCgpCiAgICAgICAgIGZvciBlbGVtIGluIGVsZW1lbnRzOgogICAgICAgICAgICAgc2VsZi5jb21waWxlZWxlbWVudChlbGVtKQotICAgIAorCiAgICAgZGVmIGNvbXBpbGVwcm9wZXJ0eShzZWxmLCBwcm9wLCBpc19hcHBsaWNhdGlvbl9jbGFzcz1GYWxzZSk6CiAgICAgICAgIFtuYW1lLCBjb2RlLCB3aGF0XSA9IHByb3AKICAgICAgICAgaWYgY29kZSA9PSAnY0AjISc6CkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogICAgICAgICBzZWxmLm5hbWVtYXBwZXJzWzBdLmFkZG5hbWVjb2RlKCdwcm9wZXJ0eScsIHBuYW1lLCBjb2RlKQogICAgICAgICBpZiBpc19hcHBsaWNhdGlvbl9jbGFzcyBhbmQgc2VsZi5mcDoKICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiVzID0gX1Byb3BfJXMoKVxuIiAlIChwbmFtZSwgcG5hbWUpKQotICAgIAorCiAgICAgZGVmIGNvbXBpbGVlbGVtZW50KHNlbGYsIGVsZW0pOgogICAgICAgICBbY29kZSwga2V5Zm9ybV0gPSBlbGVtCiAgICAgICAgIGlmIHNlbGYuZnA6CkBAIC0xMDU2LDEwICsxMDU2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiMgWFhYWCAlcyBlbGVtZW50ICVyIG5vdCBmb3VuZCEhXG4iJShjbmFtZSwgZWNvZGUpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBlbGlzdC5hcHBlbmQoKG5hbWUsIGVuYW1lKSkKLSAgICAgICAgICAgICAgICAKKwogICAgICAgICBwbGlzdC5zb3J0KCkKICAgICAgICAgZWxpc3Quc29ydCgpCi0gICAgICAgIAorCiAgICAgICAgIGlmIHNlbGYuZnA6CiAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCIlcy5fcHJpdnByb3BkaWN0ID0ge1xuIiVjbmFtZSkKICAgICAgICAgICAgIGZvciBuIGluIHBsaXN0OgpAQCAtMTA2OSw3ICsxMDY5LDcgQEAKICAgICAgICAgICAgIGZvciBuLCBmdWxsbiBpbiBlbGlzdDoKICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCIgICAgJyVzJyA6ICVzLFxuIiUobiwgZnVsbG4pKQogICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgifVxuIikKLSAgICAKKwogICAgIGRlZiBjb21waWxlY29tcGFyaXNvbihzZWxmLCBjb21wKToKICAgICAgICAgW25hbWUsIGNvZGUsIGNvbW1lbnRdID0gY29tcAogICAgICAgICBpbmFtZSA9IGlkZW50aWZ5KG5hbWUpCkBAIC0xMDc3LDcgKzEwNzcsNyBAQAogICAgICAgICBpZiBzZWxmLmZwOgogICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiY2xhc3MgJXMoYWV0b29scy5OQ29tcGFyaXNvbik6XG4iICUgaW5hbWUpCiAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCcgICAgIiIiJXMgLSAlcyAiIiJcbicgJSAoYXNjaWkobmFtZSksIGFzY2lpKGNvbW1lbnQpKSkKLSAgICAgICAgCisKICAgICBkZWYgY29tcGlsZWVudW1lcmF0aW9uKHNlbGYsIGVudW0pOgogICAgICAgICBbY29kZSwgaXRlbXNdID0gZW51bQogICAgICAgICBuYW1lID0gIl9FbnVtXyVzIiAlIGlkZW50aWZ5KGNvZGUpCkBAIC0xMDg4LDExICsxMDg4LDExIEBACiAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJ9XG5cbiIpCiAgICAgICAgIHNlbGYubmFtZW1hcHBlcnNbMF0uYWRkbmFtZWNvZGUoJ2VudW0nLCBuYW1lLCBjb2RlKQogICAgICAgICByZXR1cm4gY29kZQotICAgIAorCiAgICAgZGVmIGNvbXBpbGVlbnVtZXJhdG9yKHNlbGYsIGl0ZW0pOgogICAgICAgICBbbmFtZSwgY29kZSwgZGVzY10gPSBpdGVtCiAgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAlciA6ICVyLFx0IyAlc1xuIiAlIChpZGVudGlmeShuYW1lKSwgY29kZSwgYXNjaWkoZGVzYykpKQotICAgICAgICAKKwogICAgIGRlZiBjaGVja2ZvcmVudW0oc2VsZiwgZW51bSk6CiAgICAgICAgICIiIlRoaXMgZW51bSBjb2RlIGlzIHVzZWQgYnkgYW4gZXZlbnQuIE1ha2Ugc3VyZSBpdCdzIGF2YWlsYWJsZSIiIgogICAgICAgICBuYW1lLCBmdWxsbmFtZSwgbW9kdWxlID0gc2VsZi5maW5kY29kZW5hbWUoJ2VudW0nLCBlbnVtKQpAQCAtMTEwMywzMyArMTEwMywzMyBAQAogICAgICAgICBpZiBtb2R1bGU6CiAgICAgICAgICAgICBpZiBzZWxmLmZwOgogICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoImZyb20gJXMgaW1wb3J0ICVzXG4iJShtb2R1bGUsIG5hbWUpKQotICAgICAgICAKKwogICAgIGRlZiBkdW1waW5kZXgoc2VsZik6CiAgICAgICAgIGlmIG5vdCBzZWxmLmZwOgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHNlbGYuZnAud3JpdGUoIlxuI1xuIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlXG4jXG4iKQotICAgICAgICAKKwogICAgICAgICBzZWxmLmZwLndyaXRlKCJfY2xhc3NkZWNsYXJhdGlvbnMgPSB7XG4iKQogICAgICAgICBjbGFzc2xpc3QgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmdldGFsbCgnY2xhc3MnKQogICAgICAgICBjbGFzc2xpc3Quc29ydCgpCiAgICAgICAgIGZvciBrLCB2IGluIGNsYXNzbGlzdDoKICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAlciA6ICVzLFxuIiAlIChrLCB2KSkKICAgICAgICAgc2VsZi5mcC53cml0ZSgifVxuIikKLSAgICAgICAgCisKICAgICAgICAgc2VsZi5mcC53cml0ZSgiXG5fcHJvcGRlY2xhcmF0aW9ucyA9IHtcbiIpCiAgICAgICAgIHByb3BsaXN0ID0gc2VsZi5uYW1lbWFwcGVyc1swXS5nZXRhbGwoJ3Byb3BlcnR5JykKICAgICAgICAgcHJvcGxpc3Quc29ydCgpCiAgICAgICAgIGZvciBrLCB2IGluIHByb3BsaXN0OgogICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiICAgICVyIDogX1Byb3BfJXMsXG4iICUgKGssIHYpKQogICAgICAgICBzZWxmLmZwLndyaXRlKCJ9XG4iKQotICAgICAgICAKKwogICAgICAgICBzZWxmLmZwLndyaXRlKCJcbl9jb21wZGVjbGFyYXRpb25zID0ge1xuIikKICAgICAgICAgY29tcGxpc3QgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmdldGFsbCgnY29tcGFyaXNvbicpCiAgICAgICAgIGNvbXBsaXN0LnNvcnQoKQogICAgICAgICBmb3IgaywgdiBpbiBjb21wbGlzdDoKICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAlciA6ICVzLFxuIiAlIChrLCB2KSkKICAgICAgICAgc2VsZi5mcC53cml0ZSgifVxuIikKLSAgICAgICAgCisKICAgICAgICAgc2VsZi5mcC53cml0ZSgiXG5fZW51bWRlY2xhcmF0aW9ucyA9IHtcbiIpCiAgICAgICAgIGVudW1saXN0ID0gc2VsZi5uYW1lbWFwcGVyc1swXS5nZXRhbGwoJ2VudW0nKQogICAgICAgICBlbnVtbGlzdC5zb3J0KCkKQEAgLTExNDAsMTYgKzExNDAsMTYgQEAKIGRlZiBjb21waWxlZGF0YShkYXRhKToKICAgICBbdHlwZSwgZGVzY3JpcHRpb24sIGZsYWdzXSA9IGRhdGEKICAgICByZXR1cm4gIiVyIC0tICVyICVzIiAlICh0eXBlLCBkZXNjcmlwdGlvbiwgY29tcGlsZWRhdGFmbGFncyhmbGFncykpCi0gICAgCisKIGRlZiBpc19udWxsKGRhdGEpOgogICAgIHJldHVybiBkYXRhWzBdID09ICdudWxsJwotICAgIAorCiBkZWYgaXNfb3B0aW9uYWwoZGF0YSk6CiAgICAgcmV0dXJuIChkYXRhWzJdICYgMHg4MDAwKQotICAgIAorCiBkZWYgaXNfZW51bShkYXRhKToKICAgICByZXR1cm4gKGRhdGFbMl0gJiAweDIwMDApCi0gICAgCisKIGRlZiBnZXRkYXRhZG9jKGRhdGEpOgogICAgIFt0eXBlLCBkZXNjciwgZmxhZ3NdID0gZGF0YQogICAgIGlmIGRlc2NyOgpAQCAtMTE3MCw3ICsxMTcwLDcgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgYml0cy5hcHBlbmQocmVwcihpKSkKICAgICByZXR1cm4gJ1slc10nICUgc3RyaW5nLmpvaW4oYml0cykKLSAgICAKKwogZGVmIGFzY2lpKHN0cik6CiAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHdpdGggYWxsIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGhleC1lbmNvZGVkIiIiCiAgICAgaWYgdHlwZShzdHIpICE9IHR5cGUoJycpOgpAQCAtMTE4Miw3ICsxMTgyLDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJ2ID0gcnYgKyAnXFwnICsgJ3glMDIuMngnICUgb3JkKGMpCiAgICAgcmV0dXJuIHJ2Ci0gICAgCisKIGRlZiBpZGVudGlmeShzdHIpOgogICAgICIiIlR1cm4gYW55IHN0cmluZyBpbnRvIGFuIGlkZW50aWZpZXI6CiAgICAgLSByZXBsYWNlIHNwYWNlIGJ5IF8KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9pYy5weSBiL0xpYi9wbGF0LW1hYy9pYy5weQppbmRleCAzMjM2ODA1Li42NTc1MzM2IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvaWMucHkKKysrIGIvTGliL3BsYXQtbWFjL2ljLnB5CkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgIHJldHVybiAiSUNPcGFxdWVEYXRhKCVyKSIlKHNlbGYuZGF0YSwpCiAKIF9JQ09wYXF1ZURhdGFUeXBlPXR5cGUoSUNPcGFxdWVEYXRhKCcnKSkKLSAgICAgICAgCisKIGRlZiBfZGVjb2RlX2RlZmF1bHQoZGF0YSwga2V5KToKICAgICBpZiBsZW4oZGF0YSkgPT0gMDoKICAgICAgICAgcmV0dXJuIGRhdGEKQEAgLTQ2LDggKzQ2LDggQEAKICAgICAgICAgIyBBc3N1bWUgUHN0cmluZwogICAgICAgICByZXR1cm4gZGF0YVsxOl0KICAgICByZXR1cm4gSUNPcGFxdWVEYXRhKGRhdGEpCi0gICAgCi0gICAgCisKKwogZGVmIF9kZWNvZGVfbXVsdGlzdHIoZGF0YSwga2V5KToKICAgICBudW1zdHIgPSBvcmQoZGF0YVswXSkgPDwgOCB8IG9yZChkYXRhWzFdKQogICAgIHJ2ID0gW10KQEAgLTU4LDU0ICs1OCw1NCBAQAogICAgICAgICBydi5hcHBlbmQoc3RyKQogICAgICAgICBwdHIgPSBwdHIgKyBzdHJsZW4gKyAxCiAgICAgcmV0dXJuIHJ2Ci0gICAgCisKIGRlZiBfZGVjb2RlX2ZvbnRyZWNvcmQoZGF0YSwga2V5KToKICAgICBzaXplID0gb3JkKGRhdGFbMF0pIDw8IDggfCBvcmQoZGF0YVsxXSkKICAgICBmYWNlID0gb3JkKGRhdGFbMl0pCiAgICAgbmFtZWxlbiA9IG9yZChkYXRhWzRdKQogICAgIHJldHVybiBzaXplLCBmYWNlLCBkYXRhWzU6NStuYW1lbGVuXQotICAgIAorCiBkZWYgX2RlY29kZV9ib29sZWFuKGRhdGEsIGtleSk6CiAgICAgcmV0dXJuIG9yZChkYXRhWzBdKQotICAgIAorCiBkZWYgX2RlY29kZV90ZXh0KGRhdGEsIGtleSk6CiAgICAgcmV0dXJuIGRhdGEKLSAgICAKKwogZGVmIF9kZWNvZGVfY2hhcnNldChkYXRhLCBrZXkpOgogICAgIHJldHVybiBkYXRhWzoyNTZdLCBkYXRhWzI1NjpdCi0gICAgCisKIGRlZiBfZGVjb2RlX2FwcHNwZWMoZGF0YSwga2V5KToKICAgICBuYW1lbGVuID0gb3JkKGRhdGFbNF0pCiAgICAgcmV0dXJuIGRhdGFbMDo0XSwgZGF0YVs1OjUrbmFtZWxlbl0KIAogZGVmIF9jb2RlX2RlZmF1bHQoZGF0YSwga2V5KToKICAgICByZXR1cm4gY2hyKGxlbihkYXRhKSkgKyBkYXRhCi0gICAgICAgIAorCiBkZWYgX2NvZGVfbXVsdGlzdHIoZGF0YSwga2V5KToKICAgICBudW1zdHIgPSBsZW4oZGF0YSkKICAgICBydiA9IGNocigobnVtc3RyPj44KSAmIDB4ZmYpICsgY2hyKG51bXN0ciAmIDB4ZmYpCiAgICAgZm9yIGkgaW4gZGF0YToKICAgICAgICAgcnYgPSBydiArIF9jb2RlX2RlZmF1bHQoaSkKICAgICByZXR1cm4gcnYKLSAgICAKKwogZGVmIF9jb2RlX2ZvbnRyZWNvcmQoZGF0YSwga2V5KToKICAgICBzaXplLCBmYWNlLCBuYW1lID0gZGF0YQogICAgIHJldHVybiBjaHIoKHNpemU+PjgpICYgMHhmZikgKyBjaHIoc2l6ZSAmIDB4ZmYpICsgY2hyKGZhY2UgJiAweGZmKSArIFwKICAgICAgICAgY2hyKDApICsgX2NvZGVfZGVmYXVsdChuYW1lKQotICAgIAorCiBkZWYgX2NvZGVfYm9vbGVhbihkYXRhLCBrZXkpOgogICAgIHByaW50ICdYWFhYIGJvb2xlYW46JywgcmVwcihkYXRhKQogICAgIHJldHVybiBjaHIoZGF0YSkKLSAgICAKKwogZGVmIF9jb2RlX3RleHQoZGF0YSwga2V5KToKICAgICByZXR1cm4gZGF0YQotICAgIAorCiBkZWYgX2NvZGVfY2hhcnNldChkYXRhLCBrZXkpOgogICAgIHJldHVybiBkYXRhWzBdICsgZGF0YVsxXQotICAgIAorCiBkZWYgX2NvZGVfYXBwc3BlYyhkYXRhLCBrZXkpOgogICAgIHJldHVybiBkYXRhWzBdICsgX2NvZGVfZGVmYXVsdChkYXRhWzFdKQotICAgIAorCiBfZGVjb2Rlcl90YWJsZSA9IHsKICAgICAiQXJjaGllQWxsIiA6IChfZGVjb2RlX211bHRpc3RyICwgX2NvZGVfbXVsdGlzdHIpLAogICAgICJVTWljaEFsbCIgOiAoX2RlY29kZV9tdWx0aXN0ciAsIF9jb2RlX211bHRpc3RyKSwKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgICJQbGFuIiA6IChfZGVjb2RlX3RleHQgLCBfY29kZV90ZXh0KSwKICAgICAiTWFpbEhlYWRlcnMiIDogKF9kZWNvZGVfdGV4dCAsIF9jb2RlX3RleHQpLAogICAgICJOZXdzSGVhZGVycyIgOiAoX2RlY29kZV90ZXh0ICwgX2NvZGVfdGV4dCksCi0jICAgIk1hcHBpbmciIAorIyAgICJNYXBwaW5nIgogICAgICJDaGFyYWN0ZXJTZXQiIDogKF9kZWNvZGVfY2hhcnNldCAsIF9jb2RlX2NoYXJzZXQpLAogICAgICJIZWxwZXJcMjQ1IiA6IChfZGVjb2RlX2FwcHNwZWMgLCBfY29kZV9hcHBzcGVjKSwKICMgICAiU2VydmljZXMiIDogKF9kZWNvZGVfc2VydmljZXMsID8/Pz8pLApAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgZWxzZToKICAgICAgICAgY29kZXIgPSBfY29kZV9kZWZhdWx0CiAgICAgcmV0dXJuIGNvZGVyKGRhdGEsIGtleSkKLSAgICAKKwogY2xhc3MgSUM6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpZ25hdHVyZT0nUHl0aCcsIGljPU5vbmUpOgogICAgICAgICBpZiBpYzoKQEAgLTE2Niw3ICsxNjYsNyBAQAogICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLmljLCAnSUNGaW5kQ29uZmlnRmlsZScpOgogICAgICAgICAgICAgICAgIHNlbGYuaWMuSUNGaW5kQ29uZmlnRmlsZSgpCiAgICAgICAgIHNlbGYuaCA9IFJlcy5SZXNvdXJjZSgnJykKLSAgICAgICAgICAgIAorCiAgICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgIHJ2ID0gW10KICAgICAgICAgc2VsZi5pYy5JQ0JlZ2luKGljUmVhZE9ubHlQZXJtKQpAQCAtMTc1LDMyICsxNzUsMzIgQEAKICAgICAgICAgICAgIHJ2LmFwcGVuZChzZWxmLmljLklDR2V0SW5kUHJlZihpKzEpKQogICAgICAgICBzZWxmLmljLklDRW5kKCkKICAgICAgICAgcmV0dXJuIHJ2Ci0gICAgICAgIAorCiAgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKICAgICAgICAgcmV0dXJuIHNlbGYuX19jb250YWluc19fKGtleSkKLSAgICAgICAgCisKICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGR1bW15ID0gc2VsZi5pYy5JQ0ZpbmRQcmVmSGFuZGxlKGtleSwgc2VsZi5oKQogICAgICAgICBleGNlcHQgaWNnbHVlLmVycm9yOgogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgCisKICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgYXR0ciA9IHNlbGYuaWMuSUNGaW5kUHJlZkhhbmRsZShrZXksIHNlbGYuaCkKICAgICAgICAgcmV0dXJuIF9kZWNvZGUoc2VsZi5oLmRhdGEsIGtleSkKLSAgICAgICAgCisKICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgIHZhbHVlID0gX2NvZGUodmFsdWUsIGtleSkKICAgICAgICAgc2VsZi5pYy5JQ1NldFByZWYoa2V5LCBJQ2F0dHJfbm9fY2hhbmdlLCB2YWx1ZSkKLSAgICAgICAgCisKICAgICBkZWYgbGF1bmNodXJsKHNlbGYsIHVybCwgaGludD0iIik6CiAgICAgICAgICMgV29yayBhcm91bmQgYSBidWcgaW4gSUNMYXVuY2hVUkw6IGZpbGU6L2ZvbyBkb2VzCiAgICAgICAgICMgbm90IHdvcmsgYnV0IGZpbGU6Ly8vZm9vIGRvZXMuCiAgICAgICAgIGlmIHVybFs6Nl0gPT0gJ2ZpbGU6LycgYW5kIHVybFs2XSAhPSAnLyc6CiAgICAgICAgICAgICB1cmwgPSAnZmlsZTovLy8nICsgdXJsWzY6XQogICAgICAgICBzZWxmLmljLklDTGF1bmNoVVJMKGhpbnQsIHVybCwgMCwgbGVuKHVybCkpCi0gICAgICAgIAorCiAgICAgZGVmIHBhcnNldXJsKHNlbGYsIGRhdGEsIHN0YXJ0PU5vbmUsIGVuZD1Ob25lLCBoaW50PSIiKToKICAgICAgICAgaWYgc3RhcnQgPT0gTm9uZToKICAgICAgICAgICAgIHNlbFN0YXJ0ID0gMApAQCAtMjExLDIxICsyMTEsMjEgQEAKICAgICAgICAgICAgIHNlbEVuZCA9IGVuZAogICAgICAgICBzZWxTdGFydCwgc2VsRW5kID0gc2VsZi5pYy5JQ1BhcnNlVVJMKGhpbnQsIGRhdGEsIHNlbFN0YXJ0LCBzZWxFbmQsIHNlbGYuaCkKICAgICAgICAgcmV0dXJuIHNlbGYuaC5kYXRhLCBzZWxTdGFydCwgc2VsRW5kCi0gICAgICAgIAorCiAgICAgZGVmIG1hcGZpbGUoc2VsZiwgZmlsZSk6CiAgICAgICAgIGlmIHR5cGUoZmlsZSkgIT0gdHlwZSgnJyk6CiAgICAgICAgICAgICBmaWxlID0gZmlsZS5hc190dXBsZSgpWzJdCiAgICAgICAgIHJldHVybiBzZWxmLmljLklDTWFwRmlsZW5hbWUoZmlsZSkKLSAgICAgICAgCisKICAgICBkZWYgbWFwdHlwZWNyZWF0b3Ioc2VsZiwgdHlwZSwgY3JlYXRvciwgZmlsZW5hbWU9IiIpOgogICAgICAgICByZXR1cm4gc2VsZi5pYy5JQ01hcFR5cGVDcmVhdG9yKHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lKQotICAgICAgICAKKwogICAgIGRlZiBzZXR0eXBlY3JlYXRvcihzZWxmLCBmaWxlKToKICAgICAgICAgZmlsZSA9IENhcmJvbi5GaWxlLnBhdGhuYW1lKGZpbGUpCiAgICAgICAgIHJlY29yZCA9IHNlbGYubWFwZmlsZShvcy5wYXRoLnNwbGl0KGZpbGUpWzFdKQogICAgICAgICBNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShmaWxlLCByZWNvcmRbMl0sIHJlY29yZFsxXSkKICAgICAgICAgbWFjb3N0b29scy50b3VjaGVkKGZzcykKLSAgICAgICAgCisKICMgQ29udmVuaWVuY2Ugcm91dGluZXMKIF9kZnRfaWMgPSBOb25lCiAKQEAgLTIzMywyNyArMjMzLDI3IEBACiAgICAgZ2xvYmFsIF9kZnRfaWMKICAgICBpZiBfZGZ0X2ljID09IE5vbmU6IF9kZnRfaWMgPSBJQygpCiAgICAgcmV0dXJuIF9kZnRfaWMubGF1bmNodXJsKHVybCwgaGludCkKLSAgICAKKwogZGVmIHBhcnNldXJsKGRhdGEsIHN0YXJ0PU5vbmUsIGVuZD1Ob25lLCBoaW50PSIiKToKICAgICBnbG9iYWwgX2RmdF9pYwogICAgIGlmIF9kZnRfaWMgPT0gTm9uZTogX2RmdF9pYyA9IElDKCkKICAgICByZXR1cm4gX2RmdF9pYy5wYXJzZXVybChkYXRhLCBzdGFydCwgZW5kLCBoaW50KQotICAgIAorCiBkZWYgbWFwZmlsZShmaWxlbmFtZSk6CiAgICAgZ2xvYmFsIF9kZnRfaWMKICAgICBpZiBfZGZ0X2ljID09IE5vbmU6IF9kZnRfaWMgPSBJQygpCiAgICAgcmV0dXJuIF9kZnRfaWMubWFwZmlsZShmaWxlbmFtZSkKLSAgICAKKwogZGVmIG1hcHR5cGVjcmVhdG9yKHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lPSIiKToKICAgICBnbG9iYWwgX2RmdF9pYwogICAgIGlmIF9kZnRfaWMgPT0gTm9uZTogX2RmdF9pYyA9IElDKCkKICAgICByZXR1cm4gX2RmdF9pYy5tYXB0eXBlY3JlYXRvcih0eXBlLCBjcmVhdG9yLCBmaWxlbmFtZSkKLSAgICAKKwogZGVmIHNldHR5cGVjcmVhdG9yKGZpbGUpOgogICAgIGdsb2JhbCBfZGZ0X2ljCiAgICAgaWYgX2RmdF9pYyA9PSBOb25lOiBfZGZ0X2ljID0gSUMoKQogICAgIHJldHVybiBfZGZ0X2ljLnNldHR5cGVjcmVhdG9yKGZpbGUpCi0gICAgICAgIAorCiBkZWYgX3Rlc3QoKToKICAgICBpYyA9IElDKCkKICAgICBmb3IgayBpbiBpYy5rZXlzKCk6CkBAIC0yNjMsNyArMjYzLDYgQEAKICAgICAgICAgICAgIHYgPSAnPz8/PycKICAgICAgICAgcHJpbnQgaywgJ1x0JywgdgogICAgIHN5cy5leGl0KDEpCi0gICAgCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgX3Rlc3QoKQotICAgIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2ljb3Blbi5weSBiL0xpYi9wbGF0LW1hYy9pY29wZW4ucHkKaW5kZXggOTllODY2ZS4uZWVhNjA4MyAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2ljb3Blbi5weQorKysgYi9MaWIvcGxhdC1tYWMvaWNvcGVuLnB5CkBAIC00MiwxOCArNDIsMTggQEAKIF9idWlsdGluX29wZW4gPSBnbG9iYWxzKCkuZ2V0KCdfYnVpbHRpbl9vcGVuJywgX19idWlsdGluX18ub3BlbikKIAogZGVmIF9vcGVuX3dpdGhfdHlwZXIoKmFyZ3MpOgotICAgICAgICBmaWxlID0gX2J1aWx0aW5fb3BlbigqYXJncykKLSAgICAgICAgZmlsZW5hbWUgPSBhcmdzWzBdCi0gICAgICAgIG1vZGUgPSAncicKLSAgICAgICAgaWYgYXJnc1sxOl06Ci0gICAgICAgICAgICAgICAgbW9kZSA9IGFyZ3NbMV0KLSAgICAgICAgaWYgbW9kZVswXSA9PSAndyc6Ci0gICAgICAgICAgICAgICAgZnJvbSBpYyBpbXBvcnQgZXJyb3IsIHNldHR5cGVjcmVhdG9yCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dHlwZWNyZWF0b3IoZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgZXhjZXB0IGVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICByZXR1cm4gZmlsZQorICAgIGZpbGUgPSBfYnVpbHRpbl9vcGVuKCphcmdzKQorICAgIGZpbGVuYW1lID0gYXJnc1swXQorICAgIG1vZGUgPSAncicKKyAgICBpZiBhcmdzWzE6XToKKyAgICAgICAgbW9kZSA9IGFyZ3NbMV0KKyAgICBpZiBtb2RlWzBdID09ICd3JzoKKyAgICAgICAgZnJvbSBpYyBpbXBvcnQgZXJyb3IsIHNldHR5cGVjcmVhdG9yCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNldHR5cGVjcmVhdG9yKGZpbGVuYW1lKQorICAgICAgICBleGNlcHQgZXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIGZpbGUKIAogX19idWlsdGluX18ub3BlbiA9IF9vcGVuX3dpdGhfdHlwZXIKIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9Db2RlV2Fycmlvcl9zdWl0ZS5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvQ29kZVdhcnJpb3Jfc3VpdGUucHkKaW5kZXggMDMzNzAzYy4uMGZkNTYyYiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9Db2RlV2Fycmlvcl9zdWl0ZS5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL0NvZGVXYXJyaW9yX3N1aXRlLnB5CkBAIC01ODAsNDQgKzU4MCw0NCBAQAogICAgICd0ZXh0JyA6IFN0YW5kYXJkX1N1aXRlLnRleHQsCiB9CiBfRW51bV9ES05EID0gewotICAgICdwcm9qZWN0JyA6ICdQUkpEJywJIyBhIHByb2plY3QgZG9jdW1lbnQKLSAgICAnZWRpdG9yX2RvY3VtZW50JyA6ICdFRElUJywJIyBhbiBlZGl0b3IgZG9jdW1lbnQKLSAgICAnbWVzc2FnZScgOiAnTVNTRycsCSMgYSBtZXNzYWdlIGRvY3VtZW50Ci0gICAgJ2ZpbGVfY29tcGFyZScgOiAnQ09NUCcsCSMgYSBmaWxlIGNvbXBhcmUgZG9jdW1lbnQKLSAgICAnY2F0YWxvZ19kb2N1bWVudCcgOiAnQ1RMRycsCSMgYSBicm93c2VyIGNhdGFsb2cKLSAgICAnY2xhc3NfYnJvd3NlcicgOiAnQlJPVycsCSMgYSBjbGFzcyBicm93c2VyIGRvY3VtZW50Ci0gICAgJ3NpbmdsZV9jbGFzc19icm93c2VyJyA6ICcxQlJXJywJIyBhIHNpbmdsZSBjbGFzcyBicm93c2VyIGRvY3VtZW50Ci0gICAgJ3N5bWJvbF9icm93c2VyJyA6ICdTWU1CJywJIyBhIHN5bWJvbCBicm93c2VyIGRvY3VtZW50Ci0gICAgJ2NsYXNzX2hpZXJhcmNoeScgOiAnSElFUicsCSMgYSBjbGFzcyBoaWVyYXJjaHkgZG9jdW1lbnQKLSAgICAnc2luZ2xlX2NsYXNzX2hpZXJhcmNoeScgOiAnMUhJUicsCSMgYSBzaW5nbGUgY2xhc3MgaGllcmFyY2h5IGRvY3VtZW50Ci0gICAgJ3Byb2plY3RfaW5zcGVjdG9yJyA6ICdJTlNQJywJIyBhIHByb2plY3QgaW5zcGVjdG9yCi0gICAgJ1Rvb2xTZXJ2ZXJfd29ya3NoZWV0JyA6ICdUT09MJywJIyB0aGUgVG9vbFNlcnZlciB3b3Jrc2hlZXQKLSAgICAnYnVpbGRfcHJvZ3Jlc3NfZG9jdW1lbnQnIDogJ1BSR1MnLAkjIHRoZSBidWlsZCBwcm9ncmVzcyB3aW5kb3cKKyAgICAncHJvamVjdCcgOiAnUFJKRCcsICMgYSBwcm9qZWN0IGRvY3VtZW50CisgICAgJ2VkaXRvcl9kb2N1bWVudCcgOiAnRURJVCcsICMgYW4gZWRpdG9yIGRvY3VtZW50CisgICAgJ21lc3NhZ2UnIDogJ01TU0cnLCAjIGEgbWVzc2FnZSBkb2N1bWVudAorICAgICdmaWxlX2NvbXBhcmUnIDogJ0NPTVAnLCAgICAjIGEgZmlsZSBjb21wYXJlIGRvY3VtZW50CisgICAgJ2NhdGFsb2dfZG9jdW1lbnQnIDogJ0NUTEcnLCAgICAgICAgIyBhIGJyb3dzZXIgY2F0YWxvZworICAgICdjbGFzc19icm93c2VyJyA6ICdCUk9XJywgICAjIGEgY2xhc3MgYnJvd3NlciBkb2N1bWVudAorICAgICdzaW5nbGVfY2xhc3NfYnJvd3NlcicgOiAnMUJSVycsICAgICMgYSBzaW5nbGUgY2xhc3MgYnJvd3NlciBkb2N1bWVudAorICAgICdzeW1ib2xfYnJvd3NlcicgOiAnU1lNQicsICAjIGEgc3ltYm9sIGJyb3dzZXIgZG9jdW1lbnQKKyAgICAnY2xhc3NfaGllcmFyY2h5JyA6ICdISUVSJywgIyBhIGNsYXNzIGhpZXJhcmNoeSBkb2N1bWVudAorICAgICdzaW5nbGVfY2xhc3NfaGllcmFyY2h5JyA6ICcxSElSJywgICMgYSBzaW5nbGUgY2xhc3MgaGllcmFyY2h5IGRvY3VtZW50CisgICAgJ3Byb2plY3RfaW5zcGVjdG9yJyA6ICdJTlNQJywgICAgICAgIyBhIHByb2plY3QgaW5zcGVjdG9yCisgICAgJ1Rvb2xTZXJ2ZXJfd29ya3NoZWV0JyA6ICdUT09MJywgICAgIyB0aGUgVG9vbFNlcnZlciB3b3Jrc2hlZXQKKyAgICAnYnVpbGRfcHJvZ3Jlc3NfZG9jdW1lbnQnIDogJ1BSR1MnLCAjIHRoZSBidWlsZCBwcm9ncmVzcyB3aW5kb3cKIH0KIAogX0VudW1fRlRZUCA9IHsKLSAgICAnbGlicmFyeV9maWxlJyA6ICdMSUJGJywJIyBhIGxpYnJhcnkgZmlsZQotICAgICdwcm9qZWN0X2ZpbGUnIDogJ1BSSkYnLAkjIGEgcHJvamVjdCBmaWxlCi0gICAgJ3Jlc291cmNlX2ZpbGUnIDogJ1JFU0YnLAkjIGEgcmVzb3VyY2UgZmlsZQotICAgICd0ZXh0X2ZpbGUnIDogJ1RYVEYnLAkjIGEgdGV4dCBmaWxlCi0gICAgJ3Vua25vd25fZmlsZScgOiAnVU5LTicsCSMgdW5rbm93biBmaWxlIHR5cGUKKyAgICAnbGlicmFyeV9maWxlJyA6ICdMSUJGJywgICAgIyBhIGxpYnJhcnkgZmlsZQorICAgICdwcm9qZWN0X2ZpbGUnIDogJ1BSSkYnLCAgICAjIGEgcHJvamVjdCBmaWxlCisgICAgJ3Jlc291cmNlX2ZpbGUnIDogJ1JFU0YnLCAgICMgYSByZXNvdXJjZSBmaWxlCisgICAgJ3RleHRfZmlsZScgOiAnVFhURicsICAgICAgICMgYSB0ZXh0IGZpbGUKKyAgICAndW5rbm93bl9maWxlJyA6ICdVTktOJywgICAgIyB1bmtub3duIGZpbGUgdHlwZQogfQogCiBfRW51bV9JbnRlID0gewotICAgICduZXZlcl9pbnRlcmFjdCcgOiAnZU52cicsCSMgbmV2ZXIgYWxsb3cgdXNlciBpbnRlcmFjdGlvbnMKLSAgICAnaW50ZXJhY3Rfd2l0aF9zZWxmJyA6ICdlSW5TJywJIyBhbGxvdyB1c2VyIGludGVyYWN0aW9uIG9ubHkgd2hlbiBhbiBBcHBsZUV2ZW50IGlzIHNlbnQgZnJvbSB3aXRoaW4gQ29kZVdhcnJpb3IKLSAgICAnaW50ZXJhY3Rfd2l0aF9sb2NhbCcgOiAnZUluTCcsCSMgYWxsb3cgdXNlciBpbnRlcmFjdGlvbiB3aGVuIEFwcGxlRXZlbnRzIGFyZSBzZW50IGZyb20gYXBwbGljYXRpb25zIG9uIHRoZSBzYW1lIG1hY2hpbmUgKGRlZmF1bHQpCi0gICAgJ2ludGVyYWN0X3dpdGhfYWxsJyA6ICdlSW5BJywJIyBhbGxvdyB1c2VyIGludGVyYWN0aW9uIGZyb20gYm90aCBsb2NhbCBhbmQgcmVtb3RlIEFwcGxlRXZlbnRzCisgICAgJ25ldmVyX2ludGVyYWN0JyA6ICdlTnZyJywgICMgbmV2ZXIgYWxsb3cgdXNlciBpbnRlcmFjdGlvbnMKKyAgICAnaW50ZXJhY3Rfd2l0aF9zZWxmJyA6ICdlSW5TJywgICAgICAjIGFsbG93IHVzZXIgaW50ZXJhY3Rpb24gb25seSB3aGVuIGFuIEFwcGxlRXZlbnQgaXMgc2VudCBmcm9tIHdpdGhpbiBDb2RlV2FycmlvcgorICAgICdpbnRlcmFjdF93aXRoX2xvY2FsJyA6ICdlSW5MJywgICAgICMgYWxsb3cgdXNlciBpbnRlcmFjdGlvbiB3aGVuIEFwcGxlRXZlbnRzIGFyZSBzZW50IGZyb20gYXBwbGljYXRpb25zIG9uIHRoZSBzYW1lIG1hY2hpbmUgKGRlZmF1bHQpCisgICAgJ2ludGVyYWN0X3dpdGhfYWxsJyA6ICdlSW5BJywgICAgICAgIyBhbGxvdyB1c2VyIGludGVyYWN0aW9uIGZyb20gYm90aCBsb2NhbCBhbmQgcmVtb3RlIEFwcGxlRXZlbnRzCiB9CiAKIF9FbnVtX1BFUk0gPSB7Ci0gICAgJ3JlYWRfd3JpdGUnIDogJ1JkV3InLAkjIHRoZSBmaWxlIGlzIG9wZW4gd2l0aCByZWFkL3dyaXRlIHBlcm1pc3Npb24KLSAgICAncmVhZF9vbmx5JyA6ICdSZWFkJywJIyB0aGUgZmlsZSBpcyBvcGVuIHdpdGggcmVhZC9vbmx5IHBlcm1pc3Npb24KLSAgICAnY2hlY2tlZF9vdXRfcmVhZF93cml0ZScgOiAnQ2tSVycsCSMgdGhlIGZpbGUgaXMgY2hlY2tlZCBvdXQgd2l0aCByZWFkL3dyaXRlIHBlcm1pc3Npb24KLSAgICAnY2hlY2tlZF9vdXRfcmVhZF9vbmx5JyA6ICdDa1JPJywJIyB0aGUgZmlsZSBpcyBjaGVja2VkIG91dCB3aXRoIHJlYWQvb25seSBwZXJtaXNzaW9uCi0gICAgJ2NoZWNrZWRfb3V0X3JlYWRfbW9kaWZ5JyA6ICdDa1JNJywJIyB0aGUgZmlsZSBpcyBjaGVja2VkIG91dCB3aXRoIHJlYWQvbW9kaWZ5IHBlcm1pc3Npb24KLSAgICAnbG9ja2VkJyA6ICdMb2NrJywJIyB0aGUgZmlsZSBpcyBsb2NrZWQgb24gZGlzawotICAgICdub25lJyA6ICdMTk5PJywJIyB0aGUgZmlsZSBpcyBuZXcKKyAgICAncmVhZF93cml0ZScgOiAnUmRXcicsICAgICAgIyB0aGUgZmlsZSBpcyBvcGVuIHdpdGggcmVhZC93cml0ZSBwZXJtaXNzaW9uCisgICAgJ3JlYWRfb25seScgOiAnUmVhZCcsICAgICAgICMgdGhlIGZpbGUgaXMgb3BlbiB3aXRoIHJlYWQvb25seSBwZXJtaXNzaW9uCisgICAgJ2NoZWNrZWRfb3V0X3JlYWRfd3JpdGUnIDogJ0NrUlcnLCAgIyB0aGUgZmlsZSBpcyBjaGVja2VkIG91dCB3aXRoIHJlYWQvd3JpdGUgcGVybWlzc2lvbgorICAgICdjaGVja2VkX291dF9yZWFkX29ubHknIDogJ0NrUk8nLCAgICMgdGhlIGZpbGUgaXMgY2hlY2tlZCBvdXQgd2l0aCByZWFkL29ubHkgcGVybWlzc2lvbgorICAgICdjaGVja2VkX291dF9yZWFkX21vZGlmeScgOiAnQ2tSTScsICMgdGhlIGZpbGUgaXMgY2hlY2tlZCBvdXQgd2l0aCByZWFkL21vZGlmeSBwZXJtaXNzaW9uCisgICAgJ2xvY2tlZCcgOiAnTG9jaycsICAjIHRoZSBmaWxlIGlzIGxvY2tlZCBvbiBkaXNrCisgICAgJ25vbmUnIDogJ0xOTk8nLCAgICAjIHRoZSBmaWxlIGlzIG5ldwogfQogCiAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvTWV0cm93ZXJrc19TaGVsbF9TdWl0ZS5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvTWV0cm93ZXJrc19TaGVsbF9TdWl0ZS5weQppbmRleCAzYmViMDg5Li45MDljZGMwIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL01ldHJvd2Vya3NfU2hlbGxfU3VpdGUucHkKKysrIGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9NZXRyb3dlcmtzX1NoZWxsX1N1aXRlLnB5CkBAIC0yMDI1LDExMCArMjAyNSwxMTAgQEAKIEZvbnQuX3ByaXZlbGVtZGljdCA9IHsKIH0KIF9FbnVtX0FjY2UgPSB7Ci0gICAgJ3B1YmxpYycgOiAnUHVibCcsCSMgCi0gICAgJ3Byb3RlY3RlZCcgOiAnUHJvdCcsCSMgCi0gICAgJ3ByaXZhdGUnIDogJ1ByaXYnLAkjIAorICAgICdwdWJsaWMnIDogJ1B1YmwnLCAgIworICAgICdwcm90ZWN0ZWQnIDogJ1Byb3QnLCAgICAgICAjCisgICAgJ3ByaXZhdGUnIDogJ1ByaXYnLCAjCiB9CiAKIF9FbnVtX0JYYnIgPSB7Ci0gICAgJ0Fsd2F5c19CdWlsZCcgOiAnQlhiMScsCSMgQWx3YXlzIGJ1aWxkIHRoZSB0YXJnZXQgYmVmb3JlIHJ1bm5pbmcuCi0gICAgJ0Fza19CdWlsZCcgOiAnQlhiMicsCSMgQXNrIGJlZm9yZSBidWlsZGluZyB0aGUgdGFyZ2V0IHdoZW4gcnVubmluZy4KLSAgICAnTmV2ZXJfQnVpbGQnIDogJ0JYYjMnLAkjIE5ldmVyIGJlZm9yZSBidWlsZGluZyB0aGUgdGFyZ2V0IGJlZm9yZSBydW5uaW5nLgorICAgICdBbHdheXNfQnVpbGQnIDogJ0JYYjEnLCAgICAjIEFsd2F5cyBidWlsZCB0aGUgdGFyZ2V0IGJlZm9yZSBydW5uaW5nLgorICAgICdBc2tfQnVpbGQnIDogJ0JYYjInLCAgICAgICAjIEFzayBiZWZvcmUgYnVpbGRpbmcgdGhlIHRhcmdldCB3aGVuIHJ1bm5pbmcuCisgICAgJ05ldmVyX0J1aWxkJyA6ICdCWGIzJywgICAgICMgTmV2ZXIgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0YXJnZXQgYmVmb3JlIHJ1bm5pbmcuCiB9CiAKIF9FbnVtX0RiU0EgPSB7Ci0gICAgJ05vX0FjdGlvbicgOiAnRFNBMScsCSMgRG9uXHhkNXQgZG8gYW55dGhpbmcgdG8gbm9uLWRlYnVnIHdpbmRvd3MKLSAgICAnSGlkZV9XaW5kb3dzJyA6ICdEU0EyJywJIyBIaWRlIG5vbi1kZWJ1Z2dpbmcgd2luZG93cwotICAgICdDb2xsYXBzZV9XaW5kb3dzJyA6ICdEU0EzJywJIyBDb2xsYXBzZSBub24tZGVidWdnaW5nIHdpbmRvd3MKLSAgICAnQ2xvc2VfV2luZG93cycgOiAnRFNBNCcsCSMgQ2xvc2Ugbm9uLWRlYnVnZ2luZyB3aW5kb3dzCisgICAgJ05vX0FjdGlvbicgOiAnRFNBMScsICAgICAgICMgRG9uXHhkNXQgZG8gYW55dGhpbmcgdG8gbm9uLWRlYnVnIHdpbmRvd3MKKyAgICAnSGlkZV9XaW5kb3dzJyA6ICdEU0EyJywgICAgIyBIaWRlIG5vbi1kZWJ1Z2dpbmcgd2luZG93cworICAgICdDb2xsYXBzZV9XaW5kb3dzJyA6ICdEU0EzJywgICAgICAgICMgQ29sbGFwc2Ugbm9uLWRlYnVnZ2luZyB3aW5kb3dzCisgICAgJ0Nsb3NlX1dpbmRvd3MnIDogJ0RTQTQnLCAgICMgQ2xvc2Ugbm9uLWRlYnVnZ2luZyB3aW5kb3dzCiB9CiAKIF9FbnVtX0RnQkwgPSB7Ci0gICAgJ0Fsd2F5cycgOiAnRGdCMCcsCSMgQWx3YXlzIGJ1aWxkIGJlZm9yZSBkZWJ1Z2dpbmcuCi0gICAgJ05ldmVyJyA6ICdEZ0IxJywJIyBOZXZlciBidWlsZCBiZWZvcmUgZGVidWdnaW5nLgotICAgICdBc2snIDogJ0RnQjInLAkjIEFzayBhYm91dCBidWlsZGluZyBiZWZvcmUgZGVidWdnaW5nLgorICAgICdBbHdheXMnIDogJ0RnQjAnLCAgIyBBbHdheXMgYnVpbGQgYmVmb3JlIGRlYnVnZ2luZy4KKyAgICAnTmV2ZXInIDogJ0RnQjEnLCAgICMgTmV2ZXIgYnVpbGQgYmVmb3JlIGRlYnVnZ2luZy4KKyAgICAnQXNrJyA6ICdEZ0IyJywgICAgICMgQXNrIGFib3V0IGJ1aWxkaW5nIGJlZm9yZSBkZWJ1Z2dpbmcuCiB9CiAKIF9FbnVtX0VyclQgPSB7Ci0gICAgJ2luZm9ybWF0aW9uJyA6ICdFckluJywJIyAKLSAgICAnY29tcGlsZXJfd2FybmluZycgOiAnRXJDVycsCSMgCi0gICAgJ2NvbXBpbGVyX2Vycm9yJyA6ICdFckNFJywJIyAKLSAgICAnZGVmaW5pdGlvbicgOiAnRXJEZicsCSMgCi0gICAgJ2xpbmtlcl93YXJuaW5nJyA6ICdFckxXJywJIyAKLSAgICAnbGlua2VyX2Vycm9yJyA6ICdFckxFJywJIyAKLSAgICAnZmluZF9yZXN1bHQnIDogJ0VyRm4nLAkjIAotICAgICdnZW5lcmljX2Vycm9yJyA6ICdFckduJywJIyAKKyAgICAnaW5mb3JtYXRpb24nIDogJ0VySW4nLCAgICAgIworICAgICdjb21waWxlcl93YXJuaW5nJyA6ICdFckNXJywgICAgICAgICMKKyAgICAnY29tcGlsZXJfZXJyb3InIDogJ0VyQ0UnLCAgIworICAgICdkZWZpbml0aW9uJyA6ICdFckRmJywgICAgICAjCisgICAgJ2xpbmtlcl93YXJuaW5nJyA6ICdFckxXJywgICMKKyAgICAnbGlua2VyX2Vycm9yJyA6ICdFckxFJywgICAgIworICAgICdmaW5kX3Jlc3VsdCcgOiAnRXJGbicsICAgICAjCisgICAgJ2dlbmVyaWNfZXJyb3InIDogJ0VyR24nLCAgICMKIH0KIAogX0VudW1fSW50ZSA9IHsKLSAgICAnbmV2ZXJfaW50ZXJhY3QnIDogJ2VOdnInLAkjIE5ldmVyIGFsbG93IHVzZXIgaW50ZXJhY3Rpb25zCi0gICAgJ2ludGVyYWN0X3dpdGhfc2VsZicgOiAnZUluUycsCSMgQWxsb3cgdXNlciBpbnRlcmFjdGlvbiBvbmx5IHdoZW4gYW4gQXBwbGVFdmVudCBpcyBzZW50IGZyb20gd2l0aGluIENvZGVXYXJyaW9yCi0gICAgJ2ludGVyYWN0X3dpdGhfbG9jYWwnIDogJ2VJbkwnLAkjIEFsbG93IHVzZXIgaW50ZXJhY3Rpb24gd2hlbiBBcHBsZUV2ZW50cyBhcmUgc2VudCBmcm9tIGFwcGxpY2F0aW9ucyBvbiB0aGUgc2FtZSBtYWNoaW5lIChkZWZhdWx0KQotICAgICdpbnRlcmFjdF93aXRoX2FsbCcgOiAnZUluQScsCSMgQWxsb3cgdXNlciBpbnRlcmFjdGlvbiBmcm9tIGJvdGggbG9jYWwgYW5kIHJlbW90ZSBBcHBsZUV2ZW50cworICAgICduZXZlcl9pbnRlcmFjdCcgOiAnZU52cicsICAjIE5ldmVyIGFsbG93IHVzZXIgaW50ZXJhY3Rpb25zCisgICAgJ2ludGVyYWN0X3dpdGhfc2VsZicgOiAnZUluUycsICAgICAgIyBBbGxvdyB1c2VyIGludGVyYWN0aW9uIG9ubHkgd2hlbiBhbiBBcHBsZUV2ZW50IGlzIHNlbnQgZnJvbSB3aXRoaW4gQ29kZVdhcnJpb3IKKyAgICAnaW50ZXJhY3Rfd2l0aF9sb2NhbCcgOiAnZUluTCcsICAgICAjIEFsbG93IHVzZXIgaW50ZXJhY3Rpb24gd2hlbiBBcHBsZUV2ZW50cyBhcmUgc2VudCBmcm9tIGFwcGxpY2F0aW9ucyBvbiB0aGUgc2FtZSBtYWNoaW5lIChkZWZhdWx0KQorICAgICdpbnRlcmFjdF93aXRoX2FsbCcgOiAnZUluQScsICAgICAgICMgQWxsb3cgdXNlciBpbnRlcmFjdGlvbiBmcm9tIGJvdGggbG9jYWwgYW5kIHJlbW90ZSBBcHBsZUV2ZW50cwogfQogCiBfRW51bV9MYW5nID0gewotICAgICdDJyA6ICdMQyAgJywJIyAKLSAgICAnQ18yYl9fMmJfJyA6ICdMQysrJywJIyAKLSAgICAnUGFzY2FsJyA6ICdMUCAgJywJIyAKLSAgICAnT2JqZWN0X1Bhc2NhbCcgOiAnTFArKycsCSMgCi0gICAgJ0phdmEnIDogJ0xKYXYnLAkjIAotICAgICdBc3NlbWJsZXInIDogJ0xBc20nLAkjIAotICAgICdVbmtub3duJyA6ICdMPyAgJywJIyAKKyAgICAnQycgOiAnTEMgICcsICAgICAgICMKKyAgICAnQ18yYl9fMmJfJyA6ICdMQysrJywgICAgICAgIworICAgICdQYXNjYWwnIDogJ0xQICAnLCAgIworICAgICdPYmplY3RfUGFzY2FsJyA6ICdMUCsrJywgICAjCisgICAgJ0phdmEnIDogJ0xKYXYnLCAgICAjCisgICAgJ0Fzc2VtYmxlcicgOiAnTEFzbScsICAgICAgICMKKyAgICAnVW5rbm93bicgOiAnTD8gICcsICMKIH0KIAogX0VudW1fUFBybSA9IHsKLSAgICAnYWJzb2x1dGUnIDogJ0Fic28nLAkjIEFuIGFic29sdXRlIHBhdGggbmFtZSwgaW5jbHVkaW5nIHZvbHVtZSBuYW1lLgotICAgICdwcm9qZWN0X3JlbGF0aXZlJyA6ICdQUmVsJywJIyBBIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcHJvamVjdFx4ZDVzIGZvbGRlci4KLSAgICAnc2hlbGxfcmVsYXRpdmUnIDogJ1NSZWwnLAkjIEEgcGF0aCByZWxhdGl2ZSB0byB0aGUgQ29kZVdhcnJpb3JceGFhIGZvbGRlci4KLSAgICAnc3lzdGVtX3JlbGF0aXZlJyA6ICdZUmVsJywJIyBBIHBhdGggcmVsYXRpdmUgdG8gdGhlIHN5c3RlbSBmb2xkZXIKLSAgICAncm9vdF9yZWxhdGl2ZScgOiAnUlJlbCcsCSMgCisgICAgJ2Fic29sdXRlJyA6ICdBYnNvJywgICAgICAgICMgQW4gYWJzb2x1dGUgcGF0aCBuYW1lLCBpbmNsdWRpbmcgdm9sdW1lIG5hbWUuCisgICAgJ3Byb2plY3RfcmVsYXRpdmUnIDogJ1BSZWwnLCAgICAgICAgIyBBIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcHJvamVjdFx4ZDVzIGZvbGRlci4KKyAgICAnc2hlbGxfcmVsYXRpdmUnIDogJ1NSZWwnLCAgIyBBIHBhdGggcmVsYXRpdmUgdG8gdGhlIENvZGVXYXJyaW9yXHhhYSBmb2xkZXIuCisgICAgJ3N5c3RlbV9yZWxhdGl2ZScgOiAnWVJlbCcsICMgQSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzeXN0ZW0gZm9sZGVyCisgICAgJ3Jvb3RfcmVsYXRpdmUnIDogJ1JSZWwnLCAgICMKIH0KIAogX0VudW1fUFhkZyA9IHsKLSAgICAnRGlhZ25vc2VfTm9uZScgOiAnUFhkMScsCSMgTm8gUGx1Z2luIERpYWdub3N0aWNzLgotICAgICdEaWFnbm9zZV9FcnJvcnMnIDogJ1BYZDInLAkjIFBsdWdpbiBEaWFnbm9zdGljcyBmb3IgZXJyb3JzIG9ubHkuCi0gICAgJ0RpYWdub3NlX0FsbCcgOiAnUFhkMycsCSMgUGx1Z2luIERpYWdub3N0aWNzIGZvciBldmVyeXRoaW5nLgorICAgICdEaWFnbm9zZV9Ob25lJyA6ICdQWGQxJywgICAjIE5vIFBsdWdpbiBEaWFnbm9zdGljcy4KKyAgICAnRGlhZ25vc2VfRXJyb3JzJyA6ICdQWGQyJywgIyBQbHVnaW4gRGlhZ25vc3RpY3MgZm9yIGVycm9ycyBvbmx5LgorICAgICdEaWFnbm9zZV9BbGwnIDogJ1BYZDMnLCAgICAjIFBsdWdpbiBEaWFnbm9zdGljcyBmb3IgZXZlcnl0aGluZy4KIH0KIAogX0VudW1fUHRoRiA9IHsKLSAgICAnR2VuZXJpY19QYXRoJyA6ICdQRkduJywJIyAKLSAgICAnTWFjT1NfUGF0aCcgOiAnUEZNYycsCSMgTWFjT1MgcGF0aCB1c2luZyBjb2xvbiBhcyBzZXBhcmF0b3IKLSAgICAnV2luZG93c19QYXRoJyA6ICdQRlduJywJIyBXaW5kb3dzIHBhdGggdXNpbmcgYmFja3NsYXNoIGFzIHNlcGFyYXRvcgotICAgICdVbml4X1BhdGgnIDogJ1BGVXgnLAkjIFVuaXggcGF0aCB1c2luZyBzbGFzaCBhcyBzZXBhcmF0b3IKKyAgICAnR2VuZXJpY19QYXRoJyA6ICdQRkduJywgICAgIworICAgICdNYWNPU19QYXRoJyA6ICdQRk1jJywgICAgICAjIE1hY09TIHBhdGggdXNpbmcgY29sb24gYXMgc2VwYXJhdG9yCisgICAgJ1dpbmRvd3NfUGF0aCcgOiAnUEZXbicsICAgICMgV2luZG93cyBwYXRoIHVzaW5nIGJhY2tzbGFzaCBhcyBzZXBhcmF0b3IKKyAgICAnVW5peF9QYXRoJyA6ICdQRlV4JywgICAgICAgIyBVbml4IHBhdGggdXNpbmcgc2xhc2ggYXMgc2VwYXJhdG9yCiB9CiAKIF9FbnVtX1JlZlAgPSB7Ci0gICAgJ1RoaW5rX1JlZmVyZW5jZScgOiAnRGFuUicsCSMgCi0gICAgJ1F1aWNrVmlldycgOiAnQUxUVicsCSMgCisgICAgJ1RoaW5rX1JlZmVyZW5jZScgOiAnRGFuUicsICMKKyAgICAnUXVpY2tWaWV3JyA6ICdBTFRWJywgICAgICAgIwogfQogCiBfRW51bV9TVEtkID0gewotICAgICdBYnNvbHV0ZV9QYXRoJyA6ICdTVEswJywJIyBUaGUgXHhkMnBhdGhceGQzIHByb3BlcnR5IGlzIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAgICAnUmVnaXN0cnlfS2V5JyA6ICdTVEsxJywJIyBUaGUgXHhkMnBhdGhceGQzIHByb3BlcnR5IGlzIHRoZSBuYW1lIG9mIGEgcmVnaXN0cnkga2V5IHRoYXQgY29udGFpbnMgdGhlIHBhdGggdG8gdGhlIHJvb3QuCi0gICAgJ0Vudmlyb25tZW50X1ZhcmlhYmxlJyA6ICdTVEsyJywJIyBUaGUgXHhkMnBhdGhceGQzIHByb3BlcnR5IGlzIHRoZSBuYW1lIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgY29udGFpbnMgdGhlIHBhdGggdG8gdGhlIHJvb3QuCisgICAgJ0Fic29sdXRlX1BhdGgnIDogJ1NUSzAnLCAgICMgVGhlIFx4ZDJwYXRoXHhkMyBwcm9wZXJ0eSBpcyBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc291cmNlIHRyZWUuCisgICAgJ1JlZ2lzdHJ5X0tleScgOiAnU1RLMScsICAgICMgVGhlIFx4ZDJwYXRoXHhkMyBwcm9wZXJ0eSBpcyB0aGUgbmFtZSBvZiBhIHJlZ2lzdHJ5IGtleSB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIHRvIHRoZSByb290LgorICAgICdFbnZpcm9ubWVudF9WYXJpYWJsZScgOiAnU1RLMicsICAgICMgVGhlIFx4ZDJwYXRoXHhkMyBwcm9wZXJ0eSBpcyB0aGUgbmFtZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIHRvIHRoZSByb290LgogfQogCiBfRW51bV9TcmNUID0gewotICAgICdzb3VyY2UnIDogJ0ZUeHQnLAkjIEEgc291cmNlIGZpbGUgKC5jLCAuY3AsIC5wLCBldGMpLgotICAgICd1bmtub3duJyA6ICdGVW5rJywJIyBBbiB1bmtub3duIGZpbGUgdHlwZS4KKyAgICAnc291cmNlJyA6ICdGVHh0JywgICMgQSBzb3VyY2UgZmlsZSAoLmMsIC5jcCwgLnAsIGV0YykuCisgICAgJ3Vua25vd24nIDogJ0ZVbmsnLCAjIEFuIHVua25vd24gZmlsZSB0eXBlLgogfQogCiBfRW51bV9UbXBCID0gewotICAgICdVc2VyX1NwZWNpZmllZCcgOiAnVXNycycsCSMgVXNlIHVzZXIgc3BlY2lmaWVkIHN5bWJvbHMgd2hlbiBzZXR0aW5nIHRlbXBvcmFyeSBicmVha3BvaW50cyBvbiBwcm9ncmFtIGxhdW5jaC4KLSAgICAnRGVmYXVsdCcgOiAnRGZsdCcsCSMgVXNlIHN5c3RlbSBkZWZhdWx0IHN5bWJvbHMgd2hlbiBzZXR0aW5nIHRlbXBvcmFyeSBicmVha3BvaW50cyBvbiBwcm9ncmFtIGxhdW5jaC4KKyAgICAnVXNlcl9TcGVjaWZpZWQnIDogJ1VzcnMnLCAgIyBVc2UgdXNlciBzcGVjaWZpZWQgc3ltYm9scyB3aGVuIHNldHRpbmcgdGVtcG9yYXJ5IGJyZWFrcG9pbnRzIG9uIHByb2dyYW0gbGF1bmNoLgorICAgICdEZWZhdWx0JyA6ICdEZmx0JywgIyBVc2Ugc3lzdGVtIGRlZmF1bHQgc3ltYm9scyB3aGVuIHNldHRpbmcgdGVtcG9yYXJ5IGJyZWFrcG9pbnRzIG9uIHByb2dyYW0gbGF1bmNoLgogfQogCiBfRW51bV9UeHRGID0gewotICAgICdNYWNPUycgOiAnVHhGMCcsCSMgTWFjT1MgdGV4dCBmb3JtYXQKLSAgICAnRE9TJyA6ICdUeEYxJywJIyBET1MgdGV4dCBmb3JtYXQKLSAgICAnVW5peCcgOiAnVHhGMicsCSMgVW5peCB0ZXh0IGZvcm1hdAorICAgICdNYWNPUycgOiAnVHhGMCcsICAgIyBNYWNPUyB0ZXh0IGZvcm1hdAorICAgICdET1MnIDogJ1R4RjEnLCAgICAgIyBET1MgdGV4dCBmb3JtYXQKKyAgICAnVW5peCcgOiAnVHhGMicsICAgICMgVW5peCB0ZXh0IGZvcm1hdAogfQogCiBfRW51bV9zYXZvID0gewotICAgICd5ZXMnIDogJ3llcyAnLAkjIFNhdmUgY2hhbmdlcwotICAgICdubycgOiAnbm8gICcsCSMgRG8gbm90IHNhdmUgY2hhbmdlcwotICAgICdhc2snIDogJ2FzayAnLAkjIEFzayB0aGUgdXNlciB3aGV0aGVyIHRvIHNhdmUKKyAgICAneWVzJyA6ICd5ZXMgJywgICAgICMgU2F2ZSBjaGFuZ2VzCisgICAgJ25vJyA6ICdubyAgJywgICAgICAjIERvIG5vdCBzYXZlIGNoYW5nZXMKKyAgICAnYXNrJyA6ICdhc2sgJywgICAgICMgQXNrIHRoZSB1c2VyIHdoZXRoZXIgdG8gc2F2ZQogfQogCiAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvUmVxdWlyZWQucHkgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL1JlcXVpcmVkLnB5CmluZGV4IGEyYzBkZTguLmIwNzQ5ZTggMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvUmVxdWlyZWQucHkKKysrIGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9SZXF1aXJlZC5weQpAQCAtNDAsOCArNDAsOCBAQAogICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCiBfRW51bV9Db252ID0gewotICAgICd5ZXMnIDogJ3llcyAnLAkjIENvbnZlcnQgdGhlIHByb2plY3QgaWYgbmVjZXNzYXJ5IG9uIG9wZW4KLSAgICAnbm8nIDogJ25vICAnLAkjIERvIG5vdCBjb252ZXJ0IHRoZSBwcm9qZWN0IGlmIG5lZWRlZCBvbiBvcGVuCisgICAgJ3llcycgOiAneWVzICcsICAgICAjIENvbnZlcnQgdGhlIHByb2plY3QgaWYgbmVjZXNzYXJ5IG9uIG9wZW4KKyAgICAnbm8nIDogJ25vICAnLCAgICAgICMgRG8gbm90IGNvbnZlcnQgdGhlIHByb2plY3QgaWYgbmVlZGVkIG9uIG9wZW4KIH0KIAogCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL19faW5pdF9fLnB5IGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9fX2luaXRfXy5weQppbmRleCA0M2FlNDA0Li41ZWY3Y2E5IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL19faW5pdF9fLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvX19pbml0X18ucHkKQEAgLTE4Nyw0ICsxODcsMyBAQAogICAgIF9zaWduYXR1cmUgPSAnQ1dJRScKIAogICAgIF9tb2R1bGVOYW1lID0gJ0NvZGVXYXJyaW9yJwotCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1JlcXVpcmVkX1N1aXRlLnB5IGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9SZXF1aXJlZF9TdWl0ZS5weQppbmRleCBlMDIzYWNkLi4wYTk4NWQxIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1JlcXVpcmVkX1N1aXRlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvUmVxdWlyZWRfU3VpdGUucHkKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAogICAgIGRlZiBydW4oc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLSAgICAgICAgIiIicnVuOiAKKyAgICAgICAgIiIicnVuOgogICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CiAgICAgICAgICIiIgogICAgICAgICBfY29kZSA9ICdhZXZ0JwpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9TdGFuZGFyZF9TdWl0ZS5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvU3RhbmRhcmRfU3VpdGUucHkKaW5kZXggYWY2OGUyNS4uN2VhZDk4YSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9TdGFuZGFyZF9TdWl0ZS5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1N0YW5kYXJkX1N1aXRlLnB5CkBAIC0xNyw3ICsxNyw3IEBACiAgICAgfQogCiAgICAgZGVmIGdldChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLSAgICAgICAgIiIiZ2V0OiAKKyAgICAgICAgIiIiZ2V0OgogICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQogICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGFzOiB1bmRvY3VtZW50ZWQsIHR5cGVjb2RlICd0eXBlJwogICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1dlYl9Ccm93c2VyX1N1aXRlLnB5IGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9XZWJfQnJvd3Nlcl9TdWl0ZS5weQppbmRleCBhMDVkNzk1Li5mZjgwOGViIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1dlYl9Ccm93c2VyX1N1aXRlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvV2ViX0Jyb3dzZXJfU3VpdGUucHkKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgIiIiR2V0V2luZG93SW5mbzogUmV0dXJucyBhIHdpbmRvdyBpbmZvIHJlY29yZCAoVVJML1RpdGxlKSBmb3IgdGhlIHNwZWNpZmllZCB3aW5kb3cuCiAgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBXaW5kb3cgSWRlbnRpZmllciBvZiB0aGUgd2luZG93CiAgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLSAgICAgICAgUmV0dXJuczogICAKKyAgICAgICAgUmV0dXJuczoKICAgICAgICAgIiIiCiAgICAgICAgIF9jb2RlID0gJ1dXVyEnCiAgICAgICAgIF9zdWJjb2RlID0gJ1dORk8nCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9FbnVtZXJhdGlvbnMucHkgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9FbnVtZXJhdGlvbnMucHkKaW5kZXggMzgzMzZjYy4uNTU4ZDdmZiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRW51bWVyYXRpb25zLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0VudW1lcmF0aW9ucy5weQpAQCAtMTYsMTA2ICsxNiwxMDYgQEAKICAgICBwYXNzCiAKIF9FbnVtX2VhcnIgPSB7Ci0gICAgJ25vdF9hcnJhbmdlZCcgOiAnbmFycicsCSMgCi0gICAgJ3NuYXBfdG9fZ3JpZCcgOiAnZ3JkYScsCSMgCi0gICAgJ2FycmFuZ2VkX2J5X25hbWUnIDogJ25hbWEnLAkjIAotICAgICdhcnJhbmdlZF9ieV9tb2RpZmljYXRpb25fZGF0ZScgOiAnbWR0YScsCSMgCi0gICAgJ2FycmFuZ2VkX2J5X2NyZWF0aW9uX2RhdGUnIDogJ2NkdGEnLAkjIAotICAgICdhcnJhbmdlZF9ieV9zaXplJyA6ICdzaXphJywJIyAKLSAgICAnYXJyYW5nZWRfYnlfa2luZCcgOiAna2luYScsCSMgCi0gICAgJ2FycmFuZ2VkX2J5X2xhYmVsJyA6ICdsYWJhJywJIyAKKyAgICAnbm90X2FycmFuZ2VkJyA6ICduYXJyJywgICAgIworICAgICdzbmFwX3RvX2dyaWQnIDogJ2dyZGEnLCAgICAjCisgICAgJ2FycmFuZ2VkX2J5X25hbWUnIDogJ25hbWEnLCAgICAgICAgIworICAgICdhcnJhbmdlZF9ieV9tb2RpZmljYXRpb25fZGF0ZScgOiAnbWR0YScsICAgIworICAgICdhcnJhbmdlZF9ieV9jcmVhdGlvbl9kYXRlJyA6ICdjZHRhJywgICAgICAgIworICAgICdhcnJhbmdlZF9ieV9zaXplJyA6ICdzaXphJywgICAgICAgICMKKyAgICAnYXJyYW5nZWRfYnlfa2luZCcgOiAna2luYScsICAgICAgICAjCisgICAgJ2FycmFuZ2VkX2J5X2xhYmVsJyA6ICdsYWJhJywgICAgICAgIwogfQogCiBfRW51bV9lY3Z3ID0gewotICAgICdpY29uX3ZpZXcnIDogJ2ljbnYnLAkjIAotICAgICdsaXN0X3ZpZXcnIDogJ2xzdncnLAkjIAotICAgICdjb2x1bW5fdmlldycgOiAnY2x2dycsCSMgCisgICAgJ2ljb25fdmlldycgOiAnaWNudicsICAgICAgICMKKyAgICAnbGlzdF92aWV3JyA6ICdsc3Z3JywgICAgICAgIworICAgICdjb2x1bW5fdmlldycgOiAnY2x2dycsICAgICAjCiB9CiAKIF9FbnVtX2VkZm0gPSB7Ci0gICAgJ01hY19PU19mb3JtYXQnIDogJ2RmaGYnLAkjIAotICAgICdNYWNfT1NfRXh0ZW5kZWRfZm9ybWF0JyA6ICdkZmgrJywJIyAKLSAgICAnVUZTX2Zvcm1hdCcgOiAnZGZ1ZicsCSMgCi0gICAgJ05GU19mb3JtYXQnIDogJ2RmbmYnLAkjIAotICAgICdhdWRpb19mb3JtYXQnIDogJ2RmYXUnLAkjIAotICAgICdQcm9ET1NfZm9ybWF0JyA6ICdkZnByJywJIyAKLSAgICAnTVNfMmRfRE9TX2Zvcm1hdCcgOiAnZGZtcycsCSMgCi0gICAgJ0lTT185NjYwX2Zvcm1hdCcgOiAnZGY5NicsCSMgCi0gICAgJ0hpZ2hfU2llcnJhX2Zvcm1hdCcgOiAnZGZocycsCSMgCi0gICAgJ1F1aWNrVGFrZV9mb3JtYXQnIDogJ2RmcXQnLAkjIAotICAgICdBcHBsZV9QaG90b19mb3JtYXQnIDogJ2RmcGgnLAkjIAotICAgICdBcHBsZVNoYXJlX2Zvcm1hdCcgOiAnZGZhcycsCSMgCi0gICAgJ1VERl9mb3JtYXQnIDogJ2RmdWQnLAkjIAotICAgICdXZWJEQVZfZm9ybWF0JyA6ICdkZndkJywJIyAKLSAgICAnRlRQX2Zvcm1hdCcgOiAnZGZmdCcsCSMgCi0gICAgJ1BhY2tldF8yZF93cml0dGVuX1VERl9mb3JtYXQnIDogJ2RmcHUnLAkjIAotICAgICd1bmtub3duX2Zvcm1hdCcgOiAnZGY/PycsCSMgCisgICAgJ01hY19PU19mb3JtYXQnIDogJ2RmaGYnLCAgICMKKyAgICAnTWFjX09TX0V4dGVuZGVkX2Zvcm1hdCcgOiAnZGZoKycsICAjCisgICAgJ1VGU19mb3JtYXQnIDogJ2RmdWYnLCAgICAgICMKKyAgICAnTkZTX2Zvcm1hdCcgOiAnZGZuZicsICAgICAgIworICAgICdhdWRpb19mb3JtYXQnIDogJ2RmYXUnLCAgICAjCisgICAgJ1Byb0RPU19mb3JtYXQnIDogJ2RmcHInLCAgICMKKyAgICAnTVNfMmRfRE9TX2Zvcm1hdCcgOiAnZGZtcycsICAgICAgICAjCisgICAgJ0lTT185NjYwX2Zvcm1hdCcgOiAnZGY5NicsICMKKyAgICAnSGlnaF9TaWVycmFfZm9ybWF0JyA6ICdkZmhzJywgICAgICAjCisgICAgJ1F1aWNrVGFrZV9mb3JtYXQnIDogJ2RmcXQnLCAgICAgICAgIworICAgICdBcHBsZV9QaG90b19mb3JtYXQnIDogJ2RmcGgnLCAgICAgICMKKyAgICAnQXBwbGVTaGFyZV9mb3JtYXQnIDogJ2RmYXMnLCAgICAgICAjCisgICAgJ1VERl9mb3JtYXQnIDogJ2RmdWQnLCAgICAgICMKKyAgICAnV2ViREFWX2Zvcm1hdCcgOiAnZGZ3ZCcsICAgIworICAgICdGVFBfZm9ybWF0JyA6ICdkZmZ0JywgICAgICAjCisgICAgJ1BhY2tldF8yZF93cml0dGVuX1VERl9mb3JtYXQnIDogJ2RmcHUnLCAgICAjCisgICAgJ3Vua25vd25fZm9ybWF0JyA6ICdkZj8/JywgICMKIH0KIAogX0VudW1fZWxzdiA9IHsKLSAgICAnbmFtZV9jb2x1bW4nIDogJ2Vsc24nLAkjIAotICAgICdtb2RpZmljYXRpb25fZGF0ZV9jb2x1bW4nIDogJ2Vsc20nLAkjIAotICAgICdjcmVhdGlvbl9kYXRlX2NvbHVtbicgOiAnZWxzYycsCSMgCi0gICAgJ3NpemVfY29sdW1uJyA6ICdlbHNzJywJIyAKLSAgICAna2luZF9jb2x1bW4nIDogJ2Vsc2snLAkjIAotICAgICdsYWJlbF9jb2x1bW4nIDogJ2Vsc2wnLAkjIAotICAgICd2ZXJzaW9uX2NvbHVtbicgOiAnZWxzdicsCSMgCi0gICAgJ2NvbW1lbnRfY29sdW1uJyA6ICdlbHNDJywJIyAKKyAgICAnbmFtZV9jb2x1bW4nIDogJ2Vsc24nLCAgICAgIworICAgICdtb2RpZmljYXRpb25fZGF0ZV9jb2x1bW4nIDogJ2Vsc20nLCAgICAgICAgIworICAgICdjcmVhdGlvbl9kYXRlX2NvbHVtbicgOiAnZWxzYycsICAgICMKKyAgICAnc2l6ZV9jb2x1bW4nIDogJ2Vsc3MnLCAgICAgIworICAgICdraW5kX2NvbHVtbicgOiAnZWxzaycsICAgICAjCisgICAgJ2xhYmVsX2NvbHVtbicgOiAnZWxzbCcsICAgICMKKyAgICAndmVyc2lvbl9jb2x1bW4nIDogJ2Vsc3YnLCAgIworICAgICdjb21tZW50X2NvbHVtbicgOiAnZWxzQycsICAjCiB9CiAKIF9FbnVtX2lwbmwgPSB7Ci0gICAgJ0dlbmVyYWxfSW5mb3JtYXRpb25fcGFuZWwnIDogJ2dwbmwnLAkjIAotICAgICdTaGFyaW5nX3BhbmVsJyA6ICdzcG5sJywJIyAKLSAgICAnTWVtb3J5X3BhbmVsJyA6ICdtcG5sJywJIyAKLSAgICAnUHJldmlld19wYW5lbCcgOiAndnBubCcsCSMgCi0gICAgJ0FwcGxpY2F0aW9uX3BhbmVsJyA6ICdhcG5sJywJIyAKLSAgICAnTGFuZ3VhZ2VzX3BhbmVsJyA6ICdwa2xnJywJIyAKLSAgICAnUGx1Z2luc19wYW5lbCcgOiAncGtwZycsCSMgCi0gICAgJ05hbWVfXzI2X19FeHRlbnNpb25fcGFuZWwnIDogJ25wbmwnLAkjIAotICAgICdDb21tZW50c19wYW5lbCcgOiAnY3BubCcsCSMgCi0gICAgJ0NvbnRlbnRfSW5kZXhfcGFuZWwnIDogJ2NpbmwnLAkjIAorICAgICdHZW5lcmFsX0luZm9ybWF0aW9uX3BhbmVsJyA6ICdncG5sJywgICAgICAgIworICAgICdTaGFyaW5nX3BhbmVsJyA6ICdzcG5sJywgICAjCisgICAgJ01lbW9yeV9wYW5lbCcgOiAnbXBubCcsICAgICMKKyAgICAnUHJldmlld19wYW5lbCcgOiAndnBubCcsICAgIworICAgICdBcHBsaWNhdGlvbl9wYW5lbCcgOiAnYXBubCcsICAgICAgICMKKyAgICAnTGFuZ3VhZ2VzX3BhbmVsJyA6ICdwa2xnJywgIworICAgICdQbHVnaW5zX3BhbmVsJyA6ICdwa3BnJywgICAjCisgICAgJ05hbWVfXzI2X19FeHRlbnNpb25fcGFuZWwnIDogJ25wbmwnLCAgICAgICAjCisgICAgJ0NvbW1lbnRzX3BhbmVsJyA6ICdjcG5sJywgICMKKyAgICAnQ29udGVudF9JbmRleF9wYW5lbCcgOiAnY2lubCcsICAgICAjCiB9CiAKIF9FbnVtX2lzaXogPSB7Ci0gICAgJ21pbmknIDogJ21paWMnLAkjIAotICAgICdzbWFsbCcgOiAnc21pYycsCSMgCi0gICAgJ2xhcmdlJyA6ICdsZ2ljJywJIyAKKyAgICAnbWluaScgOiAnbWlpYycsICAgICMKKyAgICAnc21hbGwnIDogJ3NtaWMnLCAgICMKKyAgICAnbGFyZ2UnIDogJ2xnaWMnLCAgICMKIH0KIAogX0VudW1fbHZpYyA9IHsKLSAgICAnc21hbGxfaWNvbicgOiAnc21pYycsCSMgCi0gICAgJ2xhcmdlX2ljb24nIDogJ2xnaWMnLAkjIAorICAgICdzbWFsbF9pY29uJyA6ICdzbWljJywgICAgICAjCisgICAgJ2xhcmdlX2ljb24nIDogJ2xnaWMnLCAgICAgICMKIH0KIAogX0VudW1fcHJpdiA9IHsKLSAgICAncmVhZF9vbmx5JyA6ICdyZWFkJywJIyAKLSAgICAncmVhZF93cml0ZScgOiAncmR3cicsCSMgCi0gICAgJ3dyaXRlX29ubHknIDogJ3dyaXQnLAkjIAotICAgICdub25lJyA6ICdub25lJywJIyAKKyAgICAncmVhZF9vbmx5JyA6ICdyZWFkJywgICAgICAgIworICAgICdyZWFkX3dyaXRlJyA6ICdyZHdyJywgICAgICAjCisgICAgJ3dyaXRlX29ubHknIDogJ3dyaXQnLCAgICAgICMKKyAgICAnbm9uZScgOiAnbm9uZScsICAgICMKIH0KIAogX0VudW1fc29kciA9IHsKLSAgICAnbm9ybWFsJyA6ICdzbnJtJywJIyAKLSAgICAncmV2ZXJzZWQnIDogJ3NydnMnLAkjIAorICAgICdub3JtYWwnIDogJ3Nucm0nLCAgIworICAgICdyZXZlcnNlZCcgOiAnc3J2cycsICAgICAgICAjCiB9CiAKIF9FbnVtX3Z3YnkgPSB7Ci0gICAgJ2NvbmZsaWN0cycgOiAnY2ZsYycsCSMgCi0gICAgJ2V4aXN0aW5nX2l0ZW1zJyA6ICdleHNpJywJIyAKLSAgICAnc21hbGxfaWNvbicgOiAnc21pYycsCSMgCi0gICAgJ2ljb24nIDogJ2lpbWcnLAkjIAotICAgICduYW1lJyA6ICdwbmFtJywJIyAKLSAgICAnbW9kaWZpY2F0aW9uX2RhdGUnIDogJ2FzbW8nLAkjIAotICAgICdzaXplJyA6ICdwdHN6JywJIyAKLSAgICAna2luZCcgOiAna2luZCcsCSMgCi0gICAgJ2NvbW1lbnQnIDogJ2NvbXQnLAkjIAotICAgICdsYWJlbCcgOiAnbGFiaScsCSMgCi0gICAgJ3ZlcnNpb24nIDogJ3ZlcnMnLAkjIAotICAgICdjcmVhdGlvbl9kYXRlJyA6ICdhc2NkJywJIyAKLSAgICAnc21hbGxfYnV0dG9uJyA6ICdzbWJ1JywJIyAKLSAgICAnbGFyZ2VfYnV0dG9uJyA6ICdsZ2J1JywJIyAKLSAgICAnZ3JpZCcgOiAnZ3JpZCcsCSMgCi0gICAgJ2FsbCcgOiAna3lhbCcsCSMgCisgICAgJ2NvbmZsaWN0cycgOiAnY2ZsYycsICAgICAgICMKKyAgICAnZXhpc3RpbmdfaXRlbXMnIDogJ2V4c2knLCAgIworICAgICdzbWFsbF9pY29uJyA6ICdzbWljJywgICAgICAjCisgICAgJ2ljb24nIDogJ2lpbWcnLCAgICAjCisgICAgJ25hbWUnIDogJ3BuYW0nLCAgICAjCisgICAgJ21vZGlmaWNhdGlvbl9kYXRlJyA6ICdhc21vJywgICAgICAgIworICAgICdzaXplJyA6ICdwdHN6JywgICAgIworICAgICdraW5kJyA6ICdraW5kJywgICAgIworICAgICdjb21tZW50JyA6ICdjb210JywgIworICAgICdsYWJlbCcgOiAnbGFiaScsICAgIworICAgICd2ZXJzaW9uJyA6ICd2ZXJzJywgIworICAgICdjcmVhdGlvbl9kYXRlJyA6ICdhc2NkJywgICAjCisgICAgJ3NtYWxsX2J1dHRvbicgOiAnc21idScsICAgICMKKyAgICAnbGFyZ2VfYnV0dG9uJyA6ICdsZ2J1JywgICAgIworICAgICdncmlkJyA6ICdncmlkJywgICAgIworICAgICdhbGwnIDogJ2t5YWwnLCAgICAgIwogfQogCiAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvTW96aWxsYV9zdWl0ZS5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvTW96aWxsYV9zdWl0ZS5weQppbmRleCBhNDA1MTBlLi5mNGFlYTczIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL01vemlsbGFfc3VpdGUucHkKKysrIGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Nb3ppbGxhX3N1aXRlLnB5CkBAIC0yMjQsMjkgKzIyNCwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCiBfRW51bV9jb21wID0gewotICAgICdOYXZpZ2F0b3InIDogJ25hdmcnLAkjIFRoZSBOYXZpZ2F0b3IgY29tcG9uZW50Ci0gICAgJ0luQm94JyA6ICdpbmJ4JywJIyBUaGUgSW5Cb3ggY29tcG9uZW50Ci0gICAgJ05ld3Nncm91cHMnIDogJ2NvbGInLAkjIFRoZSBOZXdzZ3JvdXBzIGNvbXBvbmVudAotICAgICdDb21wb3NlcicgOiAnY3BzcicsCSMgVGhlIFBhZ2UgQ29tcG9zZXIgY29tcG9uZW50Ci0gICAgJ0NvbmZlcmVuY2UnIDogJ2NvbmYnLAkjIFRoZSBDb25mZXJlbmNlIENvbXBvbmVudAotICAgICdDYWxlbmRhcicgOiAnY2FsZCcsCSMgVGhlIENhbGVuZGFyIENvbXBvbmVudAorICAgICdOYXZpZ2F0b3InIDogJ25hdmcnLCAgICAgICAjIFRoZSBOYXZpZ2F0b3IgY29tcG9uZW50CisgICAgJ0luQm94JyA6ICdpbmJ4JywgICAjIFRoZSBJbkJveCBjb21wb25lbnQKKyAgICAnTmV3c2dyb3VwcycgOiAnY29sYicsICAgICAgIyBUaGUgTmV3c2dyb3VwcyBjb21wb25lbnQKKyAgICAnQ29tcG9zZXInIDogJ2Nwc3InLCAgICAgICAgIyBUaGUgUGFnZSBDb21wb3NlciBjb21wb25lbnQKKyAgICAnQ29uZmVyZW5jZScgOiAnY29uZicsICAgICAgIyBUaGUgQ29uZmVyZW5jZSBDb21wb25lbnQKKyAgICAnQ2FsZW5kYXInIDogJ2NhbGQnLCAgICAgICAgIyBUaGUgQ2FsZW5kYXIgQ29tcG9uZW50CiB9CiAKIF9FbnVtX2RpcmUgPSB7Ci0gICAgJ2FnYWluJyA6ICdhZ2FpJywJIyBBZ2FpbiAocmVsb2FkKQotICAgICdob21lJyA6ICdob21lJywJIyBIb21lCi0gICAgJ2JhY2t3YXJkJyA6ICdwcmV2JywJIyBQcmV2aW91cyBwYWdlCi0gICAgJ2ZvcndhcmQnIDogJ25leHQnLAkjIE5leHQgcGFnZQorICAgICdhZ2FpbicgOiAnYWdhaScsICAgIyBBZ2FpbiAocmVsb2FkKQorICAgICdob21lJyA6ICdob21lJywgICAgIyBIb21lCisgICAgJ2JhY2t3YXJkJyA6ICdwcmV2JywgICAgICAgICMgUHJldmlvdXMgcGFnZQorICAgICdmb3J3YXJkJyA6ICduZXh0JywgIyBOZXh0IHBhZ2UKIH0KIAogX0VudW1fbmNtZCA9IHsKLSAgICAnR2V0X25ld19tYWlsJyA6ICdceDAwXHgwMFx4MDRXJywJIyAKLSAgICAnU2VuZF9xdWV1ZWRfbWVzc2FnZXMnIDogJ1x4MDBceDAwXHgwNFgnLAkjIAotICAgICdSZWFkX25ld3Nncm91cHMnIDogJ1x4MDBceDAwXHgwNFx4MDQnLAkjIAotICAgICdTaG93X0luYm94JyA6ICdceDAwXHgwMFx4MDRceDA1JywJIyAKLSAgICAnU2hvd19Cb29rbWFya3Nfd2luZG93JyA6ICdceDAwXHgwMFx4MDRceDA2JywJIyAKLSAgICAnU2hvd19IaXN0b3J5X3dpbmRvdycgOiAnXHgwMFx4MDBceDA0XHgwNycsCSMgCi0gICAgJ1Nob3dfQWRkcmVzc19Cb29rX3dpbmRvdycgOiAnXHgwMFx4MDBceDA0XHQnLAkjIAorICAgICdHZXRfbmV3X21haWwnIDogJ1x4MDBceDAwXHgwNFcnLCAgICMKKyAgICAnU2VuZF9xdWV1ZWRfbWVzc2FnZXMnIDogJ1x4MDBceDAwXHgwNFgnLCAgICMKKyAgICAnUmVhZF9uZXdzZ3JvdXBzJyA6ICdceDAwXHgwMFx4MDRceDA0JywgICAgICMKKyAgICAnU2hvd19JbmJveCcgOiAnXHgwMFx4MDBceDA0XHgwNScsICAjCisgICAgJ1Nob3dfQm9va21hcmtzX3dpbmRvdycgOiAnXHgwMFx4MDBceDA0XHgwNicsICAgICAgICMKKyAgICAnU2hvd19IaXN0b3J5X3dpbmRvdycgOiAnXHgwMFx4MDBceDA0XHgwNycsICMKKyAgICAnU2hvd19BZGRyZXNzX0Jvb2tfd2luZG93JyA6ICdceDAwXHgwMFx4MDRcdCcsICAgICAgIwogfQogCiAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUG93ZXJQbGFudC5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUG93ZXJQbGFudC5weQppbmRleCAzMGZlNTY2Li43NzY3MzA1IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1Bvd2VyUGxhbnQucHkKKysrIGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Qb3dlclBsYW50LnB5CkBAIC0xLDQgKzEsNCBAQAotIiIiU3VpdGUgUG93ZXJQbGFudDogCisiIiJTdWl0ZSBQb3dlclBsYW50OgogTGV2ZWwgMCwgdmVyc2lvbiAwCiAKIEdlbmVyYXRlZCBmcm9tIC9Wb2x1bWVzL1NhcC9BcHBsaWNhdGlvbnMgKE1hYyBPUyA5KS9OZXRzY2FwZSBDb21tdW5pY2F0b3JceGUyXHg4NFx4YTIgRm9sZGVyL05ldHNjYXBlIENvbW11bmljYXRvclx4ZTJceDg0XHhhMgpAQCAtNjIsMTAgKzYyLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKIF9FbnVtX2RiYWMgPSB7Ci0gICAgJ0RvTm90aGluZycgOiAnXHgwMFx4MDBceDAwXHgwMCcsCSMgTm8gZGVidWdnaW5nIGFjdGlvbiBpcyB0YWtlbi4KLSAgICAnUG9zdEFsZXJ0JyA6ICdceDAwXHgwMFx4MDBceDAxJywJIyBQb3N0IGFuIGFsZXJ0LgotICAgICdMb3dMZXZlbERlYnVnZ2VyJyA6ICdceDAwXHgwMFx4MDBceDAyJywJIyBCcmVhayBpbnRvIHRoZSBsb3cgbGV2ZWwgZGVidWdnZXIgKE1hY3NCdWcpLgotICAgICdTb3VyY2VEZWJ1Z2dlcicgOiAnXHgwMFx4MDBceDAwXHgwMycsCSMgQnJlYWsgaW50byB0aGUgc291cmNlIGxldmVsIGRlYnVnZ2VyIChpZiBzb3VyY2UgZGVidWdnZXIgaXMgZXhlY3V0aW5nKS4KKyAgICAnRG9Ob3RoaW5nJyA6ICdceDAwXHgwMFx4MDBceDAwJywgICAjIE5vIGRlYnVnZ2luZyBhY3Rpb24gaXMgdGFrZW4uCisgICAgJ1Bvc3RBbGVydCcgOiAnXHgwMFx4MDBceDAwXHgwMScsICAgIyBQb3N0IGFuIGFsZXJ0LgorICAgICdMb3dMZXZlbERlYnVnZ2VyJyA6ICdceDAwXHgwMFx4MDBceDAyJywgICAgIyBCcmVhayBpbnRvIHRoZSBsb3cgbGV2ZWwgZGVidWdnZXIgKE1hY3NCdWcpLgorICAgICdTb3VyY2VEZWJ1Z2dlcicgOiAnXHgwMFx4MDBceDAwXHgwMycsICAgICAgIyBCcmVhayBpbnRvIHRoZSBzb3VyY2UgbGV2ZWwgZGVidWdnZXIgKGlmIHNvdXJjZSBkZWJ1Z2dlciBpcyBleGVjdXRpbmcpLgogfQogCiAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUmVxdWlyZWRfc3VpdGUucHkgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1JlcXVpcmVkX3N1aXRlLnB5CmluZGV4IDUzNTJiYjEuLmI1YzQxMTAgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUmVxdWlyZWRfc3VpdGUucHkKKysrIGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9SZXF1aXJlZF9zdWl0ZS5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIlN1aXRlIFJlcXVpcmVkIHN1aXRlOiAKKyIiIlN1aXRlIFJlcXVpcmVkIHN1aXRlOgogTGV2ZWwgMCwgdmVyc2lvbiAwCiAKIEdlbmVyYXRlZCBmcm9tIC9Wb2x1bWVzL1NhcC9BcHBsaWNhdGlvbnMgKE1hYyBPUyA5KS9OZXRzY2FwZSBDb21tdW5pY2F0b3JceGUyXHg4NFx4YTIgRm9sZGVyL05ldHNjYXBlIENvbW11bmljYXRvclx4ZTJceDg0XHhhMgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9TdGFuZGFyZF9VUkxfc3VpdGUucHkgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1VSTF9zdWl0ZS5weQppbmRleCA5NDg0N2FhLi5kZTRhMDFjIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1VSTF9zdWl0ZS5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1VSTF9zdWl0ZS5weQpAQCAtMjIsOCArMjIsOCBAQAogCiAgICAgZGVmIEdldFVSTChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKICAgICAgICAgIiIiR2V0VVJMOiBMb2FkcyB0aGUgVVJMIChvcHRpb25hbGx5IHRvIGRpc2spCi0gICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBUaGUgdXJsIAotICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiBmaWxlIHRoZSBVUkwgc2hvdWxkIGJlIGxvYWRlZCBpbnRvICAKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IFRoZSB1cmwKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB0bzogZmlsZSB0aGUgVVJMIHNob3VsZCBiZSBsb2FkZWQgaW50bwogICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGluc2lkZTogV2luZG93IHRoZSBVUkwgc2hvdWxkIGJlIGxvYWRlZCB0bwogICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGZyb21fOiBSZWZlcnJlciwgdG8gYmUgc2VudCB3aXRoIHRoZSBIVFRQIHJlcXVlc3QKICAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9UZXh0LnB5IGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9UZXh0LnB5CmluZGV4IDQ1MTVkNGIuLjIzNjBkOTQgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvVGV4dC5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1RleHQucHkKQEAgLTEsNCArMSw0IEBACi0iIiJTdWl0ZSBUZXh0OiAKKyIiIlN1aXRlIFRleHQ6CiBMZXZlbCAwLCB2ZXJzaW9uIDAKIAogR2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL0FwcGxpY2F0aW9ucyAoTWFjIE9TIDkpL05ldHNjYXBlIENvbW11bmljYXRvclx4ZTJceDg0XHhhMiBGb2xkZXIvTmV0c2NhcGUgQ29tbXVuaWNhdG9yXHhlMlx4ODRceGEyCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1dvcmxkV2lkZVdlYl9zdWl0ZS5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvV29ybGRXaWRlV2ViX3N1aXRlLnB5CmluZGV4IDE1MmMyNGEuLjA2Y2JmYTcgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvV29ybGRXaWRlV2ViX3N1aXRlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvV29ybGRXaWRlV2ViX3N1aXRlLnB5CkBAIC0xLDQgKzEsNCBAQAotIiIiU3VpdGUgV29ybGRXaWRlV2ViIHN1aXRlLCBhcyBkZWZpbmVkIGluIFNweWdsYXNzIHNwZWMuOiAKKyIiIlN1aXRlIFdvcmxkV2lkZVdlYiBzdWl0ZSwgYXMgZGVmaW5lZCBpbiBTcHlnbGFzcyBzcGVjLjoKIExldmVsIDEsIHZlcnNpb24gMQogCiBHZW5lcmF0ZWQgZnJvbSAvVm9sdW1lcy9TYXAvQXBwbGljYXRpb25zIChNYWMgT1MgOSkvTmV0c2NhcGUgQ29tbXVuaWNhdG9yXHhlMlx4ODRceGEyIEZvbGRlci9OZXRzY2FwZSBDb21tdW5pY2F0b3JceGUyXHg4NFx4YTIKQEAgLTMxNyw3ICszMTcsNyBAQAogCiAgICAgZGVmIHVucmVnaXN0ZXJfcHJvdG9jb2woc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKICAgICAgICAgIiIidW5yZWdpc3RlciBwcm90b2NvbDogcmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2YgXHhkMnJlZ2lzdGVyIHByb3RvY29sXHhkMwotICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogQXBwbGljYXRpb24gc2lnLiAKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IEFwcGxpY2F0aW9uIHNpZy4KICAgICAgICAgS2V5d29yZCBhcmd1bWVudCBmb3JfcHJvdG9jb2w6IHByb3RvY29sIHByZWZpeC4gSWYgbm9uZSwgdW5yZWdpc3RlciBmb3IgYWxsIHByb3RvY29scwogICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CiAgICAgICAgIFJldHVybnM6IFRSVUUgaWYgc3VjY2Vzc2Z1bApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvQXBwbGVTY3JpcHRfU3VpdGUucHkgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weQppbmRleCAyNTFmZDc3Li41NzQwNDNkIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weQpAQCAtMTk5NSw2NCArMTk5NSw2NCBAQAogem9uZXMuX3ByaXZlbGVtZGljdCA9IHsKIH0KIF9FbnVtX2Jvb3YgPSB7Ci0gICAgJ3RydWUnIDogJ3RydWUnLAkjIHRoZSB0cnVlIGJvb2xlYW4gdmFsdWUKLSAgICAnZmFsc2UnIDogJ2ZhbHMnLAkjIHRoZSBmYWxzZSBib29sZWFuIHZhbHVlCisgICAgJ3RydWUnIDogJ3RydWUnLCAgICAjIHRoZSB0cnVlIGJvb2xlYW4gdmFsdWUKKyAgICAnZmFsc2UnIDogJ2ZhbHMnLCAgICMgdGhlIGZhbHNlIGJvb2xlYW4gdmFsdWUKIH0KIAogX0VudW1fY29ucyA9IHsKLSAgICAnY2FzZScgOiAnY2FzZScsCSMgY2FzZQotICAgICdkaWFjcml0aWNhbHMnIDogJ2RpYWMnLAkjIGRpYWNyaXRpY2FscwotICAgICd3aGl0ZV9zcGFjZScgOiAnd2hpdCcsCSMgd2hpdGUgc3BhY2UKLSAgICAnaHlwaGVucycgOiAnaHlwaCcsCSMgaHlwaGVucwotICAgICdleHBhbnNpb24nIDogJ2V4cGEnLAkjIGV4cGFuc2lvbgotICAgICdwdW5jdHVhdGlvbicgOiAncHVuYycsCSMgcHVuY3R1YXRpb24KLSAgICAnYXBwbGljYXRpb25fcmVzcG9uc2VzJyA6ICdybXRlJywJIyByZW1vdGUgZXZlbnQgcmVwbGllcworICAgICdjYXNlJyA6ICdjYXNlJywgICAgIyBjYXNlCisgICAgJ2RpYWNyaXRpY2FscycgOiAnZGlhYycsICAgICMgZGlhY3JpdGljYWxzCisgICAgJ3doaXRlX3NwYWNlJyA6ICd3aGl0JywgICAgICMgd2hpdGUgc3BhY2UKKyAgICAnaHlwaGVucycgOiAnaHlwaCcsICMgaHlwaGVucworICAgICdleHBhbnNpb24nIDogJ2V4cGEnLCAgICAgICAjIGV4cGFuc2lvbgorICAgICdwdW5jdHVhdGlvbicgOiAncHVuYycsICAgICAjIHB1bmN0dWF0aW9uCisgICAgJ2FwcGxpY2F0aW9uX3Jlc3BvbnNlcycgOiAncm10ZScsICAgIyByZW1vdGUgZXZlbnQgcmVwbGllcwogfQogCiBfRW51bV9lTWRzID0gewotICAgICdvcHRpb25fZG93bicgOiAnS29wdCcsCSMgCi0gICAgJ2NvbW1hbmRfZG93bicgOiAnS2NtZCcsCSMgCi0gICAgJ2NvbnRyb2xfZG93bicgOiAnS2N0bCcsCSMgCi0gICAgJ3NoaWZ0X2Rvd24nIDogJ0tzZnQnLAkjIAotICAgICdjYXBzX2xvY2tfZG93bicgOiAnS2NsaycsCSMgCisgICAgJ29wdGlvbl9kb3duJyA6ICdLb3B0JywgICAgICMKKyAgICAnY29tbWFuZF9kb3duJyA6ICdLY21kJywgICAgIworICAgICdjb250cm9sX2Rvd24nIDogJ0tjdGwnLCAgICAjCisgICAgJ3NoaWZ0X2Rvd24nIDogJ0tzZnQnLCAgICAgICMKKyAgICAnY2Fwc19sb2NrX2Rvd24nIDogJ0tjbGsnLCAgIwogfQogCiBfRW51bV9la3N0ID0gewotICAgICdlc2NhcGVfa2V5JyA6ICdrczVceDAwJywJIyAKLSAgICAnZGVsZXRlX2tleScgOiAna3MzXHgwMCcsCSMgCi0gICAgJ3RhYl9rZXknIDogJ2tzMFx4MDAnLAkjIAotICAgICdyZXR1cm5fa2V5JyA6ICdrcyRceDAwJywJIyAKLSAgICAnY2xlYXJfa2V5JyA6ICdrc0dceDAwJywJIyAKLSAgICAnZW50ZXJfa2V5JyA6ICdrc0xceDAwJywJIyAKLSAgICAndXBfYXJyb3dfa2V5JyA6ICdrc35ceDAwJywJIyAKLSAgICAnZG93bl9hcnJvd19rZXknIDogJ2tzfVx4MDAnLAkjIAotICAgICdsZWZ0X2Fycm93X2tleScgOiAna3N7XHgwMCcsCSMgCi0gICAgJ3JpZ2h0X2Fycm93X2tleScgOiAna3N8XHgwMCcsCSMgCi0gICAgJ2hlbHBfa2V5JyA6ICdrc3JceDAwJywJIyAKLSAgICAnaG9tZV9rZXknIDogJ2tzc1x4MDAnLAkjIAotICAgICdwYWdlX3VwX2tleScgOiAna3N0XHgwMCcsCSMgCi0gICAgJ3BhZ2VfZG93bl9rZXknIDogJ2tzeVx4MDAnLAkjIAotICAgICdmb3J3YXJkX2RlbF9rZXknIDogJ2tzdVx4MDAnLAkjIAotICAgICdlbmRfa2V5JyA6ICdrc3dceDAwJywJIyAKLSAgICAnRjFfa2V5JyA6ICdrc3pceDAwJywJIyAKLSAgICAnRjJfa2V5JyA6ICdrc3hceDAwJywJIyAKLSAgICAnRjNfa2V5JyA6ICdrc2NceDAwJywJIyAKLSAgICAnRjRfa2V5JyA6ICdrc3ZceDAwJywJIyAKLSAgICAnRjVfa2V5JyA6ICdrc2BceDAwJywJIyAKLSAgICAnRjZfa2V5JyA6ICdrc2FceDAwJywJIyAKLSAgICAnRjdfa2V5JyA6ICdrc2JceDAwJywJIyAKLSAgICAnRjhfa2V5JyA6ICdrc2RceDAwJywJIyAKLSAgICAnRjlfa2V5JyA6ICdrc2VceDAwJywJIyAKLSAgICAnRjEwX2tleScgOiAna3NtXHgwMCcsCSMgCi0gICAgJ0YxMV9rZXknIDogJ2tzZ1x4MDAnLAkjIAotICAgICdGMTJfa2V5JyA6ICdrc29ceDAwJywJIyAKLSAgICAnRjEzX2tleScgOiAna3NpXHgwMCcsCSMgCi0gICAgJ0YxNF9rZXknIDogJ2tza1x4MDAnLAkjIAotICAgICdGMTVfa2V5JyA6ICdrc3FceDAwJywJIyAKKyAgICAnZXNjYXBlX2tleScgOiAna3M1XHgwMCcsICAgIworICAgICdkZWxldGVfa2V5JyA6ICdrczNceDAwJywgICAjCisgICAgJ3RhYl9rZXknIDogJ2tzMFx4MDAnLCAgICAgICMKKyAgICAncmV0dXJuX2tleScgOiAna3MkXHgwMCcsICAgIworICAgICdjbGVhcl9rZXknIDogJ2tzR1x4MDAnLCAgICAjCisgICAgJ2VudGVyX2tleScgOiAna3NMXHgwMCcsICAgICMKKyAgICAndXBfYXJyb3dfa2V5JyA6ICdrc35ceDAwJywgIworICAgICdkb3duX2Fycm93X2tleScgOiAna3N9XHgwMCcsICAgICAgICMKKyAgICAnbGVmdF9hcnJvd19rZXknIDogJ2tze1x4MDAnLCAgICAgICAjCisgICAgJ3JpZ2h0X2Fycm93X2tleScgOiAna3N8XHgwMCcsICAgICAgIworICAgICdoZWxwX2tleScgOiAna3NyXHgwMCcsICAgICAjCisgICAgJ2hvbWVfa2V5JyA6ICdrc3NceDAwJywgICAgICMKKyAgICAncGFnZV91cF9rZXknIDogJ2tzdFx4MDAnLCAgIworICAgICdwYWdlX2Rvd25fa2V5JyA6ICdrc3lceDAwJywgICAgICAgICMKKyAgICAnZm9yd2FyZF9kZWxfa2V5JyA6ICdrc3VceDAwJywgICAgICAjCisgICAgJ2VuZF9rZXknIDogJ2tzd1x4MDAnLCAgICAgICMKKyAgICAnRjFfa2V5JyA6ICdrc3pceDAwJywgICAgICAgIworICAgICdGMl9rZXknIDogJ2tzeFx4MDAnLCAgICAgICAjCisgICAgJ0YzX2tleScgOiAna3NjXHgwMCcsICAgICAgICMKKyAgICAnRjRfa2V5JyA6ICdrc3ZceDAwJywgICAgICAgIworICAgICdGNV9rZXknIDogJ2tzYFx4MDAnLCAgICAgICAjCisgICAgJ0Y2X2tleScgOiAna3NhXHgwMCcsICAgICAgICMKKyAgICAnRjdfa2V5JyA6ICdrc2JceDAwJywgICAgICAgIworICAgICdGOF9rZXknIDogJ2tzZFx4MDAnLCAgICAgICAjCisgICAgJ0Y5X2tleScgOiAna3NlXHgwMCcsICAgICAgICMKKyAgICAnRjEwX2tleScgOiAna3NtXHgwMCcsICAgICAgIworICAgICdGMTFfa2V5JyA6ICdrc2dceDAwJywgICAgICAjCisgICAgJ0YxMl9rZXknIDogJ2tzb1x4MDAnLCAgICAgICMKKyAgICAnRjEzX2tleScgOiAna3NpXHgwMCcsICAgICAgIworICAgICdGMTRfa2V5JyA6ICdrc2tceDAwJywgICAgICAjCisgICAgJ0YxNV9rZXknIDogJ2tzcVx4MDAnLCAgICAgICMKIH0KIAogX0VudW1fbWlzYyA9IHsKLSAgICAnY3VycmVudF9hcHBsaWNhdGlvbicgOiAnY3VyYScsCSMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24KKyAgICAnY3VycmVudF9hcHBsaWNhdGlvbicgOiAnY3VyYScsICAgICAjIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uCiB9CiAKIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvTWFjaW50b3NoX0Nvbm5lY3Rpdml0eV9DbGFzLnB5IGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvTWFjaW50b3NoX0Nvbm5lY3Rpdml0eV9DbGFzLnB5CmluZGV4IDVmYTA2ZGQuLjk5ZmU1ZTMgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL01hY2ludG9zaF9Db25uZWN0aXZpdHlfQ2xhcy5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9NYWNpbnRvc2hfQ29ubmVjdGl2aXR5X0NsYXMucHkKQEAgLTI1Myw3NCArMjUzLDc0IEBACiBVU0JfYWRkcmVzcy5fcHJpdmVsZW1kaWN0ID0gewogfQogX0VudW1fZWNvbiA9IHsKLSAgICAnQURCJyA6ICdlYWRiJywJIyAKLSAgICAncHJpbnRlcl9wb3J0JyA6ICdlY3BwJywJIyAKLSAgICAnbW9kZW1fcG9ydCcgOiAnZWNtcCcsCSMgCi0gICAgJ21vZGVtX3ByaW50ZXJfcG9ydCcgOiAnZW1wcCcsCSMgCi0gICAgJ0xvY2FsVGFsaycgOiAnZWNsdCcsCSMgCi0gICAgJ0V0aGVybmV0JyA6ICdlY2VuJywJIyAKLSAgICAnVG9rZW5fUmluZycgOiAnZXRvaycsCSMgCi0gICAgJ1NDU0knIDogJ2Vjc2MnLAkjIAotICAgICdVU0InIDogJ2VjdXMnLAkjIAotICAgICdGaXJlV2lyZScgOiAnZWNmdycsCSMgCi0gICAgJ2luZnJhcmVkJyA6ICdlY2lyJywJIyAKLSAgICAnUENfY2FyZCcgOiAnZWNwYycsCSMgCi0gICAgJ1BDSV9idXMnIDogJ2VjcGknLAkjIAotICAgICdOdUJ1cycgOiAnZW51YicsCSMgCi0gICAgJ1BEU19zbG90JyA6ICdlY3BkJywJIyAKLSAgICAnQ29tbV9zbG90JyA6ICdlY2NtJywJIyAKLSAgICAnbW9uaXRvcl9vdXQnIDogJ2VjbW4nLAkjIAotICAgICd2aWRlb19vdXQnIDogJ2Vjdm8nLAkjIAotICAgICd2aWRlb19pbicgOiAnZWN2aScsCSMgCi0gICAgJ2F1ZGlvX291dCcgOiAnZWNhbycsCSMgCi0gICAgJ2F1ZGlvX2xpbmVfaW4nIDogJ2VjYWknLAkjIAotICAgICdhdWRpb19saW5lX291dCcgOiAnZWNhbCcsCSMgCi0gICAgJ21pY3JvcGhvbmUnIDogJ2VjbWknLAkjIAorICAgICdBREInIDogJ2VhZGInLCAgICAgIworICAgICdwcmludGVyX3BvcnQnIDogJ2VjcHAnLCAgICAjCisgICAgJ21vZGVtX3BvcnQnIDogJ2VjbXAnLCAgICAgICMKKyAgICAnbW9kZW1fcHJpbnRlcl9wb3J0JyA6ICdlbXBwJywgICAgICAjCisgICAgJ0xvY2FsVGFsaycgOiAnZWNsdCcsICAgICAgICMKKyAgICAnRXRoZXJuZXQnIDogJ2VjZW4nLCAgICAgICAgIworICAgICdUb2tlbl9SaW5nJyA6ICdldG9rJywgICAgICAjCisgICAgJ1NDU0knIDogJ2Vjc2MnLCAgICAjCisgICAgJ1VTQicgOiAnZWN1cycsICAgICAjCisgICAgJ0ZpcmVXaXJlJyA6ICdlY2Z3JywgICAgICAgICMKKyAgICAnaW5mcmFyZWQnIDogJ2VjaXInLCAgICAgICAgIworICAgICdQQ19jYXJkJyA6ICdlY3BjJywgIworICAgICdQQ0lfYnVzJyA6ICdlY3BpJywgIworICAgICdOdUJ1cycgOiAnZW51YicsICAgIworICAgICdQRFNfc2xvdCcgOiAnZWNwZCcsICAgICAgICAjCisgICAgJ0NvbW1fc2xvdCcgOiAnZWNjbScsICAgICAgICMKKyAgICAnbW9uaXRvcl9vdXQnIDogJ2VjbW4nLCAgICAgIworICAgICd2aWRlb19vdXQnIDogJ2Vjdm8nLCAgICAgICAjCisgICAgJ3ZpZGVvX2luJyA6ICdlY3ZpJywgICAgICAgICMKKyAgICAnYXVkaW9fb3V0JyA6ICdlY2FvJywgICAgICAgIworICAgICdhdWRpb19saW5lX2luJyA6ICdlY2FpJywgICAjCisgICAgJ2F1ZGlvX2xpbmVfb3V0JyA6ICdlY2FsJywgICMKKyAgICAnbWljcm9waG9uZScgOiAnZWNtaScsICAgICAgIwogfQogCiBfRW51bV9lZHZ0ID0gewotICAgICdoYXJkX2Rpc2tfZHJpdmUnIDogJ2VoZCAnLAkjIAotICAgICdmbG9wcHlfZGlza19kcml2ZScgOiAnZWZkICcsCSMgCi0gICAgJ0NEX1JPTV9kcml2ZScgOiAnZWNkICcsCSMgCi0gICAgJ0RWRF9kcml2ZScgOiAnZWR2ZCcsCSMgCi0gICAgJ3N0b3JhZ2VfZGV2aWNlJyA6ICdlZHN0JywJIyAKLSAgICAna2V5Ym9hcmQnIDogJ2VrYmQnLAkjIAotICAgICdtb3VzZScgOiAnZW1vdScsCSMgCi0gICAgJ3RyYWNrYmFsbCcgOiAnZXRyaycsCSMgCi0gICAgJ3RyYWNrcGFkJyA6ICdlZHRwJywJIyAKLSAgICAncG9pbnRpbmdfZGV2aWNlJyA6ICdlZHBkJywJIyAKLSAgICAndmlkZW9fbW9uaXRvcicgOiAnZWR2bScsCSMgCi0gICAgJ0xDRF9kaXNwbGF5JyA6ICdlZGxjJywJIyAKLSAgICAnZGlzcGxheScgOiAnZWRkcycsCSMgCi0gICAgJ21vZGVtJyA6ICdlZG1tJywJIyAKLSAgICAnUENfY2FyZCcgOiAnZWNwYycsCSMgCi0gICAgJ1BDSV9jYXJkJyA6ICdlZHBpJywJIyAKLSAgICAnTnVCdXNfY2FyZCcgOiAnZWRuYicsCSMgCi0gICAgJ3ByaW50ZXInIDogJ2VkcHInLAkjIAotICAgICdzcGVha2VycycgOiAnZWRzcCcsCSMgCi0gICAgJ21pY3JvcGhvbmUnIDogJ2VjbWknLAkjIAorICAgICdoYXJkX2Rpc2tfZHJpdmUnIDogJ2VoZCAnLCAjCisgICAgJ2Zsb3BweV9kaXNrX2RyaXZlJyA6ICdlZmQgJywgICAgICAgIworICAgICdDRF9ST01fZHJpdmUnIDogJ2VjZCAnLCAgICAjCisgICAgJ0RWRF9kcml2ZScgOiAnZWR2ZCcsICAgICAgICMKKyAgICAnc3RvcmFnZV9kZXZpY2UnIDogJ2Vkc3QnLCAgIworICAgICdrZXlib2FyZCcgOiAnZWtiZCcsICAgICAgICAjCisgICAgJ21vdXNlJyA6ICdlbW91JywgICAjCisgICAgJ3RyYWNrYmFsbCcgOiAnZXRyaycsICAgICAgICMKKyAgICAndHJhY2twYWQnIDogJ2VkdHAnLCAgICAgICAgIworICAgICdwb2ludGluZ19kZXZpY2UnIDogJ2VkcGQnLCAjCisgICAgJ3ZpZGVvX21vbml0b3InIDogJ2Vkdm0nLCAgICMKKyAgICAnTENEX2Rpc3BsYXknIDogJ2VkbGMnLCAgICAgIworICAgICdkaXNwbGF5JyA6ICdlZGRzJywgIworICAgICdtb2RlbScgOiAnZWRtbScsICAgIworICAgICdQQ19jYXJkJyA6ICdlY3BjJywgIworICAgICdQQ0lfY2FyZCcgOiAnZWRwaScsICAgICAgICAjCisgICAgJ051QnVzX2NhcmQnIDogJ2VkbmInLCAgICAgICMKKyAgICAncHJpbnRlcicgOiAnZWRwcicsICMKKyAgICAnc3BlYWtlcnMnIDogJ2Vkc3AnLCAgICAgICAgIworICAgICdtaWNyb3Bob25lJyA6ICdlY21pJywgICAgICAjCiB9CiAKIF9FbnVtX2Vwcm8gPSB7Ci0gICAgJ3NlcmlhbCcgOiAnZXBzcicsCSMgCi0gICAgJ0FwcGxlVGFsaycgOiAnZXBhdCcsCSMgCi0gICAgJ0lQJyA6ICdlcGlwJywJIyAKLSAgICAnU0NTSScgOiAnZWNzYycsCSMgCi0gICAgJ0FEQicgOiAnZWFkYicsCSMgCi0gICAgJ0ZpcmVXaXJlJyA6ICdlY2Z3JywJIyAKLSAgICAnSXJEQScgOiAnZXBpcicsCSMgCi0gICAgJ0lSVGFsaycgOiAnZXBpdCcsCSMgCi0gICAgJ1VTQicgOiAnZWN1cycsCSMgCi0gICAgJ1BDX2NhcmQnIDogJ2VjcGMnLAkjIAotICAgICdQQ0lfYnVzJyA6ICdlY3BpJywJIyAKLSAgICAnTnVCdXMnIDogJ2VudWInLAkjIAotICAgICdidXMnIDogJ2VidXMnLAkjIAotICAgICdNYWNpbnRvc2hfdmlkZW8nIDogJ2VwbXYnLAkjIAotICAgICdTVkdBJyA6ICdlcHNnJywJIyAKLSAgICAnU192aWRlbycgOiAnZXBzdicsCSMgCi0gICAgJ2FuYWxvZ19hdWRpbycgOiAnZXBhdScsCSMgCi0gICAgJ2RpZ2l0YWxfYXVkaW8nIDogJ2VwZGEnLAkjIAotICAgICdQb3N0U2NyaXB0JyA6ICdlcHBzJywJIyAKKyAgICAnc2VyaWFsJyA6ICdlcHNyJywgICMKKyAgICAnQXBwbGVUYWxrJyA6ICdlcGF0JywgICAgICAgIworICAgICdJUCcgOiAnZXBpcCcsICAgICAgIworICAgICdTQ1NJJyA6ICdlY3NjJywgICAgIworICAgICdBREInIDogJ2VhZGInLCAgICAgIworICAgICdGaXJlV2lyZScgOiAnZWNmdycsICAgICAgICAjCisgICAgJ0lyREEnIDogJ2VwaXInLCAgICAjCisgICAgJ0lSVGFsaycgOiAnZXBpdCcsICAjCisgICAgJ1VTQicgOiAnZWN1cycsICAgICAjCisgICAgJ1BDX2NhcmQnIDogJ2VjcGMnLCAjCisgICAgJ1BDSV9idXMnIDogJ2VjcGknLCAjCisgICAgJ051QnVzJyA6ICdlbnViJywgICAjCisgICAgJ2J1cycgOiAnZWJ1cycsICAgICAjCisgICAgJ01hY2ludG9zaF92aWRlbycgOiAnZXBtdicsICMKKyAgICAnU1ZHQScgOiAnZXBzZycsICAgICMKKyAgICAnU192aWRlbycgOiAnZXBzdicsICMKKyAgICAnYW5hbG9nX2F1ZGlvJyA6ICdlcGF1JywgICAgIworICAgICdkaWdpdGFsX2F1ZGlvJyA6ICdlcGRhJywgICAjCisgICAgJ1Bvc3RTY3JpcHQnIDogJ2VwcHMnLCAgICAgICMKIH0KIAogCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VpdGUucHkgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VpdGUucHkKaW5kZXggZjRiNTlmNS4uMTE3NDdmOSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvUXVpY2tEcmF3X0dyYXBoaWNzX1N1aXRlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1F1aWNrRHJhd19HcmFwaGljc19TdWl0ZS5weQpAQCAtMzI3LDI4ICszMjcsMjggQEAKIGdyYXBoaWNfbGluZS5fcHJpdmVsZW1kaWN0ID0gewogfQogX0VudW1fYXJybyA9IHsKLSAgICAnbm9fYXJyb3cnIDogJ2Fybm8nLAkjIE5vIGFycm93IG9uIGxpbmUKLSAgICAnYXJyb3dfYXRfc3RhcnQnIDogJ2Fyc3QnLAkjIEFycm93IGF0IHN0YXJ0IG9mIGxpbmUKLSAgICAnYXJyb3dfYXRfZW5kJyA6ICdhcmVuJywJIyBBcnJvdyBhdCBlbmQgb2YgbGluZQotICAgICdhcnJvd19hdF9ib3RoX2VuZHMnIDogJ2FyYm8nLAkjIEFycm93IGF0IGJvdGggdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBsaW5lCisgICAgJ25vX2Fycm93JyA6ICdhcm5vJywgICAgICAgICMgTm8gYXJyb3cgb24gbGluZQorICAgICdhcnJvd19hdF9zdGFydCcgOiAnYXJzdCcsICAjIEFycm93IGF0IHN0YXJ0IG9mIGxpbmUKKyAgICAnYXJyb3dfYXRfZW5kJyA6ICdhcmVuJywgICAgIyBBcnJvdyBhdCBlbmQgb2YgbGluZQorICAgICdhcnJvd19hdF9ib3RoX2VuZHMnIDogJ2FyYm8nLCAgICAgICMgQXJyb3cgYXQgYm90aCB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIGxpbmUKIH0KIAogX0VudW1fdHJhbiA9IHsKLSAgICAnY29weV9waXhlbHMnIDogJ2NweSAnLAkjIAotICAgICdub3RfY29weV9waXhlbHMnIDogJ25jcHknLAkjIAotICAgICdvcl9waXhlbHMnIDogJ29yICAnLAkjIAotICAgICdub3Rfb3JfcGl4ZWxzJyA6ICdudG9yJywJIyAKLSAgICAnYmljX3BpeGVscycgOiAnYmljICcsCSMgCi0gICAgJ25vdF9iaWNfcGl4ZWxzJyA6ICduYmljJywJIyAKLSAgICAneG9yX3BpeGVscycgOiAneG9yICcsCSMgCi0gICAgJ25vdF94b3JfcGl4ZWxzJyA6ICdueG9yJywJIyAKLSAgICAnYWRkX292ZXJfcGl4ZWxzJyA6ICdhZGRvJywJIyAKLSAgICAnYWRkX3Bpbl9waXhlbHMnIDogJ2FkZHAnLAkjIAotICAgICdzdWJfb3Zlcl9waXhlbHMnIDogJ3N1Ym8nLAkjIAotICAgICdzdWJfcGluX3BpeGVscycgOiAnc3VicCcsCSMgCi0gICAgJ2FkX21heF9waXhlbHMnIDogJ2FkbXgnLAkjIAotICAgICdhZF9taW5fcGl4ZWxzJyA6ICdhZG1uJywJIyAKLSAgICAnYmxlbmRfcGl4ZWxzJyA6ICdibG5kJywJIyAKKyAgICAnY29weV9waXhlbHMnIDogJ2NweSAnLCAgICAgIworICAgICdub3RfY29weV9waXhlbHMnIDogJ25jcHknLCAjCisgICAgJ29yX3BpeGVscycgOiAnb3IgICcsICAgICAgICMKKyAgICAnbm90X29yX3BpeGVscycgOiAnbnRvcicsICAgIworICAgICdiaWNfcGl4ZWxzJyA6ICdiaWMgJywgICAgICAjCisgICAgJ25vdF9iaWNfcGl4ZWxzJyA6ICduYmljJywgICMKKyAgICAneG9yX3BpeGVscycgOiAneG9yICcsICAgICAgIworICAgICdub3RfeG9yX3BpeGVscycgOiAnbnhvcicsICAjCisgICAgJ2FkZF9vdmVyX3BpeGVscycgOiAnYWRkbycsICMKKyAgICAnYWRkX3Bpbl9waXhlbHMnIDogJ2FkZHAnLCAgIworICAgICdzdWJfb3Zlcl9waXhlbHMnIDogJ3N1Ym8nLCAjCisgICAgJ3N1Yl9waW5fcGl4ZWxzJyA6ICdzdWJwJywgICMKKyAgICAnYWRfbWF4X3BpeGVscycgOiAnYWRteCcsICAgIworICAgICdhZF9taW5fcGl4ZWxzJyA6ICdhZG1uJywgICAjCisgICAgJ2JsZW5kX3BpeGVscycgOiAnYmxuZCcsICAgICMKIH0KIAogCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9TdGFuZGFyZF9TdWl0ZS5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1N0YW5kYXJkX1N1aXRlLnB5CmluZGV4IGRlNmQ1ZTUuLjg2NjgxZjUgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1N0YW5kYXJkX1N1aXRlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1N0YW5kYXJkX1N1aXRlLnB5CkBAIC02NTYsMzMgKzY1NiwzMyBAQAogY2xhc3MgX2IzXyhhZXRvb2xzLk5Db21wYXJpc29uKToKICAgICAiIiJceGIzIC0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIiIgogX0VudW1fa2ZybSA9IHsKLSAgICAnaW5kZXgnIDogJ2luZHgnLAkjIGtleWZvcm0gZGVzaWduYXRpbmcgaW5kZXhlZCBhY2Nlc3MKLSAgICAnbmFtZWQnIDogJ25hbWUnLAkjIGtleWZvcm0gZGVzaWduYXRpbmcgbmFtZWQgYWNjZXNzCi0gICAgJ2lkJyA6ICdJRCAgJywJIyBrZXlmb3JtIGRlc2lnbmF0aW5nIGFjY2VzcyBieSB1bmlxdWUgaWRlbnRpZmllcgorICAgICdpbmRleCcgOiAnaW5keCcsICAgIyBrZXlmb3JtIGRlc2lnbmF0aW5nIGluZGV4ZWQgYWNjZXNzCisgICAgJ25hbWVkJyA6ICduYW1lJywgICAjIGtleWZvcm0gZGVzaWduYXRpbmcgbmFtZWQgYWNjZXNzCisgICAgJ2lkJyA6ICdJRCAgJywgICAgICAjIGtleWZvcm0gZGVzaWduYXRpbmcgYWNjZXNzIGJ5IHVuaXF1ZSBpZGVudGlmaWVyCiB9CiAKIF9FbnVtX3Nhdm8gPSB7Ci0gICAgJ3llcycgOiAneWVzICcsCSMgU2F2ZSBvYmplY3RzIG5vdwotICAgICdubycgOiAnbm8gICcsCSMgRG8gbm90IHNhdmUgb2JqZWN0cwotICAgICdhc2snIDogJ2FzayAnLAkjIEFzayB0aGUgdXNlciB3aGV0aGVyIHRvIHNhdmUKKyAgICAneWVzJyA6ICd5ZXMgJywgICAgICMgU2F2ZSBvYmplY3RzIG5vdworICAgICdubycgOiAnbm8gICcsICAgICAgIyBEbyBub3Qgc2F2ZSBvYmplY3RzCisgICAgJ2FzaycgOiAnYXNrICcsICAgICAjIEFzayB0aGUgdXNlciB3aGV0aGVyIHRvIHNhdmUKIH0KIAogX0VudW1fc3R5bCA9IHsKLSAgICAncGxhaW4nIDogJ3BsYW4nLAkjIFBsYWluCi0gICAgJ2JvbGQnIDogJ2JvbGQnLAkjIEJvbGQKLSAgICAnaXRhbGljJyA6ICdpdGFsJywJIyBJdGFsaWMKLSAgICAnb3V0bGluZScgOiAnb3V0bCcsCSMgT3V0bGluZQotICAgICdzaGFkb3cnIDogJ3NoYWQnLAkjIFNoYWRvdwotICAgICd1bmRlcmxpbmUnIDogJ3VuZGwnLAkjIFVuZGVybGluZQotICAgICdzdXBlcnNjcmlwdCcgOiAnc3BzYycsCSMgU3VwZXJzY3JpcHQKLSAgICAnc3Vic2NyaXB0JyA6ICdzYnNjJywJIyBTdWJzY3JpcHQKLSAgICAnc3RyaWtldGhyb3VnaCcgOiAnc3RyaycsCSMgU3RyaWtldGhyb3VnaAotICAgICdzbWFsbF9jYXBzJyA6ICdzbWNwJywJIyBTbWFsbCBjYXBzCi0gICAgJ2FsbF9jYXBzJyA6ICdhbGNwJywJIyBBbGwgY2FwaXRhbCBsZXR0ZXJzCi0gICAgJ2FsbF9sb3dlcmNhc2UnIDogJ2xvd2MnLAkjIExvd2VyY2FzZQotICAgICdjb25kZW5zZWQnIDogJ2NvbmQnLAkjIENvbmRlbnNlZAotICAgICdleHBhbmRlZCcgOiAncGV4cCcsCSMgRXhwYW5kZWQKLSAgICAnaGlkZGVuJyA6ICdoaWRuJywJIyBIaWRkZW4KKyAgICAncGxhaW4nIDogJ3BsYW4nLCAgICMgUGxhaW4KKyAgICAnYm9sZCcgOiAnYm9sZCcsICAgICMgQm9sZAorICAgICdpdGFsaWMnIDogJ2l0YWwnLCAgIyBJdGFsaWMKKyAgICAnb3V0bGluZScgOiAnb3V0bCcsICMgT3V0bGluZQorICAgICdzaGFkb3cnIDogJ3NoYWQnLCAgIyBTaGFkb3cKKyAgICAndW5kZXJsaW5lJyA6ICd1bmRsJywgICAgICAgIyBVbmRlcmxpbmUKKyAgICAnc3VwZXJzY3JpcHQnIDogJ3Nwc2MnLCAgICAgIyBTdXBlcnNjcmlwdAorICAgICdzdWJzY3JpcHQnIDogJ3Nic2MnLCAgICAgICAjIFN1YnNjcmlwdAorICAgICdzdHJpa2V0aHJvdWdoJyA6ICdzdHJrJywgICAjIFN0cmlrZXRocm91Z2gKKyAgICAnc21hbGxfY2FwcycgOiAnc21jcCcsICAgICAgIyBTbWFsbCBjYXBzCisgICAgJ2FsbF9jYXBzJyA6ICdhbGNwJywgICAgICAgICMgQWxsIGNhcGl0YWwgbGV0dGVycworICAgICdhbGxfbG93ZXJjYXNlJyA6ICdsb3djJywgICAjIExvd2VyY2FzZQorICAgICdjb25kZW5zZWQnIDogJ2NvbmQnLCAgICAgICAjIENvbmRlbnNlZAorICAgICdleHBhbmRlZCcgOiAncGV4cCcsICAgICAgICAjIEV4cGFuZGVkCisgICAgJ2hpZGRlbicgOiAnaGlkbicsICAjIEhpZGRlbgogfQogCiAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1RhYmxlX1N1aXRlLnB5IGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvVGFibGVfU3VpdGUucHkKaW5kZXggYmI5MjliOC4uYWZhMDFhMCAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvVGFibGVfU3VpdGUucHkKKysrIGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvVGFibGVfU3VpdGUucHkKQEAgLTc0LDkgKzc0LDkgQEAKIHRhYmxlcy5fcHJpdmVsZW1kaWN0ID0gewogfQogX0VudW1fcHJ0biA9IHsKLSAgICAncmVhZF9vbmx5JyA6ICdubW9kJywJIyBDYW5ceGQ1dCBjaGFuZ2UgdmFsdWVzIG9yIGZvcm11bGFzCi0gICAgJ2Zvcm11bGFzX3Byb3RlY3RlZCcgOiAnZnBybycsCSMgQ2FuIGNoYW5nZXMgdmFsdWVzIGJ1dCBub3QgZm9ybXVsYXMKLSAgICAncmVhZF8yZl93cml0ZScgOiAnbW9kZicsCSMgQ2FuIGNoYW5nZSB2YWx1ZXMgYW5kIGZvcm11bGFzCisgICAgJ3JlYWRfb25seScgOiAnbm1vZCcsICAgICAgICMgQ2FuXHhkNXQgY2hhbmdlIHZhbHVlcyBvciBmb3JtdWxhcworICAgICdmb3JtdWxhc19wcm90ZWN0ZWQnIDogJ2Zwcm8nLCAgICAgICMgQ2FuIGNoYW5nZXMgdmFsdWVzIGJ1dCBub3QgZm9ybXVsYXMKKyAgICAncmVhZF8yZl93cml0ZScgOiAnbW9kZicsICAgIyBDYW4gY2hhbmdlIHZhbHVlcyBhbmQgZm9ybXVsYXMKIH0KIAogCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UZXh0X1N1aXRlLnB5IGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvVGV4dF9TdWl0ZS5weQppbmRleCA0ZWRiN2Y0Li4xODQ1ZjRkIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UZXh0X1N1aXRlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1RleHRfU3VpdGUucHkKQEAgLTE2MiwyOCArMTYyLDI4IEBACiB0ZXh0X3N0eWxlX2luZm8uX3ByaXZlbGVtZGljdCA9IHsKIH0KIF9FbnVtX2p1c3QgPSB7Ci0gICAgJ2xlZnQnIDogJ2xlZnQnLAkjIEFsaWduIHdpdGggbGVmdCBtYXJnaW4KLSAgICAncmlnaHQnIDogJ3JnaHQnLAkjIEFsaWduIHdpdGggcmlnaHQgbWFyZ2luCi0gICAgJ2NlbnRlcicgOiAnY2VudCcsCSMgQWxpZ24gd2l0aCBjZW50ZXIKLSAgICAnZnVsbCcgOiAnZnVsbCcsCSMgQWxpZ24gd2l0aCBib3RoIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbnMKKyAgICAnbGVmdCcgOiAnbGVmdCcsICAgICMgQWxpZ24gd2l0aCBsZWZ0IG1hcmdpbgorICAgICdyaWdodCcgOiAncmdodCcsICAgIyBBbGlnbiB3aXRoIHJpZ2h0IG1hcmdpbgorICAgICdjZW50ZXInIDogJ2NlbnQnLCAgIyBBbGlnbiB3aXRoIGNlbnRlcgorICAgICdmdWxsJyA6ICdmdWxsJywgICAgIyBBbGlnbiB3aXRoIGJvdGggbGVmdCBhbmQgcmlnaHQgbWFyZ2lucwogfQogCiBfRW51bV9zdHlsID0gewotICAgICdwbGFpbicgOiAncGxhbicsCSMgUGxhaW4KLSAgICAnYm9sZCcgOiAnYm9sZCcsCSMgQm9sZAotICAgICdpdGFsaWMnIDogJ2l0YWwnLAkjIEl0YWxpYwotICAgICdvdXRsaW5lJyA6ICdvdXRsJywJIyBPdXRsaW5lCi0gICAgJ3NoYWRvdycgOiAnc2hhZCcsCSMgU2hhZG93Ci0gICAgJ3VuZGVybGluZScgOiAndW5kbCcsCSMgVW5kZXJsaW5lCi0gICAgJ3N1cGVyc2NyaXB0JyA6ICdzcHNjJywJIyBTdXBlcnNjcmlwdAotICAgICdzdWJzY3JpcHQnIDogJ3Nic2MnLAkjIFN1YnNjcmlwdAotICAgICdzdHJpa2V0aHJvdWdoJyA6ICdzdHJrJywJIyBTdHJpa2V0aHJvdWdoCi0gICAgJ3NtYWxsX2NhcHMnIDogJ3NtY3AnLAkjIFNtYWxsIGNhcHMKLSAgICAnYWxsX2NhcHMnIDogJ2FsY3AnLAkjIEFsbCBjYXBpdGFsIGxldHRlcnMKLSAgICAnYWxsX2xvd2VyY2FzZScgOiAnbG93YycsCSMgTG93ZXJjYXNlCi0gICAgJ2NvbmRlbnNlZCcgOiAnY29uZCcsCSMgQ29uZGVuc2VkCi0gICAgJ2V4cGFuZGVkJyA6ICdwZXhwJywJIyBFeHBhbmRlZAotICAgICdoaWRkZW4nIDogJ2hpZG4nLAkjIEhpZGRlbgorICAgICdwbGFpbicgOiAncGxhbicsICAgIyBQbGFpbgorICAgICdib2xkJyA6ICdib2xkJywgICAgIyBCb2xkCisgICAgJ2l0YWxpYycgOiAnaXRhbCcsICAjIEl0YWxpYworICAgICdvdXRsaW5lJyA6ICdvdXRsJywgIyBPdXRsaW5lCisgICAgJ3NoYWRvdycgOiAnc2hhZCcsICAjIFNoYWRvdworICAgICd1bmRlcmxpbmUnIDogJ3VuZGwnLCAgICAgICAjIFVuZGVybGluZQorICAgICdzdXBlcnNjcmlwdCcgOiAnc3BzYycsICAgICAjIFN1cGVyc2NyaXB0CisgICAgJ3N1YnNjcmlwdCcgOiAnc2JzYycsICAgICAgICMgU3Vic2NyaXB0CisgICAgJ3N0cmlrZXRocm91Z2gnIDogJ3N0cmsnLCAgICMgU3RyaWtldGhyb3VnaAorICAgICdzbWFsbF9jYXBzJyA6ICdzbWNwJywgICAgICAjIFNtYWxsIGNhcHMKKyAgICAnYWxsX2NhcHMnIDogJ2FsY3AnLCAgICAgICAgIyBBbGwgY2FwaXRhbCBsZXR0ZXJzCisgICAgJ2FsbF9sb3dlcmNhc2UnIDogJ2xvd2MnLCAgICMgTG93ZXJjYXNlCisgICAgJ2NvbmRlbnNlZCcgOiAnY29uZCcsICAgICAgICMgQ29uZGVuc2VkCisgICAgJ2V4cGFuZGVkJyA6ICdwZXhwJywgICAgICAgICMgRXhwYW5kZWQKKyAgICAnaGlkZGVuJyA6ICdoaWRuJywgICMgSGlkZGVuCiB9CiAKIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvX19pbml0X18ucHkgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9fX2luaXRfXy5weQppbmRleCBmNjQ4NTE3Li5iODBlM2JhIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9fX2luaXRfXy5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9fX2luaXRfXy5weQpAQCAtNDY5LDQgKzQ2OSwzIEBACiAgICAgX3NpZ25hdHVyZSA9ICdhc2NyJwogCiAgICAgX21vZHVsZU5hbWUgPSAnU3RkU3VpdGVzJwotCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9EaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLnB5IGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvRGlza19Gb2xkZXJfRmlsZV9TdWl0ZS5weQppbmRleCBiOWU2YjM0Li5hOWFjM2RkIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9EaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL0Rpc2tfRm9sZGVyX0ZpbGVfU3VpdGUucHkKQEAgLTMxMywyMSArMzEzLDIxIEBACiAgICAgJ2l0ZW0nIDogaXRlbSwKIH0KIF9FbnVtX2VkZm0gPSB7Ci0gICAgJ01TXzJkX0RPU19mb3JtYXQnIDogJ2RmbXMnLAkjIE1TLURPUyBmb3JtYXQKLSAgICAnQXBwbGVfUGhvdG9fZm9ybWF0JyA6ICdkZnBoJywJIyBBcHBsZSBQaG90byBmb3JtYXQKLSAgICAnSVNPXzk2NjBfZm9ybWF0JyA6ICdkZjk2JywJIyBJU08gOTY2MCBmb3JtYXQKLSAgICAnUXVpY2tUYWtlX2Zvcm1hdCcgOiAnZGZxdCcsCSMgUXVpY2tUYWtlIGZvcm1hdAotICAgICdBcHBsZVNoYXJlX2Zvcm1hdCcgOiAnZGZhcycsCSMgQXBwbGVTaGFyZSBmb3JtYXQKLSAgICAnSGlnaF9TaWVycmFfZm9ybWF0JyA6ICdkZmhzJywJIyBIaWdoIFNpZXJyYSBmb3JtYXQKLSAgICAnTWFjX09TX0V4dGVuZGVkX2Zvcm1hdCcgOiAnZGZoKycsCSMgTWFjIE9TIEV4dGVuZGVkIGZvcm1hdAotICAgICdVREZfZm9ybWF0JyA6ICdkZnVkJywJIyBVREYgZm9ybWF0Ci0gICAgJ3Vua25vd25fZm9ybWF0JyA6ICdkZj8/JywJIyB1bmtub3duIGZvcm1hdAotICAgICdhdWRpb19mb3JtYXQnIDogJ2RmYXUnLAkjIGF1ZGlvIGZvcm1hdAotICAgICdNYWNfT1NfZm9ybWF0JyA6ICdkZmhmJywJIyBNYWMgT1MgZm9ybWF0Ci0gICAgJ1VGU19mb3JtYXQnIDogJ2RmdWYnLAkjIFVGUyBmb3JtYXQKLSAgICAnTkZTX2Zvcm1hdCcgOiAnZGZuZicsCSMgTkZTIGZvcm1hdAotICAgICdQcm9ET1NfZm9ybWF0JyA6ICdkZnByJywJIyBQcm9ET1MgZm9ybWF0Ci0gICAgJ1dlYkRBVl9mb3JtYXQnIDogJ2Rmd2QnLAkjIFdlYkRBViBmb3JtYXQKKyAgICAnTVNfMmRfRE9TX2Zvcm1hdCcgOiAnZGZtcycsICAgICAgICAjIE1TLURPUyBmb3JtYXQKKyAgICAnQXBwbGVfUGhvdG9fZm9ybWF0JyA6ICdkZnBoJywgICAgICAjIEFwcGxlIFBob3RvIGZvcm1hdAorICAgICdJU09fOTY2MF9mb3JtYXQnIDogJ2RmOTYnLCAjIElTTyA5NjYwIGZvcm1hdAorICAgICdRdWlja1Rha2VfZm9ybWF0JyA6ICdkZnF0JywgICAgICAgICMgUXVpY2tUYWtlIGZvcm1hdAorICAgICdBcHBsZVNoYXJlX2Zvcm1hdCcgOiAnZGZhcycsICAgICAgICMgQXBwbGVTaGFyZSBmb3JtYXQKKyAgICAnSGlnaF9TaWVycmFfZm9ybWF0JyA6ICdkZmhzJywgICAgICAjIEhpZ2ggU2llcnJhIGZvcm1hdAorICAgICdNYWNfT1NfRXh0ZW5kZWRfZm9ybWF0JyA6ICdkZmgrJywgICMgTWFjIE9TIEV4dGVuZGVkIGZvcm1hdAorICAgICdVREZfZm9ybWF0JyA6ICdkZnVkJywgICAgICAjIFVERiBmb3JtYXQKKyAgICAndW5rbm93bl9mb3JtYXQnIDogJ2RmPz8nLCAgIyB1bmtub3duIGZvcm1hdAorICAgICdhdWRpb19mb3JtYXQnIDogJ2RmYXUnLCAgICAjIGF1ZGlvIGZvcm1hdAorICAgICdNYWNfT1NfZm9ybWF0JyA6ICdkZmhmJywgICAjIE1hYyBPUyBmb3JtYXQKKyAgICAnVUZTX2Zvcm1hdCcgOiAnZGZ1ZicsICAgICAgIyBVRlMgZm9ybWF0CisgICAgJ05GU19mb3JtYXQnIDogJ2RmbmYnLCAgICAgICMgTkZTIGZvcm1hdAorICAgICdQcm9ET1NfZm9ybWF0JyA6ICdkZnByJywgICAjIFByb0RPUyBmb3JtYXQKKyAgICAnV2ViREFWX2Zvcm1hdCcgOiAnZGZ3ZCcsICAgIyBXZWJEQVYgZm9ybWF0CiB9CiAKIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvRm9sZGVyX0FjdGlvbnNfU3VpdGUucHkgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Gb2xkZXJfQWN0aW9uc19TdWl0ZS5weQppbmRleCAyMmNmOTM1Li5jMmM3ZTVlIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Gb2xkZXJfQWN0aW9uc19TdWl0ZS5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Gb2xkZXJfQWN0aW9uc19TdWl0ZS5weQpAQCAtMjUyLDExICsyNTIsMTEgQEAKIHNjcmlwdC5fcHJpdmVsZW1kaWN0ID0gewogfQogX0VudW1fYWN0biA9IHsKLSAgICAnaXRlbXNfYWRkZWQnIDogJ2ZnZXQnLAkjIGl0ZW1zIGFkZGVkCi0gICAgJ2l0ZW1zX3JlbW92ZWQnIDogJ2Zsb3MnLAkjIGl0ZW1zIHJlbW92ZWQKLSAgICAnd2luZG93X2Nsb3NlZCcgOiAnZmNsbycsCSMgd2luZG93IGNsb3NlZAotICAgICd3aW5kb3dfbW92ZWQnIDogJ2ZzaXonLAkjIHdpbmRvdyBtb3ZlZAotICAgICd3aW5kb3dfb3BlbmVkJyA6ICdmb3BuJywJIyB3aW5kb3cgb3BlbmVkCisgICAgJ2l0ZW1zX2FkZGVkJyA6ICdmZ2V0JywgICAgICMgaXRlbXMgYWRkZWQKKyAgICAnaXRlbXNfcmVtb3ZlZCcgOiAnZmxvcycsICAgIyBpdGVtcyByZW1vdmVkCisgICAgJ3dpbmRvd19jbG9zZWQnIDogJ2ZjbG8nLCAgICMgd2luZG93IGNsb3NlZAorICAgICd3aW5kb3dfbW92ZWQnIDogJ2ZzaXonLCAgICAjIHdpbmRvdyBtb3ZlZAorICAgICd3aW5kb3dfb3BlbmVkJyA6ICdmb3BuJywgICAjIHdpbmRvdyBvcGVuZWQKIH0KIAogCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TdGFuZGFyZF9TdWl0ZS5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1N0YW5kYXJkX1N1aXRlLnB5CmluZGV4IGM5ZjZkNDQuLmYyMGVmODQgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1N0YW5kYXJkX1N1aXRlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1N0YW5kYXJkX1N1aXRlLnB5CkBAIC01MjQsOSArNTI0LDkgQEAKIGNsYXNzIF9iM18oYWV0b29scy5OQ29tcGFyaXNvbik6CiAgICAgIiIiXHhiMyAtIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiIiIKIF9FbnVtX3Nhdm8gPSB7Ci0gICAgJ2FzaycgOiAnYXNrICcsCSMgQXNrIHRoZSB1c2VyIHdoZXRoZXIgb3Igbm90IHRvIHNhdmUgdGhlIGZpbGUuCi0gICAgJ3llcycgOiAneWVzICcsCSMgU2F2ZSB0aGUgZmlsZS4KLSAgICAnbm8nIDogJ25vICAnLAkjIERvIG5vdCBzYXZlIHRoZSBmaWxlLgorICAgICdhc2snIDogJ2FzayAnLCAgICAgIyBBc2sgdGhlIHVzZXIgd2hldGhlciBvciBub3QgdG8gc2F2ZSB0aGUgZmlsZS4KKyAgICAneWVzJyA6ICd5ZXMgJywgICAgICMgU2F2ZSB0aGUgZmlsZS4KKyAgICAnbm8nIDogJ25vICAnLCAgICAgICMgRG8gbm90IHNhdmUgdGhlIGZpbGUuCiB9CiAKIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9TdGFuZGFyZF9TdWl0ZS5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvU3RhbmRhcmRfU3VpdGUucHkKaW5kZXggNjczYTMxYS4uMDM1MjkwZiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9TdGFuZGFyZF9TdWl0ZS5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1N0YW5kYXJkX1N1aXRlLnB5CkBAIC01MjQsOSArNTI0LDkgQEAKIGNsYXNzIF9iM18oYWV0b29scy5OQ29tcGFyaXNvbik6CiAgICAgIiIiXHhiMyAtIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiIiIKIF9FbnVtX3Nhdm8gPSB7Ci0gICAgJ2FzaycgOiAnYXNrICcsCSMgQXNrIHRoZSB1c2VyIHdoZXRoZXIgb3Igbm90IHRvIHNhdmUgdGhlIGZpbGUuCi0gICAgJ3llcycgOiAneWVzICcsCSMgU2F2ZSB0aGUgZmlsZS4KLSAgICAnbm8nIDogJ25vICAnLAkjIERvIG5vdCBzYXZlIHRoZSBmaWxlLgorICAgICdhc2snIDogJ2FzayAnLCAgICAgIyBBc2sgdGhlIHVzZXIgd2hldGhlciBvciBub3QgdG8gc2F2ZSB0aGUgZmlsZS4KKyAgICAneWVzJyA6ICd5ZXMgJywgICAgICMgU2F2ZSB0aGUgZmlsZS4KKyAgICAnbm8nIDogJ25vICAnLCAgICAgICMgRG8gbm90IHNhdmUgdGhlIGZpbGUuCiB9CiAKIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcy9fX2luaXRfXy5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMvX19pbml0X18ucHkKaW5kZXggYWMzYzBiYS4uMmM3MjJkOSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcy9fX2luaXRfXy5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL19idWlsdGluU3VpdGVzL19faW5pdF9fLnB5CkBAIC05LDIwICs5LDE5IEBACiAKIAogX2NvZGVfdG9fbW9kdWxlID0gewotCSdyZXFkJyA6IGJ1aWx0aW5fU3VpdGUsCi0JJ2NvcmUnIDogYnVpbHRpbl9TdWl0ZSwKKyAgICAgICAgJ3JlcWQnIDogYnVpbHRpbl9TdWl0ZSwKKyAgICAgICAgJ2NvcmUnIDogYnVpbHRpbl9TdWl0ZSwKIH0KIAogCiAKIF9jb2RlX3RvX2Z1bGxuYW1lID0gewotCSdyZXFkJyA6ICgnX2J1aWx0aW5TdWl0ZXMuYnVpbHRpbl9TdWl0ZScsICdidWlsdGluX1N1aXRlJyksCi0JJ2NvcmUnIDogKCdfYnVpbHRpblN1aXRlcy5idWlsdGluX1N1aXRlJywgJ2J1aWx0aW5fU3VpdGUnKSwKKyAgICAgICAgJ3JlcWQnIDogKCdfYnVpbHRpblN1aXRlcy5idWlsdGluX1N1aXRlJywgJ2J1aWx0aW5fU3VpdGUnKSwKKyAgICAgICAgJ2NvcmUnIDogKCdfYnVpbHRpblN1aXRlcy5idWlsdGluX1N1aXRlJywgJ2J1aWx0aW5fU3VpdGUnKSwKIH0KIAogZnJvbSBidWlsdGluX1N1aXRlIGltcG9ydCAqCiAKIGNsYXNzIF9idWlsdGluU3VpdGVzKGJ1aWx0aW5fU3VpdGVfRXZlbnRzLAotCQlhZXRvb2xzLlRhbGtUbyk6Ci0JX3NpZ25hdHVyZSA9ICdhc2NyJwotCisgICAgICAgICAgICAgICAgYWV0b29scy5UYWxrVG8pOgorICAgIF9zaWduYXR1cmUgPSAnYXNjcicKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMvYnVpbHRpbl9TdWl0ZS5weSBiL0xpYi9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMvYnVpbHRpbl9TdWl0ZS5weQppbmRleCAxMTdlZWRkLi4zMTgyNTBmIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL19idWlsdGluU3VpdGVzL2J1aWx0aW5fU3VpdGUucHkKKysrIGIvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcy9idWlsdGluX1N1aXRlLnB5CkBAIC05LDExOCArOSwxMTggQEAKIAogY2xhc3MgYnVpbHRpbl9TdWl0ZV9FdmVudHM6CiAKLQlkZWYgb3BlbihzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIib3BlbjogT3BlbiB0aGUgc3BlY2lmaWVkIG9iamVjdChzKQotCQlSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzIHRvIG9wZW4KLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQkiIiIKLQkJX2NvZGUgPSAnYWV2dCcKLQkJX3N1YmNvZGUgPSAnb2RvYycKKyAgICBkZWYgb3BlbihzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIib3BlbjogT3BlbiB0aGUgc3BlY2lmaWVkIG9iamVjdChzKQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzIHRvIG9wZW4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYWV2dCcKKyAgICAgICAgX3N1YmNvZGUgPSAnb2RvYycKIAotCQlpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJwotCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JZGVmIHJ1bihzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJydW46IFJ1biBhbiBhcHBsaWNhdGlvbi4JIE1vc3QgYXBwbGljYXRpb25zIHdpbGwgb3BlbiBhbiBlbXB0eSwgdW50aXRsZWQgd2luZG93LgotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCSIiIgotCQlfY29kZSA9ICdhZXZ0JwotCQlfc3ViY29kZSA9ICdvYXBwJworICAgIGRlZiBydW4oc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicnVuOiBSdW4gYW4gYXBwbGljYXRpb24uICAgICAgTW9zdCBhcHBsaWNhdGlvbnMgd2lsbCBvcGVuIGFuIGVtcHR5LCB1bnRpdGxlZCB3aW5kb3cuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ29hcHAnCiAKLQkJaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKLQkJaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0ICE9IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCiAKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCWRlZiByZW9wZW4oc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIicmVvcGVuOiBSZWFjdGl2YXRlIGEgcnVubmluZyBhcHBsaWNhdGlvbi4gIFNvbWUgYXBwbGljYXRpb25zIHdpbGwgb3BlbiBhIG5ldyB1bnRpdGxlZCB3aW5kb3cgaWYgbm8gd2luZG93IGlzIG9wZW4uCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJIiIiCi0JCV9jb2RlID0gJ2FldnQnCi0JCV9zdWJjb2RlID0gJ3JhcHAnCisgICAgZGVmIHJlb3BlbihzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJyZW9wZW46IFJlYWN0aXZhdGUgYSBydW5uaW5nIGFwcGxpY2F0aW9uLiAgU29tZSBhcHBsaWNhdGlvbnMgd2lsbCBvcGVuIGEgbmV3IHVudGl0bGVkIHdpbmRvdyBpZiBubyB3aW5kb3cgaXMgb3Blbi4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYWV2dCcKKyAgICAgICAgX3N1YmNvZGUgPSAncmFwcCcKIAotCQlpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJwotCQlpZiBfbm9fb2JqZWN0ICE9IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKIAogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JZGVmIF9wcmludChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIicHJpbnQ6IFByaW50IHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpCi0JCVJlcXVpcmVkIGFyZ3VtZW50OiBsaXN0IG9mIG9iamVjdHMgdG8gcHJpbnQKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQkiIiIKLQkJX2NvZGUgPSAnYWV2dCcKLQkJX3N1YmNvZGUgPSAncGRvYycKKyAgICBkZWYgX3ByaW50KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJwcmludDogUHJpbnQgdGhlIHNwZWNpZmllZCBvYmplY3QocykKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cyB0byBwcmludAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdwZG9jJwogCi0JCWlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX3F1aXQgPSB7Ci0JCSdzYXZpbmcnIDogJ3Nhdm8nLAotCX0KKyAgICBfYXJnbWFwX3F1aXQgPSB7CisgICAgICAgICAgICAnc2F2aW5nJyA6ICdzYXZvJywKKyAgICB9CiAKLQlkZWYgcXVpdChzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJxdWl0OiBRdWl0IGFuIGFwcGxpY2F0aW9uCi0JCUtleXdvcmQgYXJndW1lbnQgc2F2aW5nOiBzcGVjaWZpZXMgd2hldGhlciB0byBzYXZlIGN1cnJlbnRseSBvcGVuIGRvY3VtZW50cwotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCSIiIgotCQlfY29kZSA9ICdhZXZ0JwotCQlfc3ViY29kZSA9ICdxdWl0JworICAgIGRlZiBxdWl0KHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInF1aXQ6IFF1aXQgYW4gYXBwbGljYXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzYXZpbmc6IHNwZWNpZmllcyB3aGV0aGVyIHRvIHNhdmUgY3VycmVudGx5IG9wZW4gZG9jdW1lbnRzCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ3F1aXQnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfcXVpdCkKLQkJaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9xdWl0KQorICAgICAgICBpZiBfbm9fb2JqZWN0ICE9IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCiAKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ3Nhdm8nLCBfRW51bV9zYXZvKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnc2F2bycsIF9FbnVtX3Nhdm8pCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX2Nsb3NlID0gewotCQknc2F2aW5nJyA6ICdzYXZvJywKLQkJJ3NhdmluZ19pbicgOiAna2ZpbCcsCi0JfQorICAgIF9hcmdtYXBfY2xvc2UgPSB7CisgICAgICAgICAgICAnc2F2aW5nJyA6ICdzYXZvJywKKyAgICAgICAgICAgICdzYXZpbmdfaW4nIDogJ2tmaWwnLAorICAgIH0KIAogX0VudW1fc2F2byA9IHsKLQkneWVzJyA6ICd5ZXMgJywgIyBTYXZlIG9iamVjdHMgbm93Ci0JJ25vJyA6ICdubwknLAkjIERvIG5vdCBzYXZlIG9iamVjdHMKLQknYXNrJyA6ICdhc2sgJywgIyBBc2sgdGhlIHVzZXIgd2hldGhlciB0byBzYXZlCisgICAgICAgICd5ZXMnIDogJ3llcyAnLCAjIFNhdmUgb2JqZWN0cyBub3cKKyAgICAgICAgJ25vJyA6ICdubyAgICAgICcsICAgICAgIyBEbyBub3Qgc2F2ZSBvYmplY3RzCisgICAgICAgICdhc2snIDogJ2FzayAnLCAjIEFzayB0aGUgdXNlciB3aGV0aGVyIHRvIHNhdmUKIH0KIAogIwpAQCAtMTM2LDUgKzEzNiw1IEBACiB9CiAKIF9lbnVtZGVjbGFyYXRpb25zID0gewotCSdzYXZvJyA6IF9FbnVtX3Nhdm8sCisgICAgICAgICdzYXZvJyA6IF9FbnVtX3Nhdm8sCiB9CmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbWFjZnMucHkgYi9MaWIvcGxhdC1tYWMvbWFjZnMucHkKaW5kZXggMTFkYmJlYi4uNzM4MTVhZSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL21hY2ZzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9tYWNmcy5weQpAQCAtOSw3ICs5LDcgQEAKIAogd2FybmluZ3Mud2FybigibWFjZnMgaXMgZGVwcmVjYXRlZCwgdXNlIENhcmJvbi5GaWxlLCBDYXJib24uRm9sZGVyIG9yIEVhc3lEaWFsb2dzIiwKICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgICAgICAgICAgIAorCiAjIEZpcnN0IHN0ZXA6IGVuc3VyZSB3ZSBhbHNvIGVtdWxhdGUgdGhlIE1BQ0ZTIG1vZHVsZSwgd2hpY2ggY29udGFpbmVkCiAjIGFsbCB0aGUgY29uc3RhbnRzCiAKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgICAgIHQgPSB0ICsgMHgxMDAwMDAwMEwKICAgICAgICAgcmV0dXJuICgwLCBpbnQodCksIDApCiBlbHNlOgotICAgIGRlZiBfdXRjMnRpbWUodXRjKTogCisgICAgZGVmIF91dGMydGltZSh1dGMpOgogICAgICAgICB0ID0gdXRjWzFdCiAgICAgICAgIGlmIHQgPCAwOgogICAgICAgICAgICAgdCA9IHQgKyAweDEwMDAwMDAwMEwKQEAgLTU4LDI2ICs1OCwyNiBAQAogY2xhc3MgRlNTcGVjKENhcmJvbi5GaWxlLkZTU3BlYyk6CiAgICAgZGVmIGFzX2ZzcmVmKHNlbGYpOgogICAgICAgICByZXR1cm4gRlNSZWYoc2VsZikKLSAgICAgICAgCisKICAgICBkZWYgTmV3QWxpYXMoc2VsZiwgc3JjPU5vbmUpOgogICAgICAgICByZXR1cm4gQWxpYXMoQ2FyYm9uLkZpbGUuTmV3QWxpYXMoc3JjLCBzZWxmKSkKLSAgICAgICAgCisKICAgICBkZWYgR2V0Q3JlYXRvclR5cGUoc2VsZik6CiAgICAgICAgIGZpbmZvID0gc2VsZi5GU3BHZXRGSW5mbygpCiAgICAgICAgIHJldHVybiBmaW5mby5DcmVhdG9yLCBmaW5mby5UeXBlCi0gICAgICAgIAorCiAgICAgZGVmIFNldENyZWF0b3JUeXBlKHNlbGYsIGN0b3IsIHRwKToKICAgICAgICAgZmluZm8gPSBzZWxmLkZTcEdldEZJbmZvKCkKICAgICAgICAgZmluZm8uQ3JlYXRvciA9IGN0b3IKICAgICAgICAgZmluZm8uVHlwZSA9IHRwCiAgICAgICAgIHNlbGYuRlNwU2V0RkluZm8oZmluZm8pCi0gICAgICAgIAorCiAgICAgZGVmIEdldEZJbmZvKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5GU3BHZXRGSW5mbygpCi0gICAgICAgIAorCiAgICAgZGVmIFNldEZJbmZvKHNlbGYsIGluZm8pOgogICAgICAgICByZXR1cm4gc2VsZi5GU3BTZXRGSW5mbyhpbmZvKQotICAgICAgICAKKwogICAgIGRlZiBHZXREYXRlcyhzZWxmKToKICAgICAgICAgY2F0SW5mb0ZsYWdzID0ga0ZTQ2F0SW5mb0NyZWF0ZURhdGV8a0ZTQ2F0SW5mb0NvbnRlbnRNb2R8a0ZTQ2F0SW5mb0JhY2t1cERhdGUKICAgICAgICAgY2F0aW5mbywgZDEsIGQyLCBkMyA9IEZTUmVmKHNlbGYpLkZTR2V0Q2F0YWxvZ0luZm8oY2F0SW5mb0ZsYWdzKQpAQCAtODUsNyArODUsNyBAQAogICAgICAgICBtZGF0ZSA9IGNhdGluZm8uY29udGVudE1vZERhdGUKICAgICAgICAgYmRhdGUgPSBjYXRpbmZvLmJhY2t1cERhdGUKICAgICAgICAgcmV0dXJuIF91dGMydGltZShjZGF0ZSksIF91dGMydGltZShtZGF0ZSksIF91dGMydGltZShiZGF0ZSkKLSAgICAKKwogICAgIGRlZiBTZXREYXRlcyhzZWxmLCBjZGF0ZSwgbWRhdGUsIGJkYXRlKToKICAgICAgICAgY2F0SW5mb0ZsYWdzID0ga0ZTQ2F0SW5mb0NyZWF0ZURhdGV8a0ZTQ2F0SW5mb0NvbnRlbnRNb2R8a0ZTQ2F0SW5mb0JhY2t1cERhdGUKICAgICAgICAgY2F0aW5mbyA9IENhcmJvbi5GaWxlLkZTQ2F0YWxvZ0luZm8oCkBAIC05MywyMyArOTMsMjMgQEAKICAgICAgICAgICAgIGNvbnRlbnRNb2REYXRlID0gX3RpbWUydXRjKG1kYXRlKSwKICAgICAgICAgICAgIGJhY2t1cERhdGUgPSBfdGltZTJ1dGMoYmRhdGUpKQogICAgICAgICBGU1JlZihzZWxmKS5GU1NldENhdGFsb2dJbmZvKGNhdEluZm9GbGFncywgY2F0aW5mbykKLSAgICAKKwogY2xhc3MgRlNSZWYoQ2FyYm9uLkZpbGUuRlNSZWYpOgogICAgIGRlZiBhc19mc3NwZWMoc2VsZik6CiAgICAgICAgIHJldHVybiBGU1NwZWMoc2VsZikKLSAgICAKKwogY2xhc3MgQWxpYXMoQ2FyYm9uLkZpbGUuQWxpYXMpOgogCiAgICAgZGVmIEdldEluZm8oc2VsZiwgaW5kZXgpOgogICAgICAgICByZXR1cm4gc2VsZi5HZXRBbGlhc0luZm8oaW5kZXgpCi0gICAgICAgIAorCiAgICAgZGVmIFVwZGF0ZShzZWxmLCAqYXJncyk6CiAgICAgICAgIHBhc3MgIyBwcmludCAiQWxpYXMuVXBkYXRlIG5vdCB5ZXQgaW1wbGVtZW50ZWQiCi0gICAgICAgIAorCiAgICAgZGVmIFJlc29sdmUoc2VsZiwgc3JjPU5vbmUpOgogICAgICAgICBmc3MsIGNoYW5nZWQgPSBzZWxmLlJlc29sdmVBbGlhcyhzcmMpCiAgICAgICAgIHJldHVybiBGU1NwZWMoZnNzKSwgY2hhbmdlZAotICAgICAgICAKKwogZnJvbSBDYXJib24uRmlsZSBpbXBvcnQgRkluZm8KIAogIyBCYWNrd2FyZC1jb21wYXRpYmxlIHR5cGUgbmFtZXM6CkBAIC0xMjIsMTkgKzEyMiwxOSBAQAogZGVmIFJlc29sdmVBbGlhc0ZpbGUoZnNzLCBjaGFpbj0xKToKICAgICBmc3MsIGlzZGlyLCBpc2FsaWFzID0gQ2FyYm9uLkZpbGUuUmVzb2x2ZUFsaWFzRmlsZShmc3MsIGNoYWluKQogICAgIHJldHVybiBGU1NwZWMoZnNzKSwgaXNkaXIsIGlzYWxpYXMKLSAgICAKKwogZGVmIFJhd0ZTU3BlYyhkYXRhKToKICAgICByZXR1cm4gRlNTcGVjKHJhd2RhdGE9ZGF0YSkKLSAgICAKKwogZGVmIFJhd0FsaWFzKGRhdGEpOgogICAgIHJldHVybiBBbGlhcyhyYXdkYXRhPWRhdGEpCi0gICAgCisKIGRlZiBGaW5kQXBwbGljYXRpb24oKmFyZ3MpOgogICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJGaW5kQXBwbGljYXRpb24gbm8gbG9uZ2VyIGltcGxlbWVudGVkIgotICAgIAorCiBkZWYgTmV3QWxpYXNNaW5pbWFsRnJvbUZ1bGxQYXRoKHBhdGgpOgogICAgIHJldHVybiBBbGlhcyhDYXJib24uRmlsZS5OZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgocGF0aCwgJycsICcnKSkKLSAgICAKKwogIyBBbm90aGVyIGdsb2JhbCBmdW5jdGlvbjoKIGZyb20gQ2FyYm9uLkZvbGRlciBpbXBvcnQgRmluZEZvbGRlcgogCkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICAiIiJBc2sgZm9yIGFuIGlucHV0IGZpbGUsIG9wdGlvbmFsbHkgc3BlY2lmeWluZyA0LWNoYXIgZmlsZSB0eXBlcyB0aGF0IGFyZQogICAgIGFsbG93YWJsZSIiIgogICAgIHJldHVybiBQcm9tcHRHZXRGaWxlKCcnLCAqdHlwZWxpc3QpCi0gICAgCisKIGRlZiBQcm9tcHRHZXRGaWxlKHByb21wdCwgKnR5cGVsaXN0KToKICAgICAiIiJBc2sgZm9yIGFuIGlucHV0IGZpbGUgZ2l2aW5nIHRoZSB1c2VyIGEgcHJvbXB0IG1lc3NhZ2UuIE9wdGlvbmFsbHkgeW91IGNhbgogICAgIHNwZWNpZnlpbmcgNC1jaGFyIGZpbGUgdHlwZXMgdGhhdCBhcmUgYWxsb3dhYmxlIiIiCkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgaWYgbm90IHR5cGVsaXN0OgogICAgICAgICB0eXBlbGlzdCA9IE5vbmUKLSAgICBmc3MgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPXByb21wdCwgd2FudGVkPUZTU3BlYywgCisgICAgZnNzID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT1wcm9tcHQsIHdhbnRlZD1GU1NwZWMsCiAgICAgICAgIHR5cGVMaXN0PXR5cGVsaXN0LCBkZWZhdWx0TG9jYXRpb249X2hhbmRsZVNldEZvbGRlcigpKQogICAgIHJldHVybiBmc3MsIG5vdCBmc3MgaXMgTm9uZQogCkBAIC0xNjcsMTAgKzE2NywxMCBAQAogICAgIGltcG9ydCBFYXN5RGlhbG9ncwogICAgIHdhcm5pbmdzLndhcm4oIm1hY2ZzLlN0YW5kYXJkR2V0RmlsZSBhbmQgZnJpZW5kcyBhcmUgZGVwcmVjYXRlZCwgdXNlIEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuIiwKICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgZnNzID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUod2FudGVkPUZTU3BlYywgbWVzc2FnZT1wcm9tcHQsIAorICAgIGZzcyA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKHdhbnRlZD1GU1NwZWMsIG1lc3NhZ2U9cHJvbXB0LAogICAgIHNhdmVkRmlsZU5hbWU9ZGVmYXVsdCwgZGVmYXVsdExvY2F0aW9uPV9oYW5kbGVTZXRGb2xkZXIoKSkKICAgICByZXR1cm4gZnNzLCBub3QgZnNzIGlzIE5vbmUKLSAgICAKKwogZGVmIFNldEZvbGRlcihmb2xkZXIpOgogICAgIGdsb2JhbCBfY3VyZm9sZGVyCiAgICAgd2FybmluZ3Mud2FybigibWFjZnMuU3RhbmRhcmRHZXRGaWxlIGFuZCBmcmllbmRzIGFyZSBkZXByZWNhdGVkLCB1c2UgRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4iLApAQCAtMTgxLDE4ICsxODEsMTggQEAKICAgICAgICAgcnYgPSBOb25lCiAgICAgX2N1cmZvbGRlciA9IGZvbGRlcgogICAgIHJldHVybiBydgotICAgIAorCiBkZWYgX2hhbmRsZVNldEZvbGRlcigpOgogICAgIGdsb2JhbCBfY3VyZm9sZGVyCiAgICAgcnYgPSBfY3VyZm9sZGVyCiAgICAgX2N1cmZvbGRlciA9IE5vbmUKICAgICByZXR1cm4gcnYKLSAgICAKKwogZGVmIEdldERpcmVjdG9yeShwcm9tcHQ9Tm9uZSk6CiAgICAgIiIiQXNrIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZvbGRlci4gT3B0aW9uYWxseSB5b3UgY2FuIGdpdmUgYSBwcm9tcHQuIiIiCiAgICAgaW1wb3J0IEVhc3lEaWFsb2dzCiAgICAgd2FybmluZ3Mud2FybigibWFjZnMuU3RhbmRhcmRHZXRGaWxlIGFuZCBmcmllbmRzIGFyZSBkZXByZWNhdGVkLCB1c2UgRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4iLAogICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLSAgICBmc3MgPSBFYXN5RGlhbG9ncy5Bc2tGb2xkZXIobWVzc2FnZT1wcm9tcHQsIHdhbnRlZD1GU1NwZWMsIAorICAgIGZzcyA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcihtZXNzYWdlPXByb21wdCwgd2FudGVkPUZTU3BlYywKICAgICAgICAgZGVmYXVsdExvY2F0aW9uPV9oYW5kbGVTZXRGb2xkZXIoKSkKICAgICByZXR1cm4gZnNzLCBub3QgZnNzIGlzIE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9tYWNvc3Rvb2xzLnB5IGIvTGliL3BsYXQtbWFjL21hY29zdG9vbHMucHkKaW5kZXggMzY0NGU3ZS4uMDZiYzkyZiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL21hY29zdG9vbHMucHkKKysrIGIvTGliL3BsYXQtbWFjL21hY29zdG9vbHMucHkKQEAgLTQxLDE4ICs0MSwxOCBAQAogICAgICAgICBhbGlhcyA9IEZpbGUuRlNOZXdBbGlhcyhyZWxhdGl2ZWZzciwgc3JjZnNyKQogICAgIGVsc2U6CiAgICAgICAgIGFsaWFzID0gc3JjZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKLSAgICAKLSAgICBkc3Rmc3IsIGRzdGZzcyA9IFJlcy5GU0NyZWF0ZVJlc291cmNlRmlsZShkc3RkaXJmc3IsIHVuaWNvZGUoZHN0bmFtZSksIAorCisgICAgZHN0ZnNyLCBkc3Rmc3MgPSBSZXMuRlNDcmVhdGVSZXNvdXJjZUZpbGUoZHN0ZGlyZnNyLCB1bmljb2RlKGRzdG5hbWUpLAogICAgICAgICBGaWxlLkZTR2V0UmVzb3VyY2VGb3JrTmFtZSgpKQogICAgIGggPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKGRzdGZzciwgRmlsZS5GU0dldFJlc291cmNlRm9ya05hbWUoKSwgMykKICAgICByZXNvdXJjZSA9IFJlcy5SZXNvdXJjZShhbGlhcy5kYXRhKQogICAgIHJlc291cmNlLkFkZFJlc291cmNlKCdhbGlzJywgMCwgJycpCiAgICAgUmVzLkNsb3NlUmVzRmlsZShoKQotICAgIAorCiAgICAgZHN0ZmluZm8gPSBkc3Rmc3MuRlNwR2V0RkluZm8oKQogICAgIGRzdGZpbmZvLkZsYWdzID0gZHN0ZmluZm8uRmxhZ3N8MHg4MDAwICAgICMgQWxpYXMgZmxhZwogICAgIGRzdGZzcy5GU3BTZXRGSW5mbyhkc3RmaW5mbykKLSAgICAKKwogZGVmIG1rZGlycyhkc3QpOgogICAgICIiIk1ha2UgZGlyZWN0b3JpZXMgbGVhZGluZyB0byAnZHN0JyBpZiB0aGV5IGRvbid0IGV4aXN0IHlldCIiIgogICAgIGlmIGRzdCA9PSAnJyBvciBvcy5wYXRoLmV4aXN0cyhkc3QpOgpAQCAtNjIsNyArNjIsNyBAQAogICAgICAgICBoZWFkID0gaGVhZCArICc6JwogICAgIG1rZGlycyhoZWFkKQogICAgIG9zLm1rZGlyKGRzdCwgMDc3NykKLSAgICAKKwogZGVmIHRvdWNoZWQoZHN0KToKICAgICAiIiJUZWxsIHRoZSBmaW5kZXIgYSBmaWxlIGhhcyBjaGFuZ2VkLiBOby1vcCBvbiBNYWNPU1guIiIiCiAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICdtYWMnOiByZXR1cm4KQEAgLTgwLDcgKzgwLDcgQEAKICAgICAgICAgZGlyX2Zzcy5TZXREYXRlcyhjcmRhdGUsIG5vdywgYmtkYXRlKQogICAgIGV4Y2VwdCBtYWNmcy5lcnJvcjoKICAgICAgICAgcGFzcwotICAgIAorCiBkZWYgdG91Y2hlZF9hZShkc3QpOgogICAgICIiIlRlbGwgdGhlIGZpbmRlciBhIGZpbGUgaGFzIGNoYW5nZWQiIiIKICAgICBwYXJkaXIgPSBvcy5wYXRoLnNwbGl0KGRzdClbMF0KQEAgLTg5LDE0ICs4OSwxNCBAQAogICAgIGltcG9ydCBGaW5kZXIKICAgICBmID0gRmluZGVyLkZpbmRlcigpCiAgICAgZi51cGRhdGUoRmlsZS5GU1JlZihwYXJkaXIpKQotICAgIAorCiBkZWYgY29weShzcmMsIGRzdCwgY3JlYXRlcGF0aD0wLCBjb3B5ZGF0ZXM9MSwgZm9yY2V0eXBlPU5vbmUpOgogICAgICIiIkNvcHkgYSBmaWxlLCBpbmNsdWRpbmcgZmluZGVyIGluZm8sIHJlc291cmNlIGZvcmssIGV0YyIiIgogICAgIHNyYyA9IEZpbGUucGF0aG5hbWUoc3JjKQogICAgIGRzdCA9IEZpbGUucGF0aG5hbWUoZHN0KQogICAgIGlmIGNyZWF0ZXBhdGg6CiAgICAgICAgIG1rZGlycyhvcy5wYXRoLnNwbGl0KGRzdClbMF0pCi0gICAgCisKICAgICBpZnAgPSBvcGVuKHNyYywgJ3JiJykKICAgICBvZnAgPSBvcGVuKGRzdCwgJ3diJykKICAgICBkID0gaWZwLnJlYWQoQlVGU0laKQpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgICAgIGQgPSBpZnAucmVhZChCVUZTSVopCiAgICAgaWZwLmNsb3NlKCkKICAgICBvZnAuY2xvc2UoKQotICAgIAorCiAgICAgaWZwID0gb3BlbnJmKHNyYywgJypyYicpCiAgICAgb2ZwID0gb3BlbnJmKGRzdCwgJyp3YicpCiAgICAgZCA9IGlmcC5yZWFkKEJVRlNJWikKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgICAgICBkID0gaWZwLnJlYWQoQlVGU0laKQogICAgIGlmcC5jbG9zZSgpCiAgICAgb2ZwLmNsb3NlKCkKLSAgICAKKwogICAgIHNyY2ZzcyA9IEZpbGUuRlNTcGVjKHNyYykKICAgICBkc3Rmc3MgPSBGaWxlLkZTU3BlYyhkc3QpCiAgICAgc2YgPSBzcmNmc3MuRlNwR2V0RkluZm8oKQpAQCAtMTMwLDcgKzEzMCw3IEBACiAgICAgICAgIGNhdGluZm8sIF8sIF8sIF8gPSBzcmNmc3IuRlNHZXRDYXRhbG9nSW5mbyhGaWxlcy5rRlNDYXRJbmZvQWxsRGF0ZXMpCiAgICAgICAgIGRzdGZzci5GU1NldENhdGFsb2dJbmZvKEZpbGVzLmtGU0NhdEluZm9BbGxEYXRlcywgY2F0aW5mbykKICAgICB0b3VjaGVkKGRzdGZzcykKLSAgICAKKwogZGVmIGNvcHl0cmVlKHNyYywgZHN0LCBjb3B5ZGF0ZXM9MSk6CiAgICAgIiIiQ29weSBhIGNvbXBsZXRlIGZpbGUgdHJlZSB0byBhIG5ldyBkZXN0aW5hdGlvbiIiIgogICAgIGlmIG9zLnBhdGguaXNkaXIoc3JjKToKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9tYWNyZXNvdXJjZS5weSBiL0xpYi9wbGF0LW1hYy9tYWNyZXNvdXJjZS5weQppbmRleCBlNGMzZjYyLi5mNjhlY2RjIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbWFjcmVzb3VyY2UucHkKKysrIGIvTGliL3BsYXQtbWFjL21hY3Jlc291cmNlLnB5CkBAIC0xNSwxMiArMTUsMTIgQEAKICAgICBpcyBhdmFpbGFibGUgd2UgYXJlIGRvbmUuIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgd2UgbG9vayBmb3IgYSBmaWxlIGZpbGVuYW1lCiAgICAgKGRlZmF1bHQ6IG1vZG5hbWUgd2l0aCAucnNyYyBhcHBlbmRlZCkgZWl0aGVyIGluIHRoZSBzYW1lIGZvbGRlciBhcwogICAgIHdoZXJlIG1vZG5hbWUgd2FzIGxvYWRlZCBmcm9tLCBvciBvdGhlcndpc2UgYWNyb3NzIHN5cy5wYXRoLgotICAgIAorCiAgICAgUmV0dXJucyB0aGUgcmVmbm8gb2YgdGhlIHJlc291cmNlIGZpbGUgb3BlbmVkIChvciBOb25lKSIiIgogCiAgICAgaWYgbW9kbmFtZSBpcyBOb25lIGFuZCBmaWxlbmFtZSBpcyBOb25lOgogICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiRWl0aGVyIGZpbGVuYW1lIG9yIG1vZG5hbWUgYXJndW1lbnQgKG9yIGJvdGgpIG11c3QgYmUgZ2l2ZW4iCi0gICAgCisKICAgICBpZiB0eXBlKHJlc2lkKSBpcyB0eXBlKDEpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBoID0gUmVzLkdldFJlc291cmNlKHJlc3R5cGUsIHJlc2lkKQpAQCAtMzUsMTQgKzM1LDE0IEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAgICAgCisKICAgICAjIENvbnN0cnVjdCBhIGZpbGVuYW1lIGlmIHdlIGRvbid0IGhhdmUgb25lCiAgICAgaWYgbm90IGZpbGVuYW1lOgogICAgICAgICBpZiAnLicgaW4gbW9kbmFtZToKICAgICAgICAgICAgIGZpbGVuYW1lID0gbW9kbmFtZS5zcGxpdCgnLicpWy0xXSArICcucnNyYycKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGZpbGVuYW1lID0gbW9kbmFtZSArICcucnNyYycKLSAgICAKKwogICAgICMgTm93IGNyZWF0ZSBhIGxpc3Qgb2YgZm9sZGVycyB0byBzZWFyY2gKICAgICBzZWFyY2hkaXJzID0gW10KICAgICBpZiBtb2RuYW1lID09ICdfX21haW5fXyc6CkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgIGlmIGhhc2F0dHIobW9kLCAnX19maWxlX18nKToKICAgICAgICAgICAgIHNlYXJjaGRpcnMgPSBbb3MucGF0aC5kaXJuYW1lKG1vZC5fX2ZpbGVfXyldCiAgICAgc2VhcmNoZGlycy5leHRlbmQoc3lzLnBhdGgpCi0gICAgCisKICAgICAjIEFuZCBsb29rIGZvciB0aGUgZmlsZQogICAgIGZvciBkaXIgaW4gc2VhcmNoZGlyczoKICAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCBmaWxlbmFtZSkKQEAgLTYxLDE2ICs2MSwxNiBAQAogICAgICAgICAgICAgYnJlYWsKICAgICBlbHNlOgogICAgICAgICByYWlzZSBSZXNvdXJjZUZpbGVOb3RGb3VuZEVycm9yLCBmaWxlbmFtZQotICAgIAorCiAgICAgcmVmbm8gPSBvcGVuX3BhdGhuYW1lKHBhdGhuYW1lKQotICAgIAorCiAgICAgIyBBbmQgY2hlY2sgdGhhdCB0aGUgcmVzb3VyY2UgZXhpc3RzIG5vdwogICAgIGlmIHR5cGUocmVzaWQpIGlzIHR5cGUoMSk6CiAgICAgICAgIGggPSBSZXMuR2V0UmVzb3VyY2UocmVzdHlwZSwgcmVzaWQpCiAgICAgZWxzZToKICAgICAgICAgaCA9IFJlcy5HZXROYW1lZFJlc291cmNlKHJlc3R5cGUsIHJlc2lkKQogICAgIHJldHVybiByZWZubwotICAgIAorCiBkZWYgb3Blbl9wYXRobmFtZShwYXRobmFtZSwgdmVyYm9zZT0wKToKICAgICAiIiJPcGVuIGEgcmVzb3VyY2UgZmlsZSBnaXZlbiBieSBwYXRobmFtZSwgcG9zc2libHkgZGVjb2RpbmcgYW4KICAgICBBcHBsZVNpbmdsZSBmaWxlIiIiCkBAIC05NSw3ICs5NSw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByYWlzZQogICAgIHJldHVybiByZWZubwotICAgIAorCiBkZWYgcmVzb3VyY2VfcGF0aG5hbWUocGF0aG5hbWUsIHZlcmJvc2U9MCk6CiAgICAgIiIiUmV0dXJuIHRoZSBwYXRobmFtZSBmb3IgYSByZXNvdXJjZSBmaWxlIChlaXRoZXIgREYgb3IgUkYgYmFzZWQpLgogICAgIElmIHRoZSBwYXRobmFtZSBnaXZlbiBhbHJlYWR5IHJlZmVycyB0byBzdWNoIGEgZmlsZSBzaW1wbHkgcmV0dXJuIGl0LApAQCAtMTIxLDEyICsxMjEsMTIgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJhaXNlCiAgICAgcmV0dXJuIHBhdGhuYW1lCi0gICAgCisKIGRlZiBvcGVuX2Vycm9yX3Jlc291cmNlKCk6CiAgICAgIiIiT3BlbiB0aGUgcmVzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBlcnJvciBjb2RlIHRvIGVycm9yIG1lc3NhZ2UKICAgICBtYXBwaW5nLiIiIgogICAgIG5lZWQoJ0VzdHInLCAxLCBmaWxlbmFtZT0iZXJyb3JzLnJzcmMiLCBtb2RuYW1lPV9fbmFtZV9fKQotICAgIAorCiBkZWYgX2RlY29kZShwYXRobmFtZSwgdmVyYm9zZT0wKToKICAgICAjIERlY29kZSBhbiBBcHBsZVNpbmdsZSByZXNvdXJjZSBmaWxlLCByZXR1cm4gdGhlIG5ldyBwYXRobmFtZS4KICAgICBuZXdwYXRobmFtZSA9IHBhdGhuYW1lICsgJy5kZi5yc3JjJwpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL3BpbXAucHkgYi9MaWIvcGxhdC1tYWMvcGltcC5weQppbmRleCAzOWJjNjkzLi42N2ZhYjc2IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvcGltcC5weQorKysgYi9MaWIvcGxhdC1tYWMvcGltcC5weQpAQCAtMSw2ICsxLDYgQEAKICIiIlBhY2thZ2UgSW5zdGFsbCBNYW5hZ2VyIGZvciBQeXRob24uCiAKLVRoaXMgaXMgY3VycmVudGx5IGEgTWFjT1NYLW9ubHkgc3RyYXdtYW4gaW1wbGVtZW50YXRpb24uIAorVGhpcyBpcyBjdXJyZW50bHkgYSBNYWNPU1gtb25seSBzdHJhd21hbiBpbXBsZW1lbnRhdGlvbi4KIERlc3BpdGUgb3RoZXIgcnVtb3VycyB0aGUgbmFtZSBzdGFuZHMgZm9yICJQYWNrbWFuIElNUGxlbWVudGF0aW9uIi4KIAogVG9vbHMgdG8gYWxsb3cgZWFzeSBpbnN0YWxsYXRpb24gb2YgcGFja2FnZXMuIFRoZSBpZGVhIGlzIHRoYXQgdGhlcmUgaXMKQEAgLTI3LDcgKzI3LDcgQEAKIGltcG9ydCBzaHV0aWwKIGltcG9ydCB0aW1lCiAKLV9fYWxsX18gPSBbIlBpbXBQcmVmZXJlbmNlcyIsICJQaW1wRGF0YWJhc2UiLCAiUGltcFBhY2thZ2UiLCAibWFpbiIsIAorX19hbGxfXyA9IFsiUGltcFByZWZlcmVuY2VzIiwgIlBpbXBEYXRhYmFzZSIsICJQaW1wUGFja2FnZSIsICJtYWluIiwKICAgICAiUElNUF9WRVJTSU9OIiwgIm1haW4iXQogCiBfc2NyaXB0RXhjX05vdEluc3RhbGxlZCA9ICJwaW1wLl9zY3JpcHRFeGNfTm90SW5zdGFsbGVkIgpAQCAtNTIsMTIgKzUyLDEyIEBACiAgICAgICAgIHN0YXR1cyA9ICJleHAiCiAgICAgZWxzZToKICAgICAgICAgc3RhdHVzID0gInByb2QiCi0gICAgICAgIAorCiAgICAgbWFqb3IsIG1pbm9yLCBtaWNybywgc3RhdGUsIGV4dHJhID0gc3lzLnZlcnNpb25faW5mbwogICAgIHB5dmVycyA9ICclZC4lZCcgJSAobWFqb3IsIG1pbm9yKQogICAgIGlmIHN0YXRlICE9ICdmaW5hbCc6CiAgICAgICAgIHB5dmVycyA9IHB5dmVycyArICclcyVkJyAlIChzdGF0ZSwgZXh0cmEpCi0gICAgICAgIAorCiAgICAgbG9uZ3BsYXRmb3JtID0gZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkKICAgICBvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUgPSBsb25ncGxhdGZvcm0uc3BsaXQoJy0nKQogICAgICMgRm9yIHNvbWUgcGxhdGZvcm1zIHdlIG1heSB3YW50IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbgpAQCAtOTQsNyArOTQsNyBAQAogCiBkZWYgX2NtZChvdXRwdXQsIGRpciwgKmNtZGl0ZW1zKToKICAgICAiIiJJbnRlcm5hbCByb3V0aW5lIHRvIHJ1biBhIHNoZWxsIGNvbW1hbmQgaW4gYSBnaXZlbiBkaXJlY3RvcnkuIiIiCi0gICAgCisKICAgICBjbWQgPSAoImNkIFwiJXNcIjsgIiAlIGRpcikgKyAiICIuam9pbihjbWRpdGVtcykKICAgICBpZiBvdXRwdXQ6CiAgICAgICAgIG91dHB1dC53cml0ZSgiKyAlc1xuIiAlIGNtZCkKQEAgLTExMiwyMiArMTEyLDIyIEBACiAKIGNsYXNzIFBpbXBEb3dubG9hZGVyOgogICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgLSBEb3dubG9hZGVyIGZvciBhcmNoaXZlcyIiIgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3VtZW50LAogICAgICAgICAgICAgZGlyPSIiLAogICAgICAgICAgICAgd2F0Y2hlcj1Ob25lKToKICAgICAgICAgc2VsZi5hcmd1bWVudCA9IGFyZ3VtZW50CiAgICAgICAgIHNlbGYuX2RpciA9IGRpcgogICAgICAgICBzZWxmLl93YXRjaGVyID0gd2F0Y2hlcgotICAgICAgICAgICAgICAgIAorCiAgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVybCwgZmlsZW5hbWUsIG91dHB1dD1Ob25lKToKICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgCisKICAgICBkZWYgdXBkYXRlKHNlbGYsIHN0cik6CiAgICAgICAgIGlmIHNlbGYuX3dhdGNoZXI6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fd2F0Y2hlci51cGRhdGUoc3RyKQogICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAgICAgCisKIGNsYXNzIFBpbXBDdXJsRG93bmxvYWRlcihQaW1wRG93bmxvYWRlcik6CiAKICAgICBkZWYgZG93bmxvYWQoc2VsZiwgdXJsLCBmaWxlbmFtZSwgb3V0cHV0PU5vbmUpOgpAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHVybCkKICAgICAgICAgc2VsZi51cGRhdGUoIkRvd25sb2FkaW5nICVzOiBmaW5pc2hlZCIgJSB1cmwpCiAgICAgICAgIHJldHVybiAobm90IGV4aXRzdGF0dXMpCi0gICAgICAgICAgICAKKwogY2xhc3MgUGltcFVybGxpYkRvd25sb2FkZXIoUGltcERvd25sb2FkZXIpOgogCiAgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVybCwgZmlsZW5hbWUsIG91dHB1dD1Ob25lKToKQEAgLTE1MCwxMyArMTUwLDEzIEBACiAgICAgICAgICAgICBsZW5ndGggPSBsb25nKGRvd25sb2FkLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBsZW5ndGggPSAtMQotICAgICAgICAKKwogICAgICAgICBkYXRhID0gZG93bmxvYWQucmVhZCg0MDk2KSAjcmVhZCA0SyBhdCBhIHRpbWUKICAgICAgICAgZGxzaXplID0gMAogICAgICAgICBsYXN0dGltZSA9IDAKICAgICAgICAgd2hpbGUga2VlcGdvaW5nOgogICAgICAgICAgICAgZGxzaXplID0gZGxzaXplICsgbGVuKGRhdGEpCi0gICAgICAgICAgICBpZiBsZW4oZGF0YSkgPT0gMDogCisgICAgICAgICAgICBpZiBsZW4oZGF0YSkgPT0gMDoKICAgICAgICAgICAgICAgICAjdGhpcyBpcyBvdXIgZXhpdCBjb25kaXRpb24KICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgb3V0cHV0LndyaXRlKGRhdGEpCkBAIC0xNzEsMTIgKzE3MSwxMiBAQAogICAgICAgICBpZiBrZWVwZ29pbmc6CiAgICAgICAgICAgICBzZWxmLnVwZGF0ZSgiRG93bmxvYWRpbmcgJXM6IGZpbmlzaGVkIiAlIHVybCkKICAgICAgICAgcmV0dXJuIGtlZXBnb2luZwotICAgICAgICAKKwogY2xhc3MgUGltcFVucGFja2VyOgogICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgLSBVbnBhY2tlciBmb3IgYXJjaGl2ZXMiIiIKLSAgICAKKwogICAgIF9jYW5fcmVuYW1lID0gRmFsc2UKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmd1bWVudCwKICAgICAgICAgICAgIGRpcj0iIiwKICAgICAgICAgICAgIHJlbmFtZXM9W10sCkBAIC0xODcsMzAgKzE4NywzMCBAQAogICAgICAgICBzZWxmLl9kaXIgPSBkaXIKICAgICAgICAgc2VsZi5fcmVuYW1lcyA9IHJlbmFtZXMKICAgICAgICAgc2VsZi5fd2F0Y2hlciA9IHdhdGNoZXIKLSAgICAgICAgICAgICAgICAKKwogICAgIGRlZiB1bnBhY2soc2VsZiwgYXJjaGl2ZSwgb3V0cHV0PU5vbmUsIHBhY2thZ2U9Tm9uZSk6CiAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIAorCiAgICAgZGVmIHVwZGF0ZShzZWxmLCBzdHIpOgogICAgICAgICBpZiBzZWxmLl93YXRjaGVyOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3dhdGNoZXIudXBkYXRlKHN0cikKICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgCisKIGNsYXNzIFBpbXBDb21tYW5kVW5wYWNrZXIoUGltcFVucGFja2VyKToKICAgICAiIiJVbnBhY2sgYXJjaGl2ZXMgYnkgY2FsbGluZyBhIFVuaXggdXRpbGl0eSIiIgotICAgIAorCiAgICAgX2Nhbl9yZW5hbWUgPSBGYWxzZQotICAgIAorCiAgICAgZGVmIHVucGFjayhzZWxmLCBhcmNoaXZlLCBvdXRwdXQ9Tm9uZSwgcGFja2FnZT1Ob25lKToKICAgICAgICAgY21kID0gc2VsZi5hcmd1bWVudCAlIGFyY2hpdmUKICAgICAgICAgaWYgX2NtZChvdXRwdXQsIHNlbGYuX2RpciwgY21kKToKICAgICAgICAgICAgIHJldHVybiAidW5wYWNrIGNvbW1hbmQgZmFpbGVkIgotICAgICAgICAgICAgCisKIGNsYXNzIFBpbXBUYXJVbnBhY2tlcihQaW1wVW5wYWNrZXIpOgogICAgICIiIlVucGFjayB0YXJmaWxlcyB1c2luZyB0aGUgYnVpbHRpbiB0YXJmaWxlIG1vZHVsZSIiIgotICAgIAorCiAgICAgX2Nhbl9yZW5hbWUgPSBUcnVlCi0gICAgCisKICAgICBkZWYgdW5wYWNrKHNlbGYsIGFyY2hpdmUsIG91dHB1dD1Ob25lLCBwYWNrYWdlPU5vbmUpOgogICAgICAgICB0ZiA9IHRhcmZpbGUub3BlbihhcmNoaXZlLCAiciIpCiAgICAgICAgIG1lbWJlcnMgPSB0Zi5nZXRtZW1iZXJzKCkKQEAgLTI1Myw3ICsyNTMsNyBAQAogICAgICAgICAgICAgICAgIG5hbWVzID0gcGFja2FnZS5maWx0ZXJFeHBlY3RlZFNraXBzKG5hbWVzKQogICAgICAgICAgICAgaWYgbmFtZXM6CiAgICAgICAgICAgICAgICAgcmV0dXJuICJOb3QgYWxsIGZpbGVzIHdlcmUgdW5wYWNrZWQ6ICVzIiAlICIgIi5qb2luKG5hbWVzKQotICAgICAgICAgICAgICAgICAgICAgICAgCisKIEFSQ0hJVkVfRk9STUFUUyA9IFsKICAgICAoIi50YXIuWiIsIFBpbXBUYXJVbnBhY2tlciwgTm9uZSksCiAgICAgKCIudGF6IiwgUGltcFRhclVucGFja2VyLCBOb25lKSwKQEAgLTI2Niw4ICsyNjYsOCBAQAogY2xhc3MgUGltcFByZWZlcmVuY2VzOgogICAgICIiIkNvbnRhaW5lciBmb3IgcGVyLXVzZXIgcHJlZmVyZW5jZXMsIHN1Y2ggYXMgdGhlIGRhdGFiYXNlIHRvIHVzZQogICAgIGFuZCB3aGVyZSB0byBpbnN0YWxsIHBhY2thZ2VzLiIiIgotICAgIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgZmxhdm9yT3JkZXI9Tm9uZSwKICAgICAgICAgICAgIGRvd25sb2FkRGlyPU5vbmUsCiAgICAgICAgICAgICBidWlsZERpcj1Ob25lLApAQCAtMjg3LDEwICsyODcsMTAgQEAKICAgICAgICAgc2VsZi5idWlsZERpciA9IGJ1aWxkRGlyCiAgICAgICAgIHNlbGYucGltcERhdGFiYXNlID0gcGltcERhdGFiYXNlCiAgICAgICAgIHNlbGYud2F0Y2hlciA9IE5vbmUKLSAgICAgICAgCisKICAgICBkZWYgc2V0V2F0Y2hlcihzZWxmLCB3YXRjaGVyKToKICAgICAgICAgc2VsZi53YXRjaGVyID0gd2F0Y2hlcgotICAgICAgICAKKwogICAgIGRlZiBzZXRJbnN0YWxsRGlyKHNlbGYsIGluc3RhbGxEaXI9Tm9uZSk6CiAgICAgICAgIGlmIGluc3RhbGxEaXI6CiAgICAgICAgICAgICAjIEluc3RhbGxpbmcgdG8gbm9uLXN0YW5kYXJkIGxvY2F0aW9uLgpAQCAtMzAzLDE0ICszMDMsMTQgQEAKICAgICAgICAgICAgIGluc3RhbGxEaXIgPSBERUZBVUxUX0lOU1RBTExESVIKICAgICAgICAgICAgIHNlbGYuaW5zdGFsbExvY2F0aW9ucyA9IFtdCiAgICAgICAgIHNlbGYuaW5zdGFsbERpciA9IGluc3RhbGxEaXIKLSAgICAgICAgCisKICAgICBkZWYgaXNVc2VySW5zdGFsbChzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbERpciAhPSBERUZBVUxUX0lOU1RBTExESVIKIAogICAgIGRlZiBjaGVjayhzZWxmKToKICAgICAgICAgIiIiQ2hlY2sgdGhhdCB0aGUgcHJlZmVyZW5jZXMgbWFrZSBzZW5zZTogZGlyZWN0b3JpZXMgZXhpc3QgYW5kIGFyZQogICAgICAgICB3cml0YWJsZSwgdGhlIGluc3RhbGwgZGlyZWN0b3J5IGlzIG9uIHN5cy5wYXRoLCBldGMuIiIiCi0gICAgICAgIAorCiAgICAgICAgIHJ2ID0gIiIKICAgICAgICAgUldYX09LID0gb3MuUl9PS3xvcy5XX09LfG9zLlhfT0sKICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuZG93bmxvYWREaXIpOgpAQCAtMzM3LDcgKzMzNyw3IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHJ2ICs9ICJXYXJuaW5nOiBJbnN0YWxsIGRpcmVjdG9yeSBcIiVzXCIgaXMgbm90IG9uIHN5cy5wYXRoXG4iICUgc2VsZi5pbnN0YWxsRGlyCiAgICAgICAgIHJldHVybiBydgotICAgICAgICAKKwogICAgIGRlZiBjb21wYXJlRmxhdm9ycyhzZWxmLCBsZWZ0LCByaWdodCk6CiAgICAgICAgICIiIkNvbXBhcmUgdHdvIGZsYXZvciBzdHJpbmdzLiBUaGlzIGlzIHBhcnQgb2YgeW91ciBwcmVmZXJlbmNlcwogICAgICAgICBiZWNhdXNlIHdoZXRoZXIgdGhlIHVzZXIgcHJlZmVycyBpbnN0YWxsaW5nIGZyb20gc291cmNlIG9yIGJpbmFyeSBpcy4iIiIKQEAgLTM0OCwxMyArMzQ4LDEzIEBACiAgICAgICAgIGlmIHJpZ2h0IGluIHNlbGYuZmxhdm9yT3JkZXI6CiAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICByZXR1cm4gY21wKGxlZnQsIHJpZ2h0KQotICAgICAgICAKKwogY2xhc3MgUGltcERhdGFiYXNlOgogICAgICIiIkNsYXNzIHJlcHJlc2VudGluZyBhIHBpbXAgZGF0YWJhc2UuIEl0IGNhbiBhY3R1YWxseSBjb250YWluCiAgICAgaW5mb3JtYXRpb24gZnJvbSBtdWx0aXBsZSBkYXRhYmFzZXMgdGhyb3VnaCBpbmNsdXNpb24sIGJ1dCB0aGUKICAgICB0b3BsZXZlbCBkYXRhYmFzZSBpcyBjb25zaWRlcmVkIHRoZSBtYXN0ZXIsIGFzIGl0cyBtYWludGFpbmVyIGlzCiAgICAgInJlc3BvbnNpYmxlIiBmb3IgdGhlIGNvbnRlbnRzLiIiIgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByZWZzKToKICAgICAgICAgc2VsZi5fcGFja2FnZXMgPSBbXQogICAgICAgICBzZWxmLnByZWZlcmVuY2VzID0gcHJlZnMKQEAgLTM2MywyMyArMzYzLDIzIEBACiAgICAgICAgIHNlbGYuX3ZlcnNpb24gPSAiIgogICAgICAgICBzZWxmLl9tYWludGFpbmVyID0gIiIKICAgICAgICAgc2VsZi5fZGVzY3JpcHRpb24gPSAiIgotICAgICAgICAKKwogICAgICMgQWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgZGVmIHVybChzZWxmKTogcmV0dXJuIHNlbGYuX3VybAogICAgIGRlZiB2ZXJzaW9uKHNlbGYpOiByZXR1cm4gc2VsZi5fdmVyc2lvbgogICAgIGRlZiBtYWludGFpbmVyKHNlbGYpOiByZXR1cm4gc2VsZi5fbWFpbnRhaW5lcgogICAgIGRlZiBkZXNjcmlwdGlvbihzZWxmKTogcmV0dXJuIHNlbGYuX2Rlc2NyaXB0aW9uCi0gICAgICAgIAorCiAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICAiIiJDbGVhbiB1cCIiIgogICAgICAgICBzZWxmLl9wYWNrYWdlcyA9IFtdCiAgICAgICAgIHNlbGYucHJlZmVyZW5jZXMgPSBOb25lCi0gICAgICAgIAorCiAgICAgZGVmIGFwcGVuZFVSTChzZWxmLCB1cmwsIGluY2x1ZGVkPTApOgogICAgICAgICAiIiJBcHBlbmQgcGFja2FnZXMgZnJvbSB0aGUgZGF0YWJhc2Ugd2l0aCB0aGUgZ2l2ZW4gVVJMLgogICAgICAgICBPbmx5IHRoZSBmaXJzdCBkYXRhYmFzZSBzaG91bGQgc3BlY2lmeSBpbmNsdWRlZD0wLCBzbyB0aGUKICAgICAgICAgZ2xvYmFsIGluZm9ybWF0aW9uIChtYWludGFpbmVyLCBkZXNjcmlwdGlvbikgZ2V0IHN0b3JlZC4iIiIKLSAgICAgICAgCisKICAgICAgICAgaWYgdXJsIGluIHNlbGYuX3VybGxpc3Q6CiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VsZi5fdXJsbGlzdC5hcHBlbmQodXJsKQpAQCAtMzk2LDcgKzM5Niw3IEBACiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fdmVyc2lvbjoKICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiBkYXRhYmFzZSBoYXMgbm8gVmVyc2lvbiBpbmZvcm1hdGlvblxuIikKICAgICAgICAgICAgIGVsaWYgc2VsZi5fdmVyc2lvbiA+IFBJTVBfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiBkYXRhYmFzZSB2ZXJzaW9uICVzIG5ld2VyIHRoYW4gcGltcCB2ZXJzaW9uICVzXG4iIAorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6IGRhdGFiYXNlIHZlcnNpb24gJXMgbmV3ZXIgdGhhbiBwaW1wIHZlcnNpb24gJXNcbiIKICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5fdmVyc2lvbiwgUElNUF9WRVJTSU9OKSkKICAgICAgICAgICAgIHNlbGYuX21haW50YWluZXIgPSBwbGlzdGRhdGEuZ2V0KCdNYWludGFpbmVyJywgJycpCiAgICAgICAgICAgICBzZWxmLl9kZXNjcmlwdGlvbiA9IHBsaXN0ZGF0YS5nZXQoJ0Rlc2NyaXB0aW9uJywgJycpLnN0cmlwKCkKQEAgLTQwNSwxMiArNDA1LDEyIEBACiAgICAgICAgIG90aGVycyA9IHBsaXN0ZGF0YS5nZXQoJ0luY2x1ZGUnLCBbXSkKICAgICAgICAgZm9yIHVybCBpbiBvdGhlcnM6CiAgICAgICAgICAgICBzZWxmLmFwcGVuZFVSTCh1cmwsIGluY2x1ZGVkPTEpCi0gICAgICAgIAorCiAgICAgZGVmIF9hcHBlbmRQYWNrYWdlcyhzZWxmLCBwYWNrYWdlcyk6CiAgICAgICAgICIiIkdpdmVuIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMgY29udGFpbmluZyBwYWNrYWdlCiAgICAgICAgIGRlc2NyaXB0aW9ucyBjcmVhdGUgdGhlIFBpbXBQYWNrYWdlIG9iamVjdHMgYW5kIGFwcGVuZCB0aGVtCiAgICAgICAgIHRvIG91ciBpbnRlcm5hbCBzdG9yYWdlLiIiIgotICAgICAgICAKKwogICAgICAgICBmb3IgcCBpbiBwYWNrYWdlczoKICAgICAgICAgICAgIHAgPSBkaWN0KHApCiAgICAgICAgICAgICBmbGF2b3IgPSBwLmdldCgnRmxhdm9yJykKQEAgLTQyMSwyNyArNDIxLDI3IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHBrZyA9IFBpbXBQYWNrYWdlKHNlbGYsIGRpY3QocCkpCiAgICAgICAgICAgICBzZWxmLl9wYWNrYWdlcy5hcHBlbmQocGtnKQotICAgICAgICAgICAgCisKICAgICBkZWYgbGlzdChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgUGltcFBhY2thZ2Ugb2JqZWN0cyBpbiB0aGUgZGF0YWJhc2UuIiIiCi0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBzZWxmLl9wYWNrYWdlcwotICAgICAgICAKKwogICAgIGRlZiBsaXN0bmFtZXMoc2VsZik6CiAgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbmFtZXMgb2YgYWxsIHBhY2thZ2VzIGluIHRoZSBkYXRhYmFzZS4iIiIKLSAgICAgICAgCisKICAgICAgICAgcnYgPSBbXQogICAgICAgICBmb3IgcGtnIGluIHNlbGYuX3BhY2thZ2VzOgogICAgICAgICAgICAgcnYuYXBwZW5kKHBrZy5mdWxsbmFtZSgpKQogICAgICAgICBydi5zb3J0KCkKICAgICAgICAgcmV0dXJuIHJ2Ci0gICAgICAgIAorCiAgICAgZGVmIGR1bXAoc2VsZiwgcGF0aE9yRmlsZSk6CiAgICAgICAgICIiIkR1bXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhYmFzZSB0byBhbiBYTUwgLnBsaXN0IGZpbGUuCi0gICAgICAgIAorCiAgICAgICAgIFRoZSBmaWxlIGNhbiBiZSBwYXNzZWQgYXMgZWl0aGVyIGEgZmlsZSBvYmplY3Qgb3IgYSBwYXRobmFtZS4KICAgICAgICAgQWxsIGRhdGEsIGluY2x1ZGluZyBpbmNsdWRlZCBkYXRhYmFzZXMsIGlzIGR1bXBlZC4iIiIKLSAgICAgICAgCisKICAgICAgICAgcGFja2FnZXMgPSBbXQogICAgICAgICBmb3IgcGtnIGluIHNlbGYuX3BhY2thZ2VzOgogICAgICAgICAgICAgcGFja2FnZXMuYXBwZW5kKHBrZy5kdW1wKCkpCkBAIC00NTMsMTUgKzQ1MywxNSBAQAogICAgICAgICAgICAgfQogICAgICAgICBwbGlzdCA9IHBsaXN0bGliLlBsaXN0KCoqcGxpc3RkYXRhKQogICAgICAgICBwbGlzdC53cml0ZShwYXRoT3JGaWxlKQotICAgICAgICAKKwogICAgIGRlZiBmaW5kKHNlbGYsIGlkZW50KToKICAgICAgICAgIiIiRmluZCBhIHBhY2thZ2UuIFRoZSBwYWNrYWdlIGNhbiBiZSBzcGVjaWZpZWQgYnkgbmFtZQogICAgICAgICBvciBhcyBhIGRpY3Rpb25hcnkgd2l0aCBuYW1lLCB2ZXJzaW9uIGFuZCBmbGF2b3IgZW50cmllcy4KLSAgICAgICAgCisKICAgICAgICAgT25seSBuYW1lIGlzIG9ibGlnYXRvcnkuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtYXRjaGVzIHRoZQogICAgICAgICBiZXN0IG9uZSAoaGlnaGVyIHZlcnNpb24gbnVtYmVyLCBmbGF2b3JzIG9yZGVyZWQgYWNjb3JkaW5nIHRvCiAgICAgICAgIHVzZXJzJyBwcmVmZXJlbmNlKSBpcyByZXR1cm5lZC4iIiIKLSAgICAgICAgCisKICAgICAgICAgaWYgdHlwZShpZGVudCkgPT0gc3RyOgogICAgICAgICAgICAgIyBSZW1vdmUgKCBhbmQgKSBmb3IgcHNldWRvLXBhY2thZ2VzCiAgICAgICAgICAgICBpZiBpZGVudFswXSA9PSAnKCcgYW5kIGlkZW50Wy0xXSA9PSAnKSc6CkBAIC00OTEsNyArNDkxLDcgQEAKICAgICAgICAgICAgICAgICBpZiBub3QgZm91bmQgb3IgZm91bmQgPCBwOgogICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHAKICAgICAgICAgcmV0dXJuIGZvdW5kCi0gICAgICAgIAorCiBBTExPV0VEX0tFWVMgPSBbCiAgICAgIk5hbWUiLAogICAgICJWZXJzaW9uIiwKQEAgLTUxMSw3ICs1MTEsNyBAQAogCiBjbGFzcyBQaW1wUGFja2FnZToKICAgICAiIiJDbGFzcyByZXByZXNlbnRpbmcgYSBzaW5nbGUgcGFja2FnZS4iIiIKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYiwgcGxpc3RkYXRhKToKICAgICAgICAgc2VsZi5fZGIgPSBkYgogICAgICAgICBuYW1lID0gcGxpc3RkYXRhWyJOYW1lIl0KQEAgLTUxOSwxMCArNTE5LDEwIEBACiAgICAgICAgICAgICBpZiBub3QgayBpbiBBTExPV0VEX0tFWVM6CiAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogJXM6IHVua25vd24ga2V5ICVzXG4iICUgKG5hbWUsIGspKQogICAgICAgICBzZWxmLl9kaWN0ID0gcGxpc3RkYXRhCi0gICAgCisKICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgcmV0dXJuIHNlbGYuX2RpY3Rba2V5XQotICAgICAgICAKKwogICAgIGRlZiBuYW1lKHNlbGYpOiByZXR1cm4gc2VsZi5fZGljdFsnTmFtZSddCiAgICAgZGVmIHZlcnNpb24oc2VsZik6IHJldHVybiBzZWxmLl9kaWN0LmdldCgnVmVyc2lvbicpCiAgICAgZGVmIGZsYXZvcihzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3QuZ2V0KCdGbGF2b3InKQpAQCAtNTMxLDEzICs1MzEsMTMgQEAKICAgICBkZWYgaG9tZXBhZ2Uoc2VsZik6IHJldHVybiBzZWxmLl9kaWN0LmdldCgnSG9tZS1wYWdlJykKICAgICBkZWYgZG93bmxvYWRVUkwoc2VsZik6IHJldHVybiBzZWxmLl9kaWN0LmdldCgnRG93bmxvYWQtVVJMJykKICAgICBkZWYgc3lzdGVtd2lkZU9ubHkoc2VsZik6IHJldHVybiBzZWxmLl9kaWN0LmdldCgnU3lzdGVtd2lkZS1vbmx5JykKLSAgICAKKwogICAgIGRlZiBmdWxsbmFtZShzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBmdWxsIG5hbWUgIm5hbWUtdmVyc2lvbi1mbGF2b3IiIG9mIGEgcGFja2FnZS4KLSAgICAgICAgCisKICAgICAgICAgSWYgdGhlIHBhY2thZ2UgaXMgYSBwc2V1ZG8tcGFja2FnZSwgc29tZXRoaW5nIHRoYXQgY2Fubm90IGJlCiAgICAgICAgIGluc3RhbGxlZCB0aHJvdWdoIHBpbXAsIHJldHVybiB0aGUgbmFtZSBpbiAocGFyZW50aGVzZXMpLiIiIgotICAgICAgICAKKwogICAgICAgICBydiA9IHNlbGYuX2RpY3RbJ05hbWUnXQogICAgICAgICBpZiBzZWxmLl9kaWN0Lmhhc19rZXkoJ1ZlcnNpb24nKToKICAgICAgICAgICAgIHJ2ID0gcnYgKyAnLSVzJyAlIHNlbGYuX2RpY3RbJ1ZlcnNpb24nXQpAQCAtNTQ3LDE0ICs1NDcsMTQgQEAKICAgICAgICAgICAgICMgUHNldWRvLXBhY2thZ2UsIHNob3cgaW4gcGFyZW50aGVzZXMKICAgICAgICAgICAgIHJ2ID0gJyglcyknICUgcnYKICAgICAgICAgcmV0dXJuIHJ2Ci0gICAgCisKICAgICBkZWYgZHVtcChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIGEgZGljdCBvYmplY3QgY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gb24gdGhlIHBhY2thZ2UuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLl9kaWN0Ci0gICAgICAgIAorCiAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAiIiJDb21wYXJlIHR3byBwYWNrYWdlcywgd2hlcmUgdGhlICJiZXR0ZXIiIHBhY2thZ2Ugc29ydHMgbG93ZXIuIiIiCi0gICAgICAgIAorCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBQaW1wUGFja2FnZSk6CiAgICAgICAgICAgICByZXR1cm4gY21wKGlkKHNlbGYpLCBpZChvdGhlcikpCiAgICAgICAgIGlmIHNlbGYubmFtZSgpICE9IG90aGVyLm5hbWUoKToKQEAgLTU2MiwxNSArNTYyLDE1IEBACiAgICAgICAgIGlmIHNlbGYudmVyc2lvbigpICE9IG90aGVyLnZlcnNpb24oKToKICAgICAgICAgICAgIHJldHVybiAtY21wKHNlbGYudmVyc2lvbigpLCBvdGhlci52ZXJzaW9uKCkpCiAgICAgICAgIHJldHVybiBzZWxmLl9kYi5wcmVmZXJlbmNlcy5jb21wYXJlRmxhdm9ycyhzZWxmLmZsYXZvcigpLCBvdGhlci5mbGF2b3IoKSkKLSAgICAgICAgCisKICAgICBkZWYgaW5zdGFsbGVkKHNlbGYpOgogICAgICAgICAiIiJUZXN0IHdoZXRlciB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQuCi0gICAgICAgIAorCiAgICAgICAgIFJldHVybnMgdHdvIHZhbHVlczogYSBzdGF0dXMgaW5kaWNhdG9yIHdoaWNoIGlzIG9uZSBvZgogICAgICAgICAieWVzIiwgIm5vIiwgIm9sZCIgKGFuIG9sZGVyIHZlcnNpb24gaXMgaW5zdGFsbGVkKSBvciAiYmFkIgogICAgICAgICAoc29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHRoZSBpbnN0YWxsIHRlc3QpIGFuZCBhIGh1bWFuCiAgICAgICAgIHJlYWRhYmxlIHN0cmluZyB3aGljaCBtYXkgY29udGFpbiBtb3JlIGRldGFpbHMuIiIiCi0gICAgICAgIAorCiAgICAgICAgIG5hbWVzcGFjZSA9IHsKICAgICAgICAgICAgICJOb3RJbnN0YWxsZWQiOiBfc2NyaXB0RXhjX05vdEluc3RhbGxlZCwKICAgICAgICAgICAgICJPbGRJbnN0YWxsZWQiOiBfc2NyaXB0RXhjX09sZEluc3RhbGxlZCwKQEAgLTYwMiwxNiArNjAyLDE2IEBACiAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKQogICAgICAgICAgICAgcmV0dXJuICJiYWQiLCAiUGFja2FnZSBpbnN0YWxsIHRlc3QgZ290IGV4Y2VwdGlvbiIKICAgICAgICAgcmV0dXJuICJ5ZXMiLCAiIgotICAgICAgICAKKwogICAgIGRlZiBwcmVyZXF1aXNpdGVzKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHByZXJlcXVpc2l0ZXMgZm9yIHRoaXMgcGFja2FnZS4KLSAgICAgICAgCisKICAgICAgICAgVGhlIGxpc3QgY29udGFpbnMgMi10dXBsZXMsIG9mIHdoaWNoIHRoZSBmaXJzdCBpdGVtIGlzIGVpdGhlcgogICAgICAgICBhIFBpbXBQYWNrYWdlIG9iamVjdCBvciBOb25lLCBhbmQgdGhlIHNlY29uZCBpcyBhIGRlc2NyaXB0aXZlCiAgICAgICAgIHN0cmluZy4gVGhlIGZpcnN0IGl0ZW0gY2FuIGJlIE5vbmUgaWYgdGhpcyBwYWNrYWdlIGRlcGVuZHMgb24KICAgICAgICAgc29tZXRoaW5nIHRoYXQgaXNuJ3QgcGltcC1pbnN0YWxsYWJsZSwgaW4gd2hpY2ggY2FzZSB0aGUgZGVzY3JpcHRpdmUKICAgICAgICAgc3RyaW5nIHNob3VsZCB0ZWxsIHRoZSB1c2VyIHdoYXQgdG8gZG8uIiIiCi0gICAgICAgIAorCiAgICAgICAgIHJ2ID0gW10KICAgICAgICAgaWYgbm90IHNlbGYuX2RpY3QuZ2V0KCdEb3dubG9hZC1VUkwnKToKICAgICAgICAgICAgICMgRm9yIHBzZXVkby1wYWNrYWdlcyB0aGF0IGFyZSBhbHJlYWR5IGluc3RhbGxlZCB3ZSBkb24ndApAQCAtNjE5LDcgKzYxOSw3IEBACiAgICAgICAgICAgICBzdGF0dXMsIF8gID0gc2VsZi5pbnN0YWxsZWQoKQogICAgICAgICAgICAgaWYgc3RhdHVzID09ICJ5ZXMiOgogICAgICAgICAgICAgICAgIHJldHVybiBbXQotICAgICAgICAgICAgcmV0dXJuIFsoTm9uZSwgCisgICAgICAgICAgICByZXR1cm4gWyhOb25lLAogICAgICAgICAgICAgICAgICIlczogVGhpcyBwYWNrYWdlIGNhbm5vdCBiZSBpbnN0YWxsZWQgYXV0b21hdGljYWxseSAobm8gRG93bmxvYWQtVVJMIGZpZWxkKSIgJQogICAgICAgICAgICAgICAgICAgICBzZWxmLmZ1bGxuYW1lKCkpXQogICAgICAgICBpZiBzZWxmLnN5c3RlbXdpZGVPbmx5KCkgYW5kIHNlbGYuX2RiLnByZWZlcmVuY2VzLmlzVXNlckluc3RhbGwoKToKQEAgLTY0NSwyOCArNjQ1LDI4IEBACiAgICAgICAgICAgICAgICAgICAgIGRlc2NyID0gcGtnLnNob3J0ZGVzY3JpcHRpb24oKQogICAgICAgICAgICAgcnYuYXBwZW5kKChwa2csIGRlc2NyKSkKICAgICAgICAgcmV0dXJuIHJ2Ci0gICAgICAgICAgICAKLSAgICAgICAgCisKKwogICAgIGRlZiBkb3dubG9hZFBhY2thZ2VPbmx5KHNlbGYsIG91dHB1dD1Ob25lKToKICAgICAgICAgIiIiRG93bmxvYWQgYSBzaW5nbGUgcGFja2FnZSwgaWYgbmVlZGVkLgotICAgICAgICAKKwogICAgICAgICBBbiBNRDUgc2lnbmF0dXJlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZG93bmxvYWQgaXMgbmVlZGVkLAogICAgICAgICBhbmQgdG8gdGVzdCB0aGF0IHdlIGFjdHVhbGx5IGRvd25sb2FkZWQgd2hhdCB3ZSBleHBlY3RlZC4KICAgICAgICAgSWYgb3V0cHV0IGlzIGdpdmVuIGl0IGlzIGEgZmlsZS1saWtlIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSBhIGxvZwogICAgICAgICBvZiB3aGF0IGhhcHBlbnMuCi0gICAgICAgIAorCiAgICAgICAgIElmIGFueXRoaW5nIHVuZm9yZXNlZW4gaGFwcGVuZWQgdGhlIG1ldGhvZCByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UKICAgICAgICAgc3RyaW5nLgogICAgICAgICAiIiIKLSAgICAgICAgCisKICAgICAgICAgc2NoZW1lLCBsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2UudXJsc3BsaXQoc2VsZi5fZGljdFsnRG93bmxvYWQtVVJMJ10pCiAgICAgICAgIHBhdGggPSB1cmxsaWIudXJsMnBhdGhuYW1lKHBhdGgpCiAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChwYXRoKVsxXQotICAgICAgICBzZWxmLmFyY2hpdmVGaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9kYi5wcmVmZXJlbmNlcy5kb3dubG9hZERpciwgZmlsZW5hbWUpICAgICAgICAgCisgICAgICAgIHNlbGYuYXJjaGl2ZUZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX2RiLnByZWZlcmVuY2VzLmRvd25sb2FkRGlyLCBmaWxlbmFtZSkKICAgICAgICAgaWYgbm90IHNlbGYuX2FyY2hpdmVPSygpOgogICAgICAgICAgICAgaWYgc2NoZW1lID09ICdtYW51YWwnOgogICAgICAgICAgICAgICAgIHJldHVybiAiUGxlYXNlIGRvd25sb2FkIHBhY2thZ2UgbWFudWFsbHkgYW5kIHNhdmUgYXMgJXMiICUgc2VsZi5hcmNoaXZlRmlsZW5hbWUKLSAgICAgICAgICAgIGRvd25sb2FkZXIgPSBQaW1wVXJsbGliRG93bmxvYWRlcihOb25lLCBzZWxmLl9kYi5wcmVmZXJlbmNlcy5kb3dubG9hZERpciwgCisgICAgICAgICAgICBkb3dubG9hZGVyID0gUGltcFVybGxpYkRvd25sb2FkZXIoTm9uZSwgc2VsZi5fZGIucHJlZmVyZW5jZXMuZG93bmxvYWREaXIsCiAgICAgICAgICAgICAgICAgd2F0Y2hlcj1zZWxmLl9kYi5wcmVmZXJlbmNlcy53YXRjaGVyKQogICAgICAgICAgICAgaWYgbm90IGRvd25sb2FkZXIuZG93bmxvYWQoc2VsZi5fZGljdFsnRG93bmxvYWQtVVJMJ10sCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXJjaGl2ZUZpbGVuYW1lLCBvdXRwdXQpOgpAQCAtNjc1LDEwICs2NzUsMTAgQEAKICAgICAgICAgICAgIHJldHVybiAiYXJjaGl2ZSBub3QgZm91bmQgYWZ0ZXIgZG93bmxvYWQiCiAgICAgICAgIGlmIG5vdCBzZWxmLl9hcmNoaXZlT0soKToKICAgICAgICAgICAgIHJldHVybiAiYXJjaGl2ZSBkb2VzIG5vdCBoYXZlIGNvcnJlY3QgTUQ1IGNoZWNrc3VtIgotICAgICAgICAgICAgCisKICAgICBkZWYgX2FyY2hpdmVPSyhzZWxmKToKICAgICAgICAgIiIiVGVzdCBhbiBhcmNoaXZlLiBJdCBzaG91bGQgZXhpc3QgYW5kIHRoZSBNRDUgY2hlY2tzdW0gc2hvdWxkIGJlIGNvcnJlY3QuIiIiCi0gICAgICAgIAorCiAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmFyY2hpdmVGaWxlbmFtZSk6CiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBpZiBub3Qgc2VsZi5fZGljdC5nZXQoJ01ENVN1bScpOgpAQCAtNjg3LDEwICs2ODcsMTAgQEAKICAgICAgICAgZGF0YSA9IG9wZW4oc2VsZi5hcmNoaXZlRmlsZW5hbWUsICdyYicpLnJlYWQoKQogICAgICAgICBjaGVja3N1bSA9IG1kNS5uZXcoZGF0YSkuaGV4ZGlnZXN0KCkKICAgICAgICAgcmV0dXJuIGNoZWNrc3VtID09IHNlbGYuX2RpY3RbJ01ENVN1bSddCi0gICAgICAgICAgICAKKwogICAgIGRlZiB1bnBhY2tQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6CiAgICAgICAgICIiIlVucGFjayBhIGRvd25sb2FkZWQgcGFja2FnZSBhcmNoaXZlLiIiIgotICAgICAgICAKKwogICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5hcmNoaXZlRmlsZW5hbWUpWzFdCiAgICAgICAgIGZvciBleHQsIHVucGFja2VyQ2xhc3MsIGFyZyBpbiBBUkNISVZFX0ZPUk1BVFM6CiAgICAgICAgICAgICBpZiBmaWxlbmFtZVstbGVuKGV4dCk6XSA9PSBleHQ6CkBAIC02OTgsNDMgKzY5OCw0MyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIGV4dGVuc2lvbiBmb3IgYXJjaGl2ZSBmaWxlOiAlcyIgJSBmaWxlbmFtZQogICAgICAgICBzZWxmLmJhc2VuYW1lID0gZmlsZW5hbWVbOi1sZW4oZXh0KV0KLSAgICAgICAgdW5wYWNrZXIgPSB1bnBhY2tlckNsYXNzKGFyZywgZGlyPXNlbGYuX2RiLnByZWZlcmVuY2VzLmJ1aWxkRGlyLCAKKyAgICAgICAgdW5wYWNrZXIgPSB1bnBhY2tlckNsYXNzKGFyZywgZGlyPXNlbGYuX2RiLnByZWZlcmVuY2VzLmJ1aWxkRGlyLAogICAgICAgICAgICAgICAgIHdhdGNoZXI9c2VsZi5fZGIucHJlZmVyZW5jZXMud2F0Y2hlcikKICAgICAgICAgcnYgPSB1bnBhY2tlci51bnBhY2soc2VsZi5hcmNoaXZlRmlsZW5hbWUsIG91dHB1dD1vdXRwdXQpCiAgICAgICAgIGlmIHJ2OgogICAgICAgICAgICAgcmV0dXJuIHJ2Ci0gICAgICAgICAgICAKKwogICAgIGRlZiBpbnN0YWxsUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0PU5vbmUpOgogICAgICAgICAiIiJEZWZhdWx0IGluc3RhbGwgbWV0aG9kLCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMiIiIKICAgICAgICAgcmV0dXJuICIlczogVGhpcyBwYWNrYWdlIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBtYW51YWxseSAobm8gc3VwcG9ydCBmb3IgZmxhdm9yPVwiJXNcIikiIFwKICAgICAgICAgICAgICUgKHNlbGYuZnVsbG5hbWUoKSwgc2VsZi5fZGljdC5nZXQoZmxhdm9yLCAiIikpCi0gICAgICAgICAgICAKKwogICAgIGRlZiBpbnN0YWxsU2luZ2xlUGFja2FnZShzZWxmLCBvdXRwdXQ9Tm9uZSk6CiAgICAgICAgICIiIkRvd25sb2FkLCB1bnBhY2sgYW5kIGluc3RhbGwgYSBzaW5nbGUgcGFja2FnZS4KLSAgICAgICAgCisKICAgICAgICAgSWYgb3V0cHV0IGlzIGdpdmVuIGl0IHNob3VsZCBiZSBhIGZpbGUtbGlrZSBvYmplY3QgYW5kIGl0CiAgICAgICAgIHdpbGwgcmVjZWl2ZSBhIGxvZyBvZiB3aGF0IGhhcHBlbmVkLiIiIgotICAgICAgICAKKwogICAgICAgICBpZiBub3Qgc2VsZi5fZGljdC5nZXQoJ0Rvd25sb2FkLVVSTCcpOgogICAgICAgICAgICAgcmV0dXJuICIlczogVGhpcyBwYWNrYWdlIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBtYW51YWxseSAobm8gRG93bmxvYWQtVVJMIGZpZWxkKSIgJSBzZWxmLmZ1bGxuYW1lKCkKICAgICAgICAgbXNnID0gc2VsZi5kb3dubG9hZFBhY2thZ2VPbmx5KG91dHB1dCkKICAgICAgICAgaWYgbXNnOgogICAgICAgICAgICAgcmV0dXJuICIlczogZG93bmxvYWQ6ICVzIiAlIChzZWxmLmZ1bGxuYW1lKCksIG1zZykKLSAgICAgICAgICAgIAorCiAgICAgICAgIG1zZyA9IHNlbGYudW5wYWNrUGFja2FnZU9ubHkob3V0cHV0KQogICAgICAgICBpZiBtc2c6CiAgICAgICAgICAgICByZXR1cm4gIiVzOiB1bnBhY2s6ICVzIiAlIChzZWxmLmZ1bGxuYW1lKCksIG1zZykKLSAgICAgICAgICAgIAorCiAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxQYWNrYWdlT25seShvdXRwdXQpCi0gICAgICAgIAorCiAgICAgZGVmIGJlZm9yZUluc3RhbGwoc2VsZik6CiAgICAgICAgICIiIkJvb2trZWVwaW5nIGJlZm9yZSBpbnN0YWxsYXRpb246IHJlbWVtYmVyIHdoYXQgd2UgaGF2ZSBpbiBzaXRlLXBhY2thZ2VzIiIiCiAgICAgICAgIHNlbGYuX29sZF9jb250ZW50cyA9IG9zLmxpc3RkaXIoc2VsZi5fZGIucHJlZmVyZW5jZXMuaW5zdGFsbERpcikKLSAgICAgICAgCisKICAgICBkZWYgYWZ0ZXJJbnN0YWxsKHNlbGYpOgogICAgICAgICAiIiJCb29ra2VlcGluZyBhZnRlciBpbnN0YWxsYXRpb246IGludGVycHJldCBhbnkgbmV3IC5wdGggZmlsZXMgdGhhdCBoYXZlCiAgICAgICAgIGFwcGVhcmVkIiIiCi0gICAgICAgICAgICAgICAgCisKICAgICAgICAgbmV3X2NvbnRlbnRzID0gb3MubGlzdGRpcihzZWxmLl9kYi5wcmVmZXJlbmNlcy5pbnN0YWxsRGlyKQogICAgICAgICBmb3IgZm4gaW4gbmV3X2NvbnRlbnRzOgogICAgICAgICAgICAgaWYgZm4gaW4gc2VsZi5fb2xkX2NvbnRlbnRzOgpAQCAtNzU3LDcgKzc1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBvcy5wYXRoLmpvaW4oc2VsZi5fZGIucHJlZmVyZW5jZXMuaW5zdGFsbERpciwgbGluZSkKICAgICAgICAgICAgICAgICBsaW5lID0gb3MucGF0aC5yZWFscGF0aChsaW5lKQogICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lIGluIHN5cy5wYXRoOgotICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQobGluZSkgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQobGluZSkKIAogICAgIGRlZiBmaWx0ZXJFeHBlY3RlZFNraXBzKHNlbGYsIG5hbWVzKToKICAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCB0aGF0IGNvbnRhaW5zIG9ubHkgdW5wZXhwZWN0ZWQgc2tpcHMiIiIKQEAgLTc4MCwyMSArNzgwLDIxIEBACiAgICAgZGVmIHVucGFja1BhY2thZ2VPbmx5KHNlbGYsIG91dHB1dD1Ob25lKToKICAgICAgICAgIiIiV2UgZG9uJ3QgdW5wYWNrIGJpbmFyeSBwYWNrYWdlcyB1bnRpbCBpbnN0YWxsaW5nIiIiCiAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIAorCiAgICAgZGVmIGluc3RhbGxQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6CiAgICAgICAgICIiIkluc3RhbGwgYSBzaW5nbGUgc291cmNlIHBhY2thZ2UuCi0gICAgICAgIAorCiAgICAgICAgIElmIG91dHB1dCBpcyBnaXZlbiBpdCBzaG91bGQgYmUgYSBmaWxlLWxpa2Ugb2JqZWN0IGFuZCBpdAogICAgICAgICB3aWxsIHJlY2VpdmUgYSBsb2cgb2Ygd2hhdCBoYXBwZW5lZC4iIiIKLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdJbnN0YWxsLWNvbW1hbmQnKToKICAgICAgICAgICAgIHJldHVybiAiJXM6IEJpbmFyeSBwYWNrYWdlIGNhbm5vdCBoYXZlIEluc3RhbGwtY29tbWFuZCIgJSBzZWxmLmZ1bGxuYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdQcmUtaW5zdGFsbC1jb21tYW5kJyk6CiAgICAgICAgICAgICBpZiBfY21kKG91dHB1dCwgc2VsZi5fYnVpbGREaXJuYW1lLCBzZWxmLl9kaWN0WydQcmUtaW5zdGFsbC1jb21tYW5kJ10pOgogICAgICAgICAgICAgICAgIHJldHVybiAicHJlLWluc3RhbGwgJXM6IHJ1bm5pbmcgXCIlc1wiIGZhaWxlZCIgJSBcCiAgICAgICAgICAgICAgICAgICAgIChzZWxmLmZ1bGxuYW1lKCksIHNlbGYuX2RpY3RbJ1ByZS1pbnN0YWxsLWNvbW1hbmQnXSkKLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgc2VsZi5iZWZvcmVJbnN0YWxsKCkKIAogICAgICAgICAjIEluc3RhbGwgYnkgdW5wYWNraW5nCkBAIC04MDUsNyArODA1LDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiAiJXM6IHVua25vd24gZXh0ZW5zaW9uIGZvciBhcmNoaXZlIGZpbGU6ICVzIiAlIChzZWxmLmZ1bGxuYW1lKCksIGZpbGVuYW1lKQogICAgICAgICBzZWxmLmJhc2VuYW1lID0gZmlsZW5hbWVbOi1sZW4oZXh0KV0KLSAgICAgICAgCisKICAgICAgICAgaW5zdGFsbF9yZW5hbWVzID0gW10KICAgICAgICAgZm9yIGssIG5ld2xvYyBpbiBzZWxmLl9kYi5wcmVmZXJlbmNlcy5pbnN0YWxsTG9jYXRpb25zOgogICAgICAgICAgICAgaWYgbm90IG5ld2xvYzoKQEAgLTgxNSwyMiArODE1LDIyIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHJldHVybiAiJXM6IERvbid0IGtub3cgaW5zdGFsbExvY2F0aW9uICVzIiAlIChzZWxmLmZ1bGxuYW1lKCksIGspCiAgICAgICAgICAgICBpbnN0YWxsX3JlbmFtZXMuYXBwZW5kKChvbGRsb2MsIG5ld2xvYykpCi0gICAgICAgICAgICAgICAgCisKICAgICAgICAgdW5wYWNrZXIgPSB1bnBhY2tlckNsYXNzKGFyZywgZGlyPSIvIiwgcmVuYW1lcz1pbnN0YWxsX3JlbmFtZXMpCiAgICAgICAgIHJ2ID0gdW5wYWNrZXIudW5wYWNrKHNlbGYuYXJjaGl2ZUZpbGVuYW1lLCBvdXRwdXQ9b3V0cHV0LCBwYWNrYWdlPXNlbGYpCiAgICAgICAgIGlmIHJ2OgogICAgICAgICAgICAgcmV0dXJuIHJ2Ci0gICAgICAgIAorCiAgICAgICAgIHNlbGYuYWZ0ZXJJbnN0YWxsKCkKLSAgICAgICAgCisKICAgICAgICAgaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdQb3N0LWluc3RhbGwtY29tbWFuZCcpOgogICAgICAgICAgICAgaWYgX2NtZChvdXRwdXQsIHNlbGYuX2J1aWxkRGlybmFtZSwgc2VsZi5fZGljdFsnUG9zdC1pbnN0YWxsLWNvbW1hbmQnXSk6CiAgICAgICAgICAgICAgICAgcmV0dXJuICIlczogcG9zdC1pbnN0YWxsOiBydW5uaW5nIFwiJXNcIiBmYWlsZWQiICUgXAogICAgICAgICAgICAgICAgICAgICAoc2VsZi5mdWxsbmFtZSgpLCBzZWxmLl9kaWN0WydQb3N0LWluc3RhbGwtY29tbWFuZCddKQogCiAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIAotICAgIAorCisKIGNsYXNzIFBpbXBQYWNrYWdlX3NvdXJjZShQaW1wUGFja2FnZSk6CiAKICAgICBkZWYgdW5wYWNrUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0PU5vbmUpOgpAQCAtODQ0LDE1ICs4NDQsMTUgQEAKIAogICAgIGRlZiBpbnN0YWxsUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0PU5vbmUpOgogICAgICAgICAiIiJJbnN0YWxsIGEgc2luZ2xlIHNvdXJjZSBwYWNrYWdlLgotICAgICAgICAKKwogICAgICAgICBJZiBvdXRwdXQgaXMgZ2l2ZW4gaXQgc2hvdWxkIGJlIGEgZmlsZS1saWtlIG9iamVjdCBhbmQgaXQKICAgICAgICAgd2lsbCByZWNlaXZlIGEgbG9nIG9mIHdoYXQgaGFwcGVuZWQuIiIiCi0gICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgIGlmIHNlbGYuX2RpY3QuaGFzX2tleSgnUHJlLWluc3RhbGwtY29tbWFuZCcpOgogICAgICAgICAgICAgaWYgX2NtZChvdXRwdXQsIHNlbGYuX2J1aWxkRGlybmFtZSwgc2VsZi5fZGljdFsnUHJlLWluc3RhbGwtY29tbWFuZCddKToKICAgICAgICAgICAgICAgICByZXR1cm4gInByZS1pbnN0YWxsICVzOiBydW5uaW5nIFwiJXNcIiBmYWlsZWQiICUgXAogICAgICAgICAgICAgICAgICAgICAoc2VsZi5mdWxsbmFtZSgpLCBzZWxmLl9kaWN0WydQcmUtaW5zdGFsbC1jb21tYW5kJ10pCi0gICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgIHNlbGYuYmVmb3JlSW5zdGFsbCgpCiAgICAgICAgIGluc3RhbGxjbWQgPSBzZWxmLl9kaWN0LmdldCgnSW5zdGFsbC1jb21tYW5kJykKICAgICAgICAgaWYgaW5zdGFsbGNtZCBhbmQgc2VsZi5faW5zdGFsbF9yZW5hbWVzOgpAQCAtODgyLDQ1ICs4ODIsNDUgQEAKICAgICAgICAgICAgICAgICBydiA9IE5vbmUKICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodW53YW50ZWRfaW5zdGFsbF9kaXIpCiAgICAgICAgICAgICByZXR1cm4gcnYKLSAgICAgICAgCisKICAgICAgICAgc2VsZi5hZnRlckluc3RhbGwoKQotICAgICAgICAKKwogICAgICAgICBpZiBzZWxmLl9kaWN0Lmhhc19rZXkoJ1Bvc3QtaW5zdGFsbC1jb21tYW5kJyk6CiAgICAgICAgICAgICBpZiBfY21kKG91dHB1dCwgc2VsZi5fYnVpbGREaXJuYW1lLCBzZWxmLl9kaWN0WydQb3N0LWluc3RhbGwtY29tbWFuZCddKToKICAgICAgICAgICAgICAgICByZXR1cm4gInBvc3QtaW5zdGFsbCAlczogcnVubmluZyBcIiVzXCIgZmFpbGVkIiAlIFwKICAgICAgICAgICAgICAgICAgICAgKHNlbGYuZnVsbG5hbWUoKSwgc2VsZi5fZGljdFsnUG9zdC1pbnN0YWxsLWNvbW1hbmQnXSkKICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgCi0gICAgCisKKwogY2xhc3MgUGltcEluc3RhbGxlcjoKICAgICAiIiJJbnN0YWxsZXIgZW5naW5lOiBjb21wdXRlcyBkZXBlbmRlbmNpZXMgYW5kIGluc3RhbGxzCiAgICAgcGFja2FnZXMgaW4gdGhlIHJpZ2h0IG9yZGVyLiIiIgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiKToKICAgICAgICAgc2VsZi5fdG9kbyA9IFtdCiAgICAgICAgIHNlbGYuX2RiID0gZGIKICAgICAgICAgc2VsZi5fY3VydG9kbyA9IFtdCiAgICAgICAgIHNlbGYuX2N1cm1lc3NhZ2VzID0gW10KLSAgICAgICAgCisKICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHBhY2thZ2UpOgogICAgICAgICByZXR1cm4gcGFja2FnZSBpbiBzZWxmLl90b2RvCi0gICAgICAgIAorCiAgICAgZGVmIF9hZGRQYWNrYWdlcyhzZWxmLCBwYWNrYWdlcyk6CiAgICAgICAgIGZvciBwYWNrYWdlIGluIHBhY2thZ2VzOgogICAgICAgICAgICAgaWYgbm90IHBhY2thZ2UgaW4gc2VsZi5fdG9kbzoKICAgICAgICAgICAgICAgICBzZWxmLl90b2RvLmFwcGVuZChwYWNrYWdlKQotICAgICAgICAgICAgCisKICAgICBkZWYgX3ByZXBhcmVJbnN0YWxsKHNlbGYsIHBhY2thZ2UsIGZvcmNlPTAsIHJlY3Vyc2l2ZT0xKToKICAgICAgICAgIiIiSW50ZXJuYWwgcm91dGluZSwgcmVjdXJzaXZlIGVuZ2luZSBmb3IgcHJlcGFyZUluc3RhbGwuCi0gICAgICAgIAorCiAgICAgICAgIFRlc3Qgd2hldGhlciB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQgYW5kIChpZiBub3QgaW5zdGFsbGVkCiAgICAgICAgIG9yIGlmIGZvcmNlPT0xKSBwcmVwZW5kIGl0IHRvIHRoZSB0ZW1wb3JhcnkgdG9kbyBsaXN0IGFuZAogICAgICAgICBjYWxsIG91cnNlbHZlcyByZWN1cnNpdmVseSBvbiBhbGwgcHJlcmVxdWlzaXRlcy4iIiIKLSAgICAgICAgCisKICAgICAgICAgaWYgbm90IGZvcmNlOgogICAgICAgICAgICAgc3RhdHVzLCBtZXNzYWdlID0gcGFja2FnZS5pbnN0YWxsZWQoKQogICAgICAgICAgICAgaWYgc3RhdHVzID09ICJ5ZXMiOgotICAgICAgICAgICAgICAgIHJldHVybiAKKyAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaWYgcGFja2FnZSBpbiBzZWxmLl90b2RvIG9yIHBhY2thZ2UgaW4gc2VsZi5fY3VydG9kbzoKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLl9jdXJ0b2RvLmluc2VydCgwLCBwYWNrYWdlKQpAQCAtOTMyLDE3ICs5MzIsMTcgQEAKICAgICAgICAgICAgICAgICBzZWxmLl9wcmVwYXJlSW5zdGFsbChwa2csIEZhbHNlLCByZWN1cnNpdmUpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuX2N1cm1lc3NhZ2VzLmFwcGVuZCgiUHJvYmxlbSB3aXRoIGRlcGVuZGVuY3k6ICVzIiAlIGRlc2NyKQotICAgICAgICAgICAgICAgIAorCiAgICAgZGVmIHByZXBhcmVJbnN0YWxsKHNlbGYsIHBhY2thZ2UsIGZvcmNlPTAsIHJlY3Vyc2l2ZT0xKToKICAgICAgICAgIiIiUHJlcGFyZSBpbnN0YWxsYXRpb24gb2YgYSBwYWNrYWdlLgotICAgICAgICAKKwogICAgICAgICBJZiB0aGUgcGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZCBhbmQgZm9yY2UgaXMgZmFsc2Ugbm90aGluZwogICAgICAgICBpcyBkb25lLiBJZiByZWN1cnNpdmUgaXMgdHJ1ZSBwcmVyZXF1aXNpdGVzIGFyZSBpbnN0YWxsZWQgZmlyc3QuCi0gICAgICAgIAorCiAgICAgICAgIFJldHVybnMgYSBsaXN0IG9mIHBhY2thZ2VzICh0byBiZSBwYXNzZWQgdG8gaW5zdGFsbCkgYW5kIGEgbGlzdAogICAgICAgICBvZiBtZXNzYWdlcyBvZiBhbnkgcHJvYmxlbXMgZW5jb3VudGVyZWQuCiAgICAgICAgICIiIgotICAgICAgICAKKwogICAgICAgICBzZWxmLl9jdXJ0b2RvID0gW10KICAgICAgICAgc2VsZi5fY3VybWVzc2FnZXMgPSBbXQogICAgICAgICBzZWxmLl9wcmVwYXJlSW5zdGFsbChwYWNrYWdlLCBmb3JjZSwgcmVjdXJzaXZlKQpAQCAtOTUwLDEwICs5NTAsMTAgQEAKICAgICAgICAgc2VsZi5fY3VydG9kbyA9IFtdCiAgICAgICAgIHNlbGYuX2N1cm1lc3NhZ2VzID0gW10KICAgICAgICAgcmV0dXJuIHJ2Ci0gICAgICAgIAorCiAgICAgZGVmIGluc3RhbGwoc2VsZiwgcGFja2FnZXMsIG91dHB1dCk6CiAgICAgICAgICIiIkluc3RhbGwgYSBsaXN0IG9mIHBhY2thZ2VzLiIiIgotICAgICAgICAKKwogICAgICAgICBzZWxmLl9hZGRQYWNrYWdlcyhwYWNrYWdlcykKICAgICAgICAgc3RhdHVzID0gW10KICAgICAgICAgZm9yIHBrZyBpbiBzZWxmLl90b2RvOgpAQCAtOTYxLDEyICs5NjEsMTIgQEAKICAgICAgICAgICAgIGlmIG1zZzoKICAgICAgICAgICAgICAgICBzdGF0dXMuYXBwZW5kKG1zZykKICAgICAgICAgcmV0dXJuIHN0YXR1cwotICAgICAgICAKLSAgICAgICAgCi0gICAgCisKKworCiBkZWYgX3J1bihtb2RlLCB2ZXJib3NlLCBmb3JjZSwgYXJncywgcHJlZmFyZ3MsIHdhdGNoZXIpOgogICAgICIiIkVuZ2luZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSIiIgotICAgIAorCiAgICAgcHJlZnMgPSBQaW1wUHJlZmVyZW5jZXMoKipwcmVmYXJncykKICAgICBpZiB3YXRjaGVyOgogICAgICAgICBwcmVmcy5zZXRXYXRjaGVyKHdhdGNoZXIpCkBAIC05NzUsNyArOTc1LDcgQEAKICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShydikKICAgICBkYiA9IFBpbXBEYXRhYmFzZShwcmVmcykKICAgICBkYi5hcHBlbmRVUkwocHJlZnMucGltcERhdGFiYXNlKQotICAgIAorCiAgICAgaWYgbW9kZSA9PSAnZHVtcCc6CiAgICAgICAgIGRiLmR1bXAoc3lzLnN0ZG91dCkKICAgICBlbGlmIG1vZGUgPT0nbGlzdCc6CkBAIC0xMDUwLDcgKzEwNTAsNyBAQAogCiBkZWYgbWFpbigpOgogICAgICIiIk1pbmltYWwgY29tbWFuZGxpbmUgdG9vbCB0byBkcml2ZSBwaW1wLiIiIgotICAgIAorCiAgICAgaW1wb3J0IGdldG9wdAogICAgIGRlZiBfaGVscCgpOgogICAgICAgICBwcmludCAiVXNhZ2U6IHBpbXAgW29wdGlvbnNdIC1zIFtwYWNrYWdlIC4uLl0gIExpc3QgaW5zdGFsbGVkIHN0YXR1cyIKQEAgLTEwNjUsMTIgKzEwNjUsMTIgQEAKICAgICAgICAgcHJpbnQgIiAgICAgICAgICAgICAgKGRlZmF1bHQ6ICVzKSIgJSBERUZBVUxUX0lOU1RBTExESVIKICAgICAgICAgcHJpbnQgIiAgICAgICAtdSB1cmwgVVJMIGZvciBkYXRhYmFzZSIKICAgICAgICAgc3lzLmV4aXQoMSkKLSAgICAgICAgCisKICAgICBjbGFzcyBfV2F0Y2hlcjoKICAgICAgICAgZGVmIHVwZGF0ZShzZWxmLCBtc2cpOgogICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShtc2cgKyAnXHInKQogICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgCisKICAgICB0cnk6CiAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgInNsaWZ2ZEQ6VnU6IikKICAgICBleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgpAQCAtMTEzMyw4ICsxMTMzLDYgQEAKICAgICAgICAgICAgICAgICAocGltcF91cGRhdGUuUElNUF9WRVJTSU9OLCBQSU1QX1ZFUlNJT04pKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZnJvbSBwaW1wX3VwZGF0ZSBpbXBvcnQgKgotICAgIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIG1haW4oKQotICAgIAotICAgIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL3ZpZGVvcmVhZGVyLnB5IGIvTGliL3BsYXQtbWFjL3ZpZGVvcmVhZGVyLnB5CmluZGV4IDY0NmM3MjYuLmYxNjIyOGIgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy92aWRlb3JlYWRlci5weQorKysgYi9MaWIvcGxhdC1tYWMvdmlkZW9yZWFkZXIucHkKQEAgLTM0LDE5ICszNCwxOSBAQAogICAgICAgICBzZWxmLl9fd2lkdGggPSB3aWR0aAogICAgICAgICBzZWxmLl9faGVpZ2h0ID0gaGVpZ2h0CiAgICAgICAgIHNlbGYuX19mb3JtYXQgPSBmb3JtYXQKLSAgICAgICAgCisKICAgICBkZWYgZ2V0bmFtZShzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lCi0gICAgICAgIAorCiAgICAgZGVmIGdldGRlc2NyKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fX2Rlc2NyCi0gICAgICAgIAorCiAgICAgZGVmIGdldHNpemUoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl9fd2lkdGgsIHNlbGYuX19oZWlnaHQKLSAgICAgICAgCisKICAgICBkZWYgZ2V0Zm9ybWF0KHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fX2Zvcm1hdAotICAgICAgICAKKwogY2xhc3MgX1JlYWRlcjoKICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICAgICAgIGZkID0gUXQuT3Blbk1vdmllRmlsZShwYXRoLCAwKQpAQCAtNjYsOCArNjYsOCBAQAogICAgICAgICAgICAgc2VsZi5hdWRpb2Rlc2NyID0gX2F1ZGlvZGVzY3IoaGFuZGxlLmRhdGEpCiAgICAgICAgICAgICBzZWxmLmF1ZGlvdGltZXNjYWxlID0gc2VsZi5hdWRpb21lZGlhLkdldE1lZGlhVGltZVNjYWxlKCkKICAgICAgICAgICAgIGRlbCBoYW5kbGUKLSAgICAKLSAgICAgICAgdHJ5OiAgICAKKworICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLnZpZGVvdHJhY2sgPSBzZWxmLm1vdmllLkdldE1vdmllSW5kVHJhY2tUeXBlKDEsCiAgICAgICAgICAgICAgICAgUXVpY2tUaW1lLlZpc3VhbE1lZGlhQ2hhcmFjdGVyaXN0aWMsIFF1aWNrVGltZS5tb3ZpZVRyYWNrQ2hhcmFjdGVyaXN0aWMpCiAgICAgICAgICAgICBzZWxmLnZpZGVvbWVkaWEgPSBzZWxmLnZpZGVvdHJhY2suR2V0VHJhY2tNZWRpYSgpCkBAIC04MSwxNCArODEsMTQgQEAKICAgICAgICAgc2VsZi52aWRlb2N1cnRpbWUgPSBOb25lCiAgICAgICAgIHNlbGYuYXVkaW9jdXJ0aW1lID0gTm9uZQogCi0gICAgICAgIAorCiAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgIHNlbGYuYXVkaW9tZWRpYSA9IE5vbmUKICAgICAgICAgc2VsZi5hdWRpb3RyYWNrID0gTm9uZQogICAgICAgICBzZWxmLnZpZGVvbWVkaWEgPSBOb25lCiAgICAgICAgIHNlbGYudmlkZW90cmFjayA9IE5vbmUKICAgICAgICAgc2VsZi5tb3ZpZSA9IE5vbmUKLSAgICAgICAgCisKICAgICBkZWYgX2luaXRnd29ybGQoc2VsZik6CiAgICAgICAgIG9sZF9wb3J0LCBvbGRfZGV2ID0gUWRvZmZzLkdldEdXb3JsZCgpCiAgICAgICAgIHRyeToKQEAgLTEwOCwzNCArMTA4LDM0IEBACiAgICAgICAgICAgICAjIFhYWFggZnJhbWVyYXRlCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBRZG9mZnMuU2V0R1dvcmxkKG9sZF9wb3J0LCBvbGRfZGV2KQotICAgICAgICAKKwogICAgIGRlZiBfZ2V0dHJhY2tkdXJhdGlvbl9tcyhzZWxmLCB0cmFjayk6CiAgICAgICAgIHRyYWNrdGltZSA9IHRyYWNrLkdldFRyYWNrRHVyYXRpb24oKQogICAgICAgICByZXR1cm4gc2VsZi5fbW92aWV0aW1lX3RvX21zKHRyYWNrdGltZSkKLSAgICAgICAgCisKICAgICBkZWYgX21vdmlldGltZV90b19tcyhzZWxmLCB0aW1lKToKICAgICAgICAgdmFsdWUsIGQxLCBkMiA9IFF0LkNvbnZlcnRUaW1lU2NhbGUoKHRpbWUsIHNlbGYubW92aWV0aW1lc2NhbGUsIE5vbmUpLCAxMDAwKQogICAgICAgICByZXR1cm4gdmFsdWUKLSAgICAgICAgCisKICAgICBkZWYgX3ZpZGVvdGltZV90b19tcyhzZWxmLCB0aW1lKToKICAgICAgICAgdmFsdWUsIGQxLCBkMiA9IFF0LkNvbnZlcnRUaW1lU2NhbGUoKHRpbWUsIHNlbGYudmlkZW90aW1lc2NhbGUsIE5vbmUpLCAxMDAwKQogICAgICAgICByZXR1cm4gdmFsdWUKLSAgICAgICAgCisKICAgICBkZWYgX2F1ZGlvdGltZV90b19tcyhzZWxmLCB0aW1lKToKICAgICAgICAgdmFsdWUsIGQxLCBkMiA9IFF0LkNvbnZlcnRUaW1lU2NhbGUoKHRpbWUsIHNlbGYuYXVkaW90aW1lc2NhbGUsIE5vbmUpLCAxMDAwKQogICAgICAgICByZXR1cm4gdmFsdWUKLSAgICAgICAgCisKICAgICBkZWYgX3ZpZGVvdGltZV90b19tb3ZpZXRpbWUoc2VsZiwgdGltZSk6CiAgICAgICAgIHZhbHVlLCBkMSwgZDIgPSBRdC5Db252ZXJ0VGltZVNjYWxlKCh0aW1lLCBzZWxmLnZpZGVvdGltZXNjYWxlLCBOb25lKSwKICAgICAgICAgICAgICAgICBzZWxmLm1vdmlldGltZXNjYWxlKQogICAgICAgICByZXR1cm4gdmFsdWUKLSAgICAgICAgCisKICAgICBkZWYgSGFzQXVkaW8oc2VsZik6CiAgICAgICAgIHJldHVybiBub3Qgc2VsZi5hdWRpb3RyYWNrIGlzIE5vbmUKLSAgICAgICAgCisKICAgICBkZWYgSGFzVmlkZW8oc2VsZik6CiAgICAgICAgIHJldHVybiBub3Qgc2VsZi52aWRlb3RyYWNrIGlzIE5vbmUKLSAgICAgICAgCisKICAgICBkZWYgR2V0QXVkaW9EdXJhdGlvbihzZWxmKToKICAgICAgICAgaWYgbm90IHNlbGYuYXVkaW90cmFjazoKICAgICAgICAgICAgIHJldHVybiAwCkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgaWYgbm90IHNlbGYudmlkZW90cmFjazoKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIHJldHVybiBzZWxmLl9nZXR0cmFja2R1cmF0aW9uX21zKHNlbGYudmlkZW90cmFjaykKLSAgICAgICAgCisKICAgICBkZWYgR2V0QXVkaW9Gb3JtYXQoc2VsZik6CiAgICAgICAgIGlmIG5vdCBzZWxmLmF1ZGlvZGVzY3I6CiAgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZQpAQCAtMTcyLDIwICsxNzIsMjAgQEAKICAgICAgICAgICAgIGVuY29kaW5nID0gJ2xpbmVhci1zaWduZWQnCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBlbmNvZGluZyA9ICdxdWlja3RpbWUtY29kaW5nLSVzJyVzZWxmLmF1ZGlvZGVzY3JbJ2RhdGFGb3JtYXQnXQotIyMgICAgICByZXR1cm4gYXVkaW8uZm9ybWF0LkF1ZGlvRm9ybWF0TGluZWFyKCdxdWlja3RpbWVfYXVkaW8nLCAnUXVpY2tUaW1lIEF1ZGlvIEZvcm1hdCcsIAorIyMgICAgICByZXR1cm4gYXVkaW8uZm9ybWF0LkF1ZGlvRm9ybWF0TGluZWFyKCdxdWlja3RpbWVfYXVkaW8nLCAnUXVpY2tUaW1lIEF1ZGlvIEZvcm1hdCcsCiAjIyAgICAgICAgICBjaGFubmVscywgZW5jb2RpbmcsIGJsb2Nrc2l6ZT1ibG9ja3NpemUsIGZwYj1mcGIsIGJwcz1icHMpCiAgICAgICAgIHJldHVybiBjaGFubmVscywgZW5jb2RpbmcsIGJsb2Nrc2l6ZSwgZnBiLCBicHMKLSAgICAgICAgICAgIAorCiAgICAgZGVmIEdldEF1ZGlvRnJhbWVSYXRlKHNlbGYpOgogICAgICAgICBpZiBub3Qgc2VsZi5hdWRpb2Rlc2NyOgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgcmV0dXJuIGludChzZWxmLmF1ZGlvZGVzY3JbJ3NhbXBsZVJhdGUnXSkKLSAgICAgICAgCisKICAgICBkZWYgR2V0VmlkZW9Gb3JtYXQoc2VsZik6CiAgICAgICAgIHdpZHRoID0gc2VsZi52aWRlb2Rlc2NyWyd3aWR0aCddCiAgICAgICAgIGhlaWdodCA9IHNlbGYudmlkZW9kZXNjclsnaGVpZ2h0J10KICAgICAgICAgcmV0dXJuIFZpZGVvRm9ybWF0KCdkdW1teV9mb3JtYXQnLCAnRHVtbXkgVmlkZW8gRm9ybWF0Jywgd2lkdGgsIGhlaWdodCwgbWFjcmdiKQotICAgICAgICAKKwogICAgIGRlZiBHZXRWaWRlb0ZyYW1lUmF0ZShzZWxmKToKICAgICAgICAgdHYgPSBzZWxmLnZpZGVvY3VydGltZQogICAgICAgICBpZiB0diA9PSBOb25lOgpAQCAtMTk0LDcgKzE5NCw3IEBACiAgICAgICAgIHR2LCBkdXIgPSBzZWxmLnZpZGVvbWVkaWEuR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKGZsYWdzLCB0diwgMS4wKQogICAgICAgICBkdXIgPSBzZWxmLl92aWRlb3RpbWVfdG9fbXMoZHVyKQogICAgICAgICByZXR1cm4gaW50KCgxMDAwLjAvZHVyKSswLjUpCi0gICAgICAgIAorCiAgICAgZGVmIFJlYWRBdWRpbyhzZWxmLCBuZnJhbWVzLCB0aW1lPU5vbmUpOgogICAgICAgICBpZiBub3QgdGltZSBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5hdWRpb2N1cnRpbWUgPSB0aW1lCkBAIC0yMTAsNyArMjEwLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXVkaW9tZWRpYS5HZXRNZWRpYVNhbXBsZShoLCAwLCB0diwgZGVzY19oLCBuZnJhbWVzKQogICAgICAgICBzZWxmLmF1ZGlvY3VydGltZSA9IGFjdHVhbHRpbWUgKyBhY3R1YWxjb3VudCpzYW1wbGVkdXJhdGlvbgogICAgICAgICByZXR1cm4gc2VsZi5fYXVkaW90aW1lX3RvX21zKGFjdHVhbHRpbWUpLCBoLmRhdGEKLSAgICAgICAgCisKICAgICBkZWYgUmVhZFZpZGVvKHNlbGYsIHRpbWU9Tm9uZSk6CiAgICAgICAgIGlmIG5vdCB0aW1lIGlzIE5vbmU6CiAgICAgICAgICAgICBzZWxmLnZpZGVvY3VydGltZSA9IHRpbWUKQEAgLTIyNiw3ICsyMjYsNyBAQAogICAgICAgICBzZWxmLm1vdmllLlNldE1vdmllVGltZVZhbHVlKG1vdmllY3VydGltZSkKICAgICAgICAgc2VsZi5tb3ZpZS5Nb3ZpZXNUYXNrKDApCiAgICAgICAgIHJldHVybiBzZWxmLl92aWRlb3RpbWVfdG9fbXMoc2VsZi52aWRlb2N1cnRpbWUpLCBzZWxmLl9nZXRwaXhtYXBjb250ZW50KCkKLSAgICAgICAgCisKICAgICBkZWYgX2dldHBpeG1hcGNvbnRlbnQoc2VsZik6CiAgICAgICAgICIiIlNodWZmbGUgdGhlIG9mZnNjcmVlbiBQaXhNYXAgZGF0YSwgYmVjYXVzZSBpdCBtYXkgaGF2ZSBmdW5ueSBzdHJpZGUgdmFsdWVzIiIiCiAgICAgICAgIHJvd2J5dGVzID0gUWRvZmZzLkdldFBpeFJvd0J5dGVzKHNlbGYucGl4bWFwKQpAQCAtMjgxLDEyICsyODEsMTEgQEAKICAgICAgICAgICAgIHdydC53cml0ZShkYXRhKQogICAgICAgICAgICAgdGltZXN0YW1wLCBkYXRhID0gcmRyLlJlYWRWaWRlbygpCiAgICAgICAgICAgICBNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShwbmFtZSwgJ29nbGUnLCAnSlBFRycpCi0gICAgICAgICAgICBpZiBudW0gPiAyMDogCisgICAgICAgICAgICBpZiBudW0gPiAyMDoKICAgICAgICAgICAgICAgICBwcmludCAnc3RvcHBpbmcgYXQgMjAgZnJhbWVzIHNvIHlvdXIgZGlzayBkb2VzIG5vdCBmaWxsIHVwOi0pJwogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgcHJpbnQgJ1RvdGFsIGZyYW1lczonLCBudW0KLSAgICAgICAgCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgX3Rlc3QoKQogICAgIHN5cy5leGl0KDEpCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbmV0YnNkMS9JTi5weSBiL0xpYi9wbGF0LW5ldGJzZDEvSU4ucHkKaW5kZXggMDIwZjhlMi4uNDc0YzUxZSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbmV0YnNkMS9JTi5weQorKysgYi9MaWIvcGxhdC1uZXRic2QxL0lOLnB5CkBAIC01NCw0ICs1NCwzIEBACiBJUENUTF9BTExPV1NSQ1JUID0gNwogSVBDVExfTUFYSUQgPSA4CiBkZWYgaW5fbnVsbGhvc3QoeCk6IHJldHVybiAoKHgpLnNfYWRkciA9PSBJTkFERFJfQU5ZKQotCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1vczJlbXgvX2VteF9saW5rLnB5IGIvTGliL3BsYXQtb3MyZW14L19lbXhfbGluay5weQppbmRleCAwNDY0OGUyLi40MjJjMmJiIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1vczJlbXgvX2VteF9saW5rLnB5CisrKyBiL0xpYi9wbGF0LW9zMmVteC9fZW14X2xpbmsucHkKQEAgLTIsNyArMiw3IEBACiAKICMgV3JpdHRlbiBieSBBbmRyZXcgSSBNYWNJbnR5cmUsIERlY2VtYmVyIDIwMDIuCiAKLSIiIl9lbXhfbGluay5weSBpcyBhIHNpbXBsaXN0aWMgZW11bGF0aW9uIG9mIHRoZSBVbml4IGxpbmsoMikgbGlicmFyeSByb3V0aW5lIAorIiIiX2VteF9saW5rLnB5IGlzIGEgc2ltcGxpc3RpYyBlbXVsYXRpb24gb2YgdGhlIFVuaXggbGluaygyKSBsaWJyYXJ5IHJvdXRpbmUKIGZvciBjcmVhdGluZyBzby1jYWxsZWQgaGFyZCBsaW5rcy4gIEl0IGlzIGludGVuZGVkIHRvIGJlIGltcG9ydGVkIGludG8KIHRoZSBvcyBtb2R1bGUgaW4gcGxhY2Ugb2YgdGhlIHVuaW1wbGVtZW50ZWQgKG9uIE9TLzIpIFBvc2l4IGxpbmsoKQogZnVuY3Rpb24gKG9zLmxpbmsoKSkuCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1vczJlbXgvZ3JwLnB5IGIvTGliL3BsYXQtb3MyZW14L2dycC5weQppbmRleCBkMDVhZDI3Li5mY2ViNGM5IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1vczJlbXgvZ3JwLnB5CisrKyBiL0xpYi9wbGF0LW9zMmVteC9ncnAucHkKQEAgLTQsMTAgKzQsMTAgQEAKICMgd3JpdHRlbiBieSBBbmRyZXcgTWFjSW50eXJlLCBBcHJpbCAyMDAxLgogIyB1cGRhdGVkIEp1bHkgMjAwMywgYWRkaW5nIGZpZWxkIGFjY2Vzc29yIHN1cHBvcnQKIAotIyBub3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBjaGVja3Mgd2hldGhlciAiOiIgb3IgIjsiIGFzIHVzZWQgYXMgCisjIG5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyICI6IiBvciAiOyIgYXMgdXNlZCBhcwogIyB0aGUgZmllbGQgc2VwYXJhdG9yIGNoYXJhY3Rlci4KIAotIiIiUmVwbGFjZW1lbnQgZm9yIGdycCBzdGFuZGFyZCBleHRlbnNpb24gbW9kdWxlLCBpbnRlbmRlZCBmb3IgdXNlIG9uIAorIiIiUmVwbGFjZW1lbnQgZm9yIGdycCBzdGFuZGFyZCBleHRlbnNpb24gbW9kdWxlLCBpbnRlbmRlZCBmb3IgdXNlIG9uCiBPUy8yIGFuZCBzaW1pbGFyIHN5c3RlbXMgd2hpY2ggZG9uJ3Qgbm9ybWFsbHkgaGF2ZSBhbiAvZXRjL2dyb3VwIGZpbGUuCiAKIFRoZSBzdGFuZGFyZCBVbml4IGdyb3VwIGRhdGFiYXNlIGlzIGFuIEFTQ0lJIHRleHQgZmlsZSB3aXRoIDQgZmllbGRzIHBlcgpAQCAtMTcsMTYgKzE3LDE2IEBACiAgIC0gZ3JvdXAgaWQgKGludGVnZXIpCiAgIC0gZ3JvdXAgbWVtYmVycyAoY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgdXNlcmlkcywgd2l0aCBubyBzcGFjZXMpCiAKLU5vdGUgdGhhdCBtZW1iZXJzIGFyZSBvbmx5IGluY2x1ZGVkIGluIHRoZSBncm91cCBmaWxlIGZvciBncm91cHMgdGhhdCAKK05vdGUgdGhhdCBtZW1iZXJzIGFyZSBvbmx5IGluY2x1ZGVkIGluIHRoZSBncm91cCBmaWxlIGZvciBncm91cHMgdGhhdAogYXJlbid0IHRoZWlyIHByaW1hcnkgZ3JvdXBzLgogKHNlZSB0aGUgc2VjdGlvbiA4LjIgb2YgdGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSkKIAotVGhpcyBpbXBsZW1lbnRhdGlvbiBkaWZmZXJzIGZyb20gdGhlIHN0YW5kYXJkIFVuaXggaW1wbGVtZW50YXRpb24gYnkgCi1hbGxvd2luZyB1c2Ugb2YgdGhlIHBsYXRmb3JtJ3MgbmF0aXZlIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlciAtICc7JyBvbiBPUy8yLCAKLURPUyBhbmQgTVMtV2luZG93cyAtIGFzIHRoZSBmaWVsZCBzZXBhcmF0b3IgaW4gYWRkaXRpb24gdG8gdGhlIFVuaXggCitUaGlzIGltcGxlbWVudGF0aW9uIGRpZmZlcnMgZnJvbSB0aGUgc3RhbmRhcmQgVW5peCBpbXBsZW1lbnRhdGlvbiBieQorYWxsb3dpbmcgdXNlIG9mIHRoZSBwbGF0Zm9ybSdzIG5hdGl2ZSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIgLSAnOycgb24gT1MvMiwKK0RPUyBhbmQgTVMtV2luZG93cyAtIGFzIHRoZSBmaWVsZCBzZXBhcmF0b3IgaW4gYWRkaXRpb24gdG8gdGhlIFVuaXgKIHN0YW5kYXJkICI6Ii4KIAotVGhlIG1vZHVsZSBsb29rcyBmb3IgdGhlIGdyb3VwIGRhdGFiYXNlIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zIAorVGhlIG1vZHVsZSBsb29rcyBmb3IgdGhlIGdyb3VwIGRhdGFiYXNlIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zCiAoaW4gb3JkZXIgZmlyc3QgdG8gbGFzdCk6CiAgIC0gJHtFVENfR1JPVVB9ICAgICAgICAgICAgICAob3IgJUVUQ19HUk9VUCUpCiAgIC0gJHtFVEN9L2dyb3VwICAgICAgICAgICAgICAob3IgJUVUQyUvZ3JvdXApCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1vczJlbXgvcHdkLnB5IGIvTGliL3BsYXQtb3MyZW14L3B3ZC5weQppbmRleCAxMDM2ZmNlLi45NWQ3NjZhIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1vczJlbXgvcHdkLnB5CisrKyBiL0xpYi9wbGF0LW9zMmVteC9wd2QucHkKQEAgLTQsMTQgKzQsMTQgQEAKICMgd3JpdHRlbiBieSBBbmRyZXcgTWFjSW50eXJlLCBBcHJpbCAyMDAxLgogIyB1cGRhdGVkIEp1bHkgMjAwMywgYWRkaW5nIGZpZWxkIGFjY2Vzc29yIHN1cHBvcnQKIAotIyBub3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBjaGVja3Mgd2hldGhlciAiOiIgb3IgIjsiIGFzIHVzZWQgYXMgCisjIG5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyICI6IiBvciAiOyIgYXMgdXNlZCBhcwogIyB0aGUgZmllbGQgc2VwYXJhdG9yIGNoYXJhY3Rlci4gIFBhdGggY29udmVyc2lvbnMgYXJlIGFyZSBhcHBsaWVkIHdoZW4KICMgdGhlIGRhdGFiYXNlIHVzZXMgIjoiIGFzIHRoZSBmaWVsZCBzZXBhcmF0b3IgY2hhcmFjdGVyLgogCi0iIiJSZXBsYWNlbWVudCBmb3IgcHdkIHN0YW5kYXJkIGV4dGVuc2lvbiBtb2R1bGUsIGludGVuZGVkIGZvciB1c2Ugb24gCisiIiJSZXBsYWNlbWVudCBmb3IgcHdkIHN0YW5kYXJkIGV4dGVuc2lvbiBtb2R1bGUsIGludGVuZGVkIGZvciB1c2Ugb24KIE9TLzIgYW5kIHNpbWlsYXIgc3lzdGVtcyB3aGljaCBkb24ndCBub3JtYWxseSBoYXZlIGFuIC9ldGMvcGFzc3dkIGZpbGUuCiAKLVRoZSBzdGFuZGFyZCBVbml4IHBhc3N3b3JkIGRhdGFiYXNlIGlzIGFuIEFTQ0lJIHRleHQgZmlsZSB3aXRoIDcgZmllbGRzIAorVGhlIHN0YW5kYXJkIFVuaXggcGFzc3dvcmQgZGF0YWJhc2UgaXMgYW4gQVNDSUkgdGV4dCBmaWxlIHdpdGggNyBmaWVsZHMKIHBlciByZWNvcmQgKGxpbmUpLCBzZXBhcmF0ZWQgYnkgYSBjb2xvbjoKICAgLSB1c2VyIG5hbWUgKHN0cmluZykKICAgLSBwYXNzd29yZCAoZW5jcnlwdGVkIHN0cmluZywgb3IgIioiIG9yICIiKQpAQCAtMjMsMTMgKzIzLDEzIEBACiAKIChzZWUgdGhlIHNlY3Rpb24gOC4xIG9mIHRoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UpCiAKLVRoaXMgaW1wbGVtZW50YXRpb24gZGlmZmVycyBmcm9tIHRoZSBzdGFuZGFyZCBVbml4IGltcGxlbWVudGF0aW9uIGJ5IAotYWxsb3dpbmcgdXNlIG9mIHRoZSBwbGF0Zm9ybSdzIG5hdGl2ZSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIgLSAnOycgb24gT1MvMiwgCi1ET1MgYW5kIE1TLVdpbmRvd3MgLSBhcyB0aGUgZmllbGQgc2VwYXJhdG9yIGluIGFkZGl0aW9uIHRvIHRoZSBVbml4IAotc3RhbmRhcmQgIjoiLiAgQWRkaXRpb25hbGx5LCB3aGVuICI6IiBpcyB0aGUgc2VwYXJhdG9yIHBhdGggY29udmVyc2lvbnMgCitUaGlzIGltcGxlbWVudGF0aW9uIGRpZmZlcnMgZnJvbSB0aGUgc3RhbmRhcmQgVW5peCBpbXBsZW1lbnRhdGlvbiBieQorYWxsb3dpbmcgdXNlIG9mIHRoZSBwbGF0Zm9ybSdzIG5hdGl2ZSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIgLSAnOycgb24gT1MvMiwKK0RPUyBhbmQgTVMtV2luZG93cyAtIGFzIHRoZSBmaWVsZCBzZXBhcmF0b3IgaW4gYWRkaXRpb24gdG8gdGhlIFVuaXgKK3N0YW5kYXJkICI6Ii4gIEFkZGl0aW9uYWxseSwgd2hlbiAiOiIgaXMgdGhlIHNlcGFyYXRvciBwYXRoIGNvbnZlcnNpb25zCiBhcmUgYXBwbGllZCB0byBkZWFsIHdpdGggYW55IG11bmdpbmcgb2YgdGhlIGRyaXZlIGxldHRlciByZWZlcmVuY2UuCiAKLVRoZSBtb2R1bGUgbG9va3MgZm9yIHRoZSBwYXNzd29yZCBkYXRhYmFzZSBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9ucyAKK1RoZSBtb2R1bGUgbG9va3MgZm9yIHRoZSBwYXNzd29yZCBkYXRhYmFzZSBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9ucwogKGluIG9yZGVyIGZpcnN0IHRvIGxhc3QpOgogICAtICR7RVRDX1BBU1NXRH0gICAgICAgICAgICAgKG9yICVFVENfUEFTU1dEJSkKICAgLSAke0VUQ30vcGFzc3dkICAgICAgICAgICAgIChvciAlRVRDJS9wYXNzd2QpCkBAIC05NCw4ICs5NCw4IEBACiAKICMgZGVjaWRlIHdoYXQgZmllbGQgc2VwYXJhdG9yIHdlIGNhbiB0cnkgdG8gdXNlIC0gVW5peCBzdGFuZGFyZCwgd2l0aAogIyB0aGUgcGxhdGZvcm0ncyBwYXRoIHNlcGFyYXRvciBhcyBhbiBvcHRpb24uICBObyBzcGVjaWFsIGZpZWxkIGNvbnZlcnNpb24KLSMgaGFuZGxlciBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBwbGF0Zm9ybSdzIHBhdGggc2VwYXJhdG9yIGFzIGZpZWxkIAotIyBzZXBhcmF0b3IsIGJ1dCBhcmUgcmVxdWlyZWQgZm9yIHRoZSBob21lIGRpcmVjdG9yeSBhbmQgc2hlbGwgZmllbGRzIHdoZW4gCisjIGhhbmRsZXIgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgcGxhdGZvcm0ncyBwYXRoIHNlcGFyYXRvciBhcyBmaWVsZAorIyBzZXBhcmF0b3IsIGJ1dCBhcmUgcmVxdWlyZWQgZm9yIHRoZSBob21lIGRpcmVjdG9yeSBhbmQgc2hlbGwgZmllbGRzIHdoZW4KICMgdXNpbmcgdGhlIHN0YW5kYXJkIFVuaXggKCI6IikgZmllbGQgc2VwYXJhdG9yLgogX19maWVsZF9zZXAgPSB7JzonOiBfX3VuaXhwYXRoY29udn0KIGlmIG9zLnBhdGhzZXA6CmRpZmYgLS1naXQgYS9MaWIvcGxhdC1yaXNjb3Mvcm91cmwycGF0aC5weSBiL0xpYi9wbGF0LXJpc2Nvcy9yb3VybDJwYXRoLnB5CmluZGV4IDQ5NGUzOTQuLjc2NDJiOWYgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LXJpc2Nvcy9yb3VybDJwYXRoLnB5CisrKyBiL0xpYi9wbGF0LXJpc2Nvcy9yb3VybDJwYXRoLnB5CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgIGlmICckJyBpbiBjb21wb25lbnRzOgogICAgICAgICAgICAgZGVsIGNvbXBvbmVudHNbMF0KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICBjb21wb25lbnRzWzBdID0gJyQnCisgICAgICAgICAgICBjb21wb25lbnRzWzBdID0gJyQnCiAgICAgIyBSZW1vdmUgLiBhbmQgZW1iZWRkZWQgLi4KICAgICBpID0gMAogICAgIHdoaWxlIGkgPCBsZW4oY29tcG9uZW50cyk6CmRpZmYgLS1naXQgYS9MaWIvcGxhdC1zdW5vczUvSU4ucHkgYi9MaWIvcGxhdC1zdW5vczUvSU4ucHkKaW5kZXggN2UyNjE4Ny4uODY3YjllYiAxMDA3NTUKLS0tIGEvTGliL3BsYXQtc3Vub3M1L0lOLnB5CisrKyBiL0xpYi9wbGF0LXN1bm9zNS9JTi5weQpAQCAtODM2LDcgKzgzNiw3IEBACiBUU19SRVNVTUUgPSAweDEwMDAKIFRTX0NSRUFURSA9IDB4MjAwMAogVFNfQUxMU1RBUlQgPSBcCi0JKFRTX0NTVEFSVHxUU19VTlBBVVNFfFRTX1hTVEFSVHxUU19QU1RBUlR8VFNfUkVTVU1FfFRTX0NSRUFURSkKKyAgICAgICAgKFRTX0NTVEFSVHxUU19VTlBBVVNFfFRTX1hTVEFSVHxUU19QU1RBUlR8VFNfUkVTVU1FfFRTX0NSRUFURSkKIGRlZiBDUFJfVlNUT1BQRUQodCk6IHJldHVybiBcCiAKIGRlZiBUSFJFQURfVFJBTlNJVElPTih0cCk6IHJldHVybiB0aHJlYWRfdHJhbnNpdGlvbih0cCk7CkBAIC0xMDE0LDEzICsxMDE0LDEzIEBACiBBVF9OQkxPQ0tTID0gMHgyMDAwCiBBVF9WQ09ERSA9IDB4NDAwMAogQVRfQUxMID0gKEFUX1RZUEV8QVRfTU9ERXxBVF9VSUR8QVRfR0lEfEFUX0ZTSUR8QVRfTk9ERUlEfFwKLQkJCUFUX05MSU5LfEFUX1NJWkV8QVRfQVRJTUV8QVRfTVRJTUV8QVRfQ1RJTUV8XAotCQkJQVRfUkRFVnxBVF9CTEtTSVpFfEFUX05CTE9DS1N8QVRfVkNPREUpCisgICAgICAgICAgICAgICAgICAgICAgICBBVF9OTElOS3xBVF9TSVpFfEFUX0FUSU1FfEFUX01USU1FfEFUX0NUSU1FfFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUX1JERVZ8QVRfQkxLU0laRXxBVF9OQkxPQ0tTfEFUX1ZDT0RFKQogQVRfU1RBVCA9IChBVF9NT0RFfEFUX1VJRHxBVF9HSUR8QVRfRlNJRHxBVF9OT0RFSUR8QVRfTkxJTkt8XAotCQkJQVRfU0laRXxBVF9BVElNRXxBVF9NVElNRXxBVF9DVElNRXxBVF9SREVWKQorICAgICAgICAgICAgICAgICAgICAgICAgQVRfU0laRXxBVF9BVElNRXxBVF9NVElNRXxBVF9DVElNRXxBVF9SREVWKQogQVRfVElNRVMgPSAoQVRfQVRJTUV8QVRfTVRJTUV8QVRfQ1RJTUUpCiBBVF9OT1NFVCA9IChBVF9OTElOS3xBVF9SREVWfEFUX0ZTSUR8QVRfTk9ERUlEfEFUX1RZUEV8XAotCQkJQVRfQkxLU0laRXxBVF9OQkxPQ0tTfEFUX1ZDT0RFKQorICAgICAgICAgICAgICAgICAgICAgICAgQVRfQkxLU0laRXxBVF9OQkxPQ0tTfEFUX1ZDT0RFKQogVlNVSUQgPSAwNDAwMAogVlNHSUQgPSAwMjAwMAogVlNWVFggPSAwMTAwMApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtc3Vub3M1L1NUUk9QVFMucHkgYi9MaWIvcGxhdC1zdW5vczUvU1RST1BUUy5weQppbmRleCAxOTE3M2JiLi5lOTVkYjkzIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1zdW5vczUvU1RST1BUUy5weQorKysgYi9MaWIvcGxhdC1zdW5vczUvU1RST1BUUy5weQpAQCAtODMzLDcgKzgzMyw3IEBACiBUU19SRVNVTUUgPSAweDEwMDAKIFRTX0NSRUFURSA9IDB4MjAwMAogVFNfQUxMU1RBUlQgPSBcCi0JKFRTX0NTVEFSVHxUU19VTlBBVVNFfFRTX1hTVEFSVHxUU19QU1RBUlR8VFNfUkVTVU1FfFRTX0NSRUFURSkKKyAgICAgICAgKFRTX0NTVEFSVHxUU19VTlBBVVNFfFRTX1hTVEFSVHxUU19QU1RBUlR8VFNfUkVTVU1FfFRTX0NSRUFURSkKIGRlZiBDUFJfVlNUT1BQRUQodCk6IHJldHVybiBcCiAKIGRlZiBUSFJFQURfVFJBTlNJVElPTih0cCk6IHJldHVybiB0aHJlYWRfdHJhbnNpdGlvbih0cCk7CkBAIC0xMzkzLDEzICsxMzkzLDEzIEBACiBBVF9OQkxPQ0tTID0gMHgyMDAwCiBBVF9WQ09ERSA9IDB4NDAwMAogQVRfQUxMID0gKEFUX1RZUEV8QVRfTU9ERXxBVF9VSUR8QVRfR0lEfEFUX0ZTSUR8QVRfTk9ERUlEfFwKLQkJCUFUX05MSU5LfEFUX1NJWkV8QVRfQVRJTUV8QVRfTVRJTUV8QVRfQ1RJTUV8XAotCQkJQVRfUkRFVnxBVF9CTEtTSVpFfEFUX05CTE9DS1N8QVRfVkNPREUpCisgICAgICAgICAgICAgICAgICAgICAgICBBVF9OTElOS3xBVF9TSVpFfEFUX0FUSU1FfEFUX01USU1FfEFUX0NUSU1FfFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUX1JERVZ8QVRfQkxLU0laRXxBVF9OQkxPQ0tTfEFUX1ZDT0RFKQogQVRfU1RBVCA9IChBVF9NT0RFfEFUX1VJRHxBVF9HSUR8QVRfRlNJRHxBVF9OT0RFSUR8QVRfTkxJTkt8XAotCQkJQVRfU0laRXxBVF9BVElNRXxBVF9NVElNRXxBVF9DVElNRXxBVF9SREVWKQorICAgICAgICAgICAgICAgICAgICAgICAgQVRfU0laRXxBVF9BVElNRXxBVF9NVElNRXxBVF9DVElNRXxBVF9SREVWKQogQVRfVElNRVMgPSAoQVRfQVRJTUV8QVRfTVRJTUV8QVRfQ1RJTUUpCiBBVF9OT1NFVCA9IChBVF9OTElOS3xBVF9SREVWfEFUX0ZTSUR8QVRfTk9ERUlEfEFUX1RZUEV8XAotCQkJQVRfQkxLU0laRXxBVF9OQkxPQ0tTfEFUX1ZDT0RFKQorICAgICAgICAgICAgICAgICAgICAgICAgQVRfQkxLU0laRXxBVF9OQkxPQ0tTfEFUX1ZDT0RFKQogVlNVSUQgPSAwNDAwMAogVlNHSUQgPSAwMjAwMAogVlNWVFggPSAwMTAwMApAQCAtMTY4MiwxNCArMTY4MiwxNCBAQAogRERJX1BST1BfVFlQRV9TVFJJTkcgPSAweDAyMDAKIERESV9QUk9QX1RZUEVfQllURSA9IDB4MDQwMAogRERJX1BST1BfVFlQRV9DT01QT1NJVEUgPSAweDA4MDAKLURESV9QUk9QX1RZUEVfQU5ZID0gKERESV9QUk9QX1RZUEVfSU5UCXwJXAotCQkJCQlERElfUFJPUF9UWVBFX1NUUklORwl8CVwKLQkJCQkJRERJX1BST1BfVFlQRV9CWVRFCXwJXAotCQkJCQlERElfUFJPUF9UWVBFX0NPTVBPU0lURSkKLURESV9QUk9QX1RZUEVfTUFTSyA9IChERElfUFJPUF9UWVBFX0lOVAl8CVwKLQkJCQkJRERJX1BST1BfVFlQRV9TVFJJTkcJfAlcCi0JCQkJCURESV9QUk9QX1RZUEVfQllURQl8CVwKLQkJCQkJRERJX1BST1BfVFlQRV9DT01QT1NJVEUpCitERElfUFJPUF9UWVBFX0FOWSA9IChERElfUFJPUF9UWVBFX0lOVCAgfCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERJX1BST1BfVFlQRV9TVFJJTkcgICAgfCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERJX1BST1BfVFlQRV9CWVRFICAgICAgfCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERJX1BST1BfVFlQRV9DT01QT1NJVEUpCitERElfUFJPUF9UWVBFX01BU0sgPSAoRERJX1BST1BfVFlQRV9JTlQgfCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERJX1BST1BfVFlQRV9TVFJJTkcgICAgfCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERJX1BST1BfVFlQRV9CWVRFICAgICAgfCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERJX1BST1BfVFlQRV9DT01QT1NJVEUpCiBERElfUkVMQVRJVkVfQUREUkVTU0lORyA9ICJyZWxhdGl2ZS1hZGRyZXNzaW5nIgogRERJX0dFTkVSSUNfQUREUkVTU0lORyA9ICJnZW5lcmljLWFkZHJlc3NpbmciCiAKQEAgLTE3MDQsNyArMTcwNCw3IEBACiBERVZNQVBfQUxMT1dfUkVNQVAgPSAweDAyCiBERVZNQVBfVVNFX1BBR0VTSVpFID0gMHgwNAogREVWTUFQX1NFVFVQX0ZMQUdTID0gXAotCShERVZNQVBfTUFQUElOR19JTlZBTElEIHwgREVWTUFQX0FMTE9XX1JFTUFQIHwgREVWTUFQX1VTRV9QQUdFU0laRSkKKyAgICAgICAgKERFVk1BUF9NQVBQSU5HX0lOVkFMSUQgfCBERVZNQVBfQUxMT1dfUkVNQVAgfCBERVZNQVBfVVNFX1BBR0VTSVpFKQogREVWTUFQX1NFVFVQX0RPTkUgPSAweDEwMAogREVWTUFQX0xPQ0tfSU5JVEVEID0gMHgyMDAKIERFVk1BUF9GQVVMVElORyA9IDB4NDAwCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1zdW5vczUvU1VOQVVESU9ERVYucHkgYi9MaWIvcGxhdC1zdW5vczUvU1VOQVVESU9ERVYucHkKaW5kZXggYTgxYTJhYi4uNjMyMTM5ZiAxMDA3NTUKLS0tIGEvTGliL3BsYXQtc3Vub3M1L1NVTkFVRElPREVWLnB5CisrKyBiL0xpYi9wbGF0LXN1bm9zNS9TVU5BVURJT0RFVi5weQpAQCAtNiwyMSArNiwyMSBAQAogCiAjIEVuY29kaW5nIHR5cGVzLCBmb3IgZmllbGRzIGlfZW5jb2RpbmcgYW5kIG9fZW5jb2RpbmcKIAotRU5DT0RJTkdfTk9ORSA9IDAJCQkjIG5vIGVuY29kaW5nIGFzc2lnbmVkCi1FTkNPRElOR19VTEFXID0gMQkJCSMgdS1sYXcgZW5jb2RpbmcKLUVOQ09ESU5HX0FMQVcgPSAyCQkJIyBBLWxhdyBlbmNvZGluZwotRU5DT0RJTkdfTElORUFSID0gMwkJCSMgTGluZWFyIFBDTSBlbmNvZGluZworRU5DT0RJTkdfTk9ORSA9IDAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gZW5jb2RpbmcgYXNzaWduZWQKK0VOQ09ESU5HX1VMQVcgPSAxICAgICAgICAgICAgICAgICAgICAgICAjIHUtbGF3IGVuY29kaW5nCitFTkNPRElOR19BTEFXID0gMiAgICAgICAgICAgICAgICAgICAgICAgIyBBLWxhdyBlbmNvZGluZworRU5DT0RJTkdfTElORUFSID0gMyAgICAgICAgICAgICAgICAgICAgICMgTGluZWFyIFBDTSBlbmNvZGluZwogCiAjIEdhaW4gcmFuZ2VzIGZvciBpX2dhaW4sIG9fZ2FpbiBhbmQgbW9uaXRvcl9nYWluCiAKLU1JTl9HQUlOID0gMAkJCQkjIG1pbmltdW0gZ2FpbiB2YWx1ZQotTUFYX0dBSU4gPSAyNTUJCQkJIyBtYXhpbXVtIGdhaW4gdmFsdWUKK01JTl9HQUlOID0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1pbmltdW0gZ2FpbiB2YWx1ZQorTUFYX0dBSU4gPSAyNTUgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWF4aW11bSBnYWluIHZhbHVlCiAKICMgQmFsYW5jZSB2YWx1ZXMgZm9yIGlfYmFsYW5jZSBhbmQgb19iYWxhbmNlCiAKLUxFRlRfQkFMQU5DRSA9IDAJCQkjIGxlZnQgY2hhbm5lbCBvbmx5Ci1NSURfQkFMQU5DRSA9IDMyCQkJIyBlcXVhbCBsZWZ0L3JpZ2h0IGNoYW5uZWwKLVJJR0hUX0JBTEFOQ0UgPSA2NAkJCSMgcmlnaHQgY2hhbm5lbCBvbmx5CitMRUZUX0JBTEFOQ0UgPSAwICAgICAgICAgICAgICAgICAgICAgICAgIyBsZWZ0IGNoYW5uZWwgb25seQorTUlEX0JBTEFOQ0UgPSAzMiAgICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgbGVmdC9yaWdodCBjaGFubmVsCitSSUdIVF9CQUxBTkNFID0gNjQgICAgICAgICAgICAgICAgICAgICAgIyByaWdodCBjaGFubmVsIG9ubHkKIEJBTEFOQ0VfU0hJRlQgPSAzCiAKICMgUG9ydCBuYW1lcyBmb3IgaV9wb3J0IGFuZCBvX3BvcnQKQEAgLTMwLDExICszMCwxMSBAQAogUE9SVF9DID0gMwogUE9SVF9EID0gNAogCi1TUEVBS0VSID0gMHgwMQkJCQkjIG91dHB1dCB0byBidWlsdC1pbiBzcGVha2VyCi1IRUFEUEhPTkUgPSAweDAyCQkJIyBvdXRwdXQgdG8gaGVhZHBob25lIGphY2sKLUxJTkVfT1VUID0gMHgwNAkJCQkjIG91dHB1dCB0byBsaW5lIG91dAorU1BFQUtFUiA9IDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IHRvIGJ1aWx0LWluIHNwZWFrZXIKK0hFQURQSE9ORSA9IDB4MDIgICAgICAgICAgICAgICAgICAgICAgICAjIG91dHB1dCB0byBoZWFkcGhvbmUgamFjaworTElORV9PVVQgPSAweDA0ICAgICAgICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IHRvIGxpbmUgb3V0CiAKLU1JQ1JPUEhPTkUgPSAweDAxCQkJIyBpbnB1dCBmcm9tIG1pY3JvcGhvbmUKLUxJTkVfSU4gPSAweDAyCQkJCSMgaW5wdXQgZnJvbSBsaW5lIGluCitNSUNST1BIT05FID0gMHgwMSAgICAgICAgICAgICAgICAgICAgICAgIyBpbnB1dCBmcm9tIG1pY3JvcGhvbmUKK0xJTkVfSU4gPSAweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlucHV0IGZyb20gbGluZSBpbgogQ0QgPSAweDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5wdXQgZnJvbSBvbi1ib2FyZCBDRCBpbnB1dHMKIElOVEVSTkFMX0NEX0lOID0gQ0QgICAgICAgICAgICAgICAgICAgICAjIGlucHV0IGZyb20gaW50ZXJuYWwgQ0RST00KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LXN1bm9zNS9UWVBFUy5weSBiL0xpYi9wbGF0LXN1bm9zNS9UWVBFUy5weQppbmRleCBlNzEwNmRkLi5lOGU0YTAwIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1zdW5vczUvVFlQRVMucHkKKysrIGIvTGliL3BsYXQtc3Vub3M1L1RZUEVTLnB5CkBAIC0zMTEsNCArMzExLDMgQEAKIF9OQkJZID0gOAogTkJCWSA9IF9OQkJZCiBkZWYgRkRfWkVSTyhwKTogcmV0dXJuIGJ6ZXJvKChwKSwgc2l6ZW9mICgqKHApKSkKLQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtdW5peHdhcmU3L0lOLnB5IGIvTGliL3BsYXQtdW5peHdhcmU3L0lOLnB5CmluZGV4IDNmOTc2MDYuLmQ2NmFlOTcgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LXVuaXh3YXJlNy9JTi5weQorKysgYi9MaWIvcGxhdC11bml4d2FyZTcvSU4ucHkKQEAgLTE3MiwxMSArMTcyLDExIEBACiAjIEluY2x1ZGVkIGZyb20gc3lzL25ldGNvbmZpZy5oCiAKICMgSW5jbHVkZWQgZnJvbSBzeXMvY2RlZnMuaAotZGVmIF9fUChwcm90b3MpOiByZXR1cm4gcHJvdG9zCQkgCitkZWYgX19QKHByb3Rvcyk6IHJldHVybiBwcm90b3MKIAogZGVmIF9fU1RSSU5HKHgpOiByZXR1cm4gI3gKIAotZGVmIF9fUChwcm90b3MpOiByZXR1cm4gKCkJCSAKK2RlZiBfX1AocHJvdG9zKTogcmV0dXJuICgpCiAKIGRlZiBfX1NUUklORyh4KTogcmV0dXJuICJ4IgogCkBAIC00ODUsNyArNDg1LDcgQEAKIAogZGVmIEFUT01JQ19JTlRfREVDUihhdG9taWNfaW50cCk6IHJldHVybiBfQVRPTUlDX0lOVF9ERUNSKGF0b21pY19pbnRwKQogCi1kZWYgRlNQSU5fSU5JVChscCk6IHJldHVybiAgCitkZWYgRlNQSU5fSU5JVChscCk6IHJldHVybgogCiBkZWYgRlNQSU5fTE9DSyhsKTogcmV0dXJuIERJU0FCTEUoKQogCkBAIC00OTMsMTUgKzQ5MywxNSBAQAogCiBkZWYgRlNQSU5fVU5MT0NLKGwpOiByZXR1cm4gRU5BQkxFKCkKIAotZGVmIExPQ0tfREVJTklUKGxwKTogcmV0dXJuICAKK2RlZiBMT0NLX0RFSU5JVChscCk6IHJldHVybgogCi1kZWYgTE9DS19ERUFMTE9DKGxwKTogcmV0dXJuICAKK2RlZiBMT0NLX0RFQUxMT0MobHApOiByZXR1cm4KIAogZGVmIExPQ0tfT1dORUQobHApOiByZXR1cm4gKEJfVFJVRSkKIAotZGVmIFJXX0RFSU5JVChscCk6IHJldHVybiAgCitkZWYgUldfREVJTklUKGxwKTogcmV0dXJuCiAKLWRlZiBSV19ERUFMTE9DKGxwKTogcmV0dXJuICAKK2RlZiBSV19ERUFMTE9DKGxwKTogcmV0dXJuCiAKIGRlZiBSV19PV05FRChscCk6IHJldHVybiAoQl9UUlVFKQogCkBAIC01MTcsNyArNTE3LDcgQEAKIAogZGVmIFJXX1dSTE9DS19QTE1JTihsb2NrcCk6IHJldHVybiBMT0NLX1BMTUlOKGxvY2twKQogCi1kZWYgTE9DS19ERUlOSVQobCk6IHJldHVybiAgCitkZWYgTE9DS19ERUlOSVQobCk6IHJldHVybgogCiBkZWYgTE9DS19QTE1JTihsb2NrcCk6IHJldHVybiBMT0NLKChsb2NrcCksIFBMTUlOKQogCkBAIC01MzcsOSArNTM3LDkgQEAKIAogQ1JfTUxEUkVBTCA9IDB4MDAwMDAwMDEKIENSX1JEVU1QID0gMHgwMDAwMDAwMgotZGVmIGNyaG9sZChjcmVkcCk6IHJldHVybiBjcmhvbGRuKChjcmVkcCksIDEpCSAKK2RlZiBjcmhvbGQoY3JlZHApOiByZXR1cm4gY3Job2xkbigoY3JlZHApLCAxKQogCi1kZWYgY3JmcmVlKGNyZWRwKTogcmV0dXJuIGNyZnJlZW4oKGNyZWRwKSwgMSkJIAorZGVmIGNyZnJlZShjcmVkcCk6IHJldHVybiBjcmZyZWVuKChjcmVkcCksIDEpCiAKIAogIyBJbmNsdWRlZCBmcm9tIHN5cy9zdHJtZGVwLmgKQEAgLTgyMywxMSArODIzLDExIEBACiAKICMgSW5jbHVkZWQgZnJvbSBzeXMvaW5saW5lLmgKIElQX0hJRVJfQkFTRSA9ICgyMCkKLWRlZiBBU1NFUlRfTE9DSyh4KTogcmV0dXJuICAKK2RlZiBBU1NFUlRfTE9DSyh4KTogcmV0dXJuCiAKLWRlZiBBU1NFUlRfV1JMT0NLKHgpOiByZXR1cm4gIAorZGVmIEFTU0VSVF9XUkxPQ0soeCk6IHJldHVybgogCi1kZWYgQVNTRVJUX1VOTE9DSyh4KTogcmV0dXJuICAKK2RlZiBBU1NFUlRfVU5MT0NLKHgpOiByZXR1cm4KIAogZGVmIENBTlBVVChxKTogcmV0dXJuIGNhbnB1dCgocSkpCiAKZGlmZiAtLWdpdCBhL0xpYi9wb3NpeHBhdGgucHkgYi9MaWIvcG9zaXhwYXRoLnB5CmluZGV4IDIyMzUxN2UuLmEzNDRhMDcgMTAwNjQ0Ci0tLSBhL0xpYi9wb3NpeHBhdGgucHkKKysrIGIvTGliL3Bvc2l4cGF0aC5weQpAQCAtNDIwLDcgKzQyMCw3IEBACiAKIGRlZiBfcmVzb2x2ZV9saW5rKHBhdGgpOgogICAgICIiIkludGVybmFsIGhlbHBlciBmdW5jdGlvbi4gIFRha2VzIGEgcGF0aCBhbmQgZm9sbG93cyBzeW1saW5rcwotICAgIHVudGlsIHdlIGVpdGhlciBhcnJpdmUgYXQgc29tZXRoaW5nIHRoYXQgaXNuJ3QgYSBzeW1saW5rLCBvciAKKyAgICB1bnRpbCB3ZSBlaXRoZXIgYXJyaXZlIGF0IHNvbWV0aGluZyB0aGF0IGlzbid0IGEgc3ltbGluaywgb3IKICAgICBlbmNvdW50ZXIgYSBwYXRoIHdlJ3ZlIHNlZW4gYmVmb3JlIChtZWFuaW5nIHRoYXQgdGhlcmUncyBhIGxvb3ApLgogICAgICIiIgogICAgIHBhdGhzX3NlZW4gPSBbXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKaW5kZXggNmQ3MTIxOC4uMDYzOGY0ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CkBAIC0yNyw4ICsyNyw4IEBACiAgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2diaycpCiAgICAgY29kZWN0ZXN0cyA9ICgKICAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCi0gICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJzdHJpY3QiLCAgTm9uZSksICAKLSAgICAgICAgKCJhYmNceGM4IiwgInN0cmljdCIsICBOb25lKSwgIAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4YzgiLCAic3RyaWN0IiwgIE5vbmUpLAogICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhIiksCiAgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNFx4YzgiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhXHVmZmZkIiksCiAgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJpZ25vcmUiLCAgdSJhYmNcdTgwNGEiKSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weQppbmRleCA2ZjAwMWRlLi5iYTZmOTRkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NpdGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaXRlLnB5CkBAIC0xMTAsMTIgKzExMCwxMiBAQAogICAgICAgICAiIiJDcmVhdGUgYSAucHRoIGZpbGUgd2l0aCBhIGNvbW1lbnQsIGJsYW5rIGxpbmVzLCBhbiBgYGltcG9ydAogICAgICAgICA8c2VsZi5pbXBvcnRlZD5gYCwgYSBsaW5lIHdpdGggc2VsZi5nb29kX2Rpcm5hbWUsIGFuZCBhIGxpbmUgd2l0aAogICAgICAgICBzZWxmLmJhZF9kaXJuYW1lLgotICAgICAgICAKKwogICAgICAgICBDcmVhdGlvbiBvZiB0aGUgZGlyZWN0b3J5IGZvciBzZWxmLmdvb2RfZGlyX3BhdGggKGJhc2VkIG9mZiBvZgogICAgICAgICBzZWxmLmdvb2RfZGlybmFtZSkgaXMgYWxzbyBwZXJmb3JtZWQuCiAKICAgICAgICAgTWFrZSBzdXJlIHRvIGNhbGwgc2VsZi5jbGVhbnVwKCkgdG8gdW5kbyBhbnl0aGluZyBkb25lIGJ5IHRoaXMgbWV0aG9kLgotICAgICAgICAKKwogICAgICAgICAiIiIKICAgICAgICAgRklMRSA9IG9wZW4oc2VsZi5maWxlX3BhdGgsICd3VScpCiAgICAgICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhbnNmb3JtZXIucHkgYi9MaWIvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5CmluZGV4IDJiMGYxZTguLjZhOGM5OGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhbnNmb3JtZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFuc2Zvcm1lci5weQpAQCAtNCwyOSArNCwyOSBAQAogZnJvbSBjb21waWxlciBpbXBvcnQgY29tcGlsZQogCiBjbGFzcyBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gIAotICBkZWYgdGVzdE11bHRpcGxlTEhTKHNlbGYpOgotICAgICIiIiBUZXN0IG11bHRpcGxlIHRhcmdldHMgb24gdGhlIGxlZnQgaGFuZCBzaWRlLiAiIiIKLSAgICAKLSAgICBzbmlwcGV0cyA9IFsnYSwgYiA9IDEsIDInLAotICAgICAgICAgICAgICAgICcoYSwgYikgPSAxLCAyJywKLSAgICAgICAgICAgICAgICAnKChhLCBiKSwgYykgPSAoMSwgMiksIDMnXQogCi0gICAgZm9yIHMgaW4gc25pcHBldHM6Ci0gICAgICBhID0gdHJhbnNmb3JtZXIucGFyc2UocykKLSAgICAgIGFzc2VydCBpc2luc3RhbmNlKGEsIGFzdC5Nb2R1bGUpCi0gICAgICBjaGlsZDEgPSBhLmdldENoaWxkTm9kZXMoKVswXQotICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY2hpbGQxLCBhc3QuU3RtdCkKLSAgICAgIGNoaWxkMiA9IGNoaWxkMS5nZXRDaGlsZE5vZGVzKClbMF0KLSAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNoaWxkMiwgYXN0LkFzc2lnbikKLSAgICAgIAotICAgICAgIyBUaGlzIGFjdHVhbGx5IHRlc3RzIHRoZSBjb21waWxlciwgYnV0IGl0J3MgYSB3YXkgdG8gYXNzdXJlIHRoZSBhc3QgCi0gICAgICAjIGlzIGNvcnJlY3QKLSAgICAgIGMgPSBjb21waWxlKHMsICc8c3RyaW5nPicsICdzaW5nbGUnKQotICAgICAgdmFscyA9IHt9Ci0gICAgICBleGVjIGMgaW4gdmFscwotICAgICAgYXNzZXJ0IHZhbHNbJ2EnXSA9PSAxCi0gICAgICBhc3NlcnQgdmFsc1snYiddID09IDIKKyAgICBkZWYgdGVzdE11bHRpcGxlTEhTKHNlbGYpOgorICAgICAgICAiIiIgVGVzdCBtdWx0aXBsZSB0YXJnZXRzIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZS4gIiIiCisKKyAgICAgICAgc25pcHBldHMgPSBbJ2EsIGIgPSAxLCAyJywKKyAgICAgICAgICAgICAgICAgICAgJyhhLCBiKSA9IDEsIDInLAorICAgICAgICAgICAgICAgICAgICAnKChhLCBiKSwgYykgPSAoMSwgMiksIDMnXQorCisgICAgICAgIGZvciBzIGluIHNuaXBwZXRzOgorICAgICAgICAgICAgYSA9IHRyYW5zZm9ybWVyLnBhcnNlKHMpCisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShhLCBhc3QuTW9kdWxlKQorICAgICAgICAgICAgY2hpbGQxID0gYS5nZXRDaGlsZE5vZGVzKClbMF0KKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNoaWxkMSwgYXN0LlN0bXQpCisgICAgICAgICAgICBjaGlsZDIgPSBjaGlsZDEuZ2V0Q2hpbGROb2RlcygpWzBdCisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShjaGlsZDIsIGFzdC5Bc3NpZ24pCisKKyAgICAgICAgICAgICMgVGhpcyBhY3R1YWxseSB0ZXN0cyB0aGUgY29tcGlsZXIsIGJ1dCBpdCdzIGEgd2F5IHRvIGFzc3VyZSB0aGUgYXN0CisgICAgICAgICAgICAjIGlzIGNvcnJlY3QKKyAgICAgICAgICAgIGMgPSBjb21waWxlKHMsICc8c3RyaW5nPicsICdzaW5nbGUnKQorICAgICAgICAgICAgdmFscyA9IHt9CisgICAgICAgICAgICBleGVjIGMgaW4gdmFscworICAgICAgICAgICAgYXNzZXJ0IHZhbHNbJ2EnXSA9PSAxCisgICAgICAgICAgICBhc3NlcnQgdmFsc1snYiddID09IDIKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliLnB5IGIvTGliL3VybGxpYi5weQppbmRleCBmNDcyZDQyLi4yOTY5ZWYwIDEwMDY0NAotLS0gYS9MaWIvdXJsbGliLnB5CisrKyBiL0xpYi91cmxsaWIucHkKQEAgLTEyMjMsNyArMTIyMyw3IEBACiAKICAgICBkZWYgZ2V0cHJveGllcygpOgogICAgICAgICByZXR1cm4gZ2V0cHJveGllc19lbnZpcm9ubWVudCgpIG9yIGdldHByb3hpZXNfaW50ZXJuZXRjb25maWcoKQotICAgICAgICAKKwogZWxpZiBvcy5uYW1lID09ICdudCc6CiAgICAgZGVmIGdldHByb3hpZXNfcmVnaXN0cnkoKToKICAgICAgICAgIiIiUmV0dXJuIGEgZGljdGlvbmFyeSBvZiBzY2hlbWUgLT4gcHJveHkgc2VydmVyIFVSTCBtYXBwaW5ncy4KZGlmZiAtLWdpdCBhL0xpYi94bWwvc2F4L19leGNlcHRpb25zLnB5IGIvTGliL3htbC9zYXgvX2V4Y2VwdGlvbnMucHkKaW5kZXggNjI4ZTgwZC4uZmRkNjE0YSAxMDA2NDQKLS0tIGEvTGliL3htbC9zYXgvX2V4Y2VwdGlvbnMucHkKKysrIGIvTGliL3htbC9zYXgvX2V4Y2VwdGlvbnMucHkKQEAgLTkzLDEwICs5MywxMCBAQAogICAgICAgICAgICAgc3lzaWQgPSAiPHVua25vd24+IgogICAgICAgICBsaW5lbnVtID0gc2VsZi5nZXRMaW5lTnVtYmVyKCkKICAgICAgICAgaWYgbGluZW51bSBpcyBOb25lOgotICAgICAgICAgICBsaW5lbnVtID0gIj8iCisgICAgICAgICAgICBsaW5lbnVtID0gIj8iCiAgICAgICAgIGNvbG51bSA9IHNlbGYuZ2V0Q29sdW1uTnVtYmVyKCkKICAgICAgICAgaWYgY29sbnVtIGlzIE5vbmU6Ci0gICAgICAgICAgIGNvbG51bSA9ICI/IgorICAgICAgICAgICAgY29sbnVtID0gIj8iCiAgICAgICAgIHJldHVybiAiJXM6JXM6JXM6ICVzIiAlIChzeXNpZCwgbGluZW51bSwgY29sbnVtLCBzZWxmLl9tc2cpCiAKIApkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vUElDVGJyb3dzZS9JQ09OYnJvd3NlLnB5IGIvTWFjL0RlbW8vUElDVGJyb3dzZS9JQ09OYnJvd3NlLnB5CmluZGV4IDExOTRiN2UuLjcwMWVmN2YgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL1BJQ1Ricm93c2UvSUNPTmJyb3dzZS5weQorKysgYi9NYWMvRGVtby9QSUNUYnJvd3NlL0lDT05icm93c2UucHkKQEAgLTI3LDEzNyArMjcsMTM3IEBACiBNQVhIRUlHSFQ9MzIwCiAKIGRlZiBtYWluKCk6Ci0JbWFjcmVzb3VyY2UubmVlZCgnRExPRycsIElEX01BSU4sICJQSUNUYnJvd3NlLnJzcmMiKQotCUlDT05icm93c2UoKQorICAgIG1hY3Jlc291cmNlLm5lZWQoJ0RMT0cnLCBJRF9NQUlOLCAiUElDVGJyb3dzZS5yc3JjIikKKyAgICBJQ09OYnJvd3NlKCkKIAogY2xhc3MgSUNPTmJyb3dzZShGcmFtZVdvcmsuQXBwbGljYXRpb24pOgotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJIyBGaXJzdCBpbml0IG1lbnVzLCBldGMuCi0JCUZyYW1lV29yay5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQotCQkjIE5leHQgY3JlYXRlIG91ciBkaWFsb2cKLQkJc2VsZi5tYWluX2RpYWxvZyA9IE15RGlhbG9nKHNlbGYpCi0JCSMgTm93IG9wZW4gdGhlIGRpYWxvZwotCQljb250ZW50cyA9IHNlbGYuZmluZElDT05yZXNvdXJjZXMoKQotCQlzZWxmLm1haW5fZGlhbG9nLm9wZW4oSURfTUFJTiwgY29udGVudHMpCi0JCSMgRmluYWxseSwgZ28gaW50byB0aGUgZXZlbnQgbG9vcAotCQlzZWxmLm1haW5sb29wKCkKLQkKLQlkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKLQkJc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQotCQotCWRlZiBxdWl0KHNlbGYsICphcmdzKToKLQkJc2VsZi5fcXVpdCgpCi0JCQotCWRlZiBzaG93SUNPTihzZWxmLCByZXNpZCk6Ci0JCXcgPSBJQ09Od2luZG93KHNlbGYpCi0JCXcub3BlbihyZXNpZCkKLQkJI0Vhc3lEaWFsb2dzLk1lc3NhZ2UoJ1Nob3cgSUNPTiAlcicgJSAocmVzaWQsKSkKLQkJCi0JZGVmIGZpbmRJQ09OcmVzb3VyY2VzKHNlbGYpOgotCQludW0gPSBSZXMuQ291bnRSZXNvdXJjZXMoJ0lDT04nKQotCQlydiA9IFtdCi0JCWZvciBpIGluIHJhbmdlKDEsIG51bSsxKToKLQkJCVJlcy5TZXRSZXNMb2FkKDApCi0JCQl0cnk6Ci0JCQkJciA9IFJlcy5HZXRJbmRSZXNvdXJjZSgnSUNPTicsIGkpCi0JCQlmaW5hbGx5OgotCQkJCVJlcy5TZXRSZXNMb2FkKDEpCi0JCQlpZCwgdHlwZSwgbmFtZSA9IHIuR2V0UmVzSW5mbygpCi0JCQlydi5hcHBlbmQoKGlkLCBuYW1lKSkKLQkJcmV0dXJuIHJ2Ci0JCQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBGaXJzdCBpbml0IG1lbnVzLCBldGMuCisgICAgICAgIEZyYW1lV29yay5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQorICAgICAgICAjIE5leHQgY3JlYXRlIG91ciBkaWFsb2cKKyAgICAgICAgc2VsZi5tYWluX2RpYWxvZyA9IE15RGlhbG9nKHNlbGYpCisgICAgICAgICMgTm93IG9wZW4gdGhlIGRpYWxvZworICAgICAgICBjb250ZW50cyA9IHNlbGYuZmluZElDT05yZXNvdXJjZXMoKQorICAgICAgICBzZWxmLm1haW5fZGlhbG9nLm9wZW4oSURfTUFJTiwgY29udGVudHMpCisgICAgICAgICMgRmluYWxseSwgZ28gaW50byB0aGUgZXZlbnQgbG9vcAorICAgICAgICBzZWxmLm1haW5sb29wKCkKKworICAgIGRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVtZW51ID0gbSA9IEZyYW1lV29yay5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQorICAgICAgICBzZWxmLnF1aXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCisKKyAgICBkZWYgcXVpdChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgZGVmIHNob3dJQ09OKHNlbGYsIHJlc2lkKToKKyAgICAgICAgdyA9IElDT053aW5kb3coc2VsZikKKyAgICAgICAgdy5vcGVuKHJlc2lkKQorICAgICAgICAjRWFzeURpYWxvZ3MuTWVzc2FnZSgnU2hvdyBJQ09OICVyJyAlIChyZXNpZCwpKQorCisgICAgZGVmIGZpbmRJQ09OcmVzb3VyY2VzKHNlbGYpOgorICAgICAgICBudW0gPSBSZXMuQ291bnRSZXNvdXJjZXMoJ0lDT04nKQorICAgICAgICBydiA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIG51bSsxKToKKyAgICAgICAgICAgIFJlcy5TZXRSZXNMb2FkKDApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgciA9IFJlcy5HZXRJbmRSZXNvdXJjZSgnSUNPTicsIGkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIFJlcy5TZXRSZXNMb2FkKDEpCisgICAgICAgICAgICBpZCwgdHlwZSwgbmFtZSA9IHIuR2V0UmVzSW5mbygpCisgICAgICAgICAgICBydi5hcHBlbmQoKGlkLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIHJ2CisKIGNsYXNzIElDT053aW5kb3coRnJhbWVXb3JrLldpbmRvdyk6Ci0JZGVmIG9wZW4oc2VsZiwgKHJlc2lkLCByZXNuYW1lKSk6Ci0JCWlmIG5vdCByZXNuYW1lOgotCQkJcmVzbmFtZSA9ICcjJXInICUgKHJlc2lkLCkKLQkJc2VsZi5yZXNpZCA9IHJlc2lkCi0JCXNlbGYucGljdHVyZSA9IEljbi5HZXRJY29uKHNlbGYucmVzaWQpCi0JCWwsIHQsIHIsIGIgPSAwLCAwLCAzMiwgMzIKLQkJc2VsZi5waWN0cmVjdCA9IChsLCB0LCByLCBiKQotCQl3aWR0aCA9IHItbAotCQloZWlnaHQgPSBiLXQKLQkJaWYgd2lkdGggPCBNSU5XSURUSDogd2lkdGggPSBNSU5XSURUSAotCQllbGlmIHdpZHRoID4gTUFYV0lEVEg6IHdpZHRoID0gTUFYV0lEVEgKLQkJaWYgaGVpZ2h0IDwgTUlOSEVJR0hUOiBoZWlnaHQgPSBNSU5IRUlHSFQKLQkJZWxpZiBoZWlnaHQgPiBNQVhIRUlHSFQ6IGhlaWdodCA9IE1BWEhFSUdIVAotCQlib3VuZHMgPSAoTEVGVCwgVE9QLCBMRUZUK3dpZHRoLCBUT1AraGVpZ2h0KQotCQkKLQkJc2VsZi53aWQgPSBXaW4uTmV3V2luZG93KGJvdW5kcywgcmVzbmFtZSwgMSwgMCwgLTEsIDEsIDApCi0JCXNlbGYuZG9fcG9zdG9wZW4oKQotCQkKLQlkZWYgZG9fdXBkYXRlKHNlbGYsICphcmdzKToKLQkJY3VycmVjdCA9IHNlbGYuZml0cmVjdCgpCi0JCUljbi5QbG90SWNvbihjdXJyZWN0LCBzZWxmLnBpY3R1cmUpCi0JCQotCWRlZiBmaXRyZWN0KHNlbGYpOgotCQkiIiJSZXR1cm4gc2VsZi5waWN0cmVjdCBzY2FsZWQgdG8gZml0IGluIHdpbmRvdyIiIgotCQlncmFmID0gc2VsZi53aWQuR2V0V2luZG93UG9ydCgpCi0JCXNjcmVlbnJlY3QgPSBncmFmLkdldFBvcnRCb3VuZHMoKQotCQlwaWN3aWR0aCA9IHNlbGYucGljdHJlY3RbMl0gLSBzZWxmLnBpY3RyZWN0WzBdCi0JCXBpY2hlaWdodCA9IHNlbGYucGljdHJlY3RbM10gLSBzZWxmLnBpY3RyZWN0WzFdCi0JCWlmIHBpY3dpZHRoID4gc2NyZWVucmVjdFsyXSAtIHNjcmVlbnJlY3RbMF06Ci0JCQlmYWN0b3IgPSBmbG9hdChwaWN3aWR0aCkgLyBmbG9hdChzY3JlZW5yZWN0WzJdLXNjcmVlbnJlY3RbMF0pCi0JCQlwaWN3aWR0aCA9IHBpY3dpZHRoIC8gZmFjdG9yCi0JCQlwaWNoZWlnaHQgPSBwaWNoZWlnaHQgLyBmYWN0b3IKLQkJaWYgcGljaGVpZ2h0ID4gc2NyZWVucmVjdFszXSAtIHNjcmVlbnJlY3RbMV06Ci0JCQlmYWN0b3IgPSBmbG9hdChwaWNoZWlnaHQpIC8gZmxvYXQoc2NyZWVucmVjdFszXS1zY3JlZW5yZWN0WzFdKQotCQkJcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgotCQkJcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCi0JCXJldHVybiAoc2NyZWVucmVjdFswXSwgc2NyZWVucmVjdFsxXSwgc2NyZWVucmVjdFswXStpbnQocGljd2lkdGgpLAotCQkJCXNjcmVlbnJlY3RbMV0raW50KHBpY2hlaWdodCkpCi0JCQorICAgIGRlZiBvcGVuKHNlbGYsIChyZXNpZCwgcmVzbmFtZSkpOgorICAgICAgICBpZiBub3QgcmVzbmFtZToKKyAgICAgICAgICAgIHJlc25hbWUgPSAnIyVyJyAlIChyZXNpZCwpCisgICAgICAgIHNlbGYucmVzaWQgPSByZXNpZAorICAgICAgICBzZWxmLnBpY3R1cmUgPSBJY24uR2V0SWNvbihzZWxmLnJlc2lkKQorICAgICAgICBsLCB0LCByLCBiID0gMCwgMCwgMzIsIDMyCisgICAgICAgIHNlbGYucGljdHJlY3QgPSAobCwgdCwgciwgYikKKyAgICAgICAgd2lkdGggPSByLWwKKyAgICAgICAgaGVpZ2h0ID0gYi10CisgICAgICAgIGlmIHdpZHRoIDwgTUlOV0lEVEg6IHdpZHRoID0gTUlOV0lEVEgKKyAgICAgICAgZWxpZiB3aWR0aCA+IE1BWFdJRFRIOiB3aWR0aCA9IE1BWFdJRFRICisgICAgICAgIGlmIGhlaWdodCA8IE1JTkhFSUdIVDogaGVpZ2h0ID0gTUlOSEVJR0hUCisgICAgICAgIGVsaWYgaGVpZ2h0ID4gTUFYSEVJR0hUOiBoZWlnaHQgPSBNQVhIRUlHSFQKKyAgICAgICAgYm91bmRzID0gKExFRlQsIFRPUCwgTEVGVCt3aWR0aCwgVE9QK2hlaWdodCkKKworICAgICAgICBzZWxmLndpZCA9IFdpbi5OZXdXaW5kb3coYm91bmRzLCByZXNuYW1lLCAxLCAwLCAtMSwgMSwgMCkKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisKKyAgICBkZWYgZG9fdXBkYXRlKHNlbGYsICphcmdzKToKKyAgICAgICAgY3VycmVjdCA9IHNlbGYuZml0cmVjdCgpCisgICAgICAgIEljbi5QbG90SWNvbihjdXJyZWN0LCBzZWxmLnBpY3R1cmUpCisKKyAgICBkZWYgZml0cmVjdChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHNlbGYucGljdHJlY3Qgc2NhbGVkIHRvIGZpdCBpbiB3aW5kb3ciIiIKKyAgICAgICAgZ3JhZiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKQorICAgICAgICBzY3JlZW5yZWN0ID0gZ3JhZi5HZXRQb3J0Qm91bmRzKCkKKyAgICAgICAgcGljd2lkdGggPSBzZWxmLnBpY3RyZWN0WzJdIC0gc2VsZi5waWN0cmVjdFswXQorICAgICAgICBwaWNoZWlnaHQgPSBzZWxmLnBpY3RyZWN0WzNdIC0gc2VsZi5waWN0cmVjdFsxXQorICAgICAgICBpZiBwaWN3aWR0aCA+IHNjcmVlbnJlY3RbMl0gLSBzY3JlZW5yZWN0WzBdOgorICAgICAgICAgICAgZmFjdG9yID0gZmxvYXQocGljd2lkdGgpIC8gZmxvYXQoc2NyZWVucmVjdFsyXS1zY3JlZW5yZWN0WzBdKQorICAgICAgICAgICAgcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgorICAgICAgICAgICAgcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCisgICAgICAgIGlmIHBpY2hlaWdodCA+IHNjcmVlbnJlY3RbM10gLSBzY3JlZW5yZWN0WzFdOgorICAgICAgICAgICAgZmFjdG9yID0gZmxvYXQocGljaGVpZ2h0KSAvIGZsb2F0KHNjcmVlbnJlY3RbM10tc2NyZWVucmVjdFsxXSkKKyAgICAgICAgICAgIHBpY3dpZHRoID0gcGljd2lkdGggLyBmYWN0b3IKKyAgICAgICAgICAgIHBpY2hlaWdodCA9IHBpY2hlaWdodCAvIGZhY3RvcgorICAgICAgICByZXR1cm4gKHNjcmVlbnJlY3RbMF0sIHNjcmVlbnJlY3RbMV0sIHNjcmVlbnJlY3RbMF0raW50KHBpY3dpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbnJlY3RbMV0raW50KHBpY2hlaWdodCkpCisKIGNsYXNzIE15RGlhbG9nKEZyYW1lV29yay5EaWFsb2dXaW5kb3cpOgotCSJNYWluIGRpYWxvZyB3aW5kb3cgZm9yIElDT05icm93c2UiCisgICAgIk1haW4gZGlhbG9nIHdpbmRvdyBmb3IgSUNPTmJyb3dzZSIKIAotCWRlZiBvcGVuKHNlbGYsIGlkLCBjb250ZW50cyk6Ci0JCXNlbGYuaWQgPSBpZAotCQlGcmFtZVdvcmsuRGlhbG9nV2luZG93Lm9wZW4oc2VsZiwgSURfTUFJTikKLQkJc2VsZi5kbGcuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oTUFJTl9TSE9XKQotCQlzZWxmLmNvbnRlbnRzID0gY29udGVudHMKLQkJc2VsZi5jdGwgPSBzZWxmLmRsZy5HZXREaWFsb2dJdGVtQXNDb250cm9sKE1BSU5fTElTVCkKLQkJaCA9IHNlbGYuY3RsLkdldENvbnRyb2xEYXRhX0hhbmRsZShDb250cm9scy5rQ29udHJvbExpc3RCb3hQYXJ0LCAKLQkJCQlDb250cm9scy5rQ29udHJvbExpc3RCb3hMaXN0SGFuZGxlVGFnKQotCQlzZWxmLmxpc3QgPSBMaXN0LmFzX0xpc3QoaCkKLQkJc2VsZi5zZXRsaXN0KCkKKyAgICBkZWYgb3BlbihzZWxmLCBpZCwgY29udGVudHMpOgorICAgICAgICBzZWxmLmlkID0gaWQKKyAgICAgICAgRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdy5vcGVuKHNlbGYsIElEX01BSU4pCisgICAgICAgIHNlbGYuZGxnLlNldERpYWxvZ0RlZmF1bHRJdGVtKE1BSU5fU0hPVykKKyAgICAgICAgc2VsZi5jb250ZW50cyA9IGNvbnRlbnRzCisgICAgICAgIHNlbGYuY3RsID0gc2VsZi5kbGcuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChNQUlOX0xJU1QpCisgICAgICAgIGggPSBzZWxmLmN0bC5HZXRDb250cm9sRGF0YV9IYW5kbGUoQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94UGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xzLmtDb250cm9sTGlzdEJveExpc3RIYW5kbGVUYWcpCisgICAgICAgIHNlbGYubGlzdCA9IExpc3QuYXNfTGlzdChoKQorICAgICAgICBzZWxmLnNldGxpc3QoKQogCi0JZGVmIHNldGxpc3Qoc2VsZik6Ci0JCXNlbGYubGlzdC5MRGVsUm93KDAsIDApCi0JCXNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMCkKLQkJaWYgc2VsZi5jb250ZW50czoKLQkJCXNlbGYubGlzdC5MQWRkUm93KGxlbihzZWxmLmNvbnRlbnRzKSwgMCkKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLmNvbnRlbnRzKSk6Ci0JCQkJdiA9IHJlcHIoc2VsZi5jb250ZW50c1tpXVswXSkKLQkJCQlpZiBzZWxmLmNvbnRlbnRzW2ldWzFdOgotCQkJCQl2ID0gdiArICciJyArIHNlbGYuY29udGVudHNbaV1bMV0gKyAnIicKLQkJCQlzZWxmLmxpc3QuTFNldENlbGwodiwgKDAsIGkpKQotCQlzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDEpCi0JCXNlbGYubGlzdC5MVXBkYXRlKHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCi0JCQotCWRlZiBnZXRzZWxlY3Rpb24oc2VsZik6Ci0JCWl0ZW1zID0gW10KLQkJcG9pbnQgPSAoMCwwKQotCQl3aGlsZSAxOgotCQkJb2ssIHBvaW50ID0gc2VsZi5saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCi0JCQlpZiBub3Qgb2s6Ci0JCQkJYnJlYWsKLQkJCWl0ZW1zLmFwcGVuZChwb2ludFsxXSkKLQkJCXBvaW50ID0gcG9pbnRbMF0sIHBvaW50WzFdKzEKLQkJdmFsdWVzID0gW10KLQkJZm9yIGkgaW4gaXRlbXM6Ci0JCQl2YWx1ZXMuYXBwZW5kKHNlbGYuY29udGVudHNbaV0pCi0JCXJldHVybiB2YWx1ZXMKLQkJCi0JZGVmIGRvX3Nob3coc2VsZiwgKmFyZ3MpOgotCQlzZWxlY3Rpb24gPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCWZvciByZXNpZCBpbiBzZWxlY3Rpb246Ci0JCQlzZWxmLnBhcmVudC5zaG93SUNPTihyZXNpZCkKLQkJCi0JZGVmIGRvX2Nsb3NlKHNlbGYpOgotCQlzZWxmLmNsb3NlKCkKLQkJCi0JZGVmIGRvX2l0ZW1oaXQoc2VsZiwgaXRlbSwgZXZlbnQpOgotCQlpZiBpdGVtID09IE1BSU5fU0hPVzoKLQkJCXNlbGYuZG9fc2hvdygpCisgICAgZGVmIHNldGxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYubGlzdC5MRGVsUm93KDAsIDApCisgICAgICAgIHNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMCkKKyAgICAgICAgaWYgc2VsZi5jb250ZW50czoKKyAgICAgICAgICAgIHNlbGYubGlzdC5MQWRkUm93KGxlbihzZWxmLmNvbnRlbnRzKSwgMCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmNvbnRlbnRzKSk6CisgICAgICAgICAgICAgICAgdiA9IHJlcHIoc2VsZi5jb250ZW50c1tpXVswXSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbnRlbnRzW2ldWzFdOgorICAgICAgICAgICAgICAgICAgICB2ID0gdiArICciJyArIHNlbGYuY29udGVudHNbaV1bMV0gKyAnIicKKyAgICAgICAgICAgICAgICBzZWxmLmxpc3QuTFNldENlbGwodiwgKDAsIGkpKQorICAgICAgICBzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDEpCisgICAgICAgIHNlbGYubGlzdC5MVXBkYXRlKHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCisKKyAgICBkZWYgZ2V0c2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgIHBvaW50ID0gKDAsMCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIG9rLCBwb2ludCA9IHNlbGYubGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQorICAgICAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpdGVtcy5hcHBlbmQocG9pbnRbMV0pCisgICAgICAgICAgICBwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCisgICAgICAgIHZhbHVlcyA9IFtdCisgICAgICAgIGZvciBpIGluIGl0ZW1zOgorICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChzZWxmLmNvbnRlbnRzW2ldKQorICAgICAgICByZXR1cm4gdmFsdWVzCisKKyAgICBkZWYgZG9fc2hvdyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGVjdGlvbiA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgZm9yIHJlc2lkIGluIHNlbGVjdGlvbjoKKyAgICAgICAgICAgIHNlbGYucGFyZW50LnNob3dJQ09OKHJlc2lkKQorCisgICAgZGVmIGRvX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBkb19pdGVtaGl0KHNlbGYsIGl0ZW0sIGV2ZW50KToKKyAgICAgICAgaWYgaXRlbSA9PSBNQUlOX1NIT1c6CisgICAgICAgICAgICBzZWxmLmRvX3Nob3coKQogCiBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL1BJQ1Ricm93c2UvUElDVGJyb3dzZS5weSBiL01hYy9EZW1vL1BJQ1Ricm93c2UvUElDVGJyb3dzZS5weQppbmRleCBlYWNlODY5Li4wYWRmYzgzIDEwMDY0NAotLS0gYS9NYWMvRGVtby9QSUNUYnJvd3NlL1BJQ1Ricm93c2UucHkKKysrIGIvTWFjL0RlbW8vUElDVGJyb3dzZS9QSUNUYnJvd3NlLnB5CkBAIC0yMiwxMjAgKzIyLDEyMCBAQAogVE9QPTY0CiAKIGRlZiBtYWluKCk6Ci0JbWFjcmVzb3VyY2UubmVlZCgnRExPRycsIElEX01BSU4sICJQSUNUYnJvd3NlLnJzcmMiKQotCVBJQ1Ricm93c2UoKQorICAgIG1hY3Jlc291cmNlLm5lZWQoJ0RMT0cnLCBJRF9NQUlOLCAiUElDVGJyb3dzZS5yc3JjIikKKyAgICBQSUNUYnJvd3NlKCkKIAogY2xhc3MgUElDVGJyb3dzZShGcmFtZVdvcmsuQXBwbGljYXRpb24pOgotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJIyBGaXJzdCBpbml0IG1lbnVzLCBldGMuCi0JCUZyYW1lV29yay5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQotCQkjIE5leHQgY3JlYXRlIG91ciBkaWFsb2cKLQkJc2VsZi5tYWluX2RpYWxvZyA9IE15RGlhbG9nKHNlbGYpCi0JCSMgTm93IG9wZW4gdGhlIGRpYWxvZwotCQljb250ZW50cyA9IHNlbGYuZmluZFBJQ1RyZXNvdXJjZXMoKQotCQlzZWxmLm1haW5fZGlhbG9nLm9wZW4oSURfTUFJTiwgY29udGVudHMpCi0JCSMgRmluYWxseSwgZ28gaW50byB0aGUgZXZlbnQgbG9vcAotCQlzZWxmLm1haW5sb29wKCkKLQkKLQlkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKLQkJc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQotCQotCWRlZiBxdWl0KHNlbGYsICphcmdzKToKLQkJc2VsZi5fcXVpdCgpCi0JCQotCWRlZiBzaG93UElDVChzZWxmLCByZXNpZCk6Ci0JCXcgPSBQSUNUd2luZG93KHNlbGYpCi0JCXcub3BlbihyZXNpZCkKLQkJI0Vhc3lEaWFsb2dzLk1lc3NhZ2UoJ1Nob3cgUElDVCAlcicgJSAocmVzaWQsKSkKLQkJCi0JZGVmIGZpbmRQSUNUcmVzb3VyY2VzKHNlbGYpOgotCQludW0gPSBSZXMuQ291bnRSZXNvdXJjZXMoJ1BJQ1QnKQotCQlydiA9IFtdCi0JCWZvciBpIGluIHJhbmdlKDEsIG51bSsxKToKLQkJCVJlcy5TZXRSZXNMb2FkKDApCi0JCQl0cnk6Ci0JCQkJciA9IFJlcy5HZXRJbmRSZXNvdXJjZSgnUElDVCcsIGkpCi0JCQlmaW5hbGx5OgotCQkJCVJlcy5TZXRSZXNMb2FkKDEpCi0JCQlpZCwgdHlwZSwgbmFtZSA9IHIuR2V0UmVzSW5mbygpCi0JCQlydi5hcHBlbmQoKGlkLCBuYW1lKSkKLQkJcmV0dXJuIHJ2Ci0JCQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBGaXJzdCBpbml0IG1lbnVzLCBldGMuCisgICAgICAgIEZyYW1lV29yay5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQorICAgICAgICAjIE5leHQgY3JlYXRlIG91ciBkaWFsb2cKKyAgICAgICAgc2VsZi5tYWluX2RpYWxvZyA9IE15RGlhbG9nKHNlbGYpCisgICAgICAgICMgTm93IG9wZW4gdGhlIGRpYWxvZworICAgICAgICBjb250ZW50cyA9IHNlbGYuZmluZFBJQ1RyZXNvdXJjZXMoKQorICAgICAgICBzZWxmLm1haW5fZGlhbG9nLm9wZW4oSURfTUFJTiwgY29udGVudHMpCisgICAgICAgICMgRmluYWxseSwgZ28gaW50byB0aGUgZXZlbnQgbG9vcAorICAgICAgICBzZWxmLm1haW5sb29wKCkKKworICAgIGRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVtZW51ID0gbSA9IEZyYW1lV29yay5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQorICAgICAgICBzZWxmLnF1aXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCisKKyAgICBkZWYgcXVpdChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgZGVmIHNob3dQSUNUKHNlbGYsIHJlc2lkKToKKyAgICAgICAgdyA9IFBJQ1R3aW5kb3coc2VsZikKKyAgICAgICAgdy5vcGVuKHJlc2lkKQorICAgICAgICAjRWFzeURpYWxvZ3MuTWVzc2FnZSgnU2hvdyBQSUNUICVyJyAlIChyZXNpZCwpKQorCisgICAgZGVmIGZpbmRQSUNUcmVzb3VyY2VzKHNlbGYpOgorICAgICAgICBudW0gPSBSZXMuQ291bnRSZXNvdXJjZXMoJ1BJQ1QnKQorICAgICAgICBydiA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIG51bSsxKToKKyAgICAgICAgICAgIFJlcy5TZXRSZXNMb2FkKDApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgciA9IFJlcy5HZXRJbmRSZXNvdXJjZSgnUElDVCcsIGkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIFJlcy5TZXRSZXNMb2FkKDEpCisgICAgICAgICAgICBpZCwgdHlwZSwgbmFtZSA9IHIuR2V0UmVzSW5mbygpCisgICAgICAgICAgICBydi5hcHBlbmQoKGlkLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIHJ2CisKIGNsYXNzIFBJQ1R3aW5kb3coRnJhbWVXb3JrLldpbmRvdyk6Ci0JZGVmIG9wZW4oc2VsZiwgKHJlc2lkLCByZXNuYW1lKSk6Ci0JCWlmIG5vdCByZXNuYW1lOgotCQkJcmVzbmFtZSA9ICcjJXInICUgKHJlc2lkLCkKLQkJc2VsZi5yZXNpZCA9IHJlc2lkCi0JCXBpY3R1cmUgPSBRZC5HZXRQaWN0dXJlKHNlbGYucmVzaWQpCi0JCSMgR2V0IHJlY3QgZm9yIHBpY3R1cmUKLQkJcHJpbnQgcmVwcihwaWN0dXJlLmRhdGFbOjE2XSkKLQkJc3osIHQsIGwsIGIsIHIgPSBzdHJ1Y3QudW5wYWNrKCdoaGhoaCcsIHBpY3R1cmUuZGF0YVs6MTBdKQotCQlwcmludCAncGljdDonLCB0LCBsLCBiLCByCi0JCXdpZHRoID0gci1sCi0JCWhlaWdodCA9IGItdAotCQlpZiB3aWR0aCA8IDY0OiB3aWR0aCA9IDY0Ci0JCWVsaWYgd2lkdGggPiA0ODA6IHdpZHRoID0gNDgwCi0JCWlmIGhlaWdodCA8IDY0OiBoZWlnaHQgPSA2NAotCQllbGlmIGhlaWdodCA+IDMyMDogaGVpZ2h0ID0gMzIwCi0JCWJvdW5kcyA9IChMRUZULCBUT1AsIExFRlQrd2lkdGgsIFRPUCtoZWlnaHQpCi0JCXByaW50ICdib3VuZHM6JywgYm91bmRzCi0JCQotCQlzZWxmLndpZCA9IFdpbi5OZXdXaW5kb3coYm91bmRzLCByZXNuYW1lLCAxLCAwLCAtMSwgMSwgMCkKLQkJc2VsZi53aWQuU2V0V2luZG93UGljKHBpY3R1cmUpCi0JCXNlbGYuZG9fcG9zdG9wZW4oKQotCQkKKyAgICBkZWYgb3BlbihzZWxmLCAocmVzaWQsIHJlc25hbWUpKToKKyAgICAgICAgaWYgbm90IHJlc25hbWU6CisgICAgICAgICAgICByZXNuYW1lID0gJyMlcicgJSAocmVzaWQsKQorICAgICAgICBzZWxmLnJlc2lkID0gcmVzaWQKKyAgICAgICAgcGljdHVyZSA9IFFkLkdldFBpY3R1cmUoc2VsZi5yZXNpZCkKKyAgICAgICAgIyBHZXQgcmVjdCBmb3IgcGljdHVyZQorICAgICAgICBwcmludCByZXByKHBpY3R1cmUuZGF0YVs6MTZdKQorICAgICAgICBzeiwgdCwgbCwgYiwgciA9IHN0cnVjdC51bnBhY2soJ2hoaGhoJywgcGljdHVyZS5kYXRhWzoxMF0pCisgICAgICAgIHByaW50ICdwaWN0OicsIHQsIGwsIGIsIHIKKyAgICAgICAgd2lkdGggPSByLWwKKyAgICAgICAgaGVpZ2h0ID0gYi10CisgICAgICAgIGlmIHdpZHRoIDwgNjQ6IHdpZHRoID0gNjQKKyAgICAgICAgZWxpZiB3aWR0aCA+IDQ4MDogd2lkdGggPSA0ODAKKyAgICAgICAgaWYgaGVpZ2h0IDwgNjQ6IGhlaWdodCA9IDY0CisgICAgICAgIGVsaWYgaGVpZ2h0ID4gMzIwOiBoZWlnaHQgPSAzMjAKKyAgICAgICAgYm91bmRzID0gKExFRlQsIFRPUCwgTEVGVCt3aWR0aCwgVE9QK2hlaWdodCkKKyAgICAgICAgcHJpbnQgJ2JvdW5kczonLCBib3VuZHMKKworICAgICAgICBzZWxmLndpZCA9IFdpbi5OZXdXaW5kb3coYm91bmRzLCByZXNuYW1lLCAxLCAwLCAtMSwgMSwgMCkKKyAgICAgICAgc2VsZi53aWQuU2V0V2luZG93UGljKHBpY3R1cmUpCisgICAgICAgIHNlbGYuZG9fcG9zdG9wZW4oKQorCiBjbGFzcyBNeURpYWxvZyhGcmFtZVdvcmsuRGlhbG9nV2luZG93KToKLQkiTWFpbiBkaWFsb2cgd2luZG93IGZvciBQSUNUYnJvd3NlIgorICAgICJNYWluIGRpYWxvZyB3aW5kb3cgZm9yIFBJQ1Ricm93c2UiCiAKLQlkZWYgb3BlbihzZWxmLCBpZCwgY29udGVudHMpOgotCQlzZWxmLmlkID0gaWQKLQkJRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdy5vcGVuKHNlbGYsIElEX01BSU4pCi0JCXNlbGYuZGxnLlNldERpYWxvZ0RlZmF1bHRJdGVtKE1BSU5fU0hPVykKLQkJc2VsZi5jb250ZW50cyA9IGNvbnRlbnRzCi0JCXNlbGYuY3RsID0gc2VsZi5kbGcuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChNQUlOX0xJU1QpCi0JCWggPSBzZWxmLmN0bC5HZXRDb250cm9sRGF0YV9IYW5kbGUoQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94UGFydCwgCi0JCQkJQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94TGlzdEhhbmRsZVRhZykKLQkJc2VsZi5saXN0ID0gTGlzdC5hc19MaXN0KGgpCi0JCXNlbGYuc2V0bGlzdCgpCisgICAgZGVmIG9wZW4oc2VsZiwgaWQsIGNvbnRlbnRzKToKKyAgICAgICAgc2VsZi5pZCA9IGlkCisgICAgICAgIEZyYW1lV29yay5EaWFsb2dXaW5kb3cub3BlbihzZWxmLCBJRF9NQUlOKQorICAgICAgICBzZWxmLmRsZy5TZXREaWFsb2dEZWZhdWx0SXRlbShNQUlOX1NIT1cpCisgICAgICAgIHNlbGYuY29udGVudHMgPSBjb250ZW50cworICAgICAgICBzZWxmLmN0bCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woTUFJTl9MSVNUKQorICAgICAgICBoID0gc2VsZi5jdGwuR2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xzLmtDb250cm9sTGlzdEJveFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9scy5rQ29udHJvbExpc3RCb3hMaXN0SGFuZGxlVGFnKQorICAgICAgICBzZWxmLmxpc3QgPSBMaXN0LmFzX0xpc3QoaCkKKyAgICAgICAgc2VsZi5zZXRsaXN0KCkKIAotCWRlZiBzZXRsaXN0KHNlbGYpOgotCQlzZWxmLmxpc3QuTERlbFJvdygwLCAwKQotCQlzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDApCi0JCWlmIHNlbGYuY29udGVudHM6Ci0JCQlzZWxmLmxpc3QuTEFkZFJvdyhsZW4oc2VsZi5jb250ZW50cyksIDApCi0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5jb250ZW50cykpOgotCQkJCXYgPSByZXByKHNlbGYuY29udGVudHNbaV1bMF0pCi0JCQkJaWYgc2VsZi5jb250ZW50c1tpXVsxXToKLQkJCQkJdiA9IHYgKyAnIicgKyBzZWxmLmNvbnRlbnRzW2ldWzFdICsgJyInCi0JCQkJc2VsZi5saXN0LkxTZXRDZWxsKHYsICgwLCBpKSkKLQkJc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgxKQotCQlzZWxmLmxpc3QuTFVwZGF0ZShzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQotCQkKLQlkZWYgZ2V0c2VsZWN0aW9uKHNlbGYpOgotCQlpdGVtcyA9IFtdCi0JCXBvaW50ID0gKDAsMCkKLQkJd2hpbGUgMToKLQkJCW9rLCBwb2ludCA9IHNlbGYubGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQotCQkJaWYgbm90IG9rOgotCQkJCWJyZWFrCi0JCQlpdGVtcy5hcHBlbmQocG9pbnRbMV0pCi0JCQlwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCi0JCXZhbHVlcyA9IFtdCi0JCWZvciBpIGluIGl0ZW1zOgotCQkJdmFsdWVzLmFwcGVuZChzZWxmLmNvbnRlbnRzW2ldKQotCQlyZXR1cm4gdmFsdWVzCi0JCQotCWRlZiBkb19zaG93KHNlbGYsICphcmdzKToKLQkJc2VsZWN0aW9uID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQlmb3IgcmVzaWQgaW4gc2VsZWN0aW9uOgotCQkJc2VsZi5wYXJlbnQuc2hvd1BJQ1QocmVzaWQpCi0JCQotCWRlZiBkb19jbG9zZShzZWxmKToKLQkJc2VsZi5jbG9zZSgpCi0JCQotCWRlZiBkb19pdGVtaGl0KHNlbGYsIGl0ZW0sIGV2ZW50KToKLQkJaWYgaXRlbSA9PSBNQUlOX1NIT1c6Ci0JCQlzZWxmLmRvX3Nob3coKQorICAgIGRlZiBzZXRsaXN0KHNlbGYpOgorICAgICAgICBzZWxmLmxpc3QuTERlbFJvdygwLCAwKQorICAgICAgICBzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDApCisgICAgICAgIGlmIHNlbGYuY29udGVudHM6CisgICAgICAgICAgICBzZWxmLmxpc3QuTEFkZFJvdyhsZW4oc2VsZi5jb250ZW50cyksIDApCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5jb250ZW50cykpOgorICAgICAgICAgICAgICAgIHYgPSByZXByKHNlbGYuY29udGVudHNbaV1bMF0pCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jb250ZW50c1tpXVsxXToKKyAgICAgICAgICAgICAgICAgICAgdiA9IHYgKyAnIicgKyBzZWxmLmNvbnRlbnRzW2ldWzFdICsgJyInCisgICAgICAgICAgICAgICAgc2VsZi5saXN0LkxTZXRDZWxsKHYsICgwLCBpKSkKKyAgICAgICAgc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgxKQorICAgICAgICBzZWxmLmxpc3QuTFVwZGF0ZShzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBwb2ludCA9ICgwLDApCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBvaywgcG9pbnQgPSBzZWxmLmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKKyAgICAgICAgICAgIGlmIG5vdCBvazoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHBvaW50WzFdKQorICAgICAgICAgICAgcG9pbnQgPSBwb2ludFswXSwgcG9pbnRbMV0rMQorICAgICAgICB2YWx1ZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiBpdGVtczoKKyAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoc2VsZi5jb250ZW50c1tpXSkKKyAgICAgICAgcmV0dXJuIHZhbHVlcworCisgICAgZGVmIGRvX3Nob3coc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIGZvciByZXNpZCBpbiBzZWxlY3Rpb246CisgICAgICAgICAgICBzZWxmLnBhcmVudC5zaG93UElDVChyZXNpZCkKKworICAgIGRlZiBkb19jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZG9faXRlbWhpdChzZWxmLCBpdGVtLCBldmVudCk6CisgICAgICAgIGlmIGl0ZW0gPT0gTUFJTl9TSE9XOgorICAgICAgICAgICAgc2VsZi5kb19zaG93KCkKIAogbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvRGVtby9QSUNUYnJvd3NlL1BJQ1Ricm93c2UyLnB5IGIvTWFjL0RlbW8vUElDVGJyb3dzZS9QSUNUYnJvd3NlMi5weQppbmRleCA4NzVjOTliLi44NGNmOGI4IDEwMDY0NAotLS0gYS9NYWMvRGVtby9QSUNUYnJvd3NlL1BJQ1Ricm93c2UyLnB5CisrKyBiL01hYy9EZW1vL1BJQ1Ricm93c2UvUElDVGJyb3dzZTIucHkKQEAgLTI2LDEzOCArMjYsMTM4IEBACiBNQVhIRUlHSFQ9MzIwCiAKIGRlZiBtYWluKCk6Ci0JbWFjcmVzb3VyY2UubmVlZCgnRExPRycsIElEX01BSU4sICJQSUNUYnJvd3NlLnJzcmMiKQotCVBJQ1Ricm93c2UoKQorICAgIG1hY3Jlc291cmNlLm5lZWQoJ0RMT0cnLCBJRF9NQUlOLCAiUElDVGJyb3dzZS5yc3JjIikKKyAgICBQSUNUYnJvd3NlKCkKIAogY2xhc3MgUElDVGJyb3dzZShGcmFtZVdvcmsuQXBwbGljYXRpb24pOgotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJIyBGaXJzdCBpbml0IG1lbnVzLCBldGMuCi0JCUZyYW1lV29yay5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQotCQkjIE5leHQgY3JlYXRlIG91ciBkaWFsb2cKLQkJc2VsZi5tYWluX2RpYWxvZyA9IE15RGlhbG9nKHNlbGYpCi0JCSMgTm93IG9wZW4gdGhlIGRpYWxvZwotCQljb250ZW50cyA9IHNlbGYuZmluZFBJQ1RyZXNvdXJjZXMoKQotCQlzZWxmLm1haW5fZGlhbG9nLm9wZW4oSURfTUFJTiwgY29udGVudHMpCi0JCSMgRmluYWxseSwgZ28gaW50byB0aGUgZXZlbnQgbG9vcAotCQlzZWxmLm1haW5sb29wKCkKLQkKLQlkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKLQkJc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQotCQotCWRlZiBxdWl0KHNlbGYsICphcmdzKToKLQkJc2VsZi5fcXVpdCgpCi0JCQotCWRlZiBzaG93UElDVChzZWxmLCByZXNpZCk6Ci0JCXcgPSBQSUNUd2luZG93KHNlbGYpCi0JCXcub3BlbihyZXNpZCkKLQkJI0Vhc3lEaWFsb2dzLk1lc3NhZ2UoJ1Nob3cgUElDVCAlcicgJSAocmVzaWQsKSkKLQkJCi0JZGVmIGZpbmRQSUNUcmVzb3VyY2VzKHNlbGYpOgotCQludW0gPSBSZXMuQ291bnRSZXNvdXJjZXMoJ1BJQ1QnKQotCQlydiA9IFtdCi0JCWZvciBpIGluIHJhbmdlKDEsIG51bSsxKToKLQkJCVJlcy5TZXRSZXNMb2FkKDApCi0JCQl0cnk6Ci0JCQkJciA9IFJlcy5HZXRJbmRSZXNvdXJjZSgnUElDVCcsIGkpCi0JCQlmaW5hbGx5OgotCQkJCVJlcy5TZXRSZXNMb2FkKDEpCi0JCQlpZCwgdHlwZSwgbmFtZSA9IHIuR2V0UmVzSW5mbygpCi0JCQlydi5hcHBlbmQoKGlkLCBuYW1lKSkKLQkJcmV0dXJuIHJ2Ci0JCQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBGaXJzdCBpbml0IG1lbnVzLCBldGMuCisgICAgICAgIEZyYW1lV29yay5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQorICAgICAgICAjIE5leHQgY3JlYXRlIG91ciBkaWFsb2cKKyAgICAgICAgc2VsZi5tYWluX2RpYWxvZyA9IE15RGlhbG9nKHNlbGYpCisgICAgICAgICMgTm93IG9wZW4gdGhlIGRpYWxvZworICAgICAgICBjb250ZW50cyA9IHNlbGYuZmluZFBJQ1RyZXNvdXJjZXMoKQorICAgICAgICBzZWxmLm1haW5fZGlhbG9nLm9wZW4oSURfTUFJTiwgY29udGVudHMpCisgICAgICAgICMgRmluYWxseSwgZ28gaW50byB0aGUgZXZlbnQgbG9vcAorICAgICAgICBzZWxmLm1haW5sb29wKCkKKworICAgIGRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVtZW51ID0gbSA9IEZyYW1lV29yay5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQorICAgICAgICBzZWxmLnF1aXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCisKKyAgICBkZWYgcXVpdChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgZGVmIHNob3dQSUNUKHNlbGYsIHJlc2lkKToKKyAgICAgICAgdyA9IFBJQ1R3aW5kb3coc2VsZikKKyAgICAgICAgdy5vcGVuKHJlc2lkKQorICAgICAgICAjRWFzeURpYWxvZ3MuTWVzc2FnZSgnU2hvdyBQSUNUICVyJyAlIChyZXNpZCwpKQorCisgICAgZGVmIGZpbmRQSUNUcmVzb3VyY2VzKHNlbGYpOgorICAgICAgICBudW0gPSBSZXMuQ291bnRSZXNvdXJjZXMoJ1BJQ1QnKQorICAgICAgICBydiA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIG51bSsxKToKKyAgICAgICAgICAgIFJlcy5TZXRSZXNMb2FkKDApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgciA9IFJlcy5HZXRJbmRSZXNvdXJjZSgnUElDVCcsIGkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIFJlcy5TZXRSZXNMb2FkKDEpCisgICAgICAgICAgICBpZCwgdHlwZSwgbmFtZSA9IHIuR2V0UmVzSW5mbygpCisgICAgICAgICAgICBydi5hcHBlbmQoKGlkLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIHJ2CisKIGNsYXNzIFBJQ1R3aW5kb3coRnJhbWVXb3JrLldpbmRvdyk6Ci0JZGVmIG9wZW4oc2VsZiwgKHJlc2lkLCByZXNuYW1lKSk6Ci0JCWlmIG5vdCByZXNuYW1lOgotCQkJcmVzbmFtZSA9ICcjJXInICUgKHJlc2lkLCkKLQkJc2VsZi5yZXNpZCA9IHJlc2lkCi0JCXNlbGYucGljdHVyZSA9IFFkLkdldFBpY3R1cmUoc2VsZi5yZXNpZCkKLQkJIyBHZXQgcmVjdCBmb3IgcGljdHVyZQotCQlzeiwgdCwgbCwgYiwgciA9IHN0cnVjdC51bnBhY2soJ2hoaGhoJywgc2VsZi5waWN0dXJlLmRhdGFbOjEwXSkKLQkJc2VsZi5waWN0cmVjdCA9IChsLCB0LCByLCBiKQotCQl3aWR0aCA9IHItbAotCQloZWlnaHQgPSBiLXQKLQkJaWYgd2lkdGggPCBNSU5XSURUSDogd2lkdGggPSBNSU5XSURUSAotCQllbGlmIHdpZHRoID4gTUFYV0lEVEg6IHdpZHRoID0gTUFYV0lEVEgKLQkJaWYgaGVpZ2h0IDwgTUlOSEVJR0hUOiBoZWlnaHQgPSBNSU5IRUlHSFQKLQkJZWxpZiBoZWlnaHQgPiBNQVhIRUlHSFQ6IGhlaWdodCA9IE1BWEhFSUdIVAotCQlib3VuZHMgPSAoTEVGVCwgVE9QLCBMRUZUK3dpZHRoLCBUT1AraGVpZ2h0KQotCQkKLQkJc2VsZi53aWQgPSBXaW4uTmV3V2luZG93KGJvdW5kcywgcmVzbmFtZSwgMSwgMCwgLTEsIDEsIDApCi0JCXNlbGYuZG9fcG9zdG9wZW4oKQotCQkKLQlkZWYgZG9fdXBkYXRlKHNlbGYsICphcmdzKToKLQkJY3VycmVjdCA9IHNlbGYuZml0cmVjdCgpCi0JCVFkLkRyYXdQaWN0dXJlKHNlbGYucGljdHVyZSwgY3VycmVjdCkKLQkJCi0JZGVmIGZpdHJlY3Qoc2VsZik6Ci0JCSIiIlJldHVybiBzZWxmLnBpY3RyZWN0IHNjYWxlZCB0byBmaXQgaW4gd2luZG93IiIiCi0JCWdyYWYgPSBzZWxmLmRsZy5HZXRXaW5kb3dQb3J0KCkKLQkJc2NyZWVucmVjdCA9IGdyYWYuR2V0UG9ydEJvdW5kcygpCi0JCXBpY3dpZHRoID0gc2VsZi5waWN0cmVjdFsyXSAtIHNlbGYucGljdHJlY3RbMF0KLQkJcGljaGVpZ2h0ID0gc2VsZi5waWN0cmVjdFszXSAtIHNlbGYucGljdHJlY3RbMV0KLQkJaWYgcGljd2lkdGggPiBzY3JlZW5yZWN0WzJdIC0gc2NyZWVucmVjdFswXToKLQkJCWZhY3RvciA9IGZsb2F0KHBpY3dpZHRoKSAvIGZsb2F0KHNjcmVlbnJlY3RbMl0tc2NyZWVucmVjdFswXSkKLQkJCXBpY3dpZHRoID0gcGljd2lkdGggLyBmYWN0b3IKLQkJCXBpY2hlaWdodCA9IHBpY2hlaWdodCAvIGZhY3RvcgotCQlpZiBwaWNoZWlnaHQgPiBzY3JlZW5yZWN0WzNdIC0gc2NyZWVucmVjdFsxXToKLQkJCWZhY3RvciA9IGZsb2F0KHBpY2hlaWdodCkgLyBmbG9hdChzY3JlZW5yZWN0WzNdLXNjcmVlbnJlY3RbMV0pCi0JCQlwaWN3aWR0aCA9IHBpY3dpZHRoIC8gZmFjdG9yCi0JCQlwaWNoZWlnaHQgPSBwaWNoZWlnaHQgLyBmYWN0b3IKLQkJcmV0dXJuIChzY3JlZW5yZWN0WzBdLCBzY3JlZW5yZWN0WzFdLCBzY3JlZW5yZWN0WzBdK2ludChwaWN3aWR0aCksCi0JCQkJc2NyZWVucmVjdFsxXStpbnQocGljaGVpZ2h0KSkKLQkJCisgICAgZGVmIG9wZW4oc2VsZiwgKHJlc2lkLCByZXNuYW1lKSk6CisgICAgICAgIGlmIG5vdCByZXNuYW1lOgorICAgICAgICAgICAgcmVzbmFtZSA9ICcjJXInICUgKHJlc2lkLCkKKyAgICAgICAgc2VsZi5yZXNpZCA9IHJlc2lkCisgICAgICAgIHNlbGYucGljdHVyZSA9IFFkLkdldFBpY3R1cmUoc2VsZi5yZXNpZCkKKyAgICAgICAgIyBHZXQgcmVjdCBmb3IgcGljdHVyZQorICAgICAgICBzeiwgdCwgbCwgYiwgciA9IHN0cnVjdC51bnBhY2soJ2hoaGhoJywgc2VsZi5waWN0dXJlLmRhdGFbOjEwXSkKKyAgICAgICAgc2VsZi5waWN0cmVjdCA9IChsLCB0LCByLCBiKQorICAgICAgICB3aWR0aCA9IHItbAorICAgICAgICBoZWlnaHQgPSBiLXQKKyAgICAgICAgaWYgd2lkdGggPCBNSU5XSURUSDogd2lkdGggPSBNSU5XSURUSAorICAgICAgICBlbGlmIHdpZHRoID4gTUFYV0lEVEg6IHdpZHRoID0gTUFYV0lEVEgKKyAgICAgICAgaWYgaGVpZ2h0IDwgTUlOSEVJR0hUOiBoZWlnaHQgPSBNSU5IRUlHSFQKKyAgICAgICAgZWxpZiBoZWlnaHQgPiBNQVhIRUlHSFQ6IGhlaWdodCA9IE1BWEhFSUdIVAorICAgICAgICBib3VuZHMgPSAoTEVGVCwgVE9QLCBMRUZUK3dpZHRoLCBUT1AraGVpZ2h0KQorCisgICAgICAgIHNlbGYud2lkID0gV2luLk5ld1dpbmRvdyhib3VuZHMsIHJlc25hbWUsIDEsIDAsIC0xLCAxLCAwKQorICAgICAgICBzZWxmLmRvX3Bvc3RvcGVuKCkKKworICAgIGRlZiBkb191cGRhdGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBjdXJyZWN0ID0gc2VsZi5maXRyZWN0KCkKKyAgICAgICAgUWQuRHJhd1BpY3R1cmUoc2VsZi5waWN0dXJlLCBjdXJyZWN0KQorCisgICAgZGVmIGZpdHJlY3Qoc2VsZik6CisgICAgICAgICIiIlJldHVybiBzZWxmLnBpY3RyZWN0IHNjYWxlZCB0byBmaXQgaW4gd2luZG93IiIiCisgICAgICAgIGdyYWYgPSBzZWxmLmRsZy5HZXRXaW5kb3dQb3J0KCkKKyAgICAgICAgc2NyZWVucmVjdCA9IGdyYWYuR2V0UG9ydEJvdW5kcygpCisgICAgICAgIHBpY3dpZHRoID0gc2VsZi5waWN0cmVjdFsyXSAtIHNlbGYucGljdHJlY3RbMF0KKyAgICAgICAgcGljaGVpZ2h0ID0gc2VsZi5waWN0cmVjdFszXSAtIHNlbGYucGljdHJlY3RbMV0KKyAgICAgICAgaWYgcGljd2lkdGggPiBzY3JlZW5yZWN0WzJdIC0gc2NyZWVucmVjdFswXToKKyAgICAgICAgICAgIGZhY3RvciA9IGZsb2F0KHBpY3dpZHRoKSAvIGZsb2F0KHNjcmVlbnJlY3RbMl0tc2NyZWVucmVjdFswXSkKKyAgICAgICAgICAgIHBpY3dpZHRoID0gcGljd2lkdGggLyBmYWN0b3IKKyAgICAgICAgICAgIHBpY2hlaWdodCA9IHBpY2hlaWdodCAvIGZhY3RvcgorICAgICAgICBpZiBwaWNoZWlnaHQgPiBzY3JlZW5yZWN0WzNdIC0gc2NyZWVucmVjdFsxXToKKyAgICAgICAgICAgIGZhY3RvciA9IGZsb2F0KHBpY2hlaWdodCkgLyBmbG9hdChzY3JlZW5yZWN0WzNdLXNjcmVlbnJlY3RbMV0pCisgICAgICAgICAgICBwaWN3aWR0aCA9IHBpY3dpZHRoIC8gZmFjdG9yCisgICAgICAgICAgICBwaWNoZWlnaHQgPSBwaWNoZWlnaHQgLyBmYWN0b3IKKyAgICAgICAgcmV0dXJuIChzY3JlZW5yZWN0WzBdLCBzY3JlZW5yZWN0WzFdLCBzY3JlZW5yZWN0WzBdK2ludChwaWN3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5yZWN0WzFdK2ludChwaWNoZWlnaHQpKQorCiBjbGFzcyBNeURpYWxvZyhGcmFtZVdvcmsuRGlhbG9nV2luZG93KToKLQkiTWFpbiBkaWFsb2cgd2luZG93IGZvciBQSUNUYnJvd3NlIgorICAgICJNYWluIGRpYWxvZyB3aW5kb3cgZm9yIFBJQ1Ricm93c2UiCiAKLQlkZWYgb3BlbihzZWxmLCBpZCwgY29udGVudHMpOgotCQlzZWxmLmlkID0gaWQKLQkJRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdy5vcGVuKHNlbGYsIElEX01BSU4pCi0JCXNlbGYuZGxnLlNldERpYWxvZ0RlZmF1bHRJdGVtKE1BSU5fU0hPVykKLQkJc2VsZi5jb250ZW50cyA9IGNvbnRlbnRzCi0JCXNlbGYuY3RsID0gc2VsZi5kbGcuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChNQUlOX0xJU1QpCi0JCWggPSBzZWxmLmN0bC5HZXRDb250cm9sRGF0YV9IYW5kbGUoQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94UGFydCwgCi0JCQkJQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94TGlzdEhhbmRsZVRhZykKLQkJc2VsZi5saXN0ID0gTGlzdC5hc19MaXN0KGgpCi0JCXNlbGYuc2V0bGlzdCgpCisgICAgZGVmIG9wZW4oc2VsZiwgaWQsIGNvbnRlbnRzKToKKyAgICAgICAgc2VsZi5pZCA9IGlkCisgICAgICAgIEZyYW1lV29yay5EaWFsb2dXaW5kb3cub3BlbihzZWxmLCBJRF9NQUlOKQorICAgICAgICBzZWxmLmRsZy5TZXREaWFsb2dEZWZhdWx0SXRlbShNQUlOX1NIT1cpCisgICAgICAgIHNlbGYuY29udGVudHMgPSBjb250ZW50cworICAgICAgICBzZWxmLmN0bCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woTUFJTl9MSVNUKQorICAgICAgICBoID0gc2VsZi5jdGwuR2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xzLmtDb250cm9sTGlzdEJveFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9scy5rQ29udHJvbExpc3RCb3hMaXN0SGFuZGxlVGFnKQorICAgICAgICBzZWxmLmxpc3QgPSBMaXN0LmFzX0xpc3QoaCkKKyAgICAgICAgc2VsZi5zZXRsaXN0KCkKIAotCWRlZiBzZXRsaXN0KHNlbGYpOgotCQlzZWxmLmxpc3QuTERlbFJvdygwLCAwKQotCQlzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDApCi0JCWlmIHNlbGYuY29udGVudHM6Ci0JCQlzZWxmLmxpc3QuTEFkZFJvdyhsZW4oc2VsZi5jb250ZW50cyksIDApCi0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5jb250ZW50cykpOgotCQkJCXYgPSByZXByKHNlbGYuY29udGVudHNbaV1bMF0pCi0JCQkJaWYgc2VsZi5jb250ZW50c1tpXVsxXToKLQkJCQkJdiA9IHYgKyAnIicgKyBzZWxmLmNvbnRlbnRzW2ldWzFdICsgJyInCi0JCQkJc2VsZi5saXN0LkxTZXRDZWxsKHYsICgwLCBpKSkKLQkJc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgxKQotCQlzZWxmLmxpc3QuTFVwZGF0ZShzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQotCQkKLQlkZWYgZ2V0c2VsZWN0aW9uKHNlbGYpOgotCQlpdGVtcyA9IFtdCi0JCXBvaW50ID0gKDAsMCkKLQkJd2hpbGUgMToKLQkJCW9rLCBwb2ludCA9IHNlbGYubGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQotCQkJaWYgbm90IG9rOgotCQkJCWJyZWFrCi0JCQlpdGVtcy5hcHBlbmQocG9pbnRbMV0pCi0JCQlwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCi0JCXZhbHVlcyA9IFtdCi0JCWZvciBpIGluIGl0ZW1zOgotCQkJdmFsdWVzLmFwcGVuZChzZWxmLmNvbnRlbnRzW2ldKQotCQlyZXR1cm4gdmFsdWVzCi0JCQotCWRlZiBkb19zaG93KHNlbGYsICphcmdzKToKLQkJc2VsZWN0aW9uID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQlmb3IgcmVzaWQgaW4gc2VsZWN0aW9uOgotCQkJc2VsZi5wYXJlbnQuc2hvd1BJQ1QocmVzaWQpCi0JCQotCWRlZiBkb19jbG9zZShzZWxmKToKLQkJc2VsZi5jbG9zZSgpCi0JCQotCWRlZiBkb19pdGVtaGl0KHNlbGYsIGl0ZW0sIGV2ZW50KToKLQkJaWYgaXRlbSA9PSBNQUlOX1NIT1c6Ci0JCQlzZWxmLmRvX3Nob3coKQorICAgIGRlZiBzZXRsaXN0KHNlbGYpOgorICAgICAgICBzZWxmLmxpc3QuTERlbFJvdygwLCAwKQorICAgICAgICBzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDApCisgICAgICAgIGlmIHNlbGYuY29udGVudHM6CisgICAgICAgICAgICBzZWxmLmxpc3QuTEFkZFJvdyhsZW4oc2VsZi5jb250ZW50cyksIDApCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5jb250ZW50cykpOgorICAgICAgICAgICAgICAgIHYgPSByZXByKHNlbGYuY29udGVudHNbaV1bMF0pCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jb250ZW50c1tpXVsxXToKKyAgICAgICAgICAgICAgICAgICAgdiA9IHYgKyAnIicgKyBzZWxmLmNvbnRlbnRzW2ldWzFdICsgJyInCisgICAgICAgICAgICAgICAgc2VsZi5saXN0LkxTZXRDZWxsKHYsICgwLCBpKSkKKyAgICAgICAgc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgxKQorICAgICAgICBzZWxmLmxpc3QuTFVwZGF0ZShzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBwb2ludCA9ICgwLDApCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBvaywgcG9pbnQgPSBzZWxmLmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKKyAgICAgICAgICAgIGlmIG5vdCBvazoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHBvaW50WzFdKQorICAgICAgICAgICAgcG9pbnQgPSBwb2ludFswXSwgcG9pbnRbMV0rMQorICAgICAgICB2YWx1ZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiBpdGVtczoKKyAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoc2VsZi5jb250ZW50c1tpXSkKKyAgICAgICAgcmV0dXJuIHZhbHVlcworCisgICAgZGVmIGRvX3Nob3coc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIGZvciByZXNpZCBpbiBzZWxlY3Rpb246CisgICAgICAgICAgICBzZWxmLnBhcmVudC5zaG93UElDVChyZXNpZCkKKworICAgIGRlZiBkb19jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZG9faXRlbWhpdChzZWxmLCBpdGVtLCBldmVudCk6CisgICAgICAgIGlmIGl0ZW0gPT0gTUFJTl9TSE9XOgorICAgICAgICAgICAgc2VsZi5kb19zaG93KCkKIAogbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvRGVtby9QSUNUYnJvd3NlL2NpY25icm93c2UucHkgYi9NYWMvRGVtby9QSUNUYnJvd3NlL2NpY25icm93c2UucHkKaW5kZXggZTNkNzk3Mi4uZDk1ZTdjOCAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vUElDVGJyb3dzZS9jaWNuYnJvd3NlLnB5CisrKyBiL01hYy9EZW1vL1BJQ1Ricm93c2UvY2ljbmJyb3dzZS5weQpAQCAtMjcsMTM3ICsyNywxMzcgQEAKIE1BWEhFSUdIVD0zMjAKIAogZGVmIG1haW4oKToKLQltYWNyZXNvdXJjZS5uZWVkKCdETE9HJywgSURfTUFJTiwgIlBJQ1Ricm93c2UucnNyYyIpCi0JQ0ljb25icm93c2UoKQorICAgIG1hY3Jlc291cmNlLm5lZWQoJ0RMT0cnLCBJRF9NQUlOLCAiUElDVGJyb3dzZS5yc3JjIikKKyAgICBDSWNvbmJyb3dzZSgpCiAKIGNsYXNzIENJY29uYnJvd3NlKEZyYW1lV29yay5BcHBsaWNhdGlvbik6Ci0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQkjIEZpcnN0IGluaXQgbWVudXMsIGV0Yy4KLQkJRnJhbWVXb3JrLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCi0JCSMgTmV4dCBjcmVhdGUgb3VyIGRpYWxvZwotCQlzZWxmLm1haW5fZGlhbG9nID0gTXlEaWFsb2coc2VsZikKLQkJIyBOb3cgb3BlbiB0aGUgZGlhbG9nCi0JCWNvbnRlbnRzID0gc2VsZi5maW5kY2ljbnJlc291cmNlcygpCi0JCXNlbGYubWFpbl9kaWFsb2cub3BlbihJRF9NQUlOLCBjb250ZW50cykKLQkJIyBGaW5hbGx5LCBnbyBpbnRvIHRoZSBldmVudCBsb29wCi0JCXNlbGYubWFpbmxvb3AoKQotCQotCWRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgotCQlzZWxmLmZpbGVtZW51ID0gbSA9IEZyYW1lV29yay5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQotCQlzZWxmLnF1aXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCi0JCi0JZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLl9xdWl0KCkKLQkJCi0JZGVmIHNob3dDSWNvbihzZWxmLCByZXNpZCk6Ci0JCXcgPSBDSWNvbndpbmRvdyhzZWxmKQotCQl3Lm9wZW4ocmVzaWQpCi0JCSNFYXN5RGlhbG9ncy5NZXNzYWdlKCdTaG93IGNpY24gJXInICUgKHJlc2lkLCkpCi0JCQotCWRlZiBmaW5kY2ljbnJlc291cmNlcyhzZWxmKToKLQkJbnVtID0gUmVzLkNvdW50UmVzb3VyY2VzKCdjaWNuJykKLQkJcnYgPSBbXQotCQlmb3IgaSBpbiByYW5nZSgxLCBudW0rMSk6Ci0JCQlSZXMuU2V0UmVzTG9hZCgwKQotCQkJdHJ5OgotCQkJCXIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ2NpY24nLCBpKQotCQkJZmluYWxseToKLQkJCQlSZXMuU2V0UmVzTG9hZCgxKQotCQkJaWQsIHR5cGUsIG5hbWUgPSByLkdldFJlc0luZm8oKQotCQkJcnYuYXBwZW5kKChpZCwgbmFtZSkpCi0JCXJldHVybiBydgotCQkKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgRmlyc3QgaW5pdCBtZW51cywgZXRjLgorICAgICAgICBGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgIyBOZXh0IGNyZWF0ZSBvdXIgZGlhbG9nCisgICAgICAgIHNlbGYubWFpbl9kaWFsb2cgPSBNeURpYWxvZyhzZWxmKQorICAgICAgICAjIE5vdyBvcGVuIHRoZSBkaWFsb2cKKyAgICAgICAgY29udGVudHMgPSBzZWxmLmZpbmRjaWNucmVzb3VyY2VzKCkKKyAgICAgICAgc2VsZi5tYWluX2RpYWxvZy5vcGVuKElEX01BSU4sIGNvbnRlbnRzKQorICAgICAgICAjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKKyAgICAgICAgc2VsZi5tYWlubG9vcCgpCisKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQorCisgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgIGRlZiBzaG93Q0ljb24oc2VsZiwgcmVzaWQpOgorICAgICAgICB3ID0gQ0ljb253aW5kb3coc2VsZikKKyAgICAgICAgdy5vcGVuKHJlc2lkKQorICAgICAgICAjRWFzeURpYWxvZ3MuTWVzc2FnZSgnU2hvdyBjaWNuICVyJyAlIChyZXNpZCwpKQorCisgICAgZGVmIGZpbmRjaWNucmVzb3VyY2VzKHNlbGYpOgorICAgICAgICBudW0gPSBSZXMuQ291bnRSZXNvdXJjZXMoJ2NpY24nKQorICAgICAgICBydiA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIG51bSsxKToKKyAgICAgICAgICAgIFJlcy5TZXRSZXNMb2FkKDApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgciA9IFJlcy5HZXRJbmRSZXNvdXJjZSgnY2ljbicsIGkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIFJlcy5TZXRSZXNMb2FkKDEpCisgICAgICAgICAgICBpZCwgdHlwZSwgbmFtZSA9IHIuR2V0UmVzSW5mbygpCisgICAgICAgICAgICBydi5hcHBlbmQoKGlkLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIHJ2CisKIGNsYXNzIENJY29ud2luZG93KEZyYW1lV29yay5XaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIChyZXNpZCwgcmVzbmFtZSkpOgotCQlpZiBub3QgcmVzbmFtZToKLQkJCXJlc25hbWUgPSAnIyVyJyAlIChyZXNpZCwpCi0JCXNlbGYucmVzaWQgPSByZXNpZAotCQlzZWxmLnBpY3R1cmUgPSBJY24uR2V0Q0ljb24oc2VsZi5yZXNpZCkKLQkJbCwgdCwgciwgYiA9IDAsIDAsIDMyLCAzMgotCQlzZWxmLnBpY3RyZWN0ID0gKGwsIHQsIHIsIGIpCi0JCXdpZHRoID0gci1sCi0JCWhlaWdodCA9IGItdAotCQlpZiB3aWR0aCA8IE1JTldJRFRIOiB3aWR0aCA9IE1JTldJRFRICi0JCWVsaWYgd2lkdGggPiBNQVhXSURUSDogd2lkdGggPSBNQVhXSURUSAotCQlpZiBoZWlnaHQgPCBNSU5IRUlHSFQ6IGhlaWdodCA9IE1JTkhFSUdIVAotCQllbGlmIGhlaWdodCA+IE1BWEhFSUdIVDogaGVpZ2h0ID0gTUFYSEVJR0hUCi0JCWJvdW5kcyA9IChMRUZULCBUT1AsIExFRlQrd2lkdGgsIFRPUCtoZWlnaHQpCi0JCQotCQlzZWxmLndpZCA9IFdpbi5OZXdXaW5kb3coYm91bmRzLCByZXNuYW1lLCAxLCAwLCAtMSwgMSwgMCkKLQkJc2VsZi5kb19wb3N0b3BlbigpCi0JCQotCWRlZiBkb191cGRhdGUoc2VsZiwgKmFyZ3MpOgotCQljdXJyZWN0ID0gc2VsZi5maXRyZWN0KCkKLQkJSWNuLlBsb3RDSWNvbihjdXJyZWN0LCBzZWxmLnBpY3R1cmUpCi0JCQotCWRlZiBmaXRyZWN0KHNlbGYpOgotCQkiIiJSZXR1cm4gc2VsZi5waWN0cmVjdCBzY2FsZWQgdG8gZml0IGluIHdpbmRvdyIiIgotCQlncmFmID0gc2VsZi53aWQuR2V0V2luZG93UG9ydCgpCi0JCXNjcmVlbnJlY3QgPSBncmFmLkdldFBvcnRCb3VuZHMoKQotCQlwaWN3aWR0aCA9IHNlbGYucGljdHJlY3RbMl0gLSBzZWxmLnBpY3RyZWN0WzBdCi0JCXBpY2hlaWdodCA9IHNlbGYucGljdHJlY3RbM10gLSBzZWxmLnBpY3RyZWN0WzFdCi0JCWlmIHBpY3dpZHRoID4gc2NyZWVucmVjdFsyXSAtIHNjcmVlbnJlY3RbMF06Ci0JCQlmYWN0b3IgPSBmbG9hdChwaWN3aWR0aCkgLyBmbG9hdChzY3JlZW5yZWN0WzJdLXNjcmVlbnJlY3RbMF0pCi0JCQlwaWN3aWR0aCA9IHBpY3dpZHRoIC8gZmFjdG9yCi0JCQlwaWNoZWlnaHQgPSBwaWNoZWlnaHQgLyBmYWN0b3IKLQkJaWYgcGljaGVpZ2h0ID4gc2NyZWVucmVjdFszXSAtIHNjcmVlbnJlY3RbMV06Ci0JCQlmYWN0b3IgPSBmbG9hdChwaWNoZWlnaHQpIC8gZmxvYXQoc2NyZWVucmVjdFszXS1zY3JlZW5yZWN0WzFdKQotCQkJcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgotCQkJcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCi0JCXJldHVybiAoc2NyZWVucmVjdFswXSwgc2NyZWVucmVjdFsxXSwgc2NyZWVucmVjdFswXStpbnQocGljd2lkdGgpLAotCQkJCXNjcmVlbnJlY3RbMV0raW50KHBpY2hlaWdodCkpCi0JCQorICAgIGRlZiBvcGVuKHNlbGYsIChyZXNpZCwgcmVzbmFtZSkpOgorICAgICAgICBpZiBub3QgcmVzbmFtZToKKyAgICAgICAgICAgIHJlc25hbWUgPSAnIyVyJyAlIChyZXNpZCwpCisgICAgICAgIHNlbGYucmVzaWQgPSByZXNpZAorICAgICAgICBzZWxmLnBpY3R1cmUgPSBJY24uR2V0Q0ljb24oc2VsZi5yZXNpZCkKKyAgICAgICAgbCwgdCwgciwgYiA9IDAsIDAsIDMyLCAzMgorICAgICAgICBzZWxmLnBpY3RyZWN0ID0gKGwsIHQsIHIsIGIpCisgICAgICAgIHdpZHRoID0gci1sCisgICAgICAgIGhlaWdodCA9IGItdAorICAgICAgICBpZiB3aWR0aCA8IE1JTldJRFRIOiB3aWR0aCA9IE1JTldJRFRICisgICAgICAgIGVsaWYgd2lkdGggPiBNQVhXSURUSDogd2lkdGggPSBNQVhXSURUSAorICAgICAgICBpZiBoZWlnaHQgPCBNSU5IRUlHSFQ6IGhlaWdodCA9IE1JTkhFSUdIVAorICAgICAgICBlbGlmIGhlaWdodCA+IE1BWEhFSUdIVDogaGVpZ2h0ID0gTUFYSEVJR0hUCisgICAgICAgIGJvdW5kcyA9IChMRUZULCBUT1AsIExFRlQrd2lkdGgsIFRPUCtoZWlnaHQpCisKKyAgICAgICAgc2VsZi53aWQgPSBXaW4uTmV3V2luZG93KGJvdW5kcywgcmVzbmFtZSwgMSwgMCwgLTEsIDEsIDApCisgICAgICAgIHNlbGYuZG9fcG9zdG9wZW4oKQorCisgICAgZGVmIGRvX3VwZGF0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGN1cnJlY3QgPSBzZWxmLmZpdHJlY3QoKQorICAgICAgICBJY24uUGxvdENJY29uKGN1cnJlY3QsIHNlbGYucGljdHVyZSkKKworICAgIGRlZiBmaXRyZWN0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gc2VsZi5waWN0cmVjdCBzY2FsZWQgdG8gZml0IGluIHdpbmRvdyIiIgorICAgICAgICBncmFmID0gc2VsZi53aWQuR2V0V2luZG93UG9ydCgpCisgICAgICAgIHNjcmVlbnJlY3QgPSBncmFmLkdldFBvcnRCb3VuZHMoKQorICAgICAgICBwaWN3aWR0aCA9IHNlbGYucGljdHJlY3RbMl0gLSBzZWxmLnBpY3RyZWN0WzBdCisgICAgICAgIHBpY2hlaWdodCA9IHNlbGYucGljdHJlY3RbM10gLSBzZWxmLnBpY3RyZWN0WzFdCisgICAgICAgIGlmIHBpY3dpZHRoID4gc2NyZWVucmVjdFsyXSAtIHNjcmVlbnJlY3RbMF06CisgICAgICAgICAgICBmYWN0b3IgPSBmbG9hdChwaWN3aWR0aCkgLyBmbG9hdChzY3JlZW5yZWN0WzJdLXNjcmVlbnJlY3RbMF0pCisgICAgICAgICAgICBwaWN3aWR0aCA9IHBpY3dpZHRoIC8gZmFjdG9yCisgICAgICAgICAgICBwaWNoZWlnaHQgPSBwaWNoZWlnaHQgLyBmYWN0b3IKKyAgICAgICAgaWYgcGljaGVpZ2h0ID4gc2NyZWVucmVjdFszXSAtIHNjcmVlbnJlY3RbMV06CisgICAgICAgICAgICBmYWN0b3IgPSBmbG9hdChwaWNoZWlnaHQpIC8gZmxvYXQoc2NyZWVucmVjdFszXS1zY3JlZW5yZWN0WzFdKQorICAgICAgICAgICAgcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgorICAgICAgICAgICAgcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCisgICAgICAgIHJldHVybiAoc2NyZWVucmVjdFswXSwgc2NyZWVucmVjdFsxXSwgc2NyZWVucmVjdFswXStpbnQocGljd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVucmVjdFsxXStpbnQocGljaGVpZ2h0KSkKKwogY2xhc3MgTXlEaWFsb2coRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdyk6Ci0JIk1haW4gZGlhbG9nIHdpbmRvdyBmb3IgY2ljbmJyb3dzZSIKKyAgICAiTWFpbiBkaWFsb2cgd2luZG93IGZvciBjaWNuYnJvd3NlIgogCi0JZGVmIG9wZW4oc2VsZiwgaWQsIGNvbnRlbnRzKToKLQkJc2VsZi5pZCA9IGlkCi0JCUZyYW1lV29yay5EaWFsb2dXaW5kb3cub3BlbihzZWxmLCBJRF9NQUlOKQotCQlzZWxmLmRsZy5TZXREaWFsb2dEZWZhdWx0SXRlbShNQUlOX1NIT1cpCi0JCXNlbGYuY29udGVudHMgPSBjb250ZW50cwotCQlzZWxmLmN0bCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woTUFJTl9MSVNUKQotCQloID0gc2VsZi5jdGwuR2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xzLmtDb250cm9sTGlzdEJveFBhcnQsIAotCQkJCUNvbnRyb2xzLmtDb250cm9sTGlzdEJveExpc3RIYW5kbGVUYWcpCi0JCXNlbGYubGlzdCA9IExpc3QuYXNfTGlzdChoKQotCQlzZWxmLnNldGxpc3QoKQorICAgIGRlZiBvcGVuKHNlbGYsIGlkLCBjb250ZW50cyk6CisgICAgICAgIHNlbGYuaWQgPSBpZAorICAgICAgICBGcmFtZVdvcmsuRGlhbG9nV2luZG93Lm9wZW4oc2VsZiwgSURfTUFJTikKKyAgICAgICAgc2VsZi5kbGcuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oTUFJTl9TSE9XKQorICAgICAgICBzZWxmLmNvbnRlbnRzID0gY29udGVudHMKKyAgICAgICAgc2VsZi5jdGwgPSBzZWxmLmRsZy5HZXREaWFsb2dJdGVtQXNDb250cm9sKE1BSU5fTElTVCkKKyAgICAgICAgaCA9IHNlbGYuY3RsLkdldENvbnRyb2xEYXRhX0hhbmRsZShDb250cm9scy5rQ29udHJvbExpc3RCb3hQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94TGlzdEhhbmRsZVRhZykKKyAgICAgICAgc2VsZi5saXN0ID0gTGlzdC5hc19MaXN0KGgpCisgICAgICAgIHNlbGYuc2V0bGlzdCgpCiAKLQlkZWYgc2V0bGlzdChzZWxmKToKLQkJc2VsZi5saXN0LkxEZWxSb3coMCwgMCkKLQkJc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgwKQotCQlpZiBzZWxmLmNvbnRlbnRzOgotCQkJc2VsZi5saXN0LkxBZGRSb3cobGVuKHNlbGYuY29udGVudHMpLCAwKQotCQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuY29udGVudHMpKToKLQkJCQl2ID0gcmVwcihzZWxmLmNvbnRlbnRzW2ldWzBdKQotCQkJCWlmIHNlbGYuY29udGVudHNbaV1bMV06Ci0JCQkJCXYgPSB2ICsgJyInICsgc2VsZi5jb250ZW50c1tpXVsxXSArICciJwotCQkJCXNlbGYubGlzdC5MU2V0Q2VsbCh2LCAoMCwgaSkpCi0JCXNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKLQkJc2VsZi5saXN0LkxVcGRhdGUoc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKLQkJCi0JZGVmIGdldHNlbGVjdGlvbihzZWxmKToKLQkJaXRlbXMgPSBbXQotCQlwb2ludCA9ICgwLDApCi0JCXdoaWxlIDE6Ci0JCQlvaywgcG9pbnQgPSBzZWxmLmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKLQkJCWlmIG5vdCBvazoKLQkJCQlicmVhawotCQkJaXRlbXMuYXBwZW5kKHBvaW50WzFdKQotCQkJcG9pbnQgPSBwb2ludFswXSwgcG9pbnRbMV0rMQotCQl2YWx1ZXMgPSBbXQotCQlmb3IgaSBpbiBpdGVtczoKLQkJCXZhbHVlcy5hcHBlbmQoc2VsZi5jb250ZW50c1tpXSkKLQkJcmV0dXJuIHZhbHVlcwotCQkKLQlkZWYgZG9fc2hvdyhzZWxmLCAqYXJncyk6Ci0JCXNlbGVjdGlvbiA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJZm9yIHJlc2lkIGluIHNlbGVjdGlvbjoKLQkJCXNlbGYucGFyZW50LnNob3dDSWNvbihyZXNpZCkKLQkJCi0JZGVmIGRvX2Nsb3NlKHNlbGYpOgotCQlzZWxmLmNsb3NlKCkKLQkJCi0JZGVmIGRvX2l0ZW1oaXQoc2VsZiwgaXRlbSwgZXZlbnQpOgotCQlpZiBpdGVtID09IE1BSU5fU0hPVzoKLQkJCXNlbGYuZG9fc2hvdygpCisgICAgZGVmIHNldGxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYubGlzdC5MRGVsUm93KDAsIDApCisgICAgICAgIHNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMCkKKyAgICAgICAgaWYgc2VsZi5jb250ZW50czoKKyAgICAgICAgICAgIHNlbGYubGlzdC5MQWRkUm93KGxlbihzZWxmLmNvbnRlbnRzKSwgMCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmNvbnRlbnRzKSk6CisgICAgICAgICAgICAgICAgdiA9IHJlcHIoc2VsZi5jb250ZW50c1tpXVswXSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbnRlbnRzW2ldWzFdOgorICAgICAgICAgICAgICAgICAgICB2ID0gdiArICciJyArIHNlbGYuY29udGVudHNbaV1bMV0gKyAnIicKKyAgICAgICAgICAgICAgICBzZWxmLmxpc3QuTFNldENlbGwodiwgKDAsIGkpKQorICAgICAgICBzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDEpCisgICAgICAgIHNlbGYubGlzdC5MVXBkYXRlKHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCisKKyAgICBkZWYgZ2V0c2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgIHBvaW50ID0gKDAsMCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIG9rLCBwb2ludCA9IHNlbGYubGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQorICAgICAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpdGVtcy5hcHBlbmQocG9pbnRbMV0pCisgICAgICAgICAgICBwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCisgICAgICAgIHZhbHVlcyA9IFtdCisgICAgICAgIGZvciBpIGluIGl0ZW1zOgorICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChzZWxmLmNvbnRlbnRzW2ldKQorICAgICAgICByZXR1cm4gdmFsdWVzCisKKyAgICBkZWYgZG9fc2hvdyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGVjdGlvbiA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgZm9yIHJlc2lkIGluIHNlbGVjdGlvbjoKKyAgICAgICAgICAgIHNlbGYucGFyZW50LnNob3dDSWNvbihyZXNpZCkKKworICAgIGRlZiBkb19jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZG9faXRlbWhpdChzZWxmLCBpdGVtLCBldmVudCk6CisgICAgICAgIGlmIGl0ZW0gPT0gTUFJTl9TSE9XOgorICAgICAgICAgICAgc2VsZi5kb19zaG93KCkKIAogbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvRGVtby9QSUNUYnJvd3NlL29sZFBJQ1Ricm93c2UucHkgYi9NYWMvRGVtby9QSUNUYnJvd3NlL29sZFBJQ1Ricm93c2UucHkKaW5kZXggNWY1ODkzYy4uODYwMGJiMiAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vUElDVGJyb3dzZS9vbGRQSUNUYnJvd3NlLnB5CisrKyBiL01hYy9EZW1vL1BJQ1Ricm93c2Uvb2xkUElDVGJyb3dzZS5weQpAQCAtMjEsMTM5ICsyMSwxMzkgQEAKIFRPUD02NAogCiBkZWYgbWFpbigpOgotCW1hY3Jlc291cmNlLm5lZWQoJ0RMT0cnLCBJRF9NQUlOLCAib2xkUElDVGJyb3dzZS5yc3JjIikKLQlQSUNUYnJvd3NlKCkKKyAgICBtYWNyZXNvdXJjZS5uZWVkKCdETE9HJywgSURfTUFJTiwgIm9sZFBJQ1Ricm93c2UucnNyYyIpCisgICAgUElDVGJyb3dzZSgpCiAKIGNsYXNzIFBJQ1Ricm93c2UoRnJhbWVXb3JrLkFwcGxpY2F0aW9uKToKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCSMgRmlyc3QgaW5pdCBtZW51cywgZXRjLgotCQlGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJIyBOZXh0IGNyZWF0ZSBvdXIgZGlhbG9nCi0JCXNlbGYubWFpbl9kaWFsb2cgPSBNeURpYWxvZyhzZWxmKQotCQkjIE5vdyBvcGVuIHRoZSBkaWFsb2cKLQkJY29udGVudHMgPSBzZWxmLmZpbmRQSUNUcmVzb3VyY2VzKCkKLQkJc2VsZi5tYWluX2RpYWxvZy5vcGVuKElEX01BSU4sIGNvbnRlbnRzKQotCQkjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKLQkJc2VsZi5tYWlubG9vcCgpCi0JCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCXNlbGYuZmlsZW1lbnUgPSBtID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCi0JCXNlbGYucXVpdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKLQkKLQlkZWYgcXVpdChzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX3F1aXQoKQotCQkKLQlkZWYgc2hvd1BJQ1Qoc2VsZiwgcmVzaWQpOgotCQl3ID0gUElDVHdpbmRvdyhzZWxmKQotCQl3Lm9wZW4ocmVzaWQpCi0JCSNFYXN5RGlhbG9ncy5NZXNzYWdlKCdTaG93IFBJQ1QgJXInICUgKHJlc2lkLCkpCi0JCQotCWRlZiBmaW5kUElDVHJlc291cmNlcyhzZWxmKToKLQkJbnVtID0gUmVzLkNvdW50UmVzb3VyY2VzKCdQSUNUJykKLQkJcnYgPSBbXQotCQlmb3IgaSBpbiByYW5nZSgxLCBudW0rMSk6Ci0JCQlSZXMuU2V0UmVzTG9hZCgwKQotCQkJdHJ5OgotCQkJCXIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ1BJQ1QnLCBpKQotCQkJZmluYWxseToKLQkJCQlSZXMuU2V0UmVzTG9hZCgxKQotCQkJaWQsIHR5cGUsIG5hbWUgPSByLkdldFJlc0luZm8oKQotCQkJcnYuYXBwZW5kKChpZCwgbmFtZSkpCi0JCXJldHVybiBydgotCQkKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgRmlyc3QgaW5pdCBtZW51cywgZXRjLgorICAgICAgICBGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgIyBOZXh0IGNyZWF0ZSBvdXIgZGlhbG9nCisgICAgICAgIHNlbGYubWFpbl9kaWFsb2cgPSBNeURpYWxvZyhzZWxmKQorICAgICAgICAjIE5vdyBvcGVuIHRoZSBkaWFsb2cKKyAgICAgICAgY29udGVudHMgPSBzZWxmLmZpbmRQSUNUcmVzb3VyY2VzKCkKKyAgICAgICAgc2VsZi5tYWluX2RpYWxvZy5vcGVuKElEX01BSU4sIGNvbnRlbnRzKQorICAgICAgICAjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKKyAgICAgICAgc2VsZi5tYWlubG9vcCgpCisKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQorCisgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgIGRlZiBzaG93UElDVChzZWxmLCByZXNpZCk6CisgICAgICAgIHcgPSBQSUNUd2luZG93KHNlbGYpCisgICAgICAgIHcub3BlbihyZXNpZCkKKyAgICAgICAgI0Vhc3lEaWFsb2dzLk1lc3NhZ2UoJ1Nob3cgUElDVCAlcicgJSAocmVzaWQsKSkKKworICAgIGRlZiBmaW5kUElDVHJlc291cmNlcyhzZWxmKToKKyAgICAgICAgbnVtID0gUmVzLkNvdW50UmVzb3VyY2VzKCdQSUNUJykKKyAgICAgICAgcnYgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBudW0rMSk6CisgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ1BJQ1QnLCBpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgxKQorICAgICAgICAgICAgaWQsIHR5cGUsIG5hbWUgPSByLkdldFJlc0luZm8oKQorICAgICAgICAgICAgcnYuYXBwZW5kKChpZCwgbmFtZSkpCisgICAgICAgIHJldHVybiBydgorCiBjbGFzcyBQSUNUd2luZG93KEZyYW1lV29yay5XaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIChyZXNpZCwgcmVzbmFtZSkpOgotCQlpZiBub3QgcmVzbmFtZToKLQkJCXJlc25hbWUgPSAnIyVyJyAlIChyZXNpZCwpCi0JCXNlbGYucmVzaWQgPSByZXNpZAotCQlwaWN0dXJlID0gUWQuR2V0UGljdHVyZShzZWxmLnJlc2lkKQotCQkjIEdldCByZWN0IGZvciBwaWN0dXJlCi0JCXByaW50IHJlcHIocGljdHVyZS5kYXRhWzoxNl0pCi0JCXN6LCB0LCBsLCBiLCByID0gc3RydWN0LnVucGFjaygnaGhoaGgnLCBwaWN0dXJlLmRhdGFbOjEwXSkKLQkJcHJpbnQgJ3BpY3Q6JywgdCwgbCwgYiwgcgotCQl3aWR0aCA9IHItbAotCQloZWlnaHQgPSBiLXQKLQkJaWYgd2lkdGggPCA2NDogd2lkdGggPSA2NAotCQllbGlmIHdpZHRoID4gNDgwOiB3aWR0aCA9IDQ4MAotCQlpZiBoZWlnaHQgPCA2NDogaGVpZ2h0ID0gNjQKLQkJZWxpZiBoZWlnaHQgPiAzMjA6IGhlaWdodCA9IDMyMAotCQlib3VuZHMgPSAoTEVGVCwgVE9QLCBMRUZUK3dpZHRoLCBUT1AraGVpZ2h0KQotCQlwcmludCAnYm91bmRzOicsIGJvdW5kcwotCQkKLQkJc2VsZi53aWQgPSBXaW4uTmV3V2luZG93KGJvdW5kcywgcmVzbmFtZSwgMSwgMCwgLTEsIDEsIDApCi0JCXNlbGYud2lkLlNldFdpbmRvd1BpYyhwaWN0dXJlKQotCQlzZWxmLmRvX3Bvc3RvcGVuKCkKLQkJCisgICAgZGVmIG9wZW4oc2VsZiwgKHJlc2lkLCByZXNuYW1lKSk6CisgICAgICAgIGlmIG5vdCByZXNuYW1lOgorICAgICAgICAgICAgcmVzbmFtZSA9ICcjJXInICUgKHJlc2lkLCkKKyAgICAgICAgc2VsZi5yZXNpZCA9IHJlc2lkCisgICAgICAgIHBpY3R1cmUgPSBRZC5HZXRQaWN0dXJlKHNlbGYucmVzaWQpCisgICAgICAgICMgR2V0IHJlY3QgZm9yIHBpY3R1cmUKKyAgICAgICAgcHJpbnQgcmVwcihwaWN0dXJlLmRhdGFbOjE2XSkKKyAgICAgICAgc3osIHQsIGwsIGIsIHIgPSBzdHJ1Y3QudW5wYWNrKCdoaGhoaCcsIHBpY3R1cmUuZGF0YVs6MTBdKQorICAgICAgICBwcmludCAncGljdDonLCB0LCBsLCBiLCByCisgICAgICAgIHdpZHRoID0gci1sCisgICAgICAgIGhlaWdodCA9IGItdAorICAgICAgICBpZiB3aWR0aCA8IDY0OiB3aWR0aCA9IDY0CisgICAgICAgIGVsaWYgd2lkdGggPiA0ODA6IHdpZHRoID0gNDgwCisgICAgICAgIGlmIGhlaWdodCA8IDY0OiBoZWlnaHQgPSA2NAorICAgICAgICBlbGlmIGhlaWdodCA+IDMyMDogaGVpZ2h0ID0gMzIwCisgICAgICAgIGJvdW5kcyA9IChMRUZULCBUT1AsIExFRlQrd2lkdGgsIFRPUCtoZWlnaHQpCisgICAgICAgIHByaW50ICdib3VuZHM6JywgYm91bmRzCisKKyAgICAgICAgc2VsZi53aWQgPSBXaW4uTmV3V2luZG93KGJvdW5kcywgcmVzbmFtZSwgMSwgMCwgLTEsIDEsIDApCisgICAgICAgIHNlbGYud2lkLlNldFdpbmRvd1BpYyhwaWN0dXJlKQorICAgICAgICBzZWxmLmRvX3Bvc3RvcGVuKCkKKwogY2xhc3MgTXlEaWFsb2coRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdyk6Ci0JIk1haW4gZGlhbG9nIHdpbmRvdyBmb3IgUElDVGJyb3dzZSIKKyAgICAiTWFpbiBkaWFsb2cgd2luZG93IGZvciBQSUNUYnJvd3NlIgogCi0JZGVmIG9wZW4oc2VsZiwgaWQsIGNvbnRlbnRzKToKLQkJc2VsZi5pZCA9IGlkCi0JCUZyYW1lV29yay5EaWFsb2dXaW5kb3cub3BlbihzZWxmLCBJRF9NQUlOKQotCQlzZWxmLmRsZy5TZXREaWFsb2dEZWZhdWx0SXRlbShNQUlOX1NIT1cpCi0JCXRwLCBoLCByZWN0ID0gc2VsZi5kbGcuR2V0RGlhbG9nSXRlbShNQUlOX0xJU1QpCi0JCXJlY3QyID0gcmVjdFswXSsxLCByZWN0WzFdKzEsIHJlY3RbMl0tMTcsIHJlY3RbM10tMTcJIyBTY3JvbGwgYmFyIHNwYWNlCi0JCXNlbGYubGlzdCA9IExpc3QuTE5ldyhyZWN0MiwgKDAsIDAsIDEsIGxlbihjb250ZW50cykpLCAoMCwwKSwgMCwgc2VsZi53aWQsCi0JCQkJMCwgMSwgMSwgMSkKLQkJc2VsZi5jb250ZW50cyA9IGNvbnRlbnRzCi0JCXNlbGYuc2V0bGlzdCgpCisgICAgZGVmIG9wZW4oc2VsZiwgaWQsIGNvbnRlbnRzKToKKyAgICAgICAgc2VsZi5pZCA9IGlkCisgICAgICAgIEZyYW1lV29yay5EaWFsb2dXaW5kb3cub3BlbihzZWxmLCBJRF9NQUlOKQorICAgICAgICBzZWxmLmRsZy5TZXREaWFsb2dEZWZhdWx0SXRlbShNQUlOX1NIT1cpCisgICAgICAgIHRwLCBoLCByZWN0ID0gc2VsZi5kbGcuR2V0RGlhbG9nSXRlbShNQUlOX0xJU1QpCisgICAgICAgIHJlY3QyID0gcmVjdFswXSsxLCByZWN0WzFdKzEsIHJlY3RbMl0tMTcsIHJlY3RbM10tMTcgICAgIyBTY3JvbGwgYmFyIHNwYWNlCisgICAgICAgIHNlbGYubGlzdCA9IExpc3QuTE5ldyhyZWN0MiwgKDAsIDAsIDEsIGxlbihjb250ZW50cykpLCAoMCwwKSwgMCwgc2VsZi53aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAxLCAxKQorICAgICAgICBzZWxmLmNvbnRlbnRzID0gY29udGVudHMKKyAgICAgICAgc2VsZi5zZXRsaXN0KCkKIAotCWRlZiBzZXRsaXN0KHNlbGYpOgotCQlzZWxmLmxpc3QuTERlbFJvdygwLCAwKQotCQlzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDApCi0JCWlmIHNlbGYuY29udGVudHM6Ci0JCQlzZWxmLmxpc3QuTEFkZFJvdyhsZW4oc2VsZi5jb250ZW50cyksIDApCi0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5jb250ZW50cykpOgotCQkJCXYgPSByZXByKHNlbGYuY29udGVudHNbaV1bMF0pCi0JCQkJaWYgc2VsZi5jb250ZW50c1tpXVsxXToKLQkJCQkJdiA9IHYgKyAnIicgKyBzZWxmLmNvbnRlbnRzW2ldWzFdICsgJyInCi0JCQkJc2VsZi5saXN0LkxTZXRDZWxsKHYsICgwLCBpKSkKLQkJc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgxKQotCQlzZWxmLmxpc3QuTFVwZGF0ZShzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQotCQkKLQlkZWYgZG9fbGlzdGhpdChzZWxmLCBldmVudCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCVFkLlNldFBvcnQoc2VsZi53aWQpCi0JCXdoZXJlID0gUWQuR2xvYmFsVG9Mb2NhbCh3aGVyZSkKLQkJcHJpbnQgJ0xJU1RISVQnLCB3aGVyZQotCQlpZiBzZWxmLmxpc3QuTENsaWNrKHdoZXJlLCBtb2RpZmllcnMpOgotCQkJc2VsZi5kb19zaG93KCkKLQkJCi0JZGVmIGdldHNlbGVjdGlvbihzZWxmKToKLQkJaXRlbXMgPSBbXQotCQlwb2ludCA9ICgwLDApCi0JCXdoaWxlIDE6Ci0JCQlvaywgcG9pbnQgPSBzZWxmLmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKLQkJCWlmIG5vdCBvazoKLQkJCQlicmVhawotCQkJaXRlbXMuYXBwZW5kKHBvaW50WzFdKQotCQkJcG9pbnQgPSBwb2ludFswXSwgcG9pbnRbMV0rMQotCQl2YWx1ZXMgPSBbXQotCQlmb3IgaSBpbiBpdGVtczoKLQkJCXZhbHVlcy5hcHBlbmQoc2VsZi5jb250ZW50c1tpXSkKLQkJcmV0dXJuIHZhbHVlcwotCQkKLQlkZWYgZG9fc2hvdyhzZWxmLCAqYXJncyk6Ci0JCXNlbGVjdGlvbiA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJZm9yIHJlc2lkIGluIHNlbGVjdGlvbjoKLQkJCXNlbGYucGFyZW50LnNob3dQSUNUKHJlc2lkKQotCQkKLQlkZWYgZG9fcmF3dXBkYXRlKHNlbGYsIHdpbmRvdywgZXZlbnQpOgotCQl0cCwgaCwgcmVjdCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW0oTUFJTl9MSVNUKQotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQlRZC5GcmFtZVJlY3QocmVjdCkKLQkJc2VsZi5saXN0LkxVcGRhdGUoc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKLQkJCi0JZGVmIGRvX2FjdGl2YXRlKHNlbGYsIGFjdGl2YXRlLCBldmVudCk6Ci0JCXNlbGYubGlzdC5MQWN0aXZhdGUoYWN0aXZhdGUpCi0JCQotCWRlZiBkb19jbG9zZShzZWxmKToKLQkJc2VsZi5jbG9zZSgpCi0JCQotCWRlZiBkb19pdGVtaGl0KHNlbGYsIGl0ZW0sIGV2ZW50KToKLQkJaWYgaXRlbSA9PSBNQUlOX0xJU1Q6Ci0JCQlzZWxmLmRvX2xpc3RoaXQoZXZlbnQpCi0JCWlmIGl0ZW0gPT0gTUFJTl9TSE9XOgotCQkJc2VsZi5kb19zaG93KCkKKyAgICBkZWYgc2V0bGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5saXN0LkxEZWxSb3coMCwgMCkKKyAgICAgICAgc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgwKQorICAgICAgICBpZiBzZWxmLmNvbnRlbnRzOgorICAgICAgICAgICAgc2VsZi5saXN0LkxBZGRSb3cobGVuKHNlbGYuY29udGVudHMpLCAwKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuY29udGVudHMpKToKKyAgICAgICAgICAgICAgICB2ID0gcmVwcihzZWxmLmNvbnRlbnRzW2ldWzBdKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY29udGVudHNbaV1bMV06CisgICAgICAgICAgICAgICAgICAgIHYgPSB2ICsgJyInICsgc2VsZi5jb250ZW50c1tpXVsxXSArICciJworICAgICAgICAgICAgICAgIHNlbGYubGlzdC5MU2V0Q2VsbCh2LCAoMCwgaSkpCisgICAgICAgIHNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKKyAgICAgICAgc2VsZi5saXN0LkxVcGRhdGUoc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKKworICAgIGRlZiBkb19saXN0aGl0KHNlbGYsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgUWQuU2V0UG9ydChzZWxmLndpZCkKKyAgICAgICAgd2hlcmUgPSBRZC5HbG9iYWxUb0xvY2FsKHdoZXJlKQorICAgICAgICBwcmludCAnTElTVEhJVCcsIHdoZXJlCisgICAgICAgIGlmIHNlbGYubGlzdC5MQ2xpY2sod2hlcmUsIG1vZGlmaWVycyk6CisgICAgICAgICAgICBzZWxmLmRvX3Nob3coKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBwb2ludCA9ICgwLDApCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBvaywgcG9pbnQgPSBzZWxmLmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKKyAgICAgICAgICAgIGlmIG5vdCBvazoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHBvaW50WzFdKQorICAgICAgICAgICAgcG9pbnQgPSBwb2ludFswXSwgcG9pbnRbMV0rMQorICAgICAgICB2YWx1ZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiBpdGVtczoKKyAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoc2VsZi5jb250ZW50c1tpXSkKKyAgICAgICAgcmV0dXJuIHZhbHVlcworCisgICAgZGVmIGRvX3Nob3coc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIGZvciByZXNpZCBpbiBzZWxlY3Rpb246CisgICAgICAgICAgICBzZWxmLnBhcmVudC5zaG93UElDVChyZXNpZCkKKworICAgIGRlZiBkb19yYXd1cGRhdGUoc2VsZiwgd2luZG93LCBldmVudCk6CisgICAgICAgIHRwLCBoLCByZWN0ID0gc2VsZi5kbGcuR2V0RGlhbG9nSXRlbShNQUlOX0xJU1QpCisgICAgICAgIFFkLlNldFBvcnQoc2VsZi53aWQpCisgICAgICAgIFFkLkZyYW1lUmVjdChyZWN0KQorICAgICAgICBzZWxmLmxpc3QuTFVwZGF0ZShzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQorCisgICAgZGVmIGRvX2FjdGl2YXRlKHNlbGYsIGFjdGl2YXRlLCBldmVudCk6CisgICAgICAgIHNlbGYubGlzdC5MQWN0aXZhdGUoYWN0aXZhdGUpCisKKyAgICBkZWYgZG9fY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGRvX2l0ZW1oaXQoc2VsZiwgaXRlbSwgZXZlbnQpOgorICAgICAgICBpZiBpdGVtID09IE1BSU5fTElTVDoKKyAgICAgICAgICAgIHNlbGYuZG9fbGlzdGhpdChldmVudCkKKyAgICAgICAgaWYgaXRlbSA9PSBNQUlOX1NIT1c6CisgICAgICAgICAgICBzZWxmLmRvX3Nob3coKQogCiBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9TcGVjaWFsX0V2ZW50cy5weSBiL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9TcGVjaWFsX0V2ZW50cy5weQppbmRleCBhOThlYjhhLi5hMmIwOTEwIDEwMDY0NAotLS0gYS9NYWMvRGVtby9hcHBsZXNjcmlwdC9EaXNrX0NvcHkvU3BlY2lhbF9FdmVudHMucHkKKysrIGIvTWFjL0RlbW8vYXBwbGVzY3JpcHQvRGlza19Db3B5L1NwZWNpYWxfRXZlbnRzLnB5CkBAIC0xMiwzODUgKzEyLDM4NSBAQAogCiBjbGFzcyBTcGVjaWFsX0V2ZW50c19FdmVudHM6CiAKLQlfYXJnbWFwX21vdW50ID0gewotCQknYWNjZXNzX21vZGUnIDogJ0Fjc3MnLAotCQknY2hlY2tzdW1fdmVyaWZpY2F0aW9uJyA6ICdWQ2hrJywKLQkJJ3NpZ25hdHVyZV92ZXJpZmljYXRpb24nIDogJ1ZTaWcnLAotCQknUkFNX2NhY2hpbmcnIDogJ0NhY2gnLAotCX0KKyAgICBfYXJnbWFwX21vdW50ID0geworICAgICAgICAgICAgJ2FjY2Vzc19tb2RlJyA6ICdBY3NzJywKKyAgICAgICAgICAgICdjaGVja3N1bV92ZXJpZmljYXRpb24nIDogJ1ZDaGsnLAorICAgICAgICAgICAgJ3NpZ25hdHVyZV92ZXJpZmljYXRpb24nIDogJ1ZTaWcnLAorICAgICAgICAgICAgJ1JBTV9jYWNoaW5nJyA6ICdDYWNoJywKKyAgICB9CiAKLQlkZWYgbW91bnQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiIm1vdW50OiBNb3VudHMgYW4gRGlzayBDb3B5IGltYWdlIGFzIGEgZGlzayB2b2x1bWUKLQkJUmVxdWlyZWQgYXJndW1lbnQ6IGEgcmVmZXJlbmNlIHRvIHRoZSBkaXNrIGltYWdlIHRvIGJlIG1vdW50ZWQKLQkJS2V5d29yZCBhcmd1bWVudCBhY2Nlc3NfbW9kZTogdGhlIGFjY2VzcyBtb2RlIGZvciBtb3VudGVkIHZvbHVtZSAoZGVmYXVsdCBpcyAiYW55IiwgaS5lLiBiZXN0IHBvc3NpYmxlKQotCQlLZXl3b3JkIGFyZ3VtZW50IGNoZWNrc3VtX3ZlcmlmaWNhdGlvbjogVmVyaWZ5IHRoZSBjaGVja3N1bSBiZWZvcmUgbW91bnRpbmc/Ci0JCUtleXdvcmQgYXJndW1lbnQgc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbjogVmVyaWZ5IHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIGJlZm9yZSBtb3VudGluZz8KLQkJS2V5d29yZCBhcmd1bWVudCBSQU1fY2FjaGluZzogQ2FjaGUgdGhlIGRpc2sgaW1hZ2UgaW4gUkFNPyAoaWYgb21pdHRlZCwgZG9uJ3QgY2FjaGUpCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJUmV0dXJuczogYSByZWZlcmVuY2UgdG8gbW91bnRlZCBkaXNrCi0JCSIiIgotCQlfY29kZSA9ICdkZHNrJwotCQlfc3ViY29kZSA9ICdNb3VuJworICAgIGRlZiBtb3VudChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIibW91bnQ6IE1vdW50cyBhbiBEaXNrIENvcHkgaW1hZ2UgYXMgYSBkaXNrIHZvbHVtZQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYSByZWZlcmVuY2UgdG8gdGhlIGRpc2sgaW1hZ2UgdG8gYmUgbW91bnRlZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGFjY2Vzc19tb2RlOiB0aGUgYWNjZXNzIG1vZGUgZm9yIG1vdW50ZWQgdm9sdW1lIChkZWZhdWx0IGlzICJhbnkiLCBpLmUuIGJlc3QgcG9zc2libGUpCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgY2hlY2tzdW1fdmVyaWZpY2F0aW9uOiBWZXJpZnkgdGhlIGNoZWNrc3VtIGJlZm9yZSBtb3VudGluZz8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzaWduYXR1cmVfdmVyaWZpY2F0aW9uOiBWZXJpZnkgdGhlIERpZ2lTaWdujiBzaWduYXR1cmUgYmVmb3JlIG1vdW50aW5nPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IFJBTV9jYWNoaW5nOiBDYWNoZSB0aGUgZGlzayBpbWFnZSBpbiBSQU0/IChpZiBvbWl0dGVkLCBkb24ndCBjYWNoZSkKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byBtb3VudGVkIGRpc2sKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2Rkc2snCisgICAgICAgIF9zdWJjb2RlID0gJ01vdW4nCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfbW91bnQpCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfbW91bnQpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnQWNzcycsIF9FbnVtX0Fjc3MpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWQ2hrJywgX0VudW1fYm9vbCkKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1ZTaWcnLCBfRW51bV9ib29sKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnQ2FjaCcsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdBY3NzJywgX0VudW1fQWNzcykKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1ZDaGsnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVlNpZycsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdDYWNoJywgX0VudW1fYm9vbCkKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9leGVjdXRlX0Rpc2tTY3JpcHQgPSB7Ci0JCSdjaGVja3N1bV92ZXJpZmljYXRpb24nIDogJ1ZDaGsnLAotCQknc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbicgOiAnVlNpZycsCi0JfQorICAgIF9hcmdtYXBfZXhlY3V0ZV9EaXNrU2NyaXB0ID0geworICAgICAgICAgICAgJ2NoZWNrc3VtX3ZlcmlmaWNhdGlvbicgOiAnVkNoaycsCisgICAgICAgICAgICAnc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbicgOiAnVlNpZycsCisgICAgfQogCi0JZGVmIGV4ZWN1dGVfRGlza1NjcmlwdChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIiZXhlY3V0ZSBEaXNrU2NyaXB0OiBFeGVjdXRlcyBhIERpc2sgQ29weS1zcGVjaWZpYyBEaXNrU2NyaXB0Ci0JCVJlcXVpcmVkIGFyZ3VtZW50OiBhIHJlZmVyZW5jZSB0byB0aGUgRGlza1NjcmlwdCB0byBleGVjdXRlCi0JCUtleXdvcmQgYXJndW1lbnQgY2hlY2tzdW1fdmVyaWZpY2F0aW9uOiBTaG91bGQgY2hlY2tzdW1zIGJlIHZlcmlmaWVkIHdoZW4gbW91bnRpbmcgaW1hZ2VzIHJlZmVyZW5jZWQgaW4gdGhlIERpc2tTY3JpcHQ/Ci0JCUtleXdvcmQgYXJndW1lbnQgc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbjogU2hvdWxkIHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIG9mIHRoZSBEaXNrU2NyaXB0IGFuZCB0aGUgaW1hZ2VzIGl0IHJlZmVyZW5jZXMgYmUgdmVyaWZpZWQ/Ci0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJIiIiCi0JCV9jb2RlID0gJ2Rkc2snCi0JCV9zdWJjb2RlID0gJ1hFUWQnCisgICAgZGVmIGV4ZWN1dGVfRGlza1NjcmlwdChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZXhlY3V0ZSBEaXNrU2NyaXB0OiBFeGVjdXRlcyBhIERpc2sgQ29weS1zcGVjaWZpYyBEaXNrU2NyaXB0CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhIHJlZmVyZW5jZSB0byB0aGUgRGlza1NjcmlwdCB0byBleGVjdXRlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgY2hlY2tzdW1fdmVyaWZpY2F0aW9uOiBTaG91bGQgY2hlY2tzdW1zIGJlIHZlcmlmaWVkIHdoZW4gbW91bnRpbmcgaW1hZ2VzIHJlZmVyZW5jZWQgaW4gdGhlIERpc2tTY3JpcHQ/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbjogU2hvdWxkIHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIG9mIHRoZSBEaXNrU2NyaXB0IGFuZCB0aGUgaW1hZ2VzIGl0IHJlZmVyZW5jZXMgYmUgdmVyaWZpZWQ/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2Rkc2snCisgICAgICAgIF9zdWJjb2RlID0gJ1hFUWQnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfZXhlY3V0ZV9EaXNrU2NyaXB0KQotCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2V4ZWN1dGVfRGlza1NjcmlwdCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWQ2hrJywgX0VudW1fYm9vbCkKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1ZTaWcnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVkNoaycsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWU2lnJywgX0VudW1fYm9vbCkKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JZGVmIHVubW91bnQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiInVubW91bnQ6IFVubW91bnQgYW5kIGVqZWN0IChpZiBuZWNlc3NhcnkpIGEgdm9sdW1lCi0JCVJlcXVpcmVkIGFyZ3VtZW50OiBhIHJlZmVyZW5jZSB0byBkaXNrIHRvIGJlIHVubW91bnRlZCAoYW5kIGVqZWN0ZWQpCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJIiIiCi0JCV9jb2RlID0gJ2Rkc2snCi0JCV9zdWJjb2RlID0gJ1VtbnQnCisgICAgZGVmIHVubW91bnQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInVubW91bnQ6IFVubW91bnQgYW5kIGVqZWN0IChpZiBuZWNlc3NhcnkpIGEgdm9sdW1lCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhIHJlZmVyZW5jZSB0byBkaXNrIHRvIGJlIHVubW91bnRlZCAoYW5kIGVqZWN0ZWQpCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2Rkc2snCisgICAgICAgIF9zdWJjb2RlID0gJ1VtbnQnCiAKLQkJaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKLQkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CiAKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9jcmVhdGUgPSB7Ci0JCSdzYXZpbmdfYXMnIDogJ1N2QXMnLAotCQknbG9naWNhbF9ibG9ja3MnIDogJ0Jsa3MnLAotCQknemVyb2luZycgOiAnWmVybycsCi0JCSdsZWF2ZV9pbWFnZV9tb3VudGVkJyA6ICdNb3VuJywKLQkJJ2ZpbGVzeXN0ZW0nIDogJ0ZzeXMnLAotCX0KKyAgICBfYXJnbWFwX2NyZWF0ZSA9IHsKKyAgICAgICAgICAgICdzYXZpbmdfYXMnIDogJ1N2QXMnLAorICAgICAgICAgICAgJ2xvZ2ljYWxfYmxvY2tzJyA6ICdCbGtzJywKKyAgICAgICAgICAgICd6ZXJvaW5nJyA6ICdaZXJvJywKKyAgICAgICAgICAgICdsZWF2ZV9pbWFnZV9tb3VudGVkJyA6ICdNb3VuJywKKyAgICAgICAgICAgICdmaWxlc3lzdGVtJyA6ICdGc3lzJywKKyAgICB9CiAKLQlkZWYgY3JlYXRlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJjcmVhdGU6IENyZWF0ZSBhIG5ldyBEaXNrIENvcHkgZG9jdW1lbnQKLQkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBuYW1lIG9mIHRoZSB2b2x1bWUgdG8gY3JlYXRlCi0JCUtleXdvcmQgYXJndW1lbnQgc2F2aW5nX2FzOiB0aGUgZGlzayBpbWFnZSB0byBiZSBjcmVhdGVkCi0JCUtleXdvcmQgYXJndW1lbnQgbG9naWNhbF9ibG9ja3M6IHRoZSBudW1iZXIgb2YgbG9naWNhbCBibG9ja3MKLQkJS2V5d29yZCBhcmd1bWVudCB6ZXJvaW5nOiBTaG91bGQgYWxsIGJsb2NrcyBvbiB0aGUgZGlzayBiZSBzZXQgdG8gemVybz8KLQkJS2V5d29yZCBhcmd1bWVudCBsZWF2ZV9pbWFnZV9tb3VudGVkOiBTaG91bGQgdGhlIGltYWdlIGJlIG1vdW50ZWQgYWZ0ZXIgaXQgaXMgY3JlYXRlZD8KLQkJS2V5d29yZCBhcmd1bWVudCBmaWxlc3lzdGVtOiBmaWxlIHN5c3RlbSB0byB1c2UgKE1hYyBPUyBTdGFuZGFyZC9jb21wYXRpYmxlLCBNYWMgT1MgRW5oYW5jZWQpCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJUmV0dXJuczogYSByZWZlcmVuY2UgdG8gbmV3bHkgY3JlYXRlZCBkaXNrIGltYWdlIChvciBuZXdseSBtb3VudGVkIGRpc2spCi0JCSIiIgotCQlfY29kZSA9ICdkZHNrJwotCQlfc3ViY29kZSA9ICdDcmVhJworICAgIGRlZiBjcmVhdGUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImNyZWF0ZTogQ3JlYXRlIGEgbmV3IERpc2sgQ29weSBkb2N1bWVudAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG5hbWUgb2YgdGhlIHZvbHVtZSB0byBjcmVhdGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzYXZpbmdfYXM6IHRoZSBkaXNrIGltYWdlIHRvIGJlIGNyZWF0ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBsb2dpY2FsX2Jsb2NrczogdGhlIG51bWJlciBvZiBsb2dpY2FsIGJsb2NrcworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHplcm9pbmc6IFNob3VsZCBhbGwgYmxvY2tzIG9uIHRoZSBkaXNrIGJlIHNldCB0byB6ZXJvPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGxlYXZlX2ltYWdlX21vdW50ZWQ6IFNob3VsZCB0aGUgaW1hZ2UgYmUgbW91bnRlZCBhZnRlciBpdCBpcyBjcmVhdGVkPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGZpbGVzeXN0ZW06IGZpbGUgc3lzdGVtIHRvIHVzZSAoTWFjIE9TIFN0YW5kYXJkL2NvbXBhdGlibGUsIE1hYyBPUyBFbmhhbmNlZCkKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byBuZXdseSBjcmVhdGVkIGRpc2sgaW1hZ2UgKG9yIG5ld2x5IG1vdW50ZWQgZGlzaykKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2Rkc2snCisgICAgICAgIF9zdWJjb2RlID0gJ0NyZWEnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY3JlYXRlKQotCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2NyZWF0ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTdkFzJywgX0VudW1fZnNzXykKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ0Jsa3MnLCBfRW51bV9sb25nKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnWmVybycsIF9FbnVtX2Jvb2wpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdNb3VuJywgX0VudW1fYm9vbCkKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ0ZzeXMnLCBfRW51bV9Gc3lzKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU3ZBcycsIF9FbnVtX2Zzc18pCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdCbGtzJywgX0VudW1fbG9uZykKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1plcm8nLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnTW91bicsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdGc3lzJywgX0VudW1fRnN5cykKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JZGVmIHZlcmlmeV9jaGVja3N1bShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIidmVyaWZ5IGNoZWNrc3VtOiBWZXJpZnkgdGhlIGNoZWNrc3VtIG9mIGEgRGlzayBDb3B5IDQuMiBvciBhIERpc2sgQ29weSA2LjAgcmVhZC1vbmx5IGRvY3VtZW50Ci0JCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZGlzayBpbWFnZSB0byBiZSB2ZXJpZmllZAotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrc3VtIHZlcmlmaWNhdGlvbgotCQkiIiIKLQkJX2NvZGUgPSAnZGRzaycKLQkJX3N1YmNvZGUgPSAnVmNyYycKKyAgICBkZWYgdmVyaWZ5X2NoZWNrc3VtKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJ2ZXJpZnkgY2hlY2tzdW06IFZlcmlmeSB0aGUgY2hlY2tzdW0gb2YgYSBEaXNrIENvcHkgNC4yIG9yIGEgRGlzayBDb3B5IDYuMCByZWFkLW9ubHkgZG9jdW1lbnQKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBkaXNrIGltYWdlIHRvIGJlIHZlcmlmaWVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2tzdW0gdmVyaWZpY2F0aW9uCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdkZHNrJworICAgICAgICBfc3ViY29kZSA9ICdWY3JjJwogCi0JCWlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCWRlZiB2ZXJpZnlfc2lnbmF0dXJlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJ2ZXJpZnkgc2lnbmF0dXJlOiBWZXJpZnkgdGhlIERpZ2lTaWdujiBzaWduYXR1cmUgZm9yIGEgRGlzayBDb3B5IGRvY3VtZW50Ci0JCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZGlzayBpbWFnZSB0byBiZSB2ZXJpZmllZAotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IElzIHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIHZhbGlkPwotCQkiIiIKLQkJX2NvZGUgPSAnZGRzaycKLQkJX3N1YmNvZGUgPSAnVnNpZycKKyAgICBkZWYgdmVyaWZ5X3NpZ25hdHVyZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIidmVyaWZ5IHNpZ25hdHVyZTogVmVyaWZ5IHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIGZvciBhIERpc2sgQ29weSBkb2N1bWVudAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIGRpc2sgaW1hZ2UgdG8gYmUgdmVyaWZpZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBJcyB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSB2YWxpZD8KKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2Rkc2snCisgICAgICAgIF9zdWJjb2RlID0gJ1ZzaWcnCiAKLQkJaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKLQkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CiAKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9zaWduX2ltYWdlID0gewotCQkndXNpbmdfc2lnbmVyJyA6ICdTaW5yJywKLQl9CisgICAgX2FyZ21hcF9zaWduX2ltYWdlID0geworICAgICAgICAgICAgJ3VzaW5nX3NpZ25lcicgOiAnU2lucicsCisgICAgfQogCi0JZGVmIHNpZ25faW1hZ2Uoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiInNpZ24gaW1hZ2U6IEFkZCBhIERpZ2lTaWdujiBzaWduYXR1cmUgdG8gYSBEaXNrIENvcHkgZG9jdW1lbnQKLQkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBkaXNrIGltYWdlIHRvIGJlIHNpZ25lZAotCQlLZXl3b3JkIGFyZ3VtZW50IHVzaW5nX3NpZ25lcjogYSByZWZlcmVuY2UgdG8gc2lnbmVyIGZpbGUgdG8gdXNlCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJIiIiCi0JCV9jb2RlID0gJ2Rkc2snCi0JCV9zdWJjb2RlID0gJ0FzaWcnCisgICAgZGVmIHNpZ25faW1hZ2Uoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNpZ24gaW1hZ2U6IEFkZCBhIERpZ2lTaWdujiBzaWduYXR1cmUgdG8gYSBEaXNrIENvcHkgZG9jdW1lbnQKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBkaXNrIGltYWdlIHRvIGJlIHNpZ25lZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHVzaW5nX3NpZ25lcjogYSByZWZlcmVuY2UgdG8gc2lnbmVyIGZpbGUgdG8gdXNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2Rkc2snCisgICAgICAgIF9zdWJjb2RlID0gJ0FzaWcnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2lnbl9pbWFnZSkKLQkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zaWduX2ltYWdlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CiAKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NpbnInLCBfRW51bV9hbGlzKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU2lucicsIF9FbnVtX2FsaXMpCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCV9hcmdtYXBfY3JlYXRlX2FfZmxvcHB5X2Zyb20gPSB7Ci0JCSdzaWduYXR1cmVfdmVyaWZpY2F0aW9uJyA6ICdWU2lnJywKLQkJJ2VyYXNlX2NvbmZpcm1hdGlvbicgOiAnQ2ZybScsCi0JCSdtYWtlX211bHRpcGxlX2Zsb3BwaWVzJyA6ICdNdWx0JywKLQl9CisgICAgX2FyZ21hcF9jcmVhdGVfYV9mbG9wcHlfZnJvbSA9IHsKKyAgICAgICAgICAgICdzaWduYXR1cmVfdmVyaWZpY2F0aW9uJyA6ICdWU2lnJywKKyAgICAgICAgICAgICdlcmFzZV9jb25maXJtYXRpb24nIDogJ0Nmcm0nLAorICAgICAgICAgICAgJ21ha2VfbXVsdGlwbGVfZmxvcHBpZXMnIDogJ011bHQnLAorICAgIH0KIAotCWRlZiBjcmVhdGVfYV9mbG9wcHlfZnJvbShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIiY3JlYXRlIGEgZmxvcHB5IGZyb206IGNyZWF0ZSBhIGZsb3BweSBkaXNrIGZyb20gYSBEaXNrIENvcHkgZG9jdW1lbnQKLQkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBkaXNrIGltYWdlIHRvIG1ha2UgYSBmbG9wcHkgZnJvbQotCQlLZXl3b3JkIGFyZ3VtZW50IHNpZ25hdHVyZV92ZXJpZmljYXRpb246IFNob3VsZCB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSBiZSB2ZXJpZmllZCBiZWZvcmUgY3JlYXRpbmcgYSBmbG9wcHkgZGlzaz8KLQkJS2V5d29yZCBhcmd1bWVudCBlcmFzZV9jb25maXJtYXRpb246IFNob3VsZCB0aGUgdXNlciBiZSBhc2tlZCB0byBjb25maXJtIHRoZSBlcmFzdXJlIG9mIHRoZSBwcmV2aW91cyBjb250ZW50cyBvZiBmbG9wcHkgZGlza3M/Ci0JCUtleXdvcmQgYXJndW1lbnQgbWFrZV9tdWx0aXBsZV9mbG9wcGllczogU2hvdWxkIHRoZSB1c2VyIGJlIHByb21wdGVkIHRvIGNyZWF0ZSBtdWx0aXBsZSBmbG9wcHkgZGlza3M/Ci0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJIiIiCi0JCV9jb2RlID0gJ2Rkc2snCi0JCV9zdWJjb2RlID0gJ0JmcHknCisgICAgZGVmIGNyZWF0ZV9hX2Zsb3BweV9mcm9tKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJjcmVhdGUgYSBmbG9wcHkgZnJvbTogY3JlYXRlIGEgZmxvcHB5IGRpc2sgZnJvbSBhIERpc2sgQ29weSBkb2N1bWVudAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIGRpc2sgaW1hZ2UgdG8gbWFrZSBhIGZsb3BweSBmcm9tCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbjogU2hvdWxkIHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIGJlIHZlcmlmaWVkIGJlZm9yZSBjcmVhdGluZyBhIGZsb3BweSBkaXNrPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGVyYXNlX2NvbmZpcm1hdGlvbjogU2hvdWxkIHRoZSB1c2VyIGJlIGFza2VkIHRvIGNvbmZpcm0gdGhlIGVyYXN1cmUgb2YgdGhlIHByZXZpb3VzIGNvbnRlbnRzIG9mIGZsb3BweSBkaXNrcz8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBtYWtlX211bHRpcGxlX2Zsb3BwaWVzOiBTaG91bGQgdGhlIHVzZXIgYmUgcHJvbXB0ZWQgdG8gY3JlYXRlIG11bHRpcGxlIGZsb3BweSBkaXNrcz8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnZGRzaycKKyAgICAgICAgX3N1YmNvZGUgPSAnQmZweScKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jcmVhdGVfYV9mbG9wcHlfZnJvbSkKLQkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jcmVhdGVfYV9mbG9wcHlfZnJvbSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWU2lnJywgX0VudW1fYm9vbCkKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ0Nmcm0nLCBfRW51bV9ib29sKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnTXVsdCcsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWU2lnJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ0Nmcm0nLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnTXVsdCcsIF9FbnVtX2Jvb2wpCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCV9hcmdtYXBfY2hlY2tfaW1hZ2UgPSB7Ci0JCSdkZXRhaWxzJyA6ICdDaERlJywKLQl9CisgICAgX2FyZ21hcF9jaGVja19pbWFnZSA9IHsKKyAgICAgICAgICAgICdkZXRhaWxzJyA6ICdDaERlJywKKyAgICB9CiAKLQlkZWYgY2hlY2tfaW1hZ2Uoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiImNoZWNrIGltYWdlOiBDaGVjayB0aGUgZGlzayBpbWFnZdVzIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBmb3IgYW55IGluY29uc2lzdGVuY2llcy4gIFdvcmtzIG9uIE5ESUYsIERpc2sgQ29weSA0LjIsIERBUlSOLCBvciBEaXNrU2V0IGltYWdlcy4KLQkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBkaXNrIGltYWdlIHRvIGJlIHZlcmlmaWVkCi0JCUtleXdvcmQgYXJndW1lbnQgZGV0YWlsczogU2hvdWxkIHRoZSBkaXNrIGltYWdlIGRldGFpbHMgYmUgZGlzcGxheWVkPwotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IGEgcmVjb3JkIGNvbnRhaW5pbmcgYSBib29sZWFuICh0cnVlL2ZhbHNlKSB2YWx1ZSBpZiB0aGUgaW1hZ2UgcGFzc2VzIGNvbnNpc3RlbmN5IHRlc3RzLCBhbmQgdGhlIG51bWJlcnMgb2Ygd2FybmluZ3MgYW5kIGVycm9ycwotCQkiIiIKLQkJX2NvZGUgPSAnZGRzaycKLQkJX3N1YmNvZGUgPSAnQ2hlaycKKyAgICBkZWYgY2hlY2tfaW1hZ2Uoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImNoZWNrIGltYWdlOiBDaGVjayB0aGUgZGlzayBpbWFnZdVzIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBmb3IgYW55IGluY29uc2lzdGVuY2llcy4gIFdvcmtzIG9uIE5ESUYsIERpc2sgQ29weSA0LjIsIERBUlSOLCBvciBEaXNrU2V0IGltYWdlcy4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBkaXNrIGltYWdlIHRvIGJlIHZlcmlmaWVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgZGV0YWlsczogU2hvdWxkIHRoZSBkaXNrIGltYWdlIGRldGFpbHMgYmUgZGlzcGxheWVkPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGEgcmVjb3JkIGNvbnRhaW5pbmcgYSBib29sZWFuICh0cnVlL2ZhbHNlKSB2YWx1ZSBpZiB0aGUgaW1hZ2UgcGFzc2VzIGNvbnNpc3RlbmN5IHRlc3RzLCBhbmQgdGhlIG51bWJlcnMgb2Ygd2FybmluZ3MgYW5kIGVycm9ycworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnZGRzaycKKyAgICAgICAgX3N1YmNvZGUgPSAnQ2hlaycKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jaGVja19pbWFnZSkKLQkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jaGVja19pbWFnZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdDaERlJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ0NoRGUnLCBfRW51bV9ib29sKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX3NlZ21lbnRfaW1hZ2UgPSB7Ci0JCSdzZWdtZW50X2NvdW50JyA6ICdTR0NUJywKLQkJJ3NlZ21lbnRfc2l6ZScgOiAnU0dTWicsCi0JCSdzZWdtZW50X25hbWUnIDogJ1NHTk0nLAotCQknaW1hZ2VfSUQnIDogJ1NHSUQnLAotCX0KKyAgICBfYXJnbWFwX3NlZ21lbnRfaW1hZ2UgPSB7CisgICAgICAgICAgICAnc2VnbWVudF9jb3VudCcgOiAnU0dDVCcsCisgICAgICAgICAgICAnc2VnbWVudF9zaXplJyA6ICdTR1NaJywKKyAgICAgICAgICAgICdzZWdtZW50X25hbWUnIDogJ1NHTk0nLAorICAgICAgICAgICAgJ2ltYWdlX0lEJyA6ICdTR0lEJywKKyAgICB9CiAKLQlkZWYgc2VnbWVudF9pbWFnZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIic2VnbWVudCBpbWFnZTogU2VnbWVudCBhIE5ESUYgUi9XIG9yIFIvTyBpbWFnZSBpbnRvIHNtYWxsZXIgcGllY2VzCi0JCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZGlzayBpbWFnZSB0byBiZSBzZWdtZW50ZWQKLQkJS2V5d29yZCBhcmd1bWVudCBzZWdtZW50X2NvdW50OiB0aGUgbnVtYmVyIG9mIGltYWdlIHNlZ21lbnRzIHRvIGNyZWF0ZQotCQlLZXl3b3JkIGFyZ3VtZW50IHNlZ21lbnRfc2l6ZTogdGhlIHNpemUgb2YgaW1hZ2Ugc2VnbWVudHMgKGluIGJsb2NrcykgdG8gY3JlYXRlCi0JCUtleXdvcmQgYXJndW1lbnQgc2VnbWVudF9uYW1lOiB0aGUgcm9vdCBuYW1lIGZvciBlYWNoIGltYWdlIHNlZ21lbnQgZmlsZQotCQlLZXl3b3JkIGFyZ3VtZW50IGltYWdlX0lEOiBzdHJpbmcgdXNlZCB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBpbWFnZSBJRCB0byBncm91cCB0aGUgc2VnbWVudHMKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQlSZXR1cm5zOiBhIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byB0aGUgaW1hZ2Ugc2VnbWVudHMgY3JlYXRlZAotCQkiIiIKLQkJX2NvZGUgPSAnZGRzaycKLQkJX3N1YmNvZGUgPSAnU0dNVCcKKyAgICBkZWYgc2VnbWVudF9pbWFnZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic2VnbWVudCBpbWFnZTogU2VnbWVudCBhIE5ESUYgUi9XIG9yIFIvTyBpbWFnZSBpbnRvIHNtYWxsZXIgcGllY2VzCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZGlzayBpbWFnZSB0byBiZSBzZWdtZW50ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzZWdtZW50X2NvdW50OiB0aGUgbnVtYmVyIG9mIGltYWdlIHNlZ21lbnRzIHRvIGNyZWF0ZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNlZ21lbnRfc2l6ZTogdGhlIHNpemUgb2YgaW1hZ2Ugc2VnbWVudHMgKGluIGJsb2NrcykgdG8gY3JlYXRlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgc2VnbWVudF9uYW1lOiB0aGUgcm9vdCBuYW1lIGZvciBlYWNoIGltYWdlIHNlZ21lbnQgZmlsZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGltYWdlX0lEOiBzdHJpbmcgdXNlZCB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBpbWFnZSBJRCB0byBncm91cCB0aGUgc2VnbWVudHMKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byB0aGUgaW1hZ2Ugc2VnbWVudHMgY3JlYXRlZAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnZGRzaycKKyAgICAgICAgX3N1YmNvZGUgPSAnU0dNVCcKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWdtZW50X2ltYWdlKQotCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NlZ21lbnRfaW1hZ2UpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX2NyZWF0ZV9TTUkgPSB7Ci0JCSdzb3VyY2VfaW1hZ2VzJyA6ICdTTUkxJywKLQkJJ2xhdW5jaGluZ19hcHBsaWNhdGlvbicgOiAnU01JMicsCi0JCSdsYXVuY2hpbmdfZG9jdW1lbnQnIDogJ1NNSTMnLAotCQkndmVyc2lvbl9zdHJpbmcnIDogJ1NNSTQnLAotCQknY2hlY2tzdW1fdmVyaWZpY2F0aW9uJyA6ICdWQ2hrJywKLQkJJ3NpZ25hdHVyZV92ZXJpZmljYXRpb24nIDogJ1ZTaWcnLAotCQknaW1hZ2Vfc2lnbmluZycgOiAnU0ltZycsCi0JfQorICAgIF9hcmdtYXBfY3JlYXRlX1NNSSA9IHsKKyAgICAgICAgICAgICdzb3VyY2VfaW1hZ2VzJyA6ICdTTUkxJywKKyAgICAgICAgICAgICdsYXVuY2hpbmdfYXBwbGljYXRpb24nIDogJ1NNSTInLAorICAgICAgICAgICAgJ2xhdW5jaGluZ19kb2N1bWVudCcgOiAnU01JMycsCisgICAgICAgICAgICAndmVyc2lvbl9zdHJpbmcnIDogJ1NNSTQnLAorICAgICAgICAgICAgJ2NoZWNrc3VtX3ZlcmlmaWNhdGlvbicgOiAnVkNoaycsCisgICAgICAgICAgICAnc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbicgOiAnVlNpZycsCisgICAgICAgICAgICAnaW1hZ2Vfc2lnbmluZycgOiAnU0ltZycsCisgICAgfQogCi0JZGVmIGNyZWF0ZV9TTUkoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiImNyZWF0ZSBTTUk6IENyZWF0ZXMgYSBzZWxmLW1vdW50aW5nIGltYWdlIChTTUkpIGZyb20gYSBsaXN0IG9mIE5ESUYgZGlzayBpbWFnZXMKLQkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBzZWxmLW1vdW50aW5nIGltYWdlIHRvIGNyZWF0ZQotCQlLZXl3b3JkIGFyZ3VtZW50IHNvdXJjZV9pbWFnZXM6IGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIHNvdXJjZXMgaW1hZ2VzCi0JCUtleXdvcmQgYXJndW1lbnQgbGF1bmNoaW5nX2FwcGxpY2F0aW9uOiB0aGUgcGF0aCB0byBhbiBhcHBsaWNhdGlvbiB0byBsYXVuY2gKLQkJS2V5d29yZCBhcmd1bWVudCBsYXVuY2hpbmdfZG9jdW1lbnQ6IHRoZSBwYXRoIHRvIGEgZG9jdW1lbnQgdG8gb3BlbgotCQlLZXl3b3JkIGFyZ3VtZW50IHZlcnNpb25fc3RyaW5nOiBzZXRzIHRoZSAndmVycycgMSByZXNvdXJjZSBvZiB0aGUgc2VsZi1tb3VudGluZyBpbWFnZQotCQlLZXl3b3JkIGFyZ3VtZW50IGNoZWNrc3VtX3ZlcmlmaWNhdGlvbjogU2hvdWxkIHRoZSBjaGVja3N1bSBvZiB0aGUgc291cmNlIGltYWdlcyBiZSB2ZXJpZmllZCBiZWZvcmUgY3JlYXRpbmcgdGhlIFNNST8KLQkJS2V5d29yZCBhcmd1bWVudCBzaWduYXR1cmVfdmVyaWZpY2F0aW9uOiBTaG91bGQgdGhlIERpZ2lTaWdujiBzaWduYXR1cmUgb2YgdGhlIHNvdXJjZSBpbWFnZXMgYmUgdmVyaWZpZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBTTUk/Ci0JCUtleXdvcmQgYXJndW1lbnQgaW1hZ2Vfc2lnbmluZzogU2hvdWxkIHRoZSBTTUkgYmUgZ2l2ZW4gYSBkaWdpdGFsIHNpZ25hdHVyZSB3aGVuIGl0IGlzIGNyZWF0ZWQ/Ci0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJUmV0dXJuczogYSByZWZlcmVuY2UgdG8gdGhlIHNlbGYtbW91bnRpbmcgaW1hZ2UgY3JlYXRlZAotCQkiIiIKLQkJX2NvZGUgPSAnZGRzaycKLQkJX3N1YmNvZGUgPSAnTVNNSScKKyAgICBkZWYgY3JlYXRlX1NNSShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiY3JlYXRlIFNNSTogQ3JlYXRlcyBhIHNlbGYtbW91bnRpbmcgaW1hZ2UgKFNNSSkgZnJvbSBhIGxpc3Qgb2YgTkRJRiBkaXNrIGltYWdlcworICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIHNlbGYtbW91bnRpbmcgaW1hZ2UgdG8gY3JlYXRlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgc291cmNlX2ltYWdlczogYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gc291cmNlcyBpbWFnZXMKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBsYXVuY2hpbmdfYXBwbGljYXRpb246IHRoZSBwYXRoIHRvIGFuIGFwcGxpY2F0aW9uIHRvIGxhdW5jaAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGxhdW5jaGluZ19kb2N1bWVudDogdGhlIHBhdGggdG8gYSBkb2N1bWVudCB0byBvcGVuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdmVyc2lvbl9zdHJpbmc6IHNldHMgdGhlICd2ZXJzJyAxIHJlc291cmNlIG9mIHRoZSBzZWxmLW1vdW50aW5nIGltYWdlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgY2hlY2tzdW1fdmVyaWZpY2F0aW9uOiBTaG91bGQgdGhlIGNoZWNrc3VtIG9mIHRoZSBzb3VyY2UgaW1hZ2VzIGJlIHZlcmlmaWVkIGJlZm9yZSBjcmVhdGluZyB0aGUgU01JPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNpZ25hdHVyZV92ZXJpZmljYXRpb246IFNob3VsZCB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSBvZiB0aGUgc291cmNlIGltYWdlcyBiZSB2ZXJpZmllZCBiZWZvcmUgY3JlYXRpbmcgdGhlIFNNST8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBpbWFnZV9zaWduaW5nOiBTaG91bGQgdGhlIFNNSSBiZSBnaXZlbiBhIGRpZ2l0YWwgc2lnbmF0dXJlIHdoZW4gaXQgaXMgY3JlYXRlZD8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byB0aGUgc2VsZi1tb3VudGluZyBpbWFnZSBjcmVhdGVkCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdkZHNrJworICAgICAgICBfc3ViY29kZSA9ICdNU01JJwogCi0JCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2NyZWF0ZV9TTUkpCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY3JlYXRlX1NNSSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWQ2hrJywgX0VudW1fYm9vbCkKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1ZTaWcnLCBfRW51bV9ib29sKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU0ltZycsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWQ2hrJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1ZTaWcnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU0ltZycsIF9FbnVtX2Jvb2wpCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAogCiBjbGFzcyBWZXJpZnlfQ2hlY2tzdW1fcmVwbHlfcmVjb3JkKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6Ci0JIiIiVmVyaWZ5IENoZWNrc3VtIHJlcGx5IHJlY29yZCAtICAiIiIKLQl3YW50ID0gJ1JjcmMnCisgICAgIiIiVmVyaWZ5IENoZWNrc3VtIHJlcGx5IHJlY29yZCAtICAiIiIKKyAgICB3YW50ID0gJ1JjcmMnCiBjbGFzcyB2YWxpZGl0eShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIidmFsaWRpdHkgLSB0cnVlIGlmIGNoZWNrc3VtIGlzIHZhbGlkICIiIgotCXdoaWNoID0gJ1ZsaWQnCi0Jd2FudCA9ICdib29sJworICAgICIiInZhbGlkaXR5IC0gdHJ1ZSBpZiBjaGVja3N1bSBpcyB2YWxpZCAiIiIKKyAgICB3aGljaCA9ICdWbGlkJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIGV4cGVjdGVkX2NoZWNrc3VtKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJleHBlY3RlZCBjaGVja3N1bSAtIGNoZWNrc3VtIHZhbHVlIHN0b3JlZCBpbiB0aGUgaW1hZ2UgaGVhZGVyIChpbiBoZXhhZGVjaW1hbCkgIiIiCi0Jd2hpY2ggPSAnY3JjRScKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIiZXhwZWN0ZWQgY2hlY2tzdW0gLSBjaGVja3N1bSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGltYWdlIGhlYWRlciAoaW4gaGV4YWRlY2ltYWwpICIiIgorICAgIHdoaWNoID0gJ2NyY0UnCisgICAgd2FudCA9ICdURVhUJwogY2xhc3MgY2FsY3VsYXRlZF9jaGVja3N1bShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiY2FsY3VsYXRlZCBjaGVja3N1bSAtIGNoZWNrc3VtIHZhbHVlIGFjdHVhbGx5IGNhbGN1bGF0ZWQgKGluIGhleGFkZWNpbWFsKSAiIiIKLQl3aGljaCA9ICdjcmNBJwotCXdhbnQgPSAnVEVYVCcKKyAgICAiIiJjYWxjdWxhdGVkIGNoZWNrc3VtIC0gY2hlY2tzdW0gdmFsdWUgYWN0dWFsbHkgY2FsY3VsYXRlZCAoaW4gaGV4YWRlY2ltYWwpICIiIgorICAgIHdoaWNoID0gJ2NyY0EnCisgICAgd2FudCA9ICdURVhUJwogCiBjbGFzcyBDaGVja19JbWFnZV9yZXBseV9yZWNvcmQoYWV0b29scy5Db21wb25lbnRJdGVtKToKLQkiIiJDaGVjayBJbWFnZSByZXBseSByZWNvcmQgLSAgIiIiCi0Jd2FudCA9ICdSY2hrJworICAgICIiIkNoZWNrIEltYWdlIHJlcGx5IHJlY29yZCAtICAiIiIKKyAgICB3YW50ID0gJ1JjaGsnCiBjbGFzcyBjb25zaXN0ZW5jeShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiY29uc2lzdGVuY3kgLSBEb2VzIHRoZSBpbWFnZSBwYXNzIGNvbnNpc3RlbmN5IGNoZWNrcz8gIiIiCi0Jd2hpY2ggPSAnUmNoMScKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIiY29uc2lzdGVuY3kgLSBEb2VzIHRoZSBpbWFnZSBwYXNzIGNvbnNpc3RlbmN5IGNoZWNrcz8gIiIiCisgICAgd2hpY2ggPSAnUmNoMScKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBlcnJvcl9jb3VudChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiZXJyb3IgY291bnQgLSB0aGUgbnVtYmVyIG9mIGVycm9ycyByZWNvcmRlZCAiIiIKLQl3aGljaCA9ICdSY2gyJwotCXdhbnQgPSAnbG9uZycKKyAgICAiIiJlcnJvciBjb3VudCAtIHRoZSBudW1iZXIgb2YgZXJyb3JzIHJlY29yZGVkICIiIgorICAgIHdoaWNoID0gJ1JjaDInCisgICAgd2FudCA9ICdsb25nJwogY2xhc3Mgd2FybmluZ19jb3VudChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIid2FybmluZyBjb3VudCAtIHRoZSBudW1iZXIgb2Ygd2FybmluZ3MgcmVjb3JkZWQgIiIiCi0Jd2hpY2ggPSAnUmNoMycKLQl3YW50ID0gJ2xvbmcnCisgICAgIiIid2FybmluZyBjb3VudCAtIHRoZSBudW1iZXIgb2Ygd2FybmluZ3MgcmVjb3JkZWQgIiIiCisgICAgd2hpY2ggPSAnUmNoMycKKyAgICB3YW50ID0gJ2xvbmcnCiBWZXJpZnlfQ2hlY2tzdW1fcmVwbHlfcmVjb3JkLl9wcm9wZGljdCA9IHsKLQkndmFsaWRpdHknIDogdmFsaWRpdHksCi0JJ2V4cGVjdGVkX2NoZWNrc3VtJyA6IGV4cGVjdGVkX2NoZWNrc3VtLAotCSdjYWxjdWxhdGVkX2NoZWNrc3VtJyA6IGNhbGN1bGF0ZWRfY2hlY2tzdW0sCisgICAgICAgICd2YWxpZGl0eScgOiB2YWxpZGl0eSwKKyAgICAgICAgJ2V4cGVjdGVkX2NoZWNrc3VtJyA6IGV4cGVjdGVkX2NoZWNrc3VtLAorICAgICAgICAnY2FsY3VsYXRlZF9jaGVja3N1bScgOiBjYWxjdWxhdGVkX2NoZWNrc3VtLAogfQogVmVyaWZ5X0NoZWNrc3VtX3JlcGx5X3JlY29yZC5fZWxlbWRpY3QgPSB7CiB9CiBDaGVja19JbWFnZV9yZXBseV9yZWNvcmQuX3Byb3BkaWN0ID0gewotCSdjb25zaXN0ZW5jeScgOiBjb25zaXN0ZW5jeSwKLQknZXJyb3JfY291bnQnIDogZXJyb3JfY291bnQsCi0JJ3dhcm5pbmdfY291bnQnIDogd2FybmluZ19jb3VudCwKKyAgICAgICAgJ2NvbnNpc3RlbmN5JyA6IGNvbnNpc3RlbmN5LAorICAgICAgICAnZXJyb3JfY291bnQnIDogZXJyb3JfY291bnQsCisgICAgICAgICd3YXJuaW5nX2NvdW50JyA6IHdhcm5pbmdfY291bnQsCiB9CiBDaGVja19JbWFnZV9yZXBseV9yZWNvcmQuX2VsZW1kaWN0ID0gewogfQogX0VudW1fQWNzcyA9IHsKLQkncmVhZF9hbmRfd3JpdGUnIDogJ1JkV3InLAkjIHJlYWQvd3JpdGUgYWNjZXNzCi0JJ3JlYWRfb25seScgOiAnUmR4eCcsCSMgcmVhZC1vbmx5IGFjY2VzcwotCSdhbnknIDogJ0FueXgnLAkjIGJlc3QgcG9zc2libGUgYWNjZXNzCisgICAgICAgICdyZWFkX2FuZF93cml0ZScgOiAnUmRXcicsICAgICAgIyByZWFkL3dyaXRlIGFjY2VzcworICAgICAgICAncmVhZF9vbmx5JyA6ICdSZHh4JywgICAjIHJlYWQtb25seSBhY2Nlc3MKKyAgICAgICAgJ2FueScgOiAnQW55eCcsICMgYmVzdCBwb3NzaWJsZSBhY2Nlc3MKIH0KIAogX0VudW1fRnN5cyA9IHsKLQknTWFjX09TX1N0YW5kYXJkJyA6ICdGaGZzJywJIyBjbGFzc2ljIEhGUyBmaWxlIHN5c3RlbQotCSdjb21wYXRpYmxlX01hY19PU19FeHRlbmRlZCcgOiAnRmhmKycsCSMgbmV3IEhGUysgZmlsZSBzeXN0ZW0KKyAgICAgICAgJ01hY19PU19TdGFuZGFyZCcgOiAnRmhmcycsICAgICAjIGNsYXNzaWMgSEZTIGZpbGUgc3lzdGVtCisgICAgICAgICdjb21wYXRpYmxlX01hY19PU19FeHRlbmRlZCcgOiAnRmhmKycsICAjIG5ldyBIRlMrIGZpbGUgc3lzdGVtCiB9CiAKIF9FbnVtX2FsaXMgPSBOb25lICMgWFhYWCBlbnVtIGFsaXMgbm90IGZvdW5kISEKQEAgLTQwMiwyMyArNDAyLDIzIEBACiAjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKICMKIF9jbGFzc2RlY2xhcmF0aW9ucyA9IHsKLQknUmNoaycgOiBDaGVja19JbWFnZV9yZXBseV9yZWNvcmQsCi0JJ1JjcmMnIDogVmVyaWZ5X0NoZWNrc3VtX3JlcGx5X3JlY29yZCwKKyAgICAgICAgJ1JjaGsnIDogQ2hlY2tfSW1hZ2VfcmVwbHlfcmVjb3JkLAorICAgICAgICAnUmNyYycgOiBWZXJpZnlfQ2hlY2tzdW1fcmVwbHlfcmVjb3JkLAogfQogCiBfcHJvcGRlY2xhcmF0aW9ucyA9IHsKLQknY3JjRScgOiBleHBlY3RlZF9jaGVja3N1bSwKLQknUmNoMicgOiBlcnJvcl9jb3VudCwKLQknY3JjQScgOiBjYWxjdWxhdGVkX2NoZWNrc3VtLAotCSdSY2gzJyA6IHdhcm5pbmdfY291bnQsCi0JJ1ZsaWQnIDogdmFsaWRpdHksCi0JJ1JjaDEnIDogY29uc2lzdGVuY3ksCisgICAgICAgICdjcmNFJyA6IGV4cGVjdGVkX2NoZWNrc3VtLAorICAgICAgICAnUmNoMicgOiBlcnJvcl9jb3VudCwKKyAgICAgICAgJ2NyY0EnIDogY2FsY3VsYXRlZF9jaGVja3N1bSwKKyAgICAgICAgJ1JjaDMnIDogd2FybmluZ19jb3VudCwKKyAgICAgICAgJ1ZsaWQnIDogdmFsaWRpdHksCisgICAgICAgICdSY2gxJyA6IGNvbnNpc3RlbmN5LAogfQogCiBfY29tcGRlY2xhcmF0aW9ucyA9IHsKIH0KIAogX2VudW1kZWNsYXJhdGlvbnMgPSB7Ci0JJ0Fjc3MnIDogX0VudW1fQWNzcywKLQknRnN5cycgOiBfRW51bV9Gc3lzLAorICAgICAgICAnQWNzcycgOiBfRW51bV9BY3NzLAorICAgICAgICAnRnN5cycgOiBfRW51bV9Gc3lzLAogfQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vYXBwbGVzY3JpcHQvRGlza19Db3B5L1N0YW5kYXJkX1N1aXRlLnB5IGIvTWFjL0RlbW8vYXBwbGVzY3JpcHQvRGlza19Db3B5L1N0YW5kYXJkX1N1aXRlLnB5CmluZGV4IDkzMTI0NmUuLjQ1NWU3OGQgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9TdGFuZGFyZF9TdWl0ZS5weQorKysgYi9NYWMvRGVtby9hcHBsZXNjcmlwdC9EaXNrX0NvcHkvU3RhbmRhcmRfU3VpdGUucHkKQEAgLTEyLDIyNSArMTIsMjI1IEBACiAKIGNsYXNzIFN0YW5kYXJkX1N1aXRlX0V2ZW50czoKIAotCV9hcmdtYXBfc2F2ZSA9IHsKLQkJJ19pbicgOiAna2ZpbCcsCi0JCSd1c2luZ19mb3JtYXQnIDogJ1N2QXMnLAotCQknY2hlY2tzdW1fdmVyaWZpY2F0aW9uJyA6ICdWQ2hrJywKLQkJJ3NpZ25hdHVyZV92ZXJpZmljYXRpb24nIDogJ1ZTaWcnLAotCQknaW1hZ2Vfc2lnbmluZycgOiAnU0ltZycsCi0JCSdsZWF2ZV9pbWFnZV9tb3VudGVkJyA6ICdNb3VuJywKLQkJJ3BlcmNlbnRfZnJlZV9zcGFjZScgOiAnU2xvcCcsCi0JCSdsb2dpY2FsX2Jsb2NrcycgOiAnQmxrcycsCi0JCSd6ZXJvaW5nJyA6ICdaZXJvJywKLQl9CisgICAgX2FyZ21hcF9zYXZlID0geworICAgICAgICAgICAgJ19pbicgOiAna2ZpbCcsCisgICAgICAgICAgICAndXNpbmdfZm9ybWF0JyA6ICdTdkFzJywKKyAgICAgICAgICAgICdjaGVja3N1bV92ZXJpZmljYXRpb24nIDogJ1ZDaGsnLAorICAgICAgICAgICAgJ3NpZ25hdHVyZV92ZXJpZmljYXRpb24nIDogJ1ZTaWcnLAorICAgICAgICAgICAgJ2ltYWdlX3NpZ25pbmcnIDogJ1NJbWcnLAorICAgICAgICAgICAgJ2xlYXZlX2ltYWdlX21vdW50ZWQnIDogJ01vdW4nLAorICAgICAgICAgICAgJ3BlcmNlbnRfZnJlZV9zcGFjZScgOiAnU2xvcCcsCisgICAgICAgICAgICAnbG9naWNhbF9ibG9ja3MnIDogJ0Jsa3MnLAorICAgICAgICAgICAgJ3plcm9pbmcnIDogJ1plcm8nLAorICAgIH0KIAotCWRlZiBzYXZlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJzYXZlOiBTYXZlIGFuIG9iamVjdAotCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIHNvdXJjZSBvYmplY3QKLQkJS2V5d29yZCBhcmd1bWVudCBfaW46IHRoZSB0YXJnZXQgb2JqZWN0Ci0JCUtleXdvcmQgYXJndW1lbnQgdXNpbmdfZm9ybWF0OiB0aGUgZm9ybWF0IGZvciB0aGUgdGFyZ2V0Ci0JCUtleXdvcmQgYXJndW1lbnQgY2hlY2tzdW1fdmVyaWZpY2F0aW9uOiBTaG91bGQgdGhlIGNoZWNrc3VtIGJlIHZlcmlmaWVkIGJlZm9yZSBzYXZpbmc/Ci0JCUtleXdvcmQgYXJndW1lbnQgc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbjogU2hvdWxkIHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIGJlIHZlcmlmaWVkIGJlZm9yZSBzYXZpbmc/Ci0JCUtleXdvcmQgYXJndW1lbnQgaW1hZ2Vfc2lnbmluZzogU2hvdWxkIHRoZSBpbWFnZSBiZSBzaWduZWQ/Ci0JCUtleXdvcmQgYXJndW1lbnQgbGVhdmVfaW1hZ2VfbW91bnRlZDogU2hvdWxkIHRoZSBpbWFnZSBiZSBtb3VudGVkIGFmdGVyIHNhdmluZz8KLQkJS2V5d29yZCBhcmd1bWVudCBwZXJjZW50X2ZyZWVfc3BhY2U6IHBlcmNlbnQgZnJlZSBzcGFjZSB0byByZXNlcnZlIChmb3IgaW1hZ2UgZm9sZGVyIG9wZXJhdGlvbiwgMC0yNTUlKQotCQlLZXl3b3JkIGFyZ3VtZW50IGxvZ2ljYWxfYmxvY2tzOiBudW1iZXIgb2YgbG9naWNhbCBibG9ja3MgaW4gdGhlIGltYWdlIChmb3IgaW1hZ2UgZm9sZGVyIG9wZXJhdGlvbikKLQkJS2V5d29yZCBhcmd1bWVudCB6ZXJvaW5nOiBTaG91bGQgYWxsIHRoZSBibG9ja3MgaW4gdGhlIGltYWdlIGJlIHNldCB0byB6ZXJvcz8gKGZvciBpbWFnZSBmb2xkZXIgb3BlcmF0aW9uKQotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IHRoZSByZXN1bHQgb2YgdGhlIHNhdmUgb3BlcmF0aW9uCi0JCSIiIgotCQlfY29kZSA9ICdjb3JlJwotCQlfc3ViY29kZSA9ICdzYXZlJworICAgIGRlZiBzYXZlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzYXZlOiBTYXZlIGFuIG9iamVjdAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIHNvdXJjZSBvYmplY3QKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfaW46IHRoZSB0YXJnZXQgb2JqZWN0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdXNpbmdfZm9ybWF0OiB0aGUgZm9ybWF0IGZvciB0aGUgdGFyZ2V0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgY2hlY2tzdW1fdmVyaWZpY2F0aW9uOiBTaG91bGQgdGhlIGNoZWNrc3VtIGJlIHZlcmlmaWVkIGJlZm9yZSBzYXZpbmc/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbjogU2hvdWxkIHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIGJlIHZlcmlmaWVkIGJlZm9yZSBzYXZpbmc/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgaW1hZ2Vfc2lnbmluZzogU2hvdWxkIHRoZSBpbWFnZSBiZSBzaWduZWQ/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgbGVhdmVfaW1hZ2VfbW91bnRlZDogU2hvdWxkIHRoZSBpbWFnZSBiZSBtb3VudGVkIGFmdGVyIHNhdmluZz8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBwZXJjZW50X2ZyZWVfc3BhY2U6IHBlcmNlbnQgZnJlZSBzcGFjZSB0byByZXNlcnZlIChmb3IgaW1hZ2UgZm9sZGVyIG9wZXJhdGlvbiwgMC0yNTUlKQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGxvZ2ljYWxfYmxvY2tzOiBudW1iZXIgb2YgbG9naWNhbCBibG9ja3MgaW4gdGhlIGltYWdlIChmb3IgaW1hZ2UgZm9sZGVyIG9wZXJhdGlvbikKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB6ZXJvaW5nOiBTaG91bGQgYWxsIHRoZSBibG9ja3MgaW4gdGhlIGltYWdlIGJlIHNldCB0byB6ZXJvcz8gKGZvciBpbWFnZSBmb2xkZXIgb3BlcmF0aW9uKQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSByZXN1bHQgb2YgdGhlIHNhdmUgb3BlcmF0aW9uCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdzYXZlJwogCi0JCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NhdmUpCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2F2ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdrZmlsJywgX0VudW1fb2JqXykKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1N2QXMnLCBfRW51bV9TdkFzKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVkNoaycsIF9FbnVtX2Jvb2wpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWU2lnJywgX0VudW1fYm9vbCkKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NJbWcnLCBfRW51bV9ib29sKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnTW91bicsIF9FbnVtX2Jvb2wpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTbG9wJywgX0VudW1fbG9uZykKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ0Jsa3MnLCBfRW51bV9sb25nKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnWmVybycsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdrZmlsJywgX0VudW1fb2JqXykKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1N2QXMnLCBfRW51bV9TdkFzKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVkNoaycsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWU2lnJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NJbWcnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnTW91bicsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTbG9wJywgX0VudW1fbG9uZykKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ0Jsa3MnLCBfRW51bV9sb25nKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnWmVybycsIF9FbnVtX2Jvb2wpCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCWRlZiBkb19zY3JpcHQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiImRvIHNjcmlwdDogRXhlY3V0ZSBhbiBhdHRhY2hlZCBzY3JpcHQgbG9jYXRlZCBpbiB0aGUgZm9sZGVyICJTY3JpcHRzIgotCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIHNjcmlwdCB0byBiZSBleGVjdXRlZAotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCSIiIgotCQlfY29kZSA9ICdjb3JlJwotCQlfc3ViY29kZSA9ICdkb3NjJworICAgIGRlZiBkb19zY3JpcHQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImRvIHNjcmlwdDogRXhlY3V0ZSBhbiBhdHRhY2hlZCBzY3JpcHQgbG9jYXRlZCBpbiB0aGUgZm9sZGVyICJTY3JpcHRzIgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIHNjcmlwdCB0byBiZSBleGVjdXRlZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdkb3NjJwogCi0JCWlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAogCiBjbGFzcyBhcHBsaWNhdGlvbihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgotCSIiImFwcGxpY2F0aW9uIC0gVGhlIERpc2sgQ29weSBhcHBsaWNhdGlvbiAiIiIKLQl3YW50ID0gJ2NhcHAnCisgICAgIiIiYXBwbGljYXRpb24gLSBUaGUgRGlzayBDb3B5IGFwcGxpY2F0aW9uICIiIgorICAgIHdhbnQgPSAnY2FwcCcKIGNsYXNzIHZlcnNpb24oYWV0b29scy5OUHJvcGVydHkpOgotCSIiInZlcnNpb24gLSB0aGUgdmVyc2lvbiBvZiB0aGlzIGFwcGxpY2F0aW9uICIiIgotCXdoaWNoID0gJ3ZlcnMnCi0Jd2FudCA9ICd2ZXJzJworICAgICIiInZlcnNpb24gLSB0aGUgdmVyc2lvbiBvZiB0aGlzIGFwcGxpY2F0aW9uICIiIgorICAgIHdoaWNoID0gJ3ZlcnMnCisgICAgd2FudCA9ICd2ZXJzJwogY2xhc3MgbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIibmFtZSAtIHRoZSBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24gIiIiCi0Jd2hpY2ggPSAncG5hbScKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIibmFtZSAtIHRoZSBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24gIiIiCisgICAgd2hpY2ggPSAncG5hbScKKyAgICB3YW50ID0gJ1RFWFQnCiBjbGFzcyBjb21tZW50KGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJjb21tZW50IC0gdGhlIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiAiIiIKLQl3aGljaCA9ICdjb210JwotCXdhbnQgPSAnVEVYVCcKKyAgICAiIiJjb21tZW50IC0gdGhlIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiAiIiIKKyAgICB3aGljaCA9ICdjb210JworICAgIHdhbnQgPSAnVEVYVCcKIGNsYXNzIGRyaXZlcl92ZXJzaW9uKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJkcml2ZXIgdmVyc2lvbiAtIHRoZSB2ZXJzaW9uIG9mIHRoZSBkaXNrIGltYWdlIGRyaXZlciAiIiIKLQl3aGljaCA9ICdkVmVyJwotCXdhbnQgPSAndmVycycKKyAgICAiIiJkcml2ZXIgdmVyc2lvbiAtIHRoZSB2ZXJzaW9uIG9mIHRoZSBkaXNrIGltYWdlIGRyaXZlciAiIiIKKyAgICB3aGljaCA9ICdkVmVyJworICAgIHdhbnQgPSAndmVycycKIGNsYXNzIG5vbmVqZWN0YWJsZV9tb2RlKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJub25lamVjdGFibGUgbW9kZSAtIFNob3VsZCBtb3VudGVkIGltYWdlcyBiZSBub24tZWplY3RhYmxlPyAiIiIKLQl3aGljaCA9ICdvdHRvJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJub25lamVjdGFibGUgbW9kZSAtIFNob3VsZCBtb3VudGVkIGltYWdlcyBiZSBub24tZWplY3RhYmxlPyAiIiIKKyAgICB3aGljaCA9ICdvdHRvJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIHNhdmVfbG9nX2ZpbGUoYWV0b29scy5OUHJvcGVydHkpOgotCSIiInNhdmUgbG9nIGZpbGUgLSBTaG91bGQgdGhlIGxvZyBmaWxlIGJlIHNhdmVkIG9uIGRpc2s/ICIiIgotCXdoaWNoID0gJ1BTYUwnCi0Jd2FudCA9ICdib29sJworICAgICIiInNhdmUgbG9nIGZpbGUgLSBTaG91bGQgdGhlIGxvZyBmaWxlIGJlIHNhdmVkIG9uIGRpc2s/ICIiIgorICAgIHdoaWNoID0gJ1BTYUwnCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgdXNlX3NwZWVjaChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIidXNlIHNwZWVjaCAtIFNob3VsZCBEaXNrIENvcHkgdXNlIHNwb2tlbiBmZWVkYmFjaz8gIiIiCi0Jd2hpY2ggPSAnUFRsaycKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIidXNlIHNwZWVjaCAtIFNob3VsZCBEaXNrIENvcHkgdXNlIHNwb2tlbiBmZWVkYmFjaz8gIiIiCisgICAgd2hpY2ggPSAnUFRsaycKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBzbWFydF9TYXZlX0FzKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJzbWFydCBTYXZlIEFzIC0gU2hvdWxkIHRoZSBTYXZlIEFzLi4uIGRpYWxvZyBib3ggYXV0b21hdGljYWxseSBnbyB0byB0aGUgcmlnaHQgZm9sZGVyPyAiIiIKLQl3aGljaCA9ICdQU1NQJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJzbWFydCBTYXZlIEFzIC0gU2hvdWxkIHRoZSBTYXZlIEFzLi4uIGRpYWxvZyBib3ggYXV0b21hdGljYWxseSBnbyB0byB0aGUgcmlnaHQgZm9sZGVyPyAiIiIKKyAgICB3aGljaCA9ICdQU1NQJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIGNoZWNrc3VtX3ZlcmlmaWNhdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiY2hlY2tzdW0gdmVyaWZpY2F0aW9uIC0gU2hvdWxkIGltYWdlIGNoZWNrc3VtcyBiZSB2ZXJpZmllZD8gIiIiCi0Jd2hpY2ggPSAnUFZlQycKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIiY2hlY2tzdW0gdmVyaWZpY2F0aW9uIC0gU2hvdWxkIGltYWdlIGNoZWNrc3VtcyBiZSB2ZXJpZmllZD8gIiIiCisgICAgd2hpY2ggPSAnUFZlQycKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBzaWduYXR1cmVfdmVyaWZpY2F0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJzaWduYXR1cmUgdmVyaWZpY2F0aW9uIC0gU2hvdWxkIGRpZ2l0YWwgc2lnbmF0dXJlcyBiZSB2ZXJpZmllZD8gIiIiCi0Jd2hpY2ggPSAnUFZlUycKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiAtIFNob3VsZCBkaWdpdGFsIHNpZ25hdHVyZXMgYmUgdmVyaWZpZWQ/ICIiIgorICAgIHdoaWNoID0gJ1BWZVMnCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgZXhjbHVkZV9EaXNrU2NyaXB0cyhhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiZXhjbHVkZSBEaXNrU2NyaXB0cyAtIFNob3VsZCBpbWFnZXMgcmVmZXJlbmNlZCBpbiBEaXNrU2NyaXB0cy9EaXNrU2V0cyBiZSBleGNsdWRlZCBmcm9tIHZlcmlmaWNhdGlvbj8gIiIiCi0Jd2hpY2ggPSAnUEV4RCcKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIiZXhjbHVkZSBEaXNrU2NyaXB0cyAtIFNob3VsZCBpbWFnZXMgcmVmZXJlbmNlZCBpbiBEaXNrU2NyaXB0cy9EaXNrU2V0cyBiZSBleGNsdWRlZCBmcm9tIHZlcmlmaWNhdGlvbj8gIiIiCisgICAgd2hpY2ggPSAnUEV4RCcKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBleGNsdWRlX3JlbW90ZV9pbWFnZXMoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImV4Y2x1ZGUgcmVtb3RlIGltYWdlcyAtIFNob3VsZCBpbWFnZXMgdGhhdCBhcmUgbG9jYXRlZCBvbiBuZXR3b3JrIHZvbHVtZXMgYmUgZXhjbHVkZWQgZnJvbSB2ZXJpZmljYXRpb24/ICIiIgotCXdoaWNoID0gJ1BFeFInCi0Jd2FudCA9ICdib29sJworICAgICIiImV4Y2x1ZGUgcmVtb3RlIGltYWdlcyAtIFNob3VsZCBpbWFnZXMgdGhhdCBhcmUgbG9jYXRlZCBvbiBuZXR3b3JrIHZvbHVtZXMgYmUgZXhjbHVkZWQgZnJvbSB2ZXJpZmljYXRpb24/ICIiIgorICAgIHdoaWNoID0gJ1BFeFInCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgaW1hZ2Vfc2lnbmluZyhhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiaW1hZ2Ugc2lnbmluZyAtIFNob3VsZCBpbWFnZXMgYmUgc2lnbmVkIHdpdGggYSBkaWdpdGFsIHNpZ25hdHVyZT8gIiIiCi0Jd2hpY2ggPSAnUFNpSScKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIiaW1hZ2Ugc2lnbmluZyAtIFNob3VsZCBpbWFnZXMgYmUgc2lnbmVkIHdpdGggYSBkaWdpdGFsIHNpZ25hdHVyZT8gIiIiCisgICAgd2hpY2ggPSAnUFNpSScKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBsZWF2ZV9pbWFnZV9tb3VudGVkKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJsZWF2ZSBpbWFnZSBtb3VudGVkIC0gU2hvdWxkIGltYWdlcyBiZSBtb3VudGVkIGFmdGVyIHRoZXkgYXJlIGNyZWF0ZWQ/ICIiIgotCXdoaWNoID0gJ1BNb0EnCi0Jd2FudCA9ICdib29sJworICAgICIiImxlYXZlIGltYWdlIG1vdW50ZWQgLSBTaG91bGQgaW1hZ2VzIGJlIG1vdW50ZWQgYWZ0ZXIgdGhleSBhcmUgY3JlYXRlZD8gIiIiCisgICAgd2hpY2ggPSAnUE1vQScKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBlcmFzZV9jb25maXJtYXRpb24oYWV0b29scy5OUHJvcGVydHkpOgotCSIiImVyYXNlIGNvbmZpcm1hdGlvbiAtIFNob3VsZCB0aGUgdXNlciBiZSByZXF1aXJlZCB0byBjb25maXJtIGNvbW1hbmRzIHRoYXQgZXJhc2UgZGlza3M/ICIiIgotCXdoaWNoID0gJ1BDb0UnCi0Jd2FudCA9ICdib29sJworICAgICIiImVyYXNlIGNvbmZpcm1hdGlvbiAtIFNob3VsZCB0aGUgdXNlciBiZSByZXF1aXJlZCB0byBjb25maXJtIGNvbW1hbmRzIHRoYXQgZXJhc2UgZGlza3M/ICIiIgorICAgIHdoaWNoID0gJ1BDb0UnCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgemVyb2luZyhhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiemVyb2luZyAtIFNob3VsZCBhbGwgYmxvY2tzIG9mIGEgbmV3IGltYWdlIGJlIHNldCB0byB6ZXJvPyAiIiIKLQl3aGljaCA9ICdQWmVCJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJ6ZXJvaW5nIC0gU2hvdWxkIGFsbCBibG9ja3Mgb2YgYSBuZXcgaW1hZ2UgYmUgc2V0IHRvIHplcm8/ICIiIgorICAgIHdoaWNoID0gJ1BaZUInCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgZGVmYXVsdF9jcmVhdGVfc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiZGVmYXVsdCBjcmVhdGUgc2l6ZSAtIHRoZSBkZWZhdWx0IHNpemUgZm9yIGEgbmV3IGltYWdlLCBpbiBibG9ja3MgKDUxMiBieXRlcyBwZXIgYmxvY2spICIiIgotCXdoaWNoID0gJ1BEZVMnCi0Jd2FudCA9ICdsb25nJworICAgICIiImRlZmF1bHQgY3JlYXRlIHNpemUgLSB0aGUgZGVmYXVsdCBzaXplIGZvciBhIG5ldyBpbWFnZSwgaW4gYmxvY2tzICg1MTIgYnl0ZXMgcGVyIGJsb2NrKSAiIiIKKyAgICB3aGljaCA9ICdQRGVTJworICAgIHdhbnQgPSAnbG9uZycKIGNsYXNzIGRlZmF1bHRfY3JlYXRlX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImRlZmF1bHQgY3JlYXRlIG5hbWUgLSB0aGUgZGVmYXVsdCB2b2x1bWUgbmFtZSBmb3IgYSBuZXcgaW1hZ2UgIiIiCi0Jd2hpY2ggPSAnUERlTicKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIiZGVmYXVsdCBjcmVhdGUgbmFtZSAtIHRoZSBkZWZhdWx0IHZvbHVtZSBuYW1lIGZvciBhIG5ldyBpbWFnZSAiIiIKKyAgICB3aGljaCA9ICdQRGVOJworICAgIHdhbnQgPSAnVEVYVCcKIGNsYXNzIG1ha2VfbXVsdGlwbGVfZmxvcHBpZXMoYWV0b29scy5OUHJvcGVydHkpOgotCSIiIm1ha2UgbXVsdGlwbGUgZmxvcHBpZXMgLSBTaG91bGQgdGhlIHVzZXIgYmUgcHJvbXB0ZWQgdG8gbWFrZSBtdWx0aXBsZSBmbG9wcHkgZGlzayBpbWFnZXMgYXQgYSB0aW1lPyAiIiIKLQl3aGljaCA9ICdQQnVNJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJtYWtlIG11bHRpcGxlIGZsb3BwaWVzIC0gU2hvdWxkIHRoZSB1c2VyIGJlIHByb21wdGVkIHRvIG1ha2UgbXVsdGlwbGUgZmxvcHB5IGRpc2sgaW1hZ2VzIGF0IGEgdGltZT8gIiIiCisgICAgd2hpY2ggPSAnUEJ1TScKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBhdXRvX2ltYWdlX3Vwb25faW5zZXJ0KGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJhdXRvIGltYWdlIHVwb24gaW5zZXJ0IC0gU2hvdWxkIGEgbmV3bHktaW5zZXJ0ZWQgZGlzayBhdXRvbWF0aWNhbGx5IGJlIHByb2Nlc3NlZCBpbnRvIGFuIGltYWdlPyAiIiIKLQl3aGljaCA9ICdQYWltJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJhdXRvIGltYWdlIHVwb24gaW5zZXJ0IC0gU2hvdWxkIGEgbmV3bHktaW5zZXJ0ZWQgZGlzayBhdXRvbWF0aWNhbGx5IGJlIHByb2Nlc3NlZCBpbnRvIGFuIGltYWdlPyAiIiIKKyAgICB3aGljaCA9ICdQYWltJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIGVqZWN0X2FmdGVyX2F1dG9faW1hZ2UoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImVqZWN0IGFmdGVyIGF1dG8gaW1hZ2UgLSBTaG91bGQgYXV0by1pbWFnZWQgZGlza3MgYmUgZWplY3RlZCBhZnRlcndhcmRzPyAiIiIKLQl3aGljaCA9ICdQZWpjJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJlamVjdCBhZnRlciBhdXRvIGltYWdlIC0gU2hvdWxkIGF1dG8taW1hZ2VkIGRpc2tzIGJlIGVqZWN0ZWQgYWZ0ZXJ3YXJkcz8gIiIiCisgICAgd2hpY2ggPSAnUGVqYycKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBhdXRvX2NvcHlfdXBvbl9mbG9wcHlfaW5zZXJ0KGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJhdXRvIGNvcHkgdXBvbiBmbG9wcHkgaW5zZXJ0IC0gSW5zdGVhZCBvZiBhdXRvLWltYWdpbmcsIHNob3VsZCBuZXdseS1pbnNlcnRlZCBmbG9wcHkgZGlza3MgYmUgY29waWVkPyAiIiIKLQl3aGljaCA9ICdQY3BmJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJhdXRvIGNvcHkgdXBvbiBmbG9wcHkgaW5zZXJ0IC0gSW5zdGVhZCBvZiBhdXRvLWltYWdpbmcsIHNob3VsZCBuZXdseS1pbnNlcnRlZCBmbG9wcHkgZGlza3MgYmUgY29waWVkPyAiIiIKKyAgICB3aGljaCA9ICdQY3BmJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIHZvbHVtZV9zdWZmaXgoYWV0b29scy5OUHJvcGVydHkpOgotCSIiInZvbHVtZSBzdWZmaXggLSB0aGUgZGVmYXVsdCB2b2x1bWUgbmFtZSBzdWZmaXggIiIiCi0Jd2hpY2ggPSAnUERpRScKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIidm9sdW1lIHN1ZmZpeCAtIHRoZSBkZWZhdWx0IHZvbHVtZSBuYW1lIHN1ZmZpeCAiIiIKKyAgICB3aGljaCA9ICdQRGlFJworICAgIHdhbnQgPSAnVEVYVCcKIGNsYXNzIGltYWdlX3N1ZmZpeChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiaW1hZ2Ugc3VmZml4IC0gdGhlIGRlZmF1bHQgaW1hZ2UgbmFtZSBzdWZmaXggIiIiCi0Jd2hpY2ggPSAnUEltRScKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIiaW1hZ2Ugc3VmZml4IC0gdGhlIGRlZmF1bHQgaW1hZ2UgbmFtZSBzdWZmaXggIiIiCisgICAgd2hpY2ggPSAnUEltRScKKyAgICB3YW50ID0gJ1RFWFQnCiBjbGFzcyBkZWZhdWx0X2ZpbGVfc3lzdGVtKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJkZWZhdWx0IGZpbGUgc3lzdGVtIC0gdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gdHlwZSBmb3IgbmV3IGJsYW5rIGltYWdlcyAiIiIKLQl3aGljaCA9ICdQZnN5JwotCXdhbnQgPSAnRnN5cycKKyAgICAiIiJkZWZhdWx0IGZpbGUgc3lzdGVtIC0gdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gdHlwZSBmb3IgbmV3IGJsYW5rIGltYWdlcyAiIiIKKyAgICB3aGljaCA9ICdQZnN5JworICAgIHdhbnQgPSAnRnN5cycKIGNsYXNzIGRlZmF1bHRfaW1hZ2VfZm9ybWF0KGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJkZWZhdWx0IGltYWdlIGZvcm1hdCAtIHRoZSBkZWZhdWx0IGltYWdlIGZpbGUgZm9ybWF0ICIiIgotCXdoaWNoID0gJ1BkZm0nCi0Jd2FudCA9ICdTdkFzJworICAgICIiImRlZmF1bHQgaW1hZ2UgZm9ybWF0IC0gdGhlIGRlZmF1bHQgaW1hZ2UgZmlsZSBmb3JtYXQgIiIiCisgICAgd2hpY2ggPSAnUGRmbScKKyAgICB3YW50ID0gJ1N2QXMnCiAKIGNsYXNzIGRpc2soYWV0b29scy5Db21wb25lbnRJdGVtKToKLQkiIiJkaXNrIC0gQSBtb3VudGVkIHZvbHVtZSAiIiIKLQl3YW50ID0gJ0Rpc2snCisgICAgIiIiZGlzayAtIEEgbW91bnRlZCB2b2x1bWUgIiIiCisgICAgd2FudCA9ICdEaXNrJwogCiBuYW1lID0gbmFtZQogCiBjb21tZW50ID0gY29tbWVudAogY2xhc3MgbG9ja2VkKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJsb2NrZWQgLSBJcyB0aGUgZGlzayBsb2NrZWQ/ICIiIgotCXdoaWNoID0gJ2lzbGsnCi0Jd2FudCA9ICdib29sJworICAgICIiImxvY2tlZCAtIElzIHRoZSBkaXNrIGxvY2tlZD8gIiIiCisgICAgd2hpY2ggPSAnaXNsaycKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBjcmVhdGlvbl9kYXRlKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJjcmVhdGlvbiBkYXRlIC0gdGhlIGNyZWF0aW9uIGRhdGUgb2YgZGlzayAiIiIKLQl3aGljaCA9ICdhc2NkJwotCXdhbnQgPSAnbGR0ICcKKyAgICAiIiJjcmVhdGlvbiBkYXRlIC0gdGhlIGNyZWF0aW9uIGRhdGUgb2YgZGlzayAiIiIKKyAgICB3aGljaCA9ICdhc2NkJworICAgIHdhbnQgPSAnbGR0ICcKIGNsYXNzIG1vZGlmaWNhdGlvbl9kYXRlKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJtb2RpZmljYXRpb24gZGF0ZSAtIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiBkaXNrICIiIgotCXdoaWNoID0gJ2FzbW8nCi0Jd2FudCA9ICdsZHQgJworICAgICIiIm1vZGlmaWNhdGlvbiBkYXRlIC0gdGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9mIGRpc2sgIiIiCisgICAgd2hpY2ggPSAnYXNtbycKKyAgICB3YW50ID0gJ2xkdCAnCiBjbGFzcyBjcmMzMl9jaGVja3N1bShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiY3JjMzIgY2hlY2tzdW0gLSB0aGUgY3JjLTMyIGNoZWNrc3VtIG9mIHRoZSBkaXNrICIiIgotCXdoaWNoID0gJ1hjcmMnCi0Jd2FudCA9ICdURVhUJworICAgICIiImNyYzMyIGNoZWNrc3VtIC0gdGhlIGNyYy0zMiBjaGVja3N1bSBvZiB0aGUgZGlzayAiIiIKKyAgICB3aGljaCA9ICdYY3JjJworICAgIHdhbnQgPSAnVEVYVCcKIGNsYXNzIGRpc2tfY29weV80XzJlXzJfY2hlY2tzdW0oYWV0b29scy5OUHJvcGVydHkpOgotCSIiImRpc2sgY29weSA0LjIgY2hlY2tzdW0gLSB0aGUgRGlzayBDb3B5IDQuMiBjaGVja3N1bSBvZiB0aGUgZGlzayAiIiIKLQl3aGljaCA9ICdYYzQyJwotCXdhbnQgPSAnVEVYVCcKKyAgICAiIiJkaXNrIGNvcHkgNC4yIGNoZWNrc3VtIC0gdGhlIERpc2sgQ29weSA0LjIgY2hlY2tzdW0gb2YgdGhlIGRpc2sgIiIiCisgICAgd2hpY2ggPSAnWGM0MicKKyAgICB3YW50ID0gJ1RFWFQnCiBjbGFzcyBibG9ja19jb3VudChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiYmxvY2sgY291bnQgLSB0aGUgbnVtYmVyIG9mIGJsb2NrcyBvbiBkaXNrICIiIgotCXdoaWNoID0gJ1hibGsnCi0Jd2FudCA9ICdsb25nJworICAgICIiImJsb2NrIGNvdW50IC0gdGhlIG51bWJlciBvZiBibG9ja3Mgb24gZGlzayAiIiIKKyAgICB3aGljaCA9ICdYYmxrJworICAgIHdhbnQgPSAnbG9uZycKIGNsYXNzIGZpbGVfc3lzdGVtKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJmaWxlIHN5c3RlbSAtIHRoZSBmaWxlIHN5c3RlbSB1c2VkIG9uIGRpc2sgIiIiCi0Jd2hpY2ggPSAnWGZzaScKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIiZmlsZSBzeXN0ZW0gLSB0aGUgZmlsZSBzeXN0ZW0gdXNlZCBvbiBkaXNrICIiIgorICAgIHdoaWNoID0gJ1hmc2knCisgICAgd2FudCA9ICdURVhUJwogCiBjbGFzcyBmb2xkZXIoYWV0b29scy5Db21wb25lbnRJdGVtKToKLQkiIiJmb2xkZXIgLSBBIGZvbGRlciBvciBkaXJlY3Rvcnkgb24gYSBkaXNrICIiIgotCXdhbnQgPSAnRm9sZCcKKyAgICAiIiJmb2xkZXIgLSBBIGZvbGRlciBvciBkaXJlY3Rvcnkgb24gYSBkaXNrICIiIgorICAgIHdhbnQgPSAnRm9sZCcKIAogbmFtZSA9IG5hbWUKIApAQCAtMjQxLDggKzI0MSw4IEBACiBtb2RpZmljYXRpb25fZGF0ZSA9IG1vZGlmaWNhdGlvbl9kYXRlCiAKIGNsYXNzIGRpc2tfaW1hZ2UoYWV0b29scy5Db21wb25lbnRJdGVtKToKLQkiIiJkaXNrIGltYWdlIC0gQSBkaXNrIGltYWdlIGZpbGUgIiIiCi0Jd2FudCA9ICdESW1nJworICAgICIiImRpc2sgaW1hZ2UgLSBBIGRpc2sgaW1hZ2UgZmlsZSAiIiIKKyAgICB3YW50ID0gJ0RJbWcnCiAKIG5hbWUgPSBuYW1lCiAKQEAgLTI1NCwyOSArMjU0LDI5IEBACiAKIG1vZGlmaWNhdGlvbl9kYXRlID0gbW9kaWZpY2F0aW9uX2RhdGUKIGNsYXNzIGZpbGVfZm9ybWF0KGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJmaWxlIGZvcm1hdCAtIHRoZSBmb3JtYXQgb2YgdGhlIGRpc2sgaW1hZ2UgZmlsZSAiIiIKLQl3aGljaCA9ICdJZm10JwotCXdhbnQgPSAnVEVYVCcKKyAgICAiIiJmaWxlIGZvcm1hdCAtIHRoZSBmb3JtYXQgb2YgdGhlIGRpc2sgaW1hZ2UgZmlsZSAiIiIKKyAgICB3aGljaCA9ICdJZm10JworICAgIHdhbnQgPSAnVEVYVCcKIGNsYXNzIHNpZ25lZChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIic2lnbmVkIC0gRG9lcyB0aGUgZGlzayBpbWFnZSBoYXZlIGEgRGlnaVNpZ26OIHNpZ25hdHVyZT8gIiIiCi0Jd2hpY2ggPSAnSXNpbicKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIic2lnbmVkIC0gRG9lcyB0aGUgZGlzayBpbWFnZSBoYXZlIGEgRGlnaVNpZ26OIHNpZ25hdHVyZT8gIiIiCisgICAgd2hpY2ggPSAnSXNpbicKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBjb21wcmVzc2VkKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJjb21wcmVzc2VkIC0gSXMgdGhlIGRpc2sgaW1hZ2UgY29tcHJlc3NlZD8gIiIiCi0Jd2hpY2ggPSAnSWNvbScKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIiY29tcHJlc3NlZCAtIElzIHRoZSBkaXNrIGltYWdlIGNvbXByZXNzZWQ/ICIiIgorICAgIHdoaWNoID0gJ0ljb20nCisgICAgd2FudCA9ICdib29sJwogY2xhc3Mgc2VnbWVudGVkKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJzZWdtZW50ZWQgLSBJcyB0aGUgZGlzayBpbWFnZSBzZWdtZW50ZWQ/ICIiIgotCXdoaWNoID0gJ0lzZWcnCi0Jd2FudCA9ICdib29sJworICAgICIiInNlZ21lbnRlZCAtIElzIHRoZSBkaXNrIGltYWdlIHNlZ21lbnRlZD8gIiIiCisgICAgd2hpY2ggPSAnSXNlZycKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBzZWdtZW50cyhhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIic2VnbWVudHMgLSBhIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byBvdGhlciBzZWdtZW50cyB0aGF0IG1ha2UgdXAgYSBjb21wbGV0ZSBpbWFnZSAiIiIKLQl3aGljaCA9ICdJc2cjJwotCXdhbnQgPSAnZnNzICcKKyAgICAiIiJzZWdtZW50cyAtIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIG90aGVyIHNlZ21lbnRzIHRoYXQgbWFrZSB1cCBhIGNvbXBsZXRlIGltYWdlICIiIgorICAgIHdoaWNoID0gJ0lzZyMnCisgICAgd2FudCA9ICdmc3MgJwogY2xhc3MgZGlza19uYW1lKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJkaXNrIG5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZGlzayB0aGlzIGltYWdlIHJlcHJlc2VudHMgIiIiCi0Jd2hpY2ggPSAnSWRubScKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIiZGlzayBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGRpc2sgdGhpcyBpbWFnZSByZXByZXNlbnRzICIiIgorICAgIHdoaWNoID0gJ0lkbm0nCisgICAgd2FudCA9ICdURVhUJwogCiBjcmMzMl9jaGVja3N1bSA9IGNyYzMyX2NoZWNrc3VtCiAKQEAgLTI4NiwxMjQgKzI4NiwxMjQgQEAKIAogZmlsZV9zeXN0ZW0gPSBmaWxlX3N5c3RlbQogY2xhc3MgZGF0YV9mb3JrX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImRhdGEgZm9yayBzaXplIC0gdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgZGF0YSBmb3JrIG9mIHRoZSBkaXNrIGltYWdlICIiIgotCXdoaWNoID0gJ0lkZmsnCi0Jd2FudCA9ICdsb25nJworICAgICIiImRhdGEgZm9yayBzaXplIC0gdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgZGF0YSBmb3JrIG9mIHRoZSBkaXNrIGltYWdlICIiIgorICAgIHdoaWNoID0gJ0lkZmsnCisgICAgd2FudCA9ICdsb25nJwogY2xhc3MgcmVzb3VyY2VfZm9ya19zaXplKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJyZXNvdXJjZSBmb3JrIHNpemUgLSB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSByZXNvdXJjZSBmb3JrIG9mIHRoZSBkaXNrIGltYWdlICIiIgotCXdoaWNoID0gJ0lyZmsnCi0Jd2FudCA9ICdsb25nJworICAgICIiInJlc291cmNlIGZvcmsgc2l6ZSAtIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIHJlc291cmNlIGZvcmsgb2YgdGhlIGRpc2sgaW1hZ2UgIiIiCisgICAgd2hpY2ggPSAnSXJmaycKKyAgICB3YW50ID0gJ2xvbmcnCiAKIGNsYXNzIFNhdmVfcmVwbHlfcmVjb3JkKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6Ci0JIiIiU2F2ZSByZXBseSByZWNvcmQgLSBSZXN1bHQgZnJvbSB0aGUgc2F2ZSBvcGVyYXRpb24gIiIiCi0Jd2FudCA9ICdjcHlSJworICAgICIiIlNhdmUgcmVwbHkgcmVjb3JkIC0gUmVzdWx0IGZyb20gdGhlIHNhdmUgb3BlcmF0aW9uICIiIgorICAgIHdhbnQgPSAnY3B5UicKIGNsYXNzIHJlc3VsdGluZ190YXJnZXRfb2JqZWN0KGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJyZXN1bHRpbmcgdGFyZ2V0IG9iamVjdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIHNhdmVkICIiIgotCXdoaWNoID0gJ3JjcE8nCi0Jd2FudCA9ICdvYmogJworICAgICIiInJlc3VsdGluZyB0YXJnZXQgb2JqZWN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIHRhcmdldCBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gc2F2ZWQgIiIiCisgICAgd2hpY2ggPSAncmNwTycKKyAgICB3YW50ID0gJ29iaiAnCiBjbGFzcyBjb3B5X3R5cGUoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImNvcHkgdHlwZSAtIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHRhcmdldCBvYmplY3Qgd2FzIHNhdmVkICIiIgotCXdoaWNoID0gJ3JjcFQnCi0Jd2FudCA9ICdyY3BUJworICAgICIiImNvcHkgdHlwZSAtIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHRhcmdldCBvYmplY3Qgd2FzIHNhdmVkICIiIgorICAgIHdoaWNoID0gJ3JjcFQnCisgICAgd2FudCA9ICdyY3BUJwogYXBwbGljYXRpb24uX3Byb3BkaWN0ID0gewotCSd2ZXJzaW9uJyA6IHZlcnNpb24sCi0JJ25hbWUnIDogbmFtZSwKLQknY29tbWVudCcgOiBjb21tZW50LAotCSdkcml2ZXJfdmVyc2lvbicgOiBkcml2ZXJfdmVyc2lvbiwKLQknbm9uZWplY3RhYmxlX21vZGUnIDogbm9uZWplY3RhYmxlX21vZGUsCi0JJ3NhdmVfbG9nX2ZpbGUnIDogc2F2ZV9sb2dfZmlsZSwKLQkndXNlX3NwZWVjaCcgOiB1c2Vfc3BlZWNoLAotCSdzbWFydF9TYXZlX0FzJyA6IHNtYXJ0X1NhdmVfQXMsCi0JJ2NoZWNrc3VtX3ZlcmlmaWNhdGlvbicgOiBjaGVja3N1bV92ZXJpZmljYXRpb24sCi0JJ3NpZ25hdHVyZV92ZXJpZmljYXRpb24nIDogc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbiwKLQknZXhjbHVkZV9EaXNrU2NyaXB0cycgOiBleGNsdWRlX0Rpc2tTY3JpcHRzLAotCSdleGNsdWRlX3JlbW90ZV9pbWFnZXMnIDogZXhjbHVkZV9yZW1vdGVfaW1hZ2VzLAotCSdpbWFnZV9zaWduaW5nJyA6IGltYWdlX3NpZ25pbmcsCi0JJ2xlYXZlX2ltYWdlX21vdW50ZWQnIDogbGVhdmVfaW1hZ2VfbW91bnRlZCwKLQknZXJhc2VfY29uZmlybWF0aW9uJyA6IGVyYXNlX2NvbmZpcm1hdGlvbiwKLQknemVyb2luZycgOiB6ZXJvaW5nLAotCSdkZWZhdWx0X2NyZWF0ZV9zaXplJyA6IGRlZmF1bHRfY3JlYXRlX3NpemUsCi0JJ2RlZmF1bHRfY3JlYXRlX25hbWUnIDogZGVmYXVsdF9jcmVhdGVfbmFtZSwKLQknbWFrZV9tdWx0aXBsZV9mbG9wcGllcycgOiBtYWtlX211bHRpcGxlX2Zsb3BwaWVzLAotCSdhdXRvX2ltYWdlX3Vwb25faW5zZXJ0JyA6IGF1dG9faW1hZ2VfdXBvbl9pbnNlcnQsCi0JJ2VqZWN0X2FmdGVyX2F1dG9faW1hZ2UnIDogZWplY3RfYWZ0ZXJfYXV0b19pbWFnZSwKLQknYXV0b19jb3B5X3Vwb25fZmxvcHB5X2luc2VydCcgOiBhdXRvX2NvcHlfdXBvbl9mbG9wcHlfaW5zZXJ0LAotCSd2b2x1bWVfc3VmZml4JyA6IHZvbHVtZV9zdWZmaXgsCi0JJ2ltYWdlX3N1ZmZpeCcgOiBpbWFnZV9zdWZmaXgsCi0JJ2RlZmF1bHRfZmlsZV9zeXN0ZW0nIDogZGVmYXVsdF9maWxlX3N5c3RlbSwKLQknZGVmYXVsdF9pbWFnZV9mb3JtYXQnIDogZGVmYXVsdF9pbWFnZV9mb3JtYXQsCisgICAgICAgICd2ZXJzaW9uJyA6IHZlcnNpb24sCisgICAgICAgICduYW1lJyA6IG5hbWUsCisgICAgICAgICdjb21tZW50JyA6IGNvbW1lbnQsCisgICAgICAgICdkcml2ZXJfdmVyc2lvbicgOiBkcml2ZXJfdmVyc2lvbiwKKyAgICAgICAgJ25vbmVqZWN0YWJsZV9tb2RlJyA6IG5vbmVqZWN0YWJsZV9tb2RlLAorICAgICAgICAnc2F2ZV9sb2dfZmlsZScgOiBzYXZlX2xvZ19maWxlLAorICAgICAgICAndXNlX3NwZWVjaCcgOiB1c2Vfc3BlZWNoLAorICAgICAgICAnc21hcnRfU2F2ZV9BcycgOiBzbWFydF9TYXZlX0FzLAorICAgICAgICAnY2hlY2tzdW1fdmVyaWZpY2F0aW9uJyA6IGNoZWNrc3VtX3ZlcmlmaWNhdGlvbiwKKyAgICAgICAgJ3NpZ25hdHVyZV92ZXJpZmljYXRpb24nIDogc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbiwKKyAgICAgICAgJ2V4Y2x1ZGVfRGlza1NjcmlwdHMnIDogZXhjbHVkZV9EaXNrU2NyaXB0cywKKyAgICAgICAgJ2V4Y2x1ZGVfcmVtb3RlX2ltYWdlcycgOiBleGNsdWRlX3JlbW90ZV9pbWFnZXMsCisgICAgICAgICdpbWFnZV9zaWduaW5nJyA6IGltYWdlX3NpZ25pbmcsCisgICAgICAgICdsZWF2ZV9pbWFnZV9tb3VudGVkJyA6IGxlYXZlX2ltYWdlX21vdW50ZWQsCisgICAgICAgICdlcmFzZV9jb25maXJtYXRpb24nIDogZXJhc2VfY29uZmlybWF0aW9uLAorICAgICAgICAnemVyb2luZycgOiB6ZXJvaW5nLAorICAgICAgICAnZGVmYXVsdF9jcmVhdGVfc2l6ZScgOiBkZWZhdWx0X2NyZWF0ZV9zaXplLAorICAgICAgICAnZGVmYXVsdF9jcmVhdGVfbmFtZScgOiBkZWZhdWx0X2NyZWF0ZV9uYW1lLAorICAgICAgICAnbWFrZV9tdWx0aXBsZV9mbG9wcGllcycgOiBtYWtlX211bHRpcGxlX2Zsb3BwaWVzLAorICAgICAgICAnYXV0b19pbWFnZV91cG9uX2luc2VydCcgOiBhdXRvX2ltYWdlX3Vwb25faW5zZXJ0LAorICAgICAgICAnZWplY3RfYWZ0ZXJfYXV0b19pbWFnZScgOiBlamVjdF9hZnRlcl9hdXRvX2ltYWdlLAorICAgICAgICAnYXV0b19jb3B5X3Vwb25fZmxvcHB5X2luc2VydCcgOiBhdXRvX2NvcHlfdXBvbl9mbG9wcHlfaW5zZXJ0LAorICAgICAgICAndm9sdW1lX3N1ZmZpeCcgOiB2b2x1bWVfc3VmZml4LAorICAgICAgICAnaW1hZ2Vfc3VmZml4JyA6IGltYWdlX3N1ZmZpeCwKKyAgICAgICAgJ2RlZmF1bHRfZmlsZV9zeXN0ZW0nIDogZGVmYXVsdF9maWxlX3N5c3RlbSwKKyAgICAgICAgJ2RlZmF1bHRfaW1hZ2VfZm9ybWF0JyA6IGRlZmF1bHRfaW1hZ2VfZm9ybWF0LAogfQogYXBwbGljYXRpb24uX2VsZW1kaWN0ID0gewogfQogZGlzay5fcHJvcGRpY3QgPSB7Ci0JJ25hbWUnIDogbmFtZSwKLQknY29tbWVudCcgOiBjb21tZW50LAotCSdsb2NrZWQnIDogbG9ja2VkLAotCSdjcmVhdGlvbl9kYXRlJyA6IGNyZWF0aW9uX2RhdGUsCi0JJ21vZGlmaWNhdGlvbl9kYXRlJyA6IG1vZGlmaWNhdGlvbl9kYXRlLAotCSdjcmMzMl9jaGVja3N1bScgOiBjcmMzMl9jaGVja3N1bSwKLQknZGlza19jb3B5XzRfMmVfMl9jaGVja3N1bScgOiBkaXNrX2NvcHlfNF8yZV8yX2NoZWNrc3VtLAotCSdibG9ja19jb3VudCcgOiBibG9ja19jb3VudCwKLQknZmlsZV9zeXN0ZW0nIDogZmlsZV9zeXN0ZW0sCisgICAgICAgICduYW1lJyA6IG5hbWUsCisgICAgICAgICdjb21tZW50JyA6IGNvbW1lbnQsCisgICAgICAgICdsb2NrZWQnIDogbG9ja2VkLAorICAgICAgICAnY3JlYXRpb25fZGF0ZScgOiBjcmVhdGlvbl9kYXRlLAorICAgICAgICAnbW9kaWZpY2F0aW9uX2RhdGUnIDogbW9kaWZpY2F0aW9uX2RhdGUsCisgICAgICAgICdjcmMzMl9jaGVja3N1bScgOiBjcmMzMl9jaGVja3N1bSwKKyAgICAgICAgJ2Rpc2tfY29weV80XzJlXzJfY2hlY2tzdW0nIDogZGlza19jb3B5XzRfMmVfMl9jaGVja3N1bSwKKyAgICAgICAgJ2Jsb2NrX2NvdW50JyA6IGJsb2NrX2NvdW50LAorICAgICAgICAnZmlsZV9zeXN0ZW0nIDogZmlsZV9zeXN0ZW0sCiB9CiBkaXNrLl9lbGVtZGljdCA9IHsKIH0KIGZvbGRlci5fcHJvcGRpY3QgPSB7Ci0JJ25hbWUnIDogbmFtZSwKLQknY29tbWVudCcgOiBjb21tZW50LAotCSdjcmVhdGlvbl9kYXRlJyA6IGNyZWF0aW9uX2RhdGUsCi0JJ21vZGlmaWNhdGlvbl9kYXRlJyA6IG1vZGlmaWNhdGlvbl9kYXRlLAorICAgICAgICAnbmFtZScgOiBuYW1lLAorICAgICAgICAnY29tbWVudCcgOiBjb21tZW50LAorICAgICAgICAnY3JlYXRpb25fZGF0ZScgOiBjcmVhdGlvbl9kYXRlLAorICAgICAgICAnbW9kaWZpY2F0aW9uX2RhdGUnIDogbW9kaWZpY2F0aW9uX2RhdGUsCiB9CiBmb2xkZXIuX2VsZW1kaWN0ID0gewogfQogZGlza19pbWFnZS5fcHJvcGRpY3QgPSB7Ci0JJ25hbWUnIDogbmFtZSwKLQknY29tbWVudCcgOiBjb21tZW50LAotCSdsb2NrZWQnIDogbG9ja2VkLAotCSdjcmVhdGlvbl9kYXRlJyA6IGNyZWF0aW9uX2RhdGUsCi0JJ21vZGlmaWNhdGlvbl9kYXRlJyA6IG1vZGlmaWNhdGlvbl9kYXRlLAotCSdmaWxlX2Zvcm1hdCcgOiBmaWxlX2Zvcm1hdCwKLQknc2lnbmVkJyA6IHNpZ25lZCwKLQknY29tcHJlc3NlZCcgOiBjb21wcmVzc2VkLAotCSdzZWdtZW50ZWQnIDogc2VnbWVudGVkLAotCSdzZWdtZW50cycgOiBzZWdtZW50cywKLQknZGlza19uYW1lJyA6IGRpc2tfbmFtZSwKLQknY3JjMzJfY2hlY2tzdW0nIDogY3JjMzJfY2hlY2tzdW0sCi0JJ2Rpc2tfY29weV80XzJlXzJfY2hlY2tzdW0nIDogZGlza19jb3B5XzRfMmVfMl9jaGVja3N1bSwKLQknYmxvY2tfY291bnQnIDogYmxvY2tfY291bnQsCi0JJ2ZpbGVfc3lzdGVtJyA6IGZpbGVfc3lzdGVtLAotCSdkYXRhX2Zvcmtfc2l6ZScgOiBkYXRhX2Zvcmtfc2l6ZSwKLQkncmVzb3VyY2VfZm9ya19zaXplJyA6IHJlc291cmNlX2Zvcmtfc2l6ZSwKKyAgICAgICAgJ25hbWUnIDogbmFtZSwKKyAgICAgICAgJ2NvbW1lbnQnIDogY29tbWVudCwKKyAgICAgICAgJ2xvY2tlZCcgOiBsb2NrZWQsCisgICAgICAgICdjcmVhdGlvbl9kYXRlJyA6IGNyZWF0aW9uX2RhdGUsCisgICAgICAgICdtb2RpZmljYXRpb25fZGF0ZScgOiBtb2RpZmljYXRpb25fZGF0ZSwKKyAgICAgICAgJ2ZpbGVfZm9ybWF0JyA6IGZpbGVfZm9ybWF0LAorICAgICAgICAnc2lnbmVkJyA6IHNpZ25lZCwKKyAgICAgICAgJ2NvbXByZXNzZWQnIDogY29tcHJlc3NlZCwKKyAgICAgICAgJ3NlZ21lbnRlZCcgOiBzZWdtZW50ZWQsCisgICAgICAgICdzZWdtZW50cycgOiBzZWdtZW50cywKKyAgICAgICAgJ2Rpc2tfbmFtZScgOiBkaXNrX25hbWUsCisgICAgICAgICdjcmMzMl9jaGVja3N1bScgOiBjcmMzMl9jaGVja3N1bSwKKyAgICAgICAgJ2Rpc2tfY29weV80XzJlXzJfY2hlY2tzdW0nIDogZGlza19jb3B5XzRfMmVfMl9jaGVja3N1bSwKKyAgICAgICAgJ2Jsb2NrX2NvdW50JyA6IGJsb2NrX2NvdW50LAorICAgICAgICAnZmlsZV9zeXN0ZW0nIDogZmlsZV9zeXN0ZW0sCisgICAgICAgICdkYXRhX2Zvcmtfc2l6ZScgOiBkYXRhX2Zvcmtfc2l6ZSwKKyAgICAgICAgJ3Jlc291cmNlX2Zvcmtfc2l6ZScgOiByZXNvdXJjZV9mb3JrX3NpemUsCiB9CiBkaXNrX2ltYWdlLl9lbGVtZGljdCA9IHsKIH0KIFNhdmVfcmVwbHlfcmVjb3JkLl9wcm9wZGljdCA9IHsKLQkncmVzdWx0aW5nX3RhcmdldF9vYmplY3QnIDogcmVzdWx0aW5nX3RhcmdldF9vYmplY3QsCi0JJ2NvcHlfdHlwZScgOiBjb3B5X3R5cGUsCisgICAgICAgICdyZXN1bHRpbmdfdGFyZ2V0X29iamVjdCcgOiByZXN1bHRpbmdfdGFyZ2V0X29iamVjdCwKKyAgICAgICAgJ2NvcHlfdHlwZScgOiBjb3B5X3R5cGUsCiB9CiBTYXZlX3JlcGx5X3JlY29yZC5fZWxlbWRpY3QgPSB7CiB9CiBfRW51bV9VSUFjID0gewotCSduZXZlcl9pbnRlcmFjdCcgOiAnZU52cicsCSMgRG9u1XQgYWxsb3cgYW55IGludGVyYWN0aW9uIGF0IGFsbAotCSdpbnRlcmFjdF93aXRoX3NlbGYnIDogJ2VJblMnLAkjIE9ubHkgYWxsb3cgaW50ZXJhY3Rpb24gZnJvbSBpbnRlcm5hbCBldmVudHMKLQknaW50ZXJhY3Rfd2l0aF9sb2NhbCcgOiAnZUluTCcsCSMgQWxsb3cgaW50ZXJhY3Rpb24gZnJvbSBhbnkgZXZlbnQgb3JpZ2luYXRpbmcgb24gdGhpcyBtYWNoaW5lCi0JJ2ludGVyYWN0X3dpdGhfYWxsJyA6ICdlSW5BJywJIyBBbGxvdyBpbnRlcmFjdGlvbiBmcm9tIG5ldHdvcmsgZXZlbnRzCisgICAgICAgICduZXZlcl9pbnRlcmFjdCcgOiAnZU52cicsICAgICAgIyBEb27VdCBhbGxvdyBhbnkgaW50ZXJhY3Rpb24gYXQgYWxsCisgICAgICAgICdpbnRlcmFjdF93aXRoX3NlbGYnIDogJ2VJblMnLCAgIyBPbmx5IGFsbG93IGludGVyYWN0aW9uIGZyb20gaW50ZXJuYWwgZXZlbnRzCisgICAgICAgICdpbnRlcmFjdF93aXRoX2xvY2FsJyA6ICdlSW5MJywgIyBBbGxvdyBpbnRlcmFjdGlvbiBmcm9tIGFueSBldmVudCBvcmlnaW5hdGluZyBvbiB0aGlzIG1hY2hpbmUKKyAgICAgICAgJ2ludGVyYWN0X3dpdGhfYWxsJyA6ICdlSW5BJywgICAjIEFsbG93IGludGVyYWN0aW9uIGZyb20gbmV0d29yayBldmVudHMKIH0KIAogX0VudW1fU3ZBcyA9IHsKLQknTkRJRl9SVycgOiAnUmRXcicsCSMgcmVhZC93cml0ZSBORElGIGRpc2sgaW1hZ2UKLQknTkRJRl9STycgOiAnUmR4eCcsCSMgcmVhZC1vbmx5IE5ESUYgZGlzayBpbWFnZQotCSdORElGX0NvbXByZXNzZWQnIDogJ1JPQ28nLAkjIGNvbXByZXNzZWQgTkRJRiBkaXNrIGltYWdlCi0JJ0Rpc2tfQ29weV80XzJlXzInIDogJ0RDNDInLAkjIERpc2sgQ29weSA0LjIgZGlzayBpbWFnZQorICAgICAgICAnTkRJRl9SVycgOiAnUmRXcicsICAgICAjIHJlYWQvd3JpdGUgTkRJRiBkaXNrIGltYWdlCisgICAgICAgICdORElGX1JPJyA6ICdSZHh4JywgICAgICMgcmVhZC1vbmx5IE5ESUYgZGlzayBpbWFnZQorICAgICAgICAnTkRJRl9Db21wcmVzc2VkJyA6ICdST0NvJywgICAgICMgY29tcHJlc3NlZCBORElGIGRpc2sgaW1hZ2UKKyAgICAgICAgJ0Rpc2tfQ29weV80XzJlXzInIDogJ0RDNDInLCAgICAjIERpc2sgQ29weSA0LjIgZGlzayBpbWFnZQogfQogCiBfRW51bV9yY3BUID0gewotCSdibG9ja19kaXNrX2NvcHknIDogJ2NwQmwnLAkjIGJsb2NrLWJ5LWJsb2NrIGRpc2stbGV2ZWwgY29weQotCSdmaWxlc19hbmRfZmlsZV9JRF9jb3B5JyA6ICdjcElEJywJIyBhbGwgZmlsZXMgaW5jbHVkaW5nIGRlc2t0b3AgZGF0YWJhc2VzIGFuZCBmaWxlIElE1XMKLQknZmlsZXNfYW5kX2Rlc2t0b3BfaW5mbycgOiAnY3BEVCcsCSMgYWxsIGZpbGVzIGFuZCBtb3N0IGRlc2t0b3AgaW5mb3JtYXRpb24KLQknZmlsZXNfb25seScgOiAnY3BGSScsCSMgYWxsIGZpbGVzIGJ1dCBubyBkZXNrdG9wIGluZm9ybWF0aW9uCi0JJ2Rpc2tfaW1hZ2VfY29udmVyc2lvbicgOiAnY3BDVicsCSMgZGlzayBpbWFnZSBmb3JtYXQgY29udmVyc2lvbgotCSdkaXNrX2ltYWdlX2NyZWF0aW9uJyA6ICdjcENSJywJIyBkaXNrIGltYWdlIGNyZWF0aW9uCisgICAgICAgICdibG9ja19kaXNrX2NvcHknIDogJ2NwQmwnLCAgICAgIyBibG9jay1ieS1ibG9jayBkaXNrLWxldmVsIGNvcHkKKyAgICAgICAgJ2ZpbGVzX2FuZF9maWxlX0lEX2NvcHknIDogJ2NwSUQnLCAgICAgICMgYWxsIGZpbGVzIGluY2x1ZGluZyBkZXNrdG9wIGRhdGFiYXNlcyBhbmQgZmlsZSBJRNVzCisgICAgICAgICdmaWxlc19hbmRfZGVza3RvcF9pbmZvJyA6ICdjcERUJywgICAgICAjIGFsbCBmaWxlcyBhbmQgbW9zdCBkZXNrdG9wIGluZm9ybWF0aW9uCisgICAgICAgICdmaWxlc19vbmx5JyA6ICdjcEZJJywgICMgYWxsIGZpbGVzIGJ1dCBubyBkZXNrdG9wIGluZm9ybWF0aW9uCisgICAgICAgICdkaXNrX2ltYWdlX2NvbnZlcnNpb24nIDogJ2NwQ1YnLCAgICAgICAjIGRpc2sgaW1hZ2UgZm9ybWF0IGNvbnZlcnNpb24KKyAgICAgICAgJ2Rpc2tfaW1hZ2VfY3JlYXRpb24nIDogJ2NwQ1InLCAjIGRpc2sgaW1hZ2UgY3JlYXRpb24KIH0KIAogX0VudW1fbG9uZyA9IE5vbmUgIyBYWFhYIGVudW0gbG9uZyBub3QgZm91bmQhIQpAQCAtNDE0LDY0ICs0MTQsNjQgQEAKICMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQogIwogX2NsYXNzZGVjbGFyYXRpb25zID0gewotCSdESW1nJyA6IGRpc2tfaW1hZ2UsCi0JJ2NhcHAnIDogYXBwbGljYXRpb24sCi0JJ0Rpc2snIDogZGlzaywKLQknRm9sZCcgOiBmb2xkZXIsCi0JJ2NweVInIDogU2F2ZV9yZXBseV9yZWNvcmQsCisgICAgICAgICdESW1nJyA6IGRpc2tfaW1hZ2UsCisgICAgICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorICAgICAgICAnRGlzaycgOiBkaXNrLAorICAgICAgICAnRm9sZCcgOiBmb2xkZXIsCisgICAgICAgICdjcHlSJyA6IFNhdmVfcmVwbHlfcmVjb3JkLAogfQogCiBfcHJvcGRlY2xhcmF0aW9ucyA9IHsKLQknWGNyYycgOiBjcmMzMl9jaGVja3N1bSwKLQknUERlUycgOiBkZWZhdWx0X2NyZWF0ZV9zaXplLAotCSdJZG5tJyA6IGRpc2tfbmFtZSwKLQknUFNTUCcgOiBzbWFydF9TYXZlX0FzLAotCSdQY3BmJyA6IGF1dG9fY29weV91cG9uX2Zsb3BweV9pbnNlcnQsCi0JJ3BuYW0nIDogbmFtZSwKLQknSXNpbicgOiBzaWduZWQsCi0JJ290dG8nIDogbm9uZWplY3RhYmxlX21vZGUsCi0JJ1BFeEQnIDogZXhjbHVkZV9EaXNrU2NyaXB0cywKLQknSXNlZycgOiBzZWdtZW50ZWQsCi0JJ2lzbGsnIDogbG9ja2VkLAotCSdhc21vJyA6IG1vZGlmaWNhdGlvbl9kYXRlLAotCSdQVGxrJyA6IHVzZV9zcGVlY2gsCi0JJ1Bmc3knIDogZGVmYXVsdF9maWxlX3N5c3RlbSwKLQknUFZlQycgOiBjaGVja3N1bV92ZXJpZmljYXRpb24sCi0JJ1hjNDInIDogZGlza19jb3B5XzRfMmVfMl9jaGVja3N1bSwKLQkncmNwTycgOiByZXN1bHRpbmdfdGFyZ2V0X29iamVjdCwKLQknUGFpbScgOiBhdXRvX2ltYWdlX3Vwb25faW5zZXJ0LAotCSdjb210JyA6IGNvbW1lbnQsCi0JJ1BDb0UnIDogZXJhc2VfY29uZmlybWF0aW9uLAotCSdkVmVyJyA6IGRyaXZlcl92ZXJzaW9uLAotCSdQRGVOJyA6IGRlZmF1bHRfY3JlYXRlX25hbWUsCi0JJ1BCdU0nIDogbWFrZV9tdWx0aXBsZV9mbG9wcGllcywKLQkncmNwVCcgOiBjb3B5X3R5cGUsCi0JJ1BEaUUnIDogdm9sdW1lX3N1ZmZpeCwKLQknSWZtdCcgOiBmaWxlX2Zvcm1hdCwKLQknUGRmbScgOiBkZWZhdWx0X2ltYWdlX2Zvcm1hdCwKLQknYXNjZCcgOiBjcmVhdGlvbl9kYXRlLAotCSdQZWpjJyA6IGVqZWN0X2FmdGVyX2F1dG9faW1hZ2UsCi0JJ1BaZUInIDogemVyb2luZywKLQknUEV4UicgOiBleGNsdWRlX3JlbW90ZV9pbWFnZXMsCi0JJ1BJbUUnIDogaW1hZ2Vfc3VmZml4LAotCSdQVmVTJyA6IHNpZ25hdHVyZV92ZXJpZmljYXRpb24sCi0JJ1BTYUwnIDogc2F2ZV9sb2dfZmlsZSwKLQknWGJsaycgOiBibG9ja19jb3VudCwKLQknUE1vQScgOiBsZWF2ZV9pbWFnZV9tb3VudGVkLAotCSdJc2cjJyA6IHNlZ21lbnRzLAotCSdJcmZrJyA6IHJlc291cmNlX2Zvcmtfc2l6ZSwKLQknSWNvbScgOiBjb21wcmVzc2VkLAotCSdYZnNpJyA6IGZpbGVfc3lzdGVtLAotCSdJZGZrJyA6IGRhdGFfZm9ya19zaXplLAotCSd2ZXJzJyA6IHZlcnNpb24sCi0JJ1BTaUknIDogaW1hZ2Vfc2lnbmluZywKKyAgICAgICAgJ1hjcmMnIDogY3JjMzJfY2hlY2tzdW0sCisgICAgICAgICdQRGVTJyA6IGRlZmF1bHRfY3JlYXRlX3NpemUsCisgICAgICAgICdJZG5tJyA6IGRpc2tfbmFtZSwKKyAgICAgICAgJ1BTU1AnIDogc21hcnRfU2F2ZV9BcywKKyAgICAgICAgJ1BjcGYnIDogYXV0b19jb3B5X3Vwb25fZmxvcHB5X2luc2VydCwKKyAgICAgICAgJ3BuYW0nIDogbmFtZSwKKyAgICAgICAgJ0lzaW4nIDogc2lnbmVkLAorICAgICAgICAnb3R0bycgOiBub25lamVjdGFibGVfbW9kZSwKKyAgICAgICAgJ1BFeEQnIDogZXhjbHVkZV9EaXNrU2NyaXB0cywKKyAgICAgICAgJ0lzZWcnIDogc2VnbWVudGVkLAorICAgICAgICAnaXNsaycgOiBsb2NrZWQsCisgICAgICAgICdhc21vJyA6IG1vZGlmaWNhdGlvbl9kYXRlLAorICAgICAgICAnUFRsaycgOiB1c2Vfc3BlZWNoLAorICAgICAgICAnUGZzeScgOiBkZWZhdWx0X2ZpbGVfc3lzdGVtLAorICAgICAgICAnUFZlQycgOiBjaGVja3N1bV92ZXJpZmljYXRpb24sCisgICAgICAgICdYYzQyJyA6IGRpc2tfY29weV80XzJlXzJfY2hlY2tzdW0sCisgICAgICAgICdyY3BPJyA6IHJlc3VsdGluZ190YXJnZXRfb2JqZWN0LAorICAgICAgICAnUGFpbScgOiBhdXRvX2ltYWdlX3Vwb25faW5zZXJ0LAorICAgICAgICAnY29tdCcgOiBjb21tZW50LAorICAgICAgICAnUENvRScgOiBlcmFzZV9jb25maXJtYXRpb24sCisgICAgICAgICdkVmVyJyA6IGRyaXZlcl92ZXJzaW9uLAorICAgICAgICAnUERlTicgOiBkZWZhdWx0X2NyZWF0ZV9uYW1lLAorICAgICAgICAnUEJ1TScgOiBtYWtlX211bHRpcGxlX2Zsb3BwaWVzLAorICAgICAgICAncmNwVCcgOiBjb3B5X3R5cGUsCisgICAgICAgICdQRGlFJyA6IHZvbHVtZV9zdWZmaXgsCisgICAgICAgICdJZm10JyA6IGZpbGVfZm9ybWF0LAorICAgICAgICAnUGRmbScgOiBkZWZhdWx0X2ltYWdlX2Zvcm1hdCwKKyAgICAgICAgJ2FzY2QnIDogY3JlYXRpb25fZGF0ZSwKKyAgICAgICAgJ1BlamMnIDogZWplY3RfYWZ0ZXJfYXV0b19pbWFnZSwKKyAgICAgICAgJ1BaZUInIDogemVyb2luZywKKyAgICAgICAgJ1BFeFInIDogZXhjbHVkZV9yZW1vdGVfaW1hZ2VzLAorICAgICAgICAnUEltRScgOiBpbWFnZV9zdWZmaXgsCisgICAgICAgICdQVmVTJyA6IHNpZ25hdHVyZV92ZXJpZmljYXRpb24sCisgICAgICAgICdQU2FMJyA6IHNhdmVfbG9nX2ZpbGUsCisgICAgICAgICdYYmxrJyA6IGJsb2NrX2NvdW50LAorICAgICAgICAnUE1vQScgOiBsZWF2ZV9pbWFnZV9tb3VudGVkLAorICAgICAgICAnSXNnIycgOiBzZWdtZW50cywKKyAgICAgICAgJ0lyZmsnIDogcmVzb3VyY2VfZm9ya19zaXplLAorICAgICAgICAnSWNvbScgOiBjb21wcmVzc2VkLAorICAgICAgICAnWGZzaScgOiBmaWxlX3N5c3RlbSwKKyAgICAgICAgJ0lkZmsnIDogZGF0YV9mb3JrX3NpemUsCisgICAgICAgICd2ZXJzJyA6IHZlcnNpb24sCisgICAgICAgICdQU2lJJyA6IGltYWdlX3NpZ25pbmcsCiB9CiAKIF9jb21wZGVjbGFyYXRpb25zID0gewogfQogCiBfZW51bWRlY2xhcmF0aW9ucyA9IHsKLQknU3ZBcycgOiBfRW51bV9TdkFzLAotCSdVSUFjJyA6IF9FbnVtX1VJQWMsCi0JJ3JjcFQnIDogX0VudW1fcmNwVCwKKyAgICAgICAgJ1N2QXMnIDogX0VudW1fU3ZBcywKKyAgICAgICAgJ1VJQWMnIDogX0VudW1fVUlBYywKKyAgICAgICAgJ3JjcFQnIDogX0VudW1fcmNwVCwKIH0KZGlmZiAtLWdpdCBhL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9VdGlsaXR5X0V2ZW50cy5weSBiL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9VdGlsaXR5X0V2ZW50cy5weQppbmRleCBlZGFjOGY0Li4xNzJiNDA4IDEwMDY0NAotLS0gYS9NYWMvRGVtby9hcHBsZXNjcmlwdC9EaXNrX0NvcHkvVXRpbGl0eV9FdmVudHMucHkKKysrIGIvTWFjL0RlbW8vYXBwbGVzY3JpcHQvRGlza19Db3B5L1V0aWxpdHlfRXZlbnRzLnB5CkBAIC0xMiwxODcgKzEyLDE4NyBAQAogCiBjbGFzcyBVdGlsaXR5X0V2ZW50c19FdmVudHM6CiAKLQlfYXJnbWFwX3NlbGVjdF9kaXNrX2ltYWdlID0gewotCQknd2l0aF9wcm9tcHQnIDogJ1NFTHAnLAotCX0KKyAgICBfYXJnbWFwX3NlbGVjdF9kaXNrX2ltYWdlID0geworICAgICAgICAgICAgJ3dpdGhfcHJvbXB0JyA6ICdTRUxwJywKKyAgICB9CiAKLQlkZWYgc2VsZWN0X2Rpc2tfaW1hZ2Uoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIic2VsZWN0IGRpc2sgaW1hZ2U6IFByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBkaXNrIGltYWdlCi0JCUtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9tcHQ6IHRoZSBwcm9tcHQgc3RyaW5nIHRvIGJlIGRpc3BsYXllZAotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IGEgcmVmZXJlbmNlIHRvIGEgZGlzayBpbWFnZQotCQkiIiIKLQkJX2NvZGUgPSAnVVRJTCcKLQkJX3N1YmNvZGUgPSAnU0VMMScKKyAgICBkZWYgc2VsZWN0X2Rpc2tfaW1hZ2Uoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic2VsZWN0IGRpc2sgaW1hZ2U6IFByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBkaXNrIGltYWdlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9tcHQ6IHRoZSBwcm9tcHQgc3RyaW5nIHRvIGJlIGRpc3BsYXllZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGEgcmVmZXJlbmNlIHRvIGEgZGlzayBpbWFnZQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnVVRJTCcKKyAgICAgICAgX3N1YmNvZGUgPSAnU0VMMScKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWxlY3RfZGlza19pbWFnZSkKLQkJaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWxlY3RfZGlza19pbWFnZSkKKyAgICAgICAgaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJwogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NFTHAnLCBfRW51bV9URVhUKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX3NlbGVjdF9EaXNrU2NyaXB0ID0gewotCQknd2l0aF9wcm9tcHQnIDogJ1NFTHAnLAotCX0KKyAgICBfYXJnbWFwX3NlbGVjdF9EaXNrU2NyaXB0ID0geworICAgICAgICAgICAgJ3dpdGhfcHJvbXB0JyA6ICdTRUxwJywKKyAgICB9CiAKLQlkZWYgc2VsZWN0X0Rpc2tTY3JpcHQoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIic2VsZWN0IERpc2tTY3JpcHQ6IFByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBEaXNrU2NyaXB0Ci0JCUtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9tcHQ6IHRoZSBwcm9tcHQgc3RyaW5nIHRvIGJlIGRpc3BsYXllZAotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IGEgcmVmZXJlbmNlIHRvIGEgRGlza1NjcmlwdAotCQkiIiIKLQkJX2NvZGUgPSAnVVRJTCcKLQkJX3N1YmNvZGUgPSAnU0VMMicKKyAgICBkZWYgc2VsZWN0X0Rpc2tTY3JpcHQoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic2VsZWN0IERpc2tTY3JpcHQ6IFByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBEaXNrU2NyaXB0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9tcHQ6IHRoZSBwcm9tcHQgc3RyaW5nIHRvIGJlIGRpc3BsYXllZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGEgcmVmZXJlbmNlIHRvIGEgRGlza1NjcmlwdAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnVVRJTCcKKyAgICAgICAgX3N1YmNvZGUgPSAnU0VMMicKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWxlY3RfRGlza1NjcmlwdCkKLQkJaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWxlY3RfRGlza1NjcmlwdCkKKyAgICAgICAgaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJwogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NFTHAnLCBfRW51bV9URVhUKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX3NlbGVjdF9kaXNrX2ltYWdlX29yX0Rpc2tTY3JpcHQgPSB7Ci0JCSd3aXRoX3Byb21wdCcgOiAnU0VMcCcsCi0JfQorICAgIF9hcmdtYXBfc2VsZWN0X2Rpc2tfaW1hZ2Vfb3JfRGlza1NjcmlwdCA9IHsKKyAgICAgICAgICAgICd3aXRoX3Byb21wdCcgOiAnU0VMcCcsCisgICAgfQogCi0JZGVmIHNlbGVjdF9kaXNrX2ltYWdlX29yX0Rpc2tTY3JpcHQoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIic2VsZWN0IGRpc2sgaW1hZ2Ugb3IgRGlza1NjcmlwdDogUHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRpc2sgaW1hZ2Ugb3IgRGlza1NjcmlwdAotCQlLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvbXB0OiB0aGUgcHJvbXB0IHN0cmluZyB0byBiZSBkaXNwbGF5ZWQKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQlSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byBkaXNrIGltYWdlIG9yIGEgRGlza1NjcmlwdAotCQkiIiIKLQkJX2NvZGUgPSAnVVRJTCcKLQkJX3N1YmNvZGUgPSAnU0VMMycKKyAgICBkZWYgc2VsZWN0X2Rpc2tfaW1hZ2Vfb3JfRGlza1NjcmlwdChzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzZWxlY3QgZGlzayBpbWFnZSBvciBEaXNrU2NyaXB0OiBQcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZGlzayBpbWFnZSBvciBEaXNrU2NyaXB0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9tcHQ6IHRoZSBwcm9tcHQgc3RyaW5nIHRvIGJlIGRpc3BsYXllZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGEgcmVmZXJlbmNlIHRvIGRpc2sgaW1hZ2Ugb3IgYSBEaXNrU2NyaXB0CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdVVElMJworICAgICAgICBfc3ViY29kZSA9ICdTRUwzJwogCi0JCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NlbGVjdF9kaXNrX2ltYWdlX29yX0Rpc2tTY3JpcHQpCi0JCWlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2VsZWN0X2Rpc2tfaW1hZ2Vfb3JfRGlza1NjcmlwdCkKKyAgICAgICAgaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJwogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NFTHAnLCBfRW51bV9URVhUKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX3NlbGVjdF9mbG9wcHlfZGlza19pbWFnZSA9IHsKLQkJJ3dpdGhfcHJvbXB0JyA6ICdTRUxwJywKLQl9CisgICAgX2FyZ21hcF9zZWxlY3RfZmxvcHB5X2Rpc2tfaW1hZ2UgPSB7CisgICAgICAgICAgICAnd2l0aF9wcm9tcHQnIDogJ1NFTHAnLAorICAgIH0KIAotCWRlZiBzZWxlY3RfZmxvcHB5X2Rpc2tfaW1hZ2Uoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIic2VsZWN0IGZsb3BweSBkaXNrIGltYWdlOiBQcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZmxvcHB5IGRpc2sgaW1hZ2UKLQkJS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb21wdDogdGhlIHByb21wdCBzdHJpbmcgdG8gYmUgZGlzcGxheWVkCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJUmV0dXJuczogYSByZWZlcmVuY2UgdG8gYSBmbG9wcHkgZGlzayBpbWFnZQotCQkiIiIKLQkJX2NvZGUgPSAnVVRJTCcKLQkJX3N1YmNvZGUgPSAnU0VMNCcKKyAgICBkZWYgc2VsZWN0X2Zsb3BweV9kaXNrX2ltYWdlKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNlbGVjdCBmbG9wcHkgZGlzayBpbWFnZTogUHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZsb3BweSBkaXNrIGltYWdlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9tcHQ6IHRoZSBwcm9tcHQgc3RyaW5nIHRvIGJlIGRpc3BsYXllZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGEgcmVmZXJlbmNlIHRvIGEgZmxvcHB5IGRpc2sgaW1hZ2UKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1VUSUwnCisgICAgICAgIF9zdWJjb2RlID0gJ1NFTDQnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2VsZWN0X2Zsb3BweV9kaXNrX2ltYWdlKQotCQlpZiBfbm9fb2JqZWN0ICE9IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NlbGVjdF9mbG9wcHlfZGlza19pbWFnZSkKKyAgICAgICAgaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJwogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NFTHAnLCBfRW51bV9URVhUKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX3NlbGVjdF9kaXNrID0gewotCQknd2l0aF9wcm9tcHQnIDogJ1NFTHAnLAotCX0KKyAgICBfYXJnbWFwX3NlbGVjdF9kaXNrID0geworICAgICAgICAgICAgJ3dpdGhfcHJvbXB0JyA6ICdTRUxwJywKKyAgICB9CiAKLQlkZWYgc2VsZWN0X2Rpc2soc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIic2VsZWN0IGRpc2s6IFByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBkaXNrIHZvbHVtZQotCQlLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvbXB0OiB0aGUgcHJvbXB0IHN0cmluZyB0byBiZSBkaXNwbGF5ZWQKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQlSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byB0aGUgZGlzawotCQkiIiIKLQkJX2NvZGUgPSAnVVRJTCcKLQkJX3N1YmNvZGUgPSAnU0VMNScKKyAgICBkZWYgc2VsZWN0X2Rpc2soc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic2VsZWN0IGRpc2s6IFByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBkaXNrIHZvbHVtZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvbXB0OiB0aGUgcHJvbXB0IHN0cmluZyB0byBiZSBkaXNwbGF5ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byB0aGUgZGlzaworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnVVRJTCcKKyAgICAgICAgX3N1YmNvZGUgPSAnU0VMNScKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWxlY3RfZGlzaykKLQkJaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWxlY3RfZGlzaykKKyAgICAgICAgaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJwogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NFTHAnLCBfRW51bV9URVhUKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX3NlbGVjdF9mb2xkZXIgPSB7Ci0JCSd3aXRoX3Byb21wdCcgOiAnU0VMcCcsCi0JfQorICAgIF9hcmdtYXBfc2VsZWN0X2ZvbGRlciA9IHsKKyAgICAgICAgICAgICd3aXRoX3Byb21wdCcgOiAnU0VMcCcsCisgICAgfQogCi0JZGVmIHNlbGVjdF9mb2xkZXIoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIic2VsZWN0IGZvbGRlcjogUHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZvbGRlcgotCQlLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvbXB0OiB0aGUgcHJvbXB0IHN0cmluZyB0byBiZSBkaXNwbGF5ZWQKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQlSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byB0aGUgZm9sZGVyCi0JCSIiIgotCQlfY29kZSA9ICdVVElMJwotCQlfc3ViY29kZSA9ICdTRUw2JworICAgIGRlZiBzZWxlY3RfZm9sZGVyKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNlbGVjdCBmb2xkZXI6IFByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBmb2xkZXIKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb21wdDogdGhlIHByb21wdCBzdHJpbmcgdG8gYmUgZGlzcGxheWVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYSByZWZlcmVuY2UgdG8gdGhlIGZvbGRlcgorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnVVRJTCcKKyAgICAgICAgX3N1YmNvZGUgPSAnU0VMNicKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWxlY3RfZm9sZGVyKQotCQlpZiBfbm9fb2JqZWN0ICE9IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NlbGVjdF9mb2xkZXIpCisgICAgICAgIGlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU0VMcCcsIF9FbnVtX1RFWFQpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9sb2cgPSB7Ci0JCSd0aW1lX3N0YW1wJyA6ICdUU01QJywKLQl9CisgICAgX2FyZ21hcF9sb2cgPSB7CisgICAgICAgICAgICAndGltZV9zdGFtcCcgOiAnVFNNUCcsCisgICAgfQogCi0JZGVmIGxvZyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIibG9nOiBBZGQgYSBzdHJpbmcgdG8gdGhlIGxvZyB3aW5kb3cKLQkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBzdHJpbmcgdG8gYWRkIHRvIHRoZSBsb2cgd2luZG93Ci0JCUtleXdvcmQgYXJndW1lbnQgdGltZV9zdGFtcDogU2hvdWxkIHRoZSBsb2cgZW50cnkgYmUgdGltZS1zdGFtcGVkPyAoZmFsc2UgaWYgbm90IHN1cHBsaWVkKQotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCSIiIgotCQlfY29kZSA9ICdVVElMJwotCQlfc3ViY29kZSA9ICdMT0cgJworICAgIGRlZiBsb2coc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImxvZzogQWRkIGEgc3RyaW5nIHRvIHRoZSBsb2cgd2luZG93CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgc3RyaW5nIHRvIGFkZCB0byB0aGUgbG9nIHdpbmRvdworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRpbWVfc3RhbXA6IFNob3VsZCB0aGUgbG9nIGVudHJ5IGJlIHRpbWUtc3RhbXBlZD8gKGZhbHNlIGlmIG5vdCBzdXBwbGllZCkKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnVVRJTCcKKyAgICAgICAgX3N1YmNvZGUgPSAnTE9HICcKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9sb2cpCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfbG9nKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CiAKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1RTTVAnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVFNNUCcsIF9FbnVtX2Jvb2wpCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAogX0VudW1fVEVYVCA9IE5vbmUgIyBYWFhYIGVudW0gVEVYVCBub3QgZm91bmQhIQogX0VudW1fYm9vbCA9IE5vbmUgIyBYWFhYIGVudW0gYm9vbCBub3QgZm91bmQhIQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vYXBwbGVzY3JpcHQvRGlza19Db3B5L19faW5pdF9fLnB5IGIvTWFjL0RlbW8vYXBwbGVzY3JpcHQvRGlza19Db3B5L19faW5pdF9fLnB5CmluZGV4IGI4MTQwNTYuLmFjNTA1NjEgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9fX2luaXRfXy5weQorKysgYi9NYWMvRGVtby9hcHBsZXNjcmlwdC9EaXNrX0NvcHkvX19pbml0X18ucHkKQEAgLTEsNiArMSw2IEBACiAiIiIKIFBhY2thZ2UgZ2VuZXJhdGVkIGZyb20gTWFjaW50b3NoIEhEOkh1bHBwcm9ncmFtbWEnczpEaXNrIENvcHkKLVJlc291cmNlIGFldGUgcmVzaWQgMCAKK1Jlc291cmNlIGFldGUgcmVzaWQgMAogIiIiCiBpbXBvcnQgYWV0b29scwogRXJyb3IgPSBhZXRvb2xzLkVycm9yCkBAIC0xMCwxNyArMTAsMTcgQEAKIAogCiBfY29kZV90b19tb2R1bGUgPSB7Ci0JJ0NvcmUnIDogU3RhbmRhcmRfU3VpdGUsCi0JJ2Rkc2snIDogU3BlY2lhbF9FdmVudHMsCi0JJ2Rkc2snIDogVXRpbGl0eV9FdmVudHMsCisgICAgICAgICdDb3JlJyA6IFN0YW5kYXJkX1N1aXRlLAorICAgICAgICAnZGRzaycgOiBTcGVjaWFsX0V2ZW50cywKKyAgICAgICAgJ2Rkc2snIDogVXRpbGl0eV9FdmVudHMsCiB9CiAKIAogCiBfY29kZV90b19mdWxsbmFtZSA9IHsKLQknQ29yZScgOiAoJ0Rpc2tfQ29weS5TdGFuZGFyZF9TdWl0ZScsICdTdGFuZGFyZF9TdWl0ZScpLAotCSdkZHNrJyA6ICgnRGlza19Db3B5LlNwZWNpYWxfRXZlbnRzJywgJ1NwZWNpYWxfRXZlbnRzJyksCi0JJ2Rkc2snIDogKCdEaXNrX0NvcHkuVXRpbGl0eV9FdmVudHMnLCAnVXRpbGl0eV9FdmVudHMnKSwKKyAgICAgICAgJ0NvcmUnIDogKCdEaXNrX0NvcHkuU3RhbmRhcmRfU3VpdGUnLCAnU3RhbmRhcmRfU3VpdGUnKSwKKyAgICAgICAgJ2Rkc2snIDogKCdEaXNrX0NvcHkuU3BlY2lhbF9FdmVudHMnLCAnU3BlY2lhbF9FdmVudHMnKSwKKyAgICAgICAgJ2Rkc2snIDogKCdEaXNrX0NvcHkuVXRpbGl0eV9FdmVudHMnLCAnVXRpbGl0eV9FdmVudHMnKSwKIH0KIAogZnJvbSBTdGFuZGFyZF9TdWl0ZSBpbXBvcnQgKgpAQCAtMjksOCArMjksNyBAQAogCiAKIGNsYXNzIERpc2tfQ29weShTdGFuZGFyZF9TdWl0ZV9FdmVudHMsCi0JCVNwZWNpYWxfRXZlbnRzX0V2ZW50cywKLQkJVXRpbGl0eV9FdmVudHNfRXZlbnRzLAotCQlhZXRvb2xzLlRhbGtUbyk6Ci0JX3NpZ25hdHVyZSA9ICdkZHNrJwotCisgICAgICAgICAgICAgICAgU3BlY2lhbF9FdmVudHNfRXZlbnRzLAorICAgICAgICAgICAgICAgIFV0aWxpdHlfRXZlbnRzX0V2ZW50cywKKyAgICAgICAgICAgICAgICBhZXRvb2xzLlRhbGtUbyk6CisgICAgX3NpZ25hdHVyZSA9ICdkZHNrJwpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vYXBwbGVzY3JpcHQvbWFrZWRpc2sucHkgYi9NYWMvRGVtby9hcHBsZXNjcmlwdC9tYWtlZGlzay5weQppbmRleCAzMDE2OTY0Li45MTIxMGVlIDEwMDY0NAotLS0gYS9NYWMvRGVtby9hcHBsZXNjcmlwdC9tYWtlZGlzay5weQorKysgYi9NYWMvRGVtby9hcHBsZXNjcmlwdC9tYWtlZGlzay5weQpAQCAtNiwxMCArNiwxMCBAQAogdGFsa2VyLmFjdGl2YXRlKCkKIGZpbGVzcGVjID0gbWFjZnMuRlNTcGVjKCdteSBkaXNrIGltYWdlLmltZycpCiB0cnk6Ci0Jb2JqcmVmID0gdGFsa2VyLmNyZWF0ZSgnbXkgZGlzayBpbWFnZScsIHNhdmluZ19hcz1maWxlc3BlYywgbGVhdmVfaW1hZ2VfbW91bnRlZD0xKQorICAgIG9ianJlZiA9IHRhbGtlci5jcmVhdGUoJ215IGRpc2sgaW1hZ2UnLCBzYXZpbmdfYXM9ZmlsZXNwZWMsIGxlYXZlX2ltYWdlX21vdW50ZWQ9MSkKIGV4Y2VwdCBEaXNrX0NvcHkuRXJyb3IsIGFyZzoKLQlwcmludCAiRVJST1I6IG15IGRpc2sgaW1hZ2U6IiwgYXJnCisgICAgcHJpbnQgIkVSUk9SOiBteSBkaXNrIGltYWdlOiIsIGFyZwogZWxzZToKLQlwcmludCAnb2JqcmVmPScsIG9ianJlZgorICAgIHByaW50ICdvYmpyZWY9Jywgb2JqcmVmCiBwcmludCAnVHlwZSByZXR1cm4gdG8gZXhpdC0nCiBzeXMuc3RkaW4ucmVhZGxpbmUoKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vY2FsbGRsbC90ZXN0Y2FsbGRsbC5weSBiL01hYy9EZW1vL2NhbGxkbGwvdGVzdGNhbGxkbGwucHkKaW5kZXggZDRhNDg1My4uZTBmNjk2NCAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vY2FsbGRsbC90ZXN0Y2FsbGRsbC5weQorKysgYi9NYWMvRGVtby9jYWxsZGxsL3Rlc3RjYWxsZGxsLnB5CkBAIC04LDE2ICs4LDE2IEBACiAKIGxpYiA9IGNhbGxkbGwuZ2V0ZGlza2ZyYWdtZW50KGZzcywgJ2NhbGxkbGwucHBjLnNsYicpCiAKLWNkbGxfYl9iYmJiYmJiYiA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9iX2JiYmJiYmJiLCAnQnl0ZScsICdJbkJ5dGUnLCAnSW5CeXRlJywgCi0JCQkJJ0luQnl0ZScsICdJbkJ5dGUnLCdJbkJ5dGUnLCAnSW5CeXRlJywnSW5CeXRlJywgJ0luQnl0ZScpCi1jZGxsX2hfaGhoaGhoaGggPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfaF9oaGhoaGhoaCwgJ1Nob3J0JywgJ0luU2hvcnQnLCAnSW5TaG9ydCcsIAotCQkJCSdJblNob3J0JywgJ0luU2hvcnQnLCdJblNob3J0JywgJ0luU2hvcnQnLCdJblNob3J0JywgJ0luU2hvcnQnKQotY2RsbF9sX2xsbGxsbGxsID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX2xfbGxsbGxsbGwsICdMb25nJywgJ0luTG9uZycsICdJbkxvbmcnLCAKLQkJCQknSW5Mb25nJywgJ0luTG9uZycsJ0luTG9uZycsICdJbkxvbmcnLCdJbkxvbmcnLCAnSW5Mb25nJykKLQkJCQkKK2NkbGxfYl9iYmJiYmJiYiA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9iX2JiYmJiYmJiLCAnQnl0ZScsICdJbkJ5dGUnLCAnSW5CeXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0luQnl0ZScsICdJbkJ5dGUnLCdJbkJ5dGUnLCAnSW5CeXRlJywnSW5CeXRlJywgJ0luQnl0ZScpCitjZGxsX2hfaGhoaGhoaGggPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfaF9oaGhoaGhoaCwgJ1Nob3J0JywgJ0luU2hvcnQnLCAnSW5TaG9ydCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJblNob3J0JywgJ0luU2hvcnQnLCdJblNob3J0JywgJ0luU2hvcnQnLCdJblNob3J0JywgJ0luU2hvcnQnKQorY2RsbF9sX2xsbGxsbGxsID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX2xfbGxsbGxsbGwsICdMb25nJywgJ0luTG9uZycsICdJbkxvbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5Mb25nJywgJ0luTG9uZycsJ0luTG9uZycsICdJbkxvbmcnLCdJbkxvbmcnLCAnSW5Mb25nJykKKwogY2RsbF9OX3Nzc3Nzc3NzID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX05fc3Nzc3Nzc3MsICdOb25lJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywKLQkJCQknSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnKQotCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnKQorCiBjZGxsX29fbCA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9vX2wsICdPU0VycicsICdJbkxvbmcnKQogCiBjZGxsX05fcHAgPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfTl9wcCwgJ05vbmUnLCAnSW5Qc3RyaW5nJywgJ091dFBzdHJpbmcnKQpAQCAtMzAsMTAzICszMCwxMDMgQEAKIHByaW50ICdUZXN0IGNkbGxfYl9iYmJiYmJiYicKIHJ2ID0gY2RsbF9iX2JiYmJiYmJiKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpCiBpZiBydiA9PSAzNjoKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKLQkKKyAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CisKIHByaW50ICdUZXN0IGNkbGxfYl9iYmJiYmJiYiBuZWdhdGl2ZScKIHJ2ID0gY2RsbF9iX2JiYmJiYmJiKC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCkKIGlmIHJ2ID09IC0zNjoKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKKyAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CiAKIHByaW50ICdUZXN0IGNkbGxfaF9oaGhoaGhoaCcKIHJ2ID0gY2RsbF9oX2hoaGhoaGhoKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpCiBpZiBydiA9PSAzNjoKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKLQkKKyAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CisKIHByaW50ICdUZXN0IGNkbGxfaF9oaGhoaGhoaCBuZWdhdGl2ZScKIHJ2ID0gY2RsbF9oX2hoaGhoaGhoKC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCkKIGlmIHJ2ID09IC0zNjoKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKKyAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CiAKIHByaW50ICdUZXN0IGNkbGxfbF9sbGxsbGxsbCcKIHJ2ID0gY2RsbF9sX2xsbGxsbGxsKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpCiBpZiBydiA9PSAzNjoKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKLQkKKyAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CisKIHByaW50ICdUZXN0IGNkbGxfbF9sbGxsbGxsbCBuZWdhdGl2ZScKIHJ2ID0gY2RsbF9sX2xsbGxsbGxsKC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCkKIGlmIHJ2ID09IC0zNjoKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKLQkKKyAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CisKIHByaW50ICdUZXN0IGNkbGxfTl9zc3Nzc3NzcycKIHByaW50ICdTaG91bGQgcHJpbnQgb25lIHR3byB0aHJlZSBmb3VyIGZpdmUgc2l4IHNldmVuIGVpZ2h0JwogcnYgPSBjZGxsX05fc3Nzc3Nzc3MoJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicsICdmaXZlJywgJ3NpeCcsICdzZXZlbicsICdlaWdodCcpCiBpZiBydiA9PSBOb25lOgotCXByaW50ICdvay4nCisgICAgcHJpbnQgJ29rLicKIGVsc2U6Ci0JcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgotCQorICAgIHByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKKwogcHJpbnQgJ1Rlc3QgY2RsbF9vX2woMCknCiBydiA9IGNkbGxfb19sKDApCiBpZiBydiA9PSBOb25lOgotCXByaW50ICdvay4nCisgICAgcHJpbnQgJ29rLicKIGVsc2U6Ci0JcHJpbnQgJ0Vycm9yLCByZXR1cm5lZCcsIHJ2Ci0JCisgICAgcHJpbnQgJ0Vycm9yLCByZXR1cm5lZCcsIHJ2CisKIHByaW50ICdUZXN0IGNkbGxfb19sKC0xMDApJwogdHJ5OgotCXJ2ID0gY2RsbF9vX2woLTEwMCkKLQlwcmludCAnRXJyb3IsIGRpZCBub3QgcmFpc2UgZXhjZXB0aW9uLCByZXR1cm5lZCcsIHJ2CisgICAgcnYgPSBjZGxsX29fbCgtMTAwKQorICAgIHByaW50ICdFcnJvciwgZGlkIG5vdCByYWlzZSBleGNlcHRpb24sIHJldHVybmVkJywgcnYKIGV4Y2VwdCBNYWNPUy5FcnJvciwgYXJnOgotCWlmIGFyZ1swXSA9PSAtMTAwOgotCQlwcmludCAnb2suJwotCWVsc2U6Ci0JCXByaW50ICdFcnJvciwgcmV0dXJuZWQgaW5jb3JyZWN0IGV4Y2VwdGlvbiBhcmc6JywgYXJnWzBdCi0JCisgICAgaWYgYXJnWzBdID09IC0xMDA6CisgICAgICAgIHByaW50ICdvay4nCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgJ0Vycm9yLCByZXR1cm5lZCBpbmNvcnJlY3QgZXhjZXB0aW9uIGFyZzonLCBhcmdbMF0KKwogcHJpbnQgJ1Rlc3QgY2RsbF9OX3BwJwogcnYgPSBjZGxsX05fcHAoJ3Bhc2NhbCBzdHJpbmcnKQogaWYgcnYgPT0gJ1dhczogcGFzY2FsIHN0cmluZyc6Ci0JcHJpbnQgJ29rLicKKyAgICBwcmludCAnb2suJwogZWxzZToKLQlwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJlcHIocnYpCi0JCisgICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCByZXByKHJ2KQorCiBwcmludCAnVGVzdCBjZGxsX05fYmInCiBydiA9IGNkbGxfTl9iYigtMTAwKQogaWYgcnYgPT0gLTEwMDoKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKLQkKKyAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CisKIHByaW50ICdUZXN0IGNkbGxfTl9oaCcKIHJ2ID0gY2RsbF9OX2hoKC0xMDApCiBpZiBydiA9PSAtMTAwOgotCXByaW50ICdvay4nCisgICAgcHJpbnQgJ29rLicKIGVsc2U6Ci0JcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgotCQorICAgIHByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKKwogcHJpbnQgJ1Rlc3QgY2RsbF9OX2xsJwogcnYgPSBjZGxsX05fbGwoLTEwMCkKIGlmIHJ2ID09IC0xMDA6Ci0JcHJpbnQgJ29rLicKKyAgICBwcmludCAnb2suJwogZWxzZToKLQlwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CisgICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgogCiBwcmludCAnVGVzdCBjZGxsX05fc0gnCiBoID0gUmVzLlJlc291cmNlKCd4eXonKQogcnYgPSBjZGxsX05fc0goJ25ldyBkYXRhJywgaCkKIGlmIHJ2ID09IE5vbmUgYW5kIGguZGF0YSA9PSAnbmV3IGRhdGEnOgotCXByaW50ICdvay4nCisgICAgcHJpbnQgJ29rLicKIGVsc2U6Ci0JcHJpbnQgJ0ZhaWxlZCwgcnYgaXMnLCBydiwgJ2FuZCBoYW5kbGUgZGF0YSBpcycsIHJlcHIocnYuZGF0YSkKKyAgICBwcmludCAnRmFpbGVkLCBydiBpcycsIHJ2LCAnYW5kIGhhbmRsZSBkYXRhIGlzJywgcmVwcihydi5kYXRhKQogc3lzLmV4aXQoMSkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL2V4YW1wbGUwL2NoZWNrdGV4dC5weSBiL01hYy9EZW1vL2V4YW1wbGUwL2NoZWNrdGV4dC5weQppbmRleCBhNTk0M2E2Li4yNWY3MWU0IDEwMDY0NAotLS0gYS9NYWMvRGVtby9leGFtcGxlMC9jaGVja3RleHQucHkKKysrIGIvTWFjL0RlbW8vZXhhbXBsZTAvY2hlY2t0ZXh0LnB5CkBAIC01LDMzICs1LDMxIEBACiBpbXBvcnQgc3RyaW5nCiAKIGRlZiBtYWluKCk6Ci0JcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSdGaWxlIHRvIGNoZWNrIGVuZC1vZi1saW5lcyBpbjonKQotCWlmIG5vdCBwYXRobmFtZToKLQkJc3lzLmV4aXQoMCkKLQlmcCA9IG9wZW4ocGF0aG5hbWUsICdyYicpCi0JdHJ5OgotCQlkYXRhID0gZnAucmVhZCgpCi0JZXhjZXB0IE1lbW9yeUVycm9yOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCdTb3JyeSwgZmlsZSBpcyB0b28gYmlnLicpCi0JCXN5cy5leGl0KDApCi0JaWYgbGVuKGRhdGEpID09IDA6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoJ0ZpbGUgaXMgZW1wdHkuJykKLQkJc3lzLmV4aXQoMCkKLQludW1iZXJfY3IgPSBzdHJpbmcuY291bnQoZGF0YSwgJ1xyJykKLQludW1iZXJfbGYgPSBzdHJpbmcuY291bnQoZGF0YSwgJ1xuJykKLQlpZiBudW1iZXJfY3IgPT0gbnVtYmVyX2xmID09IDA6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoJ0ZpbGUgY29udGFpbnMgbm8gbGluZXMuJykKLQlpZiBudW1iZXJfY3IgPT0gMDoKLQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgnRmlsZSBoYXMgdW5peC1zdHlsZSBsaW5lIGVuZGluZ3MnKQotCWVsaWYgbnVtYmVyX2xmID09IDA6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoJ0ZpbGUgaGFzIG1hYy1zdHlsZSBsaW5lIGVuZGluZ3MnKQotCWVsaWYgbnVtYmVyX2NyID09IG51bWJlcl9sZjoKLQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgnRmlsZSBwcm9iYWJseSBoYXMgTVNET1Mtc3R5bGUgbGluZSBlbmRpbmdzJykKLQllbHNlOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCdGaWxlIGhhcyBubyByZWNvZ25pemFibGUgbGluZSBlbmRpbmdzIChiaW5hcnkgZmlsZT8pJykKLQlzeXMuZXhpdCgwKQotCQorICAgIHBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0nRmlsZSB0byBjaGVjayBlbmQtb2YtbGluZXMgaW46JykKKyAgICBpZiBub3QgcGF0aG5hbWU6CisgICAgICAgIHN5cy5leGl0KDApCisgICAgZnAgPSBvcGVuKHBhdGhuYW1lLCAncmInKQorICAgIHRyeToKKyAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgnU29ycnksIGZpbGUgaXMgdG9vIGJpZy4nKQorICAgICAgICBzeXMuZXhpdCgwKQorICAgIGlmIGxlbihkYXRhKSA9PSAwOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCdGaWxlIGlzIGVtcHR5LicpCisgICAgICAgIHN5cy5leGl0KDApCisgICAgbnVtYmVyX2NyID0gc3RyaW5nLmNvdW50KGRhdGEsICdccicpCisgICAgbnVtYmVyX2xmID0gc3RyaW5nLmNvdW50KGRhdGEsICdcbicpCisgICAgaWYgbnVtYmVyX2NyID09IG51bWJlcl9sZiA9PSAwOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCdGaWxlIGNvbnRhaW5zIG5vIGxpbmVzLicpCisgICAgaWYgbnVtYmVyX2NyID09IDA6CisgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoJ0ZpbGUgaGFzIHVuaXgtc3R5bGUgbGluZSBlbmRpbmdzJykKKyAgICBlbGlmIG51bWJlcl9sZiA9PSAwOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCdGaWxlIGhhcyBtYWMtc3R5bGUgbGluZSBlbmRpbmdzJykKKyAgICBlbGlmIG51bWJlcl9jciA9PSBudW1iZXJfbGY6CisgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoJ0ZpbGUgcHJvYmFibHkgaGFzIE1TRE9TLXN0eWxlIGxpbmUgZW5kaW5ncycpCisgICAgZWxzZToKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgnRmlsZSBoYXMgbm8gcmVjb2duaXphYmxlIGxpbmUgZW5kaW5ncyAoYmluYXJ5IGZpbGU/KScpCisgICAgc3lzLmV4aXQoMCkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKLQkKLQkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL2V4YW1wbGUxL2Ruc2xvb2t1cC0xLnB5IGIvTWFjL0RlbW8vZXhhbXBsZTEvZG5zbG9va3VwLTEucHkKaW5kZXggMmFhN2M4OC4uMmZiOGRjNCAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vZXhhbXBsZTEvZG5zbG9va3VwLTEucHkKKysrIGIvTWFjL0RlbW8vZXhhbXBsZTEvZG5zbG9va3VwLTEucHkKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgICAgICAgIHR4dCA9IERsZy5HZXREaWFsb2dJdGVtVGV4dChoKQogCiAgICAgICAgICAgICB0cCwgaCwgcmVjdCA9IG15X2RsZy5HZXREaWFsb2dJdGVtKElURU1fUkVTVUxUKQotICAgICAgICAgICAgRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIGRuc2xvb2t1cCh0eHQpKSAgICAgICAgCisgICAgICAgICAgICBEbGcuU2V0RGlhbG9nSXRlbVRleHQoaCwgZG5zbG9va3VwKHR4dCkpCiAgICAgICAgIGVsaWYgbiA9PSBJVEVNX1FVSVRfQlVUVE9OOgogICAgICAgICAgICAgYnJlYWsKIApAQCAtNTQsNCArNTQsMyBAQAogICAgIHJldHVybiB2YWx1ZQogCiBtYWluKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vZXhhbXBsZTIvZG5zbG9va3VwLTIucHkgYi9NYWMvRGVtby9leGFtcGxlMi9kbnNsb29rdXAtMi5weQppbmRleCA5NzQ3YzRhLi45MmNkMTgxIDEwMDY0NAotLS0gYS9NYWMvRGVtby9leGFtcGxlMi9kbnNsb29rdXAtMi5weQorKysgYi9NYWMvRGVtby9leGFtcGxlMi9kbnNsb29rdXAtMi5weQpAQCAtMTgsMTAgKzE4LDEwIEBACiBkZWYgbWFpbigpOgogICAgIG1hY3Jlc291cmNlLm5lZWQoIkRMT0ciLCBJRF9NQUlOLCAiZG5zbG9va3VwLTIucnNyYyIpCiAgICAgRE5TTG9va3VwKCkKLSAgICAKKwogY2xhc3MgRE5TTG9va3VwKEZyYW1lV29yay5BcHBsaWNhdGlvbik6CiAgICAgIkFwcGxpY2F0aW9uIGNsYXNzIGZvciBETlMgTG9va3VwIgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAjIEZpcnN0IGluaXQgbWVudXMsIGV0Yy4KICAgICAgICAgRnJhbWVXb3JrLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCkBAIC0zMSwyNyArMzEsMjcgQEAKICAgICAgICAgc2VsZi5tYWluX2RpYWxvZy5vcGVuKElEX01BSU4pCiAgICAgICAgICMgRmluYWxseSwgZ28gaW50byB0aGUgZXZlbnQgbG9vcAogICAgICAgICBzZWxmLm1haW5sb29wKCkKLSAgICAKKwogICAgIGRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgogICAgICAgICBzZWxmLmZpbGVtZW51ID0gbSA9IEZyYW1lV29yay5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQogICAgICAgICBzZWxmLnF1aXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCi0gICAgCisKICAgICBkZWYgcXVpdChzZWxmLCAqYXJncyk6CiAgICAgICAgIHNlbGYuX3F1aXQoKQotICAgICAgICAKKwogICAgIGRlZiBkb19hYm91dChzZWxmLCAqYXJncyk6CiAgICAgICAgIGYgPSBEbGcuR2V0TmV3RGlhbG9nKElEX0FCT1VULCAtMSkKICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgIG4gPSBEbGcuTW9kYWxEaWFsb2coTm9uZSkKICAgICAgICAgICAgIGlmIG4gPT0gMToKICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIAorCiBjbGFzcyBNeURpYWxvZyhGcmFtZVdvcmsuRGlhbG9nV2luZG93KToKICAgICAiTWFpbiBkaWFsb2cgd2luZG93IGZvciBETlNMb29rdXAiCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6CiAgICAgICAgIEZyYW1lV29yay5EaWFsb2dXaW5kb3cuX19pbml0X18oc2VsZiwgcGFyZW50KQogICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAotICAgIAorCiAgICAgZGVmIGRvX2l0ZW1oaXQoc2VsZiwgaXRlbSwgZXZlbnQpOgogICAgICAgICBpZiBpdGVtID09IElURU1fTE9PS1VQX0JVVFRPTjoKICAgICAgICAgICAgIHNlbGYuZG9sb29rdXAoKQpAQCAtNjQsNyArNjQsNyBAQAogCiAgICAgICAgIHRwLCBoLCByZWN0ID0gc2VsZi5kbGcuR2V0RGlhbG9nSXRlbShJVEVNX1JFU1VMVCkKICAgICAgICAgRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIHNlbGYuZG5zbG9va3VwKHR4dCkpCi0gICAgICAgIAorCiAgICAgZGVmIGRuc2xvb2t1cChzZWxmLCBzdHIpOgogICAgICAgICAiIiIgUGVyZm9ybSBETlMgbG9va3VwIG9uIHN0ci4gIElmIGZpcnN0IGNoYXJhY3RlciBvZiBkaWdpdCBpcyBudW1lcmljLAogICAgICAgICAgICAgYXNzdW1lIHRoYXQgc3RyIGNvbnRhaW5zIGFuIElQIGFkZHJlc3MuICBPdGhlcndpc2UsIGFzc3VtZSB0aGF0IHN0cgpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vaW1nYnJvd3NlL2ltZ2Jyb3dzZS5weSBiL01hYy9EZW1vL2ltZ2Jyb3dzZS9pbWdicm93c2UucHkKaW5kZXggMjYyYzY1MC4uMjhkZmZkMyAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vaW1nYnJvd3NlL2ltZ2Jyb3dzZS5weQorKysgYi9NYWMvRGVtby9pbWdicm93c2UvaW1nYnJvd3NlLnB5CkBAIC0yNSw5MyArMjUsOTMgQEAKIAogCiBkZWYgbWFpbigpOgotCXByaW50ICdoZWxsbyB3b3JsZCcKLQlpbWdicm93c2UoKQorICAgIHByaW50ICdoZWxsbyB3b3JsZCcKKyAgICBpbWdicm93c2UoKQogCiBjbGFzcyBpbWdicm93c2UoRnJhbWVXb3JrLkFwcGxpY2F0aW9uKToKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCSMgRmlyc3QgaW5pdCBtZW51cywgZXRjLgotCQlGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJc2VsZi5sYXN0d2luID0gTm9uZQotCQkjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKLQkJc2VsZi5tYWlubG9vcCgpCi0JCQotCWRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgotCQlzZWxmLmZpbGVtZW51ID0gbSA9IEZyYW1lV29yay5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQotCQlzZWxmLm9wZW5pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJPcGVuLi4uIiwgIk8iLCBzZWxmLm9wZW5kb2MpCi0JCXNlbGYuaW5mb2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkluZm8iLCAiSSIsIHNlbGYuaW5mbykKLQkJc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQotCQotCWRlZiBxdWl0KHNlbGYsICphcmdzKToKLQkJc2VsZi5fcXVpdCgpCi0JCQotCWRlZiBvcGVuZG9jKHNlbGYsICphcmdzKToKLQkJcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbigpICMgQW55IGZpbGUgdHlwZQotCQlpZiBub3QgcGF0aG5hbWU6Ci0JCQlyZXR1cm4KLQkJYmFyID0gRWFzeURpYWxvZ3MuUHJvZ3Jlc3NCYXIoJ1JlYWRpbmcgYW5kIGNvbnZlcnRpbmcuLi4nKQotCQl0cnk6Ci0JCQlyZHIgPSBpbWcucmVhZGVyKGltZ2Zvcm1hdC5tYWNyZ2IxNiwgcGF0aG5hbWUpCi0JCWV4Y2VwdCBpbWcuZXJyb3IsIGFyZzoKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UocmVwcihhcmcpKQotCQkJcmV0dXJuCi0JCXcsIGggPSByZHIud2lkdGgsIHJkci5oZWlnaHQKLQkJYmFyLnNldCgxMCkKLQkJZGF0YSA9IHJkci5yZWFkKCkKLQkJZGVsIGJhcgotCQlwaXhtYXAgPSBtYWNfaW1hZ2UubWtwaXhtYXAodywgaCwgaW1nZm9ybWF0Lm1hY3JnYjE2LCBkYXRhKQotCQlzZWxmLnNob3dpbWcodywgaCwgcGl4bWFwLCBkYXRhKQotCQkJCi0JZGVmIHNob3dpbWcoc2VsZiwgdywgaCwgcGl4bWFwLCBkYXRhKToKLQkJd2luID0gaW1nd2luZG93KHNlbGYpCi0JCXdpbi5vcGVuKHcsIGgsIHBpeG1hcCwgZGF0YSkKLQkJc2VsZi5sYXN0d2luID0gd2luCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIEZpcnN0IGluaXQgbWVudXMsIGV0Yy4KKyAgICAgICAgRnJhbWVXb3JrLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYubGFzdHdpbiA9IE5vbmUKKyAgICAgICAgIyBGaW5hbGx5LCBnbyBpbnRvIHRoZSBldmVudCBsb29wCisgICAgICAgIHNlbGYubWFpbmxvb3AoKQogCi0JZGVmIGluZm8oc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmxhc3R3aW46Ci0JCQlzZWxmLmxhc3R3aW4uaW5mbygpCQkKLQkJCisgICAgZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW1lbnUgPSBtID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCisgICAgICAgIHNlbGYub3Blbml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk9wZW4uLi4iLCAiTyIsIHNlbGYub3BlbmRvYykKKyAgICAgICAgc2VsZi5pbmZvaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiSW5mbyIsICJJIiwgc2VsZi5pbmZvKQorICAgICAgICBzZWxmLnF1aXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCisKKyAgICBkZWYgcXVpdChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgZGVmIG9wZW5kb2Moc2VsZiwgKmFyZ3MpOgorICAgICAgICBwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKCkgIyBBbnkgZmlsZSB0eXBlCisgICAgICAgIGlmIG5vdCBwYXRobmFtZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBiYXIgPSBFYXN5RGlhbG9ncy5Qcm9ncmVzc0JhcignUmVhZGluZyBhbmQgY29udmVydGluZy4uLicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJkciA9IGltZy5yZWFkZXIoaW1nZm9ybWF0Lm1hY3JnYjE2LCBwYXRobmFtZSkKKyAgICAgICAgZXhjZXB0IGltZy5lcnJvciwgYXJnOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZShyZXByKGFyZykpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdywgaCA9IHJkci53aWR0aCwgcmRyLmhlaWdodAorICAgICAgICBiYXIuc2V0KDEwKQorICAgICAgICBkYXRhID0gcmRyLnJlYWQoKQorICAgICAgICBkZWwgYmFyCisgICAgICAgIHBpeG1hcCA9IG1hY19pbWFnZS5ta3BpeG1hcCh3LCBoLCBpbWdmb3JtYXQubWFjcmdiMTYsIGRhdGEpCisgICAgICAgIHNlbGYuc2hvd2ltZyh3LCBoLCBwaXhtYXAsIGRhdGEpCisKKyAgICBkZWYgc2hvd2ltZyhzZWxmLCB3LCBoLCBwaXhtYXAsIGRhdGEpOgorICAgICAgICB3aW4gPSBpbWd3aW5kb3coc2VsZikKKyAgICAgICAgd2luLm9wZW4odywgaCwgcGl4bWFwLCBkYXRhKQorICAgICAgICBzZWxmLmxhc3R3aW4gPSB3aW4KKworICAgIGRlZiBpbmZvKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5sYXN0d2luOgorICAgICAgICAgICAgc2VsZi5sYXN0d2luLmluZm8oKQorCiBjbGFzcyBpbWd3aW5kb3coRnJhbWVXb3JrLldpbmRvdyk6Ci0JZGVmIG9wZW4oc2VsZiwgd2lkdGgsIGhlaWdodCwgcGl4bWFwLCBkYXRhKToKLQkJc2VsZi5waXhtYXAgPSBwaXhtYXAKLQkJc2VsZi5kYXRhID0gZGF0YQotCQlzZWxmLnBpY3RyZWN0ID0gKDAsIDAsIHdpZHRoLCBoZWlnaHQpCi0JCWJvdW5kcyA9IChMRUZULCBUT1AsIExFRlQrd2lkdGgsIFRPUCtoZWlnaHQpCi0JCQotCQlzZWxmLndpZCA9IFdpbi5OZXdDV2luZG93KGJvdW5kcywgIlBpY3R1cmUiLCAxLCAwLCAtMSwgMSwgMCkKLQkJc2VsZi5kb19wb3N0b3BlbigpCi0JCQotCWRlZiBkb191cGRhdGUoc2VsZiwgKmFyZ3MpOgotCQlwYXNzCi0JCWN1cnJlY3QgPSBzZWxmLmZpdHJlY3QoKQotCQlwcmludCAnUElDVDonLCBzZWxmLnBpY3RyZWN0Ci0JCXByaW50ICdXSU5EOicsIGN1cnJlY3QKLQkJcHJpbnQgJ0FSR1M6JywgKHNlbGYucGl4bWFwLCBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKCksIHNlbGYucGljdHJlY3QsCi0JCQkJY3VycmVjdCwgUXVpY2tEcmF3LnNyY0NvcHksIE5vbmUpCi0JCXNlbGYuaW5mbygpCi0JCVFkLkNvcHlCaXRzKHNlbGYucGl4bWFwLCBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKCksIHNlbGYucGljdHJlY3QsCi0JCQkJY3VycmVjdCwgUXVpY2tEcmF3LnNyY0NvcHksIE5vbmUpCi0JCQotCWRlZiBmaXRyZWN0KHNlbGYpOgotCQkiIiJSZXR1cm4gc2VsZi5waWN0cmVjdCBzY2FsZWQgdG8gZml0IGluIHdpbmRvdyIiIgotCQlncmFmID0gc2VsZi53aWQuR2V0V2luZG93UG9ydCgpCi0JCXNjcmVlbnJlY3QgPSBncmFmLkdldFBvcnRCb3VuZHMoKQotCQlwaWN3aWR0aCA9IHNlbGYucGljdHJlY3RbMl0gLSBzZWxmLnBpY3RyZWN0WzBdCi0JCXBpY2hlaWdodCA9IHNlbGYucGljdHJlY3RbM10gLSBzZWxmLnBpY3RyZWN0WzFdCi0JCWlmIHBpY3dpZHRoID4gc2NyZWVucmVjdFsyXSAtIHNjcmVlbnJlY3RbMF06Ci0JCQlmYWN0b3IgPSBmbG9hdChwaWN3aWR0aCkgLyBmbG9hdChzY3JlZW5yZWN0WzJdLXNjcmVlbnJlY3RbMF0pCi0JCQlwaWN3aWR0aCA9IHBpY3dpZHRoIC8gZmFjdG9yCi0JCQlwaWNoZWlnaHQgPSBwaWNoZWlnaHQgLyBmYWN0b3IKLQkJaWYgcGljaGVpZ2h0ID4gc2NyZWVucmVjdFszXSAtIHNjcmVlbnJlY3RbMV06Ci0JCQlmYWN0b3IgPSBmbG9hdChwaWNoZWlnaHQpIC8gZmxvYXQoc2NyZWVucmVjdFszXS1zY3JlZW5yZWN0WzFdKQotCQkJcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgotCQkJcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCi0JCXJldHVybiAoc2NyZWVucmVjdFswXSwgc2NyZWVucmVjdFsxXSwgc2NyZWVucmVjdFswXStpbnQocGljd2lkdGgpLAotCQkJCXNjcmVlbnJlY3RbMV0raW50KHBpY2hlaWdodCkpCi0JCQkJCi0JZGVmIGluZm8oc2VsZik6Ci0JCWdyYWYgPSBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkKLQkJYml0cyA9IGdyYWYuR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKCkKLQkJbWFjX2ltYWdlLmR1bXBwaXhtYXAoYml0cy5waXhtYXBfZGF0YSkKKyAgICBkZWYgb3BlbihzZWxmLCB3aWR0aCwgaGVpZ2h0LCBwaXhtYXAsIGRhdGEpOgorICAgICAgICBzZWxmLnBpeG1hcCA9IHBpeG1hcAorICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCisgICAgICAgIHNlbGYucGljdHJlY3QgPSAoMCwgMCwgd2lkdGgsIGhlaWdodCkKKyAgICAgICAgYm91bmRzID0gKExFRlQsIFRPUCwgTEVGVCt3aWR0aCwgVE9QK2hlaWdodCkKKworICAgICAgICBzZWxmLndpZCA9IFdpbi5OZXdDV2luZG93KGJvdW5kcywgIlBpY3R1cmUiLCAxLCAwLCAtMSwgMSwgMCkKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisKKyAgICBkZWYgZG9fdXBkYXRlKHNlbGYsICphcmdzKToKKyAgICAgICAgcGFzcworICAgICAgICBjdXJyZWN0ID0gc2VsZi5maXRyZWN0KCkKKyAgICAgICAgcHJpbnQgJ1BJQ1Q6Jywgc2VsZi5waWN0cmVjdAorICAgICAgICBwcmludCAnV0lORDonLCBjdXJyZWN0CisgICAgICAgIHByaW50ICdBUkdTOicsIChzZWxmLnBpeG1hcCwgc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cygpLCBzZWxmLnBpY3RyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVjdCwgUXVpY2tEcmF3LnNyY0NvcHksIE5vbmUpCisgICAgICAgIHNlbGYuaW5mbygpCisgICAgICAgIFFkLkNvcHlCaXRzKHNlbGYucGl4bWFwLCBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKCksIHNlbGYucGljdHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZWN0LCBRdWlja0RyYXcuc3JjQ29weSwgTm9uZSkKKworICAgIGRlZiBmaXRyZWN0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gc2VsZi5waWN0cmVjdCBzY2FsZWQgdG8gZml0IGluIHdpbmRvdyIiIgorICAgICAgICBncmFmID0gc2VsZi53aWQuR2V0V2luZG93UG9ydCgpCisgICAgICAgIHNjcmVlbnJlY3QgPSBncmFmLkdldFBvcnRCb3VuZHMoKQorICAgICAgICBwaWN3aWR0aCA9IHNlbGYucGljdHJlY3RbMl0gLSBzZWxmLnBpY3RyZWN0WzBdCisgICAgICAgIHBpY2hlaWdodCA9IHNlbGYucGljdHJlY3RbM10gLSBzZWxmLnBpY3RyZWN0WzFdCisgICAgICAgIGlmIHBpY3dpZHRoID4gc2NyZWVucmVjdFsyXSAtIHNjcmVlbnJlY3RbMF06CisgICAgICAgICAgICBmYWN0b3IgPSBmbG9hdChwaWN3aWR0aCkgLyBmbG9hdChzY3JlZW5yZWN0WzJdLXNjcmVlbnJlY3RbMF0pCisgICAgICAgICAgICBwaWN3aWR0aCA9IHBpY3dpZHRoIC8gZmFjdG9yCisgICAgICAgICAgICBwaWNoZWlnaHQgPSBwaWNoZWlnaHQgLyBmYWN0b3IKKyAgICAgICAgaWYgcGljaGVpZ2h0ID4gc2NyZWVucmVjdFszXSAtIHNjcmVlbnJlY3RbMV06CisgICAgICAgICAgICBmYWN0b3IgPSBmbG9hdChwaWNoZWlnaHQpIC8gZmxvYXQoc2NyZWVucmVjdFszXS1zY3JlZW5yZWN0WzFdKQorICAgICAgICAgICAgcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgorICAgICAgICAgICAgcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCisgICAgICAgIHJldHVybiAoc2NyZWVucmVjdFswXSwgc2NyZWVucmVjdFsxXSwgc2NyZWVucmVjdFswXStpbnQocGljd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVucmVjdFsxXStpbnQocGljaGVpZ2h0KSkKKworICAgIGRlZiBpbmZvKHNlbGYpOgorICAgICAgICBncmFmID0gc2VsZi53aWQuR2V0V2luZG93UG9ydCgpCisgICAgICAgIGJpdHMgPSBncmFmLkdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cygpCisgICAgICAgIG1hY19pbWFnZS5kdW1wcGl4bWFwKGJpdHMucGl4bWFwX2RhdGEpCiAKIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vaW1nYnJvd3NlL21hY19pbWFnZS5weSBiL01hYy9EZW1vL2ltZ2Jyb3dzZS9tYWNfaW1hZ2UucHkKaW5kZXggMDk0YzU4ZS4uOWM5ZWViNyAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vaW1nYnJvd3NlL21hY19pbWFnZS5weQorKysgYi9NYWMvRGVtby9pbWdicm93c2UvbWFjX2ltYWdlLnB5CkBAIC02LDUxICs2LDUxIEBACiBpbXBvcnQgTWFjT1MKIAogX2ZtdF90b19tYWMgPSB7Ci0JaW1nZm9ybWF0Lm1hY3JnYjE2IDogKDE2LCAxNiwgMywgNSksCisgICAgICAgIGltZ2Zvcm1hdC5tYWNyZ2IxNiA6ICgxNiwgMTYsIDMsIDUpLAogfQogCiBkZWYgbWtwaXhtYXAodywgaCwgZm10LCBkYXRhKToKLQkiIiJrbHVkZ2UgYSBwaXhtYXAgdG9nZXRoZXIiIiIKLQlmbXRpbmZvID0gX2ZtdF90b19tYWNbZm10XQotCQotCXJ2ID0gc3RydWN0LnBhY2soImxIaGhoaGhobGxsaGhoaGxsbCIsCi0JCWlkKGRhdGEpK01hY09TLnN0cmluZ19pZF90b19idWZmZXIsICMgSEFDSyBIQUNLISEKLQkJdyoyICsgMHg4MDAwLAotCQkwLCAwLCBoLCB3LAotCQkwLAotCQkwLCAwLCAjIFhYWFg/Ci0JCTcyPDwxNiwgNzI8PDE2LAotCQlmbXRpbmZvWzBdLCBmbXRpbmZvWzFdLAotCQlmbXRpbmZvWzJdLCBmbXRpbmZvWzNdLAotCQkwLCAwLCAwKQotIyMJcHJpbnQgJ091ciBwaXhtYXAsIHNpemUgJWQ6JyVsZW4ocnYpCi0jIwlkdW1wcGl4bWFwKHJ2KQotCXJldHVybiBRZC5SYXdCaXRNYXAocnYpCisgICAgIiIia2x1ZGdlIGEgcGl4bWFwIHRvZ2V0aGVyIiIiCisgICAgZm10aW5mbyA9IF9mbXRfdG9fbWFjW2ZtdF0KKworICAgIHJ2ID0gc3RydWN0LnBhY2soImxIaGhoaGhobGxsaGhoaGxsbCIsCisgICAgICAgICAgICBpZChkYXRhKStNYWNPUy5zdHJpbmdfaWRfdG9fYnVmZmVyLCAjIEhBQ0sgSEFDSyEhCisgICAgICAgICAgICB3KjIgKyAweDgwMDAsCisgICAgICAgICAgICAwLCAwLCBoLCB3LAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsIDAsICMgWFhYWD8KKyAgICAgICAgICAgIDcyPDwxNiwgNzI8PDE2LAorICAgICAgICAgICAgZm10aW5mb1swXSwgZm10aW5mb1sxXSwKKyAgICAgICAgICAgIGZtdGluZm9bMl0sIGZtdGluZm9bM10sCisgICAgICAgICAgICAwLCAwLCAwKQorIyMgICAgICBwcmludCAnT3VyIHBpeG1hcCwgc2l6ZSAlZDonJWxlbihydikKKyMjICAgICAgZHVtcHBpeG1hcChydikKKyAgICByZXR1cm4gUWQuUmF3Qml0TWFwKHJ2KQogCiBkZWYgZHVtcHBpeG1hcChkYXRhKToKLQliYXNlQWRkciwgXAotCQlyb3dCeXRlcywgXAotCQl0LCBsLCBiLCByLCBcCi0JCXBtVmVyc2lvbiwgXAotCQlwYWNrVHlwZSwgcGFja1NpemUsIFwKLQkJaFJlcywgdlJlcywgXAotCQlwaXhlbFR5cGUsIHBpeGVsU2l6ZSwgXAotCQljbXBDb3VudCwgY21wU2l6ZSwgXAotCQlwbGFuZUJ5dGVzLCBwbVRhYmxlLCBwbVJlc2VydmVkIFwKLQkJCT0gc3RydWN0LnVucGFjaygibGhoaGhoaGhsbGxoaGhobGxsIiwgZGF0YSkKLQlwcmludCAnQmFzZTogICAgICAgMHgleCclYmFzZUFkZHIKLQlwcmludCAncm93Qnl0ZXM6ICAgJWQgKDB4JXgpJyUocm93Qnl0ZXMmMHgzZmZmLCByb3dCeXRlcykKLQlwcmludCAncmVjdDogICAgICAgJWQsICVkLCAlZCwgJWQnJSh0LCBsLCBiLCByKQotCXByaW50ICdwbVZlcnNpb246ICAweCV4JyVwbVZlcnNpb24KLQlwcmludCAncGFja2luZzogICAgJWQgJWQnJShwYWNrVHlwZSwgcGFja1NpemUpCi0JcHJpbnQgJ3Jlc29sdXRpb246ICVmIHggJWYnJShmbG9hdChoUmVzKS8weDEwMDAwLCBmbG9hdCh2UmVzKS8weDEwMDAwKQotCXByaW50ICdwaXhlbHR5cGU6ICAlZCwgc2l6ZSAlZCclKHBpeGVsVHlwZSwgcGl4ZWxTaXplKQotCXByaW50ICdjb21wb25lbnRzOiAlZCwgc2l6ZSAlZCclKGNtcENvdW50LCBjbXBTaXplKQotCXByaW50ICdwbGFuZUJ5dGVzOiAlZCAoMHgleCknJShwbGFuZUJ5dGVzLCBwbGFuZUJ5dGVzKQotCXByaW50ICdwbVRhYmxlOiAgICAweCV4JyVwbVRhYmxlCi0JcHJpbnQgJ3BtUmVzZXJ2ZWQ6IDB4JXgnJXBtUmVzZXJ2ZWQKLQlmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0YSksIDE2KToKLQkJZm9yIGogaW4gcmFuZ2UoMTYpOgotCQkJaWYgaSArIGogPCBsZW4oZGF0YSk6Ci0JCQkJcHJpbnQgJyUwMi4yeCclb3JkKGRhdGFbaStqXSksCi0JCXByaW50CisgICAgYmFzZUFkZHIsIFwKKyAgICAgICAgICAgIHJvd0J5dGVzLCBcCisgICAgICAgICAgICB0LCBsLCBiLCByLCBcCisgICAgICAgICAgICBwbVZlcnNpb24sIFwKKyAgICAgICAgICAgIHBhY2tUeXBlLCBwYWNrU2l6ZSwgXAorICAgICAgICAgICAgaFJlcywgdlJlcywgXAorICAgICAgICAgICAgcGl4ZWxUeXBlLCBwaXhlbFNpemUsIFwKKyAgICAgICAgICAgIGNtcENvdW50LCBjbXBTaXplLCBcCisgICAgICAgICAgICBwbGFuZUJ5dGVzLCBwbVRhYmxlLCBwbVJlc2VydmVkIFwKKyAgICAgICAgICAgICAgICAgICAgPSBzdHJ1Y3QudW5wYWNrKCJsaGhoaGhoaGxsbGhoaGhsbGwiLCBkYXRhKQorICAgIHByaW50ICdCYXNlOiAgICAgICAweCV4JyViYXNlQWRkcgorICAgIHByaW50ICdyb3dCeXRlczogICAlZCAoMHgleCknJShyb3dCeXRlcyYweDNmZmYsIHJvd0J5dGVzKQorICAgIHByaW50ICdyZWN0OiAgICAgICAlZCwgJWQsICVkLCAlZCclKHQsIGwsIGIsIHIpCisgICAgcHJpbnQgJ3BtVmVyc2lvbjogIDB4JXgnJXBtVmVyc2lvbgorICAgIHByaW50ICdwYWNraW5nOiAgICAlZCAlZCclKHBhY2tUeXBlLCBwYWNrU2l6ZSkKKyAgICBwcmludCAncmVzb2x1dGlvbjogJWYgeCAlZiclKGZsb2F0KGhSZXMpLzB4MTAwMDAsIGZsb2F0KHZSZXMpLzB4MTAwMDApCisgICAgcHJpbnQgJ3BpeGVsdHlwZTogICVkLCBzaXplICVkJyUocGl4ZWxUeXBlLCBwaXhlbFNpemUpCisgICAgcHJpbnQgJ2NvbXBvbmVudHM6ICVkLCBzaXplICVkJyUoY21wQ291bnQsIGNtcFNpemUpCisgICAgcHJpbnQgJ3BsYW5lQnl0ZXM6ICVkICgweCV4KSclKHBsYW5lQnl0ZXMsIHBsYW5lQnl0ZXMpCisgICAgcHJpbnQgJ3BtVGFibGU6ICAgIDB4JXgnJXBtVGFibGUKKyAgICBwcmludCAncG1SZXNlcnZlZDogMHgleCclcG1SZXNlcnZlZAorICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXRhKSwgMTYpOgorICAgICAgICBmb3IgaiBpbiByYW5nZSgxNik6CisgICAgICAgICAgICBpZiBpICsgaiA8IGxlbihkYXRhKToKKyAgICAgICAgICAgICAgICBwcmludCAnJTAyLjJ4JyVvcmQoZGF0YVtpK2pdKSwKKyAgICAgICAgcHJpbnQKZGlmZiAtLWdpdCBhL01hYy9EZW1vL21sdGUvbWx0ZWQucHkgYi9NYWMvRGVtby9tbHRlL21sdGVkLnB5CmluZGV4IDM4MTM0NWEuLjMyM2VhNjIgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL21sdGUvbWx0ZWQucHkKKysrIGIvTWFjL0RlbW8vbWx0ZS9tbHRlZC5weQpAQCAtMTUsMzYxICsxNSwzNjAgQEAKIGZyb20gQ2FyYm9uIGltcG9ydCBNbHRlCiAKIFVORE9MQUJFTFMgPSBbICMgSW5kZXhlZCBieSBNTFRFQ2FuVW5kbygpIHZhbHVlCi0JIlR5cGluZyIsICJDdXQiLCAiUGFzdGUiLCAiQ2xlYXIiLCAiRm9udCBDaGFuZ2UiLCAiQ29sb3IgQ2hhbmdlIiwgIlNpemUgQ2hhbmdlIiwKLQkiU3R5bGUgQ2hhbmdlIiwgIkFsaWduIExlZnQiLCAiQWxpZ24gQ2VudGVyIiwgIkFsaWduIFJpZ2h0IiwgIkRyb3AiLCAiTW92ZSJdCi0JCisgICAgICAgICJUeXBpbmciLCAiQ3V0IiwgIlBhc3RlIiwgIkNsZWFyIiwgIkZvbnQgQ2hhbmdlIiwgIkNvbG9yIENoYW5nZSIsICJTaXplIENoYW5nZSIsCisgICAgICAgICJTdHlsZSBDaGFuZ2UiLCAiQWxpZ24gTGVmdCIsICJBbGlnbiBDZW50ZXIiLCAiQWxpZ24gUmlnaHQiLCAiRHJvcCIsICJNb3ZlIl0KKwogY2xhc3MgTWx0ZVdpbmRvdyhXaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIHBhdGgsIG5hbWUsIGRhdGEpOgotCQlzZWxmLnBhdGggPSBwYXRoCi0JCXNlbGYubmFtZSA9IG5hbWUKLQkJciA9IHdpbmRvd2JvdW5kcyg0MDAsIDQwMCkKLQkJdyA9IFdpbi5OZXdXaW5kb3cociwgbmFtZSwgMSwgMCwgLTEsIDEsIDApCi0JCXNlbGYud2lkID0gdwotCQlmbGFncyA9IE1hY1RleHRFZGl0b3Iua1RYTkRyYXdHcm93SWNvbk1hc2t8TWFjVGV4dEVkaXRvci5rVFhOV2FudEhTY3JvbGxCYXJNYXNrfCBcCi0JCQkJTWFjVGV4dEVkaXRvci5rVFhOV2FudFZTY3JvbGxCYXJNYXNrCi0JCXNlbGYudGVkLCBzZWxmLmZyYW1laWQgPSBNbHRlLlRYTk5ld09iamVjdChOb25lLCB3LCBOb25lLCBmbGFncywgTWFjVGV4dEVkaXRvci5rVFhOVGV4dEVkaXRTdHlsZUZyYW1lVHlwZSwKLQkJCQlNYWNUZXh0RWRpdG9yLmtUWE5UZXh0RmlsZSwgTWFjVGV4dEVkaXRvci5rVFhOTWFjT1NFbmNvZGluZykKLQkJc2VsZi50ZWQuVFhOU2V0RGF0YShNYWNUZXh0RWRpdG9yLmtUWE5UZXh0RGF0YSwgZGF0YSwgMCwgMHg3ZmZmZmZmZikKLQkJc2VsZi5jaGFuZ2VkID0gMAotCQlzZWxmLmRvX3Bvc3RvcGVuKCkKLQkJc2VsZi5kb19hY3RpdmF0ZSgxLCBOb25lKQotCQkKLQlkZWYgZG9faWRsZShzZWxmLCBldmVudCk6Ci0JCXNlbGYudGVkLlRYTklkbGUoKQkKLQkJc2VsZi50ZWQuVFhOQWRqdXN0Q3Vyc29yKE5vbmUpCi0JCQorICAgIGRlZiBvcGVuKHNlbGYsIHBhdGgsIG5hbWUsIGRhdGEpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgciA9IHdpbmRvd2JvdW5kcyg0MDAsIDQwMCkKKyAgICAgICAgdyA9IFdpbi5OZXdXaW5kb3cociwgbmFtZSwgMSwgMCwgLTEsIDEsIDApCisgICAgICAgIHNlbGYud2lkID0gdworICAgICAgICBmbGFncyA9IE1hY1RleHRFZGl0b3Iua1RYTkRyYXdHcm93SWNvbk1hc2t8TWFjVGV4dEVkaXRvci5rVFhOV2FudEhTY3JvbGxCYXJNYXNrfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNUZXh0RWRpdG9yLmtUWE5XYW50VlNjcm9sbEJhck1hc2sKKyAgICAgICAgc2VsZi50ZWQsIHNlbGYuZnJhbWVpZCA9IE1sdGUuVFhOTmV3T2JqZWN0KE5vbmUsIHcsIE5vbmUsIGZsYWdzLCBNYWNUZXh0RWRpdG9yLmtUWE5UZXh0RWRpdFN0eWxlRnJhbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjVGV4dEVkaXRvci5rVFhOVGV4dEZpbGUsIE1hY1RleHRFZGl0b3Iua1RYTk1hY09TRW5jb2RpbmcpCisgICAgICAgIHNlbGYudGVkLlRYTlNldERhdGEoTWFjVGV4dEVkaXRvci5rVFhOVGV4dERhdGEsIGRhdGEsIDAsIDB4N2ZmZmZmZmYpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDAKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisgICAgICAgIHNlbGYuZG9fYWN0aXZhdGUoMSwgTm9uZSkKIAotCQkKLQlkZWYgZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2dCk6Ci0JCWlmIG9ub2ZmOgotIyMJCQlzZWxmLnRlZC5UWE5BY3RpdmF0ZShzZWxmLmZyYW1laWQsIDApCi0JCQlzZWxmLnRlZC5UWE5Gb2N1cygxKQotCQkJc2VsZi5wYXJlbnQuYWN0aXZlID0gc2VsZgotCQllbHNlOgotCQkJc2VsZi50ZWQuVFhORm9jdXMoMCkKLQkJCXNlbGYucGFyZW50LmFjdGl2ZSA9IE5vbmUKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgZGVmIGRvX2lkbGUoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLnRlZC5UWE5JZGxlKCkKKyAgICAgICAgc2VsZi50ZWQuVFhOQWRqdXN0Q3Vyc29yKE5vbmUpCiAKLQlkZWYgZG9fdXBkYXRlKHNlbGYsIHdpZCwgZXZlbnQpOgotCQlzZWxmLnRlZC5UWE5EcmF3KE5vbmUpCi0JCQotCWRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6Ci0JCXNlbGYudGVkLlRYTlJlc2l6ZUZyYW1lKHdpZHRoLCBoZWlnaHQsIHNlbGYuZnJhbWVpZCkKLQkJCi0JZGVmIGRvX2NvbnRlbnRjbGljayhzZWxmLCBsb2NhbCwgbW9kaWZpZXJzLCBldnQpOgotCQlzZWxmLnRlZC5UWE5DbGljayhldnQpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgZG9fY2hhcihzZWxmLCBjaCwgZXZlbnQpOgotCQlzZWxmLnRlZC5UWE5LZXlEb3duKGV2ZW50KQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlpZiBzZWxmLmNoYW5nZWQ6Ci0JCQlzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgd2luZG93ICIlcyIgYmVmb3JlIGNsb3Npbmc/JyVzZWxmLm5hbWUsIDEpCi0JCQlpZiBzYXZlID4gMDoKLQkJCQlzZWxmLm1lbnVfc2F2ZSgpCi0JCQllbGlmIHNhdmUgPCAwOgotCQkJCXJldHVybgotCQlpZiBzZWxmLnBhcmVudC5hY3RpdmUgPT0gc2VsZjoKLQkJCXNlbGYucGFyZW50LmFjdGl2ZSA9IE5vbmUKLQkJc2VsZi50ZWQuVFhORGVsZXRlT2JqZWN0KCkKLQkJZGVsIHNlbGYudGVkCi0jIwkJZGVsIHNlbGYudGVkdGV4dGhhbmRsZQotCQlzZWxmLmRvX3Bvc3RjbG9zZSgpCi0JCQotCWRlZiBtZW51X3NhdmUoc2VsZik6Ci0JCWlmIG5vdCBzZWxmLnBhdGg6Ci0JCQlzZWxmLm1lbnVfc2F2ZV9hcygpCi0JCQlyZXR1cm4gIyBXaWxsIGNhbGwgdXMgcmVjdXJzaXZlbHkKLQkJZGhhbmRsZSA9IHNlbGYudGVkLlRYTkdldERhdGEoMCwgMHg3ZmZmZmZmZikKLQkJZGF0YSA9IGRoYW5kbGUuZGF0YQotCQlmcCA9IG9wZW4oc2VsZi5wYXRoLCAnd2InKSAgIyBOT1RFOiB3YiwgYmVjYXVzZSBkYXRhIGhhcyBDUiBmb3IgZW5kLW9mLWxpbmUKLQkJZnAud3JpdGUoZGF0YSkKLQkJaWYgZGF0YVstMV0gPD4gJ1xyJzogZnAud3JpdGUoJ1xyJykKLQkJZnAuY2xvc2UoKQotCQlzZWxmLmNoYW5nZWQgPSAwCi0JCQotCWRlZiBtZW51X3NhdmVfYXMoc2VsZik6Ci0JCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzOicpCi0JCWlmIG5vdCBwYXRoOiByZXR1cm4KLQkJc2VsZi5wYXRoID0gcGF0aAotCQlzZWxmLm5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCi0JCXNlbGYud2lkLlNldFdUaXRsZShzZWxmLm5hbWUpCi0JCXNlbGYubWVudV9zYXZlKCkKLQkJCi0JZGVmIG1lbnVfY3V0KHNlbGYpOgotIyMJCXNlbGYudGVkLldFU2VsVmlldygpCi0JCXNlbGYudGVkLlRYTkN1dCgpCi0jIyMJCU1sdGUuQ29udmVydFRvUHVibGljU2NyYXAoKQotIyMJCVNjcmFwLlplcm9TY3JhcCgpCi0jIwkJc2VsZi50ZWQuV0VDdXQoKQotIyMJCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQlzZWxmLmNoYW5nZWQgPSAxCi0JCQotCWRlZiBtZW51X2NvcHkoc2VsZik6Ci0jIwkJU2NyYXAuWmVyb1NjcmFwKCkKLQkJc2VsZi50ZWQuVFhOQ29weSgpCi0jIyMJCU1sdGUuQ29udmVydFRvUHVibGljU2NyYXAoKQotIyMJCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgbWVudV9wYXN0ZShzZWxmKToKLSMjIwkJTWx0ZS5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwKCkKLQkJc2VsZi50ZWQuVFhOUGFzdGUoKQotIyMJCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQlzZWxmLmNoYW5nZWQgPSAxCi0JCQotCWRlZiBtZW51X2NsZWFyKHNlbGYpOgotIyMJCXNlbGYudGVkLldFU2VsVmlldygpCi0JCXNlbGYudGVkLlRYTkNsZWFyKCkKLSMjCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJc2VsZi5jaGFuZ2VkID0gMQogCi0JZGVmIG1lbnVfdW5kbyhzZWxmKToKLQkJc2VsZi50ZWQuVFhOVW5kbygpCi0jIwkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQkJCi0JZGVmIG1lbnVfcmVkbyhzZWxmKToKLQkJc2VsZi50ZWQuVFhOUmVkbygpCi0jIwkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQkJCi0JZGVmIGhhdmVfc2VsZWN0aW9uKHNlbGYpOgotCQlzdGFydCwgc3RvcCA9IHNlbGYudGVkLlRYTkdldFNlbGVjdGlvbigpCi0JCXJldHVybiBzdGFydCA8IHN0b3AKLQkJCi0JZGVmIGNhbl9wYXN0ZShzZWxmKToKLQkJcmV0dXJuIE1sdGUuVFhOSXNTY3JhcFBhc3RhYmxlKCkKLQkJCi0JZGVmIGNhbl91bmRvKHNlbGYpOgotCQljYW4sIHdoaWNoID0gc2VsZi50ZWQuVFhOQ2FuVW5kbygpCi0JCWlmIG5vdCBjYW46Ci0JCQlyZXR1cm4gTm9uZQotCQlpZiB3aGljaCA+PSBsZW4oVU5ET0xBQkVMUyk6Ci0JCQkjIFVuc3BlY2lmaWVkIHVuZG8KLQkJCXJldHVybiAiVW5kbyIKLQkJd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQotCQkKLQkJcmV0dXJuICJVbmRvICIrd2hpY2gKIAotCWRlZiBjYW5fcmVkbyhzZWxmKToKLQkJY2FuLCB3aGljaCA9IHNlbGYudGVkLlRYTkNhblJlZG8oKQotCQlpZiBub3QgY2FuOgotCQkJcmV0dXJuIE5vbmUKLQkJaWYgd2hpY2ggPj0gbGVuKFVORE9MQUJFTFMpOgotCQkJIyBVbnNwZWNpZmllZCB1bmRvCi0JCQlyZXR1cm4gIlJlZG8iCi0JCXdoaWNoID0gVU5ET0xBQkVMU1t3aGljaF0KLQkJCi0JCXJldHVybiAiUmVkbyAiK3doaWNoCisgICAgZGVmIGRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpOgorICAgICAgICBpZiBvbm9mZjoKKyMjICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGVkLlRYTkFjdGl2YXRlKHNlbGYuZnJhbWVpZCwgMCkKKyAgICAgICAgICAgIHNlbGYudGVkLlRYTkZvY3VzKDEpCisgICAgICAgICAgICBzZWxmLnBhcmVudC5hY3RpdmUgPSBzZWxmCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRlZC5UWE5Gb2N1cygwKQorICAgICAgICAgICAgc2VsZi5wYXJlbnQuYWN0aXZlID0gTm9uZQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBkb191cGRhdGUoc2VsZiwgd2lkLCBldmVudCk6CisgICAgICAgIHNlbGYudGVkLlRYTkRyYXcoTm9uZSkKKworICAgIGRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6CisgICAgICAgIHNlbGYudGVkLlRYTlJlc2l6ZUZyYW1lKHdpZHRoLCBoZWlnaHQsIHNlbGYuZnJhbWVpZCkKKworICAgIGRlZiBkb19jb250ZW50Y2xpY2soc2VsZiwgbG9jYWwsIG1vZGlmaWVycywgZXZ0KToKKyAgICAgICAgc2VsZi50ZWQuVFhOQ2xpY2soZXZ0KQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBkb19jaGFyKHNlbGYsIGNoLCBldmVudCk6CisgICAgICAgIHNlbGYudGVkLlRYTktleURvd24oZXZlbnQpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNoYW5nZWQ6CisgICAgICAgICAgICBzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgd2luZG93ICIlcyIgYmVmb3JlIGNsb3Npbmc/JyVzZWxmLm5hbWUsIDEpCisgICAgICAgICAgICBpZiBzYXZlID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLm1lbnVfc2F2ZSgpCisgICAgICAgICAgICBlbGlmIHNhdmUgPCAwOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnBhcmVudC5hY3RpdmUgPT0gc2VsZjoKKyAgICAgICAgICAgIHNlbGYucGFyZW50LmFjdGl2ZSA9IE5vbmUKKyAgICAgICAgc2VsZi50ZWQuVFhORGVsZXRlT2JqZWN0KCkKKyAgICAgICAgZGVsIHNlbGYudGVkCisjIyAgICAgICAgICAgICAgZGVsIHNlbGYudGVkdGV4dGhhbmRsZQorICAgICAgICBzZWxmLmRvX3Bvc3RjbG9zZSgpCisKKyAgICBkZWYgbWVudV9zYXZlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5wYXRoOgorICAgICAgICAgICAgc2VsZi5tZW51X3NhdmVfYXMoKQorICAgICAgICAgICAgcmV0dXJuICMgV2lsbCBjYWxsIHVzIHJlY3Vyc2l2ZWx5CisgICAgICAgIGRoYW5kbGUgPSBzZWxmLnRlZC5UWE5HZXREYXRhKDAsIDB4N2ZmZmZmZmYpCisgICAgICAgIGRhdGEgPSBkaGFuZGxlLmRhdGEKKyAgICAgICAgZnAgPSBvcGVuKHNlbGYucGF0aCwgJ3diJykgICMgTk9URTogd2IsIGJlY2F1c2UgZGF0YSBoYXMgQ1IgZm9yIGVuZC1vZi1saW5lCisgICAgICAgIGZwLndyaXRlKGRhdGEpCisgICAgICAgIGlmIGRhdGFbLTFdIDw+ICdccic6IGZwLndyaXRlKCdccicpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMAorCisgICAgZGVmIG1lbnVfc2F2ZV9hcyhzZWxmKToKKyAgICAgICAgcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgYXM6JykKKyAgICAgICAgaWYgbm90IHBhdGg6IHJldHVybgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5wYXRoKVstMV0KKyAgICAgICAgc2VsZi53aWQuU2V0V1RpdGxlKHNlbGYubmFtZSkKKyAgICAgICAgc2VsZi5tZW51X3NhdmUoKQorCisgICAgZGVmIG1lbnVfY3V0KHNlbGYpOgorIyMgICAgICAgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIHNlbGYudGVkLlRYTkN1dCgpCisjIyMgICAgICAgICAgICAgTWx0ZS5Db252ZXJ0VG9QdWJsaWNTY3JhcCgpCisjIyAgICAgICAgICAgICAgU2NyYXAuWmVyb1NjcmFwKCkKKyMjICAgICAgICAgICAgICBzZWxmLnRlZC5XRUN1dCgpCisjIyAgICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKKworICAgIGRlZiBtZW51X2NvcHkoc2VsZik6CisjIyAgICAgICAgICAgICAgU2NyYXAuWmVyb1NjcmFwKCkKKyAgICAgICAgc2VsZi50ZWQuVFhOQ29weSgpCisjIyMgICAgICAgICAgICAgTWx0ZS5Db252ZXJ0VG9QdWJsaWNTY3JhcCgpCisjIyAgICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV9wYXN0ZShzZWxmKToKKyMjIyAgICAgICAgICAgICBNbHRlLkNvbnZlcnRGcm9tUHVibGljU2NyYXAoKQorICAgICAgICBzZWxmLnRlZC5UWE5QYXN0ZSgpCisjIyAgICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKKworICAgIGRlZiBtZW51X2NsZWFyKHNlbGYpOgorIyMgICAgICAgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIHNlbGYudGVkLlRYTkNsZWFyKCkKKyMjICAgICAgICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMQorCisgICAgZGVmIG1lbnVfdW5kbyhzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuVFhOVW5kbygpCisjIyAgICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV9yZWRvKHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5UWE5SZWRvKCkKKyMjICAgICAgICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBoYXZlX3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxmLnRlZC5UWE5HZXRTZWxlY3Rpb24oKQorICAgICAgICByZXR1cm4gc3RhcnQgPCBzdG9wCisKKyAgICBkZWYgY2FuX3Bhc3RlKHNlbGYpOgorICAgICAgICByZXR1cm4gTWx0ZS5UWE5Jc1NjcmFwUGFzdGFibGUoKQorCisgICAgZGVmIGNhbl91bmRvKHNlbGYpOgorICAgICAgICBjYW4sIHdoaWNoID0gc2VsZi50ZWQuVFhOQ2FuVW5kbygpCisgICAgICAgIGlmIG5vdCBjYW46CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiB3aGljaCA+PSBsZW4oVU5ET0xBQkVMUyk6CisgICAgICAgICAgICAjIFVuc3BlY2lmaWVkIHVuZG8KKyAgICAgICAgICAgIHJldHVybiAiVW5kbyIKKyAgICAgICAgd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQorCisgICAgICAgIHJldHVybiAiVW5kbyAiK3doaWNoCisKKyAgICBkZWYgY2FuX3JlZG8oc2VsZik6CisgICAgICAgIGNhbiwgd2hpY2ggPSBzZWxmLnRlZC5UWE5DYW5SZWRvKCkKKyAgICAgICAgaWYgbm90IGNhbjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIHdoaWNoID49IGxlbihVTkRPTEFCRUxTKToKKyAgICAgICAgICAgICMgVW5zcGVjaWZpZWQgdW5kbworICAgICAgICAgICAgcmV0dXJuICJSZWRvIgorICAgICAgICB3aGljaCA9IFVORE9MQUJFTFNbd2hpY2hdCisKKyAgICAgICAgcmV0dXJuICJSZWRvICIrd2hpY2gKIAogY2xhc3MgTWx0ZWQoQXBwbGljYXRpb24pOgotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJc2VsZi5udW0gPSAwCi0JCXNlbGYuYWN0aXZlID0gTm9uZQotCQlzZWxmLnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKLQkJc2VsZi5maWxlbWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQotCQlzZWxmLm5ld2l0ZW0gPSBNZW51SXRlbShtLCAiTmV3IHdpbmRvdyIsICJOIiwgc2VsZi5vcGVuKQotCQlzZWxmLm9wZW5pdGVtID0gTWVudUl0ZW0obSwgIk9wZW4uLi4iLCAiTyIsIHNlbGYub3BlbmZpbGUpCi0JCXNlbGYuY2xvc2VpdGVtID0gTWVudUl0ZW0obSwgIkNsb3NlIiwgIlciLCBzZWxmLmNsb3Nld2luKQotCQltLmFkZHNlcGFyYXRvcigpCi0JCXNlbGYuc2F2ZWl0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgc2VsZi5zYXZlKQotCQlzZWxmLnNhdmVhc2l0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSBhcy4uLiIsICIiLCBzZWxmLnNhdmVhcykKLQkJbS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLnF1aXRpdGVtID0gTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKLQkJCi0JCXNlbGYuZWRpdG1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJFZGl0IikKLQkJc2VsZi51bmRvaXRlbSA9IE1lbnVJdGVtKG0sICJVbmRvIiwgIloiLCBzZWxmLnVuZG8pCi0JCXNlbGYucmVkb2l0ZW0gPSBNZW51SXRlbShtLCAiUmVkbyIsIE5vbmUsIHNlbGYucmVkbykKLQkJbS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLmN1dGl0ZW0gPSBNZW51SXRlbShtLCAiQ3V0IiwgIlgiLCBzZWxmLmN1dCkKLQkJc2VsZi5jb3B5aXRlbSA9IE1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCBzZWxmLmNvcHkpCi0JCXNlbGYucGFzdGVpdGVtID0gTWVudUl0ZW0obSwgIlBhc3RlIiwgIlYiLCBzZWxmLnBhc3RlKQotCQlzZWxmLmNsZWFyaXRlbSA9IE1lbnVJdGVtKG0sICJDbGVhciIsICIiLCBzZWxmLmNsZWFyKQotCQkKLQkJIyBHcm91cHMgb2YgaXRlbXMgZW5hYmxlZCB0b2dldGhlcjoKLQkJc2VsZi53aW5kb3dncm91cCA9IFtzZWxmLmNsb3NlaXRlbSwgc2VsZi5zYXZlaXRlbSwgc2VsZi5zYXZlYXNpdGVtLCBzZWxmLmVkaXRtZW51XQotCQlzZWxmLmZvY3VzZ3JvdXAgPSBbc2VsZi5jdXRpdGVtLCBzZWxmLmNvcHlpdGVtLCBzZWxmLmNsZWFyaXRlbV0KLQkJc2VsZi53aW5kb3dncm91cF9vbiA9IC0xCi0JCXNlbGYuZm9jdXNncm91cF9vbiA9IC0xCi0JCXNlbGYucGFzdGVncm91cF9vbiA9IC0xCi0JCXNlbGYudW5kb19sYWJlbCA9ICJuZXZlciIKLQkJc2VsZi5yZWRvX2xhYmVsID0gIm5ldmVyIgotCQkKLQlkZWYgdXBkYXRlbWVudWJhcihzZWxmKToKLQkJY2hhbmdlZCA9IDAKLQkJb24gPSAoc2VsZi5hY3RpdmUgPD4gTm9uZSkKLQkJaWYgb24gPD4gc2VsZi53aW5kb3dncm91cF9vbjoKLQkJCWZvciBtIGluIHNlbGYud2luZG93Z3JvdXA6Ci0JCQkJbS5lbmFibGUob24pCi0JCQlzZWxmLndpbmRvd2dyb3VwX29uID0gb24KLQkJCWNoYW5nZWQgPSAxCi0JCWlmIG9uOgotCQkJIyBvbmx5IGlmIHdlIGhhdmUgYW4gZWRpdCBtZW51Ci0JCQlvbiA9IHNlbGYuYWN0aXZlLmhhdmVfc2VsZWN0aW9uKCkKLQkJCWlmIG9uIDw+IHNlbGYuZm9jdXNncm91cF9vbjoKLQkJCQlmb3IgbSBpbiBzZWxmLmZvY3VzZ3JvdXA6Ci0JCQkJCW0uZW5hYmxlKG9uKQotCQkJCXNlbGYuZm9jdXNncm91cF9vbiA9IG9uCi0JCQkJY2hhbmdlZCA9IDEKLQkJCW9uID0gc2VsZi5hY3RpdmUuY2FuX3Bhc3RlKCkKLQkJCWlmIG9uIDw+IHNlbGYucGFzdGVncm91cF9vbjoKLQkJCQlzZWxmLnBhc3RlaXRlbS5lbmFibGUob24pCi0JCQkJc2VsZi5wYXN0ZWdyb3VwX29uID0gb24KLQkJCQljaGFuZ2VkID0gMQotCQkJb24gPSBzZWxmLmFjdGl2ZS5jYW5fdW5kbygpCi0JCQlpZiBvbiA8PiBzZWxmLnVuZG9fbGFiZWw6Ci0JCQkJaWYgb246Ci0JCQkJCXNlbGYudW5kb2l0ZW0uZW5hYmxlKDEpCi0JCQkJCXNlbGYudW5kb2l0ZW0uc2V0dGV4dChvbikKLQkJCQkJc2VsZi51bmRvX2xhYmVsID0gb24KLQkJCQllbHNlOgotCQkJCQlzZWxmLnVuZG9pdGVtLnNldHRleHQoIk5vdGhpbmcgdG8gdW5kbyIpCi0JCQkJCXNlbGYudW5kb2l0ZW0uZW5hYmxlKDApCi0JCQkJY2hhbmdlZCA9IDEKLQkJCW9uID0gc2VsZi5hY3RpdmUuY2FuX3JlZG8oKQotCQkJaWYgb24gPD4gc2VsZi5yZWRvX2xhYmVsOgotCQkJCWlmIG9uOgotCQkJCQlzZWxmLnJlZG9pdGVtLmVuYWJsZSgxKQotCQkJCQlzZWxmLnJlZG9pdGVtLnNldHRleHQob24pCi0JCQkJCXNlbGYucmVkb19sYWJlbCA9IG9uCi0JCQkJZWxzZToKLQkJCQkJc2VsZi5yZWRvaXRlbS5zZXR0ZXh0KCJOb3RoaW5nIHRvIHJlZG8iKQotCQkJCQlzZWxmLnJlZG9pdGVtLmVuYWJsZSgwKQotCQkJCWNoYW5nZWQgPSAxCi0JCWlmIGNoYW5nZWQ6Ci0JCQlEcmF3TWVudUJhcigpCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBBcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm51bSA9IDAKKyAgICAgICAgc2VsZi5hY3RpdmUgPSBOb25lCisgICAgICAgIHNlbGYudXBkYXRlbWVudWJhcigpCiAKLQkjCi0JIyBBcHBsZSBtZW51Ci0JIwotCQotCWRlZiBkb19hYm91dChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIkEgc2ltcGxlIHNpbmdsZS1mb250IHRleHQgZWRpdG9yIGJhc2VkIG9uIE1hY1RleHRFZGl0b3IiKQotCQkJCi0JIwotCSMgRmlsZSBtZW51Ci0JIworICAgIGRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCisgICAgICAgIHNlbGYubmV3aXRlbSA9IE1lbnVJdGVtKG0sICJOZXcgd2luZG93IiwgIk4iLCBzZWxmLm9wZW4pCisgICAgICAgIHNlbGYub3Blbml0ZW0gPSBNZW51SXRlbShtLCAiT3Blbi4uLiIsICJPIiwgc2VsZi5vcGVuZmlsZSkKKyAgICAgICAgc2VsZi5jbG9zZWl0ZW0gPSBNZW51SXRlbShtLCAiQ2xvc2UiLCAiVyIsIHNlbGYuY2xvc2V3aW4pCisgICAgICAgIG0uYWRkc2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi5zYXZlaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIiwgIlMiLCBzZWxmLnNhdmUpCisgICAgICAgIHNlbGYuc2F2ZWFzaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIGFzLi4uIiwgIiIsIHNlbGYuc2F2ZWFzKQorICAgICAgICBtLmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYucXVpdGl0ZW0gPSBNZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQogCi0JZGVmIG9wZW4oc2VsZiwgKmFyZ3MpOgotCQlzZWxmLl9vcGVuKDApCi0JCQotCWRlZiBvcGVuZmlsZShzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX29wZW4oMSkKKyAgICAgICAgc2VsZi5lZGl0bWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQorICAgICAgICBzZWxmLnVuZG9pdGVtID0gTWVudUl0ZW0obSwgIlVuZG8iLCAiWiIsIHNlbGYudW5kbykKKyAgICAgICAgc2VsZi5yZWRvaXRlbSA9IE1lbnVJdGVtKG0sICJSZWRvIiwgTm9uZSwgc2VsZi5yZWRvKQorICAgICAgICBtLmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYuY3V0aXRlbSA9IE1lbnVJdGVtKG0sICJDdXQiLCAiWCIsIHNlbGYuY3V0KQorICAgICAgICBzZWxmLmNvcHlpdGVtID0gTWVudUl0ZW0obSwgIkNvcHkiLCAiQyIsIHNlbGYuY29weSkKKyAgICAgICAgc2VsZi5wYXN0ZWl0ZW0gPSBNZW51SXRlbShtLCAiUGFzdGUiLCAiViIsIHNlbGYucGFzdGUpCisgICAgICAgIHNlbGYuY2xlYXJpdGVtID0gTWVudUl0ZW0obSwgIkNsZWFyIiwgIiIsIHNlbGYuY2xlYXIpCiAKLQlkZWYgX29wZW4oc2VsZiwgYXNrZmlsZSk6Ci0JCWlmIGFza2ZpbGU6Ci0JCQlwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4odHlwZUxpc3Q9KCdURVhUJywpKQotCQkJaWYgbm90IHBhdGg6Ci0JCQkJcmV0dXJuCi0JCQluYW1lID0gb3MucGF0aC5zcGxpdChwYXRoKVstMV0KLQkJCXRyeToKLQkJCQlmcCA9IG9wZW4ocGF0aCwgJ3JiJykgIyBOT1RFIGJpbmFyeSwgd2UgbmVlZCBjciBhcyBlbmQtb2YtbGluZQotCQkJCWRhdGEgPSBmcC5yZWFkKCkKLQkJCQlmcC5jbG9zZSgpCi0JCQlleGNlcHQgSU9FcnJvciwgYXJnOgotCQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIklPRVJST1I6ICVyIiAlIChhcmcsKSkKLQkJCQlyZXR1cm4KLQkJZWxzZToKLQkJCXBhdGggPSBOb25lCi0JCQluYW1lID0gIlVudGl0bGVkICVkIiVzZWxmLm51bQotCQkJZGF0YSA9ICcnCi0JCXcgPSBNbHRlV2luZG93KHNlbGYpCi0JCXcub3BlbihwYXRoLCBuYW1lLCBkYXRhKQotCQlzZWxmLm51bSA9IHNlbGYubnVtICsgMQotCQkKLQlkZWYgY2xvc2V3aW4oc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLmNsb3NlKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIHNhdmUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfc2F2ZSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBzYXZlYXMoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfc2F2ZV9hcygpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQkKLQkJCi0JZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgotCQlmb3IgdyBpbiBzZWxmLl93aW5kb3dzLnZhbHVlcygpOgotCQkJdy5jbG9zZSgpCi0JCWlmIHNlbGYuX3dpbmRvd3M6Ci0JCQlyZXR1cm4KLQkJc2VsZi5fcXVpdCgpCi0JCQotCSMKLQkjIEVkaXQgbWVudQotCSMKLQkKLQlkZWYgdW5kbyhzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV91bmRvKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIHJlZG8oc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfcmVkbygpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBjdXQoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfY3V0KCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIGNvcHkoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfY29weSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBwYXN0ZShzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9wYXN0ZSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgICAgICMgR3JvdXBzIG9mIGl0ZW1zIGVuYWJsZWQgdG9nZXRoZXI6CisgICAgICAgIHNlbGYud2luZG93Z3JvdXAgPSBbc2VsZi5jbG9zZWl0ZW0sIHNlbGYuc2F2ZWl0ZW0sIHNlbGYuc2F2ZWFzaXRlbSwgc2VsZi5lZGl0bWVudV0KKyAgICAgICAgc2VsZi5mb2N1c2dyb3VwID0gW3NlbGYuY3V0aXRlbSwgc2VsZi5jb3B5aXRlbSwgc2VsZi5jbGVhcml0ZW1dCisgICAgICAgIHNlbGYud2luZG93Z3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLmZvY3VzZ3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLnBhc3RlZ3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLnVuZG9fbGFiZWwgPSAibmV2ZXIiCisgICAgICAgIHNlbGYucmVkb19sYWJlbCA9ICJuZXZlciIKIAotCWRlZiBjbGVhcihzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9jbGVhcigpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCSMKLQkjIE90aGVyIHN0dWZmCi0JIwkKKyAgICBkZWYgdXBkYXRlbWVudWJhcihzZWxmKToKKyAgICAgICAgY2hhbmdlZCA9IDAKKyAgICAgICAgb24gPSAoc2VsZi5hY3RpdmUgPD4gTm9uZSkKKyAgICAgICAgaWYgb24gPD4gc2VsZi53aW5kb3dncm91cF9vbjoKKyAgICAgICAgICAgIGZvciBtIGluIHNlbGYud2luZG93Z3JvdXA6CisgICAgICAgICAgICAgICAgbS5lbmFibGUob24pCisgICAgICAgICAgICBzZWxmLndpbmRvd2dyb3VwX29uID0gb24KKyAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgIGlmIG9uOgorICAgICAgICAgICAgIyBvbmx5IGlmIHdlIGhhdmUgYW4gZWRpdCBtZW51CisgICAgICAgICAgICBvbiA9IHNlbGYuYWN0aXZlLmhhdmVfc2VsZWN0aW9uKCkKKyAgICAgICAgICAgIGlmIG9uIDw+IHNlbGYuZm9jdXNncm91cF9vbjoKKyAgICAgICAgICAgICAgICBmb3IgbSBpbiBzZWxmLmZvY3VzZ3JvdXA6CisgICAgICAgICAgICAgICAgICAgIG0uZW5hYmxlKG9uKQorICAgICAgICAgICAgICAgIHNlbGYuZm9jdXNncm91cF9vbiA9IG9uCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgICAgIG9uID0gc2VsZi5hY3RpdmUuY2FuX3Bhc3RlKCkKKyAgICAgICAgICAgIGlmIG9uIDw+IHNlbGYucGFzdGVncm91cF9vbjoKKyAgICAgICAgICAgICAgICBzZWxmLnBhc3RlaXRlbS5lbmFibGUob24pCisgICAgICAgICAgICAgICAgc2VsZi5wYXN0ZWdyb3VwX29uID0gb24KKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICAgICAgb24gPSBzZWxmLmFjdGl2ZS5jYW5fdW5kbygpCisgICAgICAgICAgICBpZiBvbiA8PiBzZWxmLnVuZG9fbGFiZWw6CisgICAgICAgICAgICAgICAgaWYgb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2l0ZW0uZW5hYmxlKDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2l0ZW0uc2V0dGV4dChvbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvX2xhYmVsID0gb24KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLnNldHRleHQoIk5vdGhpbmcgdG8gdW5kbyIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2l0ZW0uZW5hYmxlKDApCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgICAgIG9uID0gc2VsZi5hY3RpdmUuY2FuX3JlZG8oKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi5yZWRvX2xhYmVsOgorICAgICAgICAgICAgICAgIGlmIG9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZG9pdGVtLmVuYWJsZSgxKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZG9pdGVtLnNldHRleHQob24pCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVkb19sYWJlbCA9IG9uCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWRvaXRlbS5zZXR0ZXh0KCJOb3RoaW5nIHRvIHJlZG8iKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZG9pdGVtLmVuYWJsZSgwKQorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgIGlmIGNoYW5nZWQ6CisgICAgICAgICAgICBEcmF3TWVudUJhcigpCiAKLQlkZWYgaWRsZShzZWxmLCBldmVudCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUuZG9faWRsZShldmVudCkKLQkJZWxzZToKLQkJCVFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQorICAgICMKKyAgICAjIEFwcGxlIG1lbnUKKyAgICAjCisKKyAgICBkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJBIHNpbXBsZSBzaW5nbGUtZm9udCB0ZXh0IGVkaXRvciBiYXNlZCBvbiBNYWNUZXh0RWRpdG9yIikKKworICAgICMKKyAgICAjIEZpbGUgbWVudQorICAgICMKKworICAgIGRlZiBvcGVuKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fb3BlbigwKQorCisgICAgZGVmIG9wZW5maWxlKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fb3BlbigxKQorCisgICAgZGVmIF9vcGVuKHNlbGYsIGFza2ZpbGUpOgorICAgICAgICBpZiBhc2tmaWxlOgorICAgICAgICAgICAgcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKKyAgICAgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aClbLTFdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnAgPSBvcGVuKHBhdGgsICdyYicpICMgTk9URSBiaW5hcnksIHdlIG5lZWQgY3IgYXMgZW5kLW9mLWxpbmUKKyAgICAgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGFyZzoKKyAgICAgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJnLCkpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gTm9uZQorICAgICAgICAgICAgbmFtZSA9ICJVbnRpdGxlZCAlZCIlc2VsZi5udW0KKyAgICAgICAgICAgIGRhdGEgPSAnJworICAgICAgICB3ID0gTWx0ZVdpbmRvdyhzZWxmKQorICAgICAgICB3Lm9wZW4ocGF0aCwgbmFtZSwgZGF0YSkKKyAgICAgICAgc2VsZi5udW0gPSBzZWxmLm51bSArIDEKKworICAgIGRlZiBjbG9zZXdpbihzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUuY2xvc2UoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIHNhdmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2F2ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgc2F2ZWFzKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3NhdmVfYXMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisKKyAgICBkZWYgcXVpdChzZWxmLCAqYXJncyk6CisgICAgICAgIGZvciB3IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6CisgICAgICAgICAgICB3LmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5fd2luZG93czoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgICMKKyAgICAjIEVkaXQgbWVudQorICAgICMKKworICAgIGRlZiB1bmRvKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3VuZG8oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIHJlZG8oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfcmVkbygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY3V0KHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2N1dCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY29weShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9jb3B5KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBwYXN0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9wYXN0ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY2xlYXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfY2xlYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgIworICAgICMgT3RoZXIgc3R1ZmYKKyAgICAjCisKKyAgICBkZWYgaWRsZShzZWxmLCBldmVudCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUuZG9faWRsZShldmVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQogCiBkZWYgbWFpbigpOgotCU1sdGUuVFhOSW5pdFRleHRlbnNpb24oMCkKLQl0cnk6Ci0JCUFwcCA9IE1sdGVkKCkKLQkJQXBwLm1haW5sb29wKCkKLQlmaW5hbGx5OgotCQlNbHRlLlRYTlRlcm1pbmF0ZVRleHRlbnNpb24oKQotCQorICAgIE1sdGUuVFhOSW5pdFRleHRlbnNpb24oMCkKKyAgICB0cnk6CisgICAgICAgIEFwcCA9IE1sdGVkKCkKKyAgICAgICAgQXBwLm1haW5sb29wKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBNbHRlLlRYTlRlcm1pbmF0ZVRleHRlbnNpb24oKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQotCQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vcXVpY2t0aW1lL01vdmllSW5XaW5kb3cucHkgYi9NYWMvRGVtby9xdWlja3RpbWUvTW92aWVJbldpbmRvdy5weQppbmRleCBlYzRiZWFlLi4wMGY1OTZlIDEwMDY0NAotLS0gYS9NYWMvRGVtby9xdWlja3RpbWUvTW92aWVJbldpbmRvdy5weQorKysgYi9NYWMvRGVtby9xdWlja3RpbWUvTW92aWVJbldpbmRvdy5weQpAQCAtMTgsNTQgKzE4LDUzIEBACiAKIAogZGVmIG1haW4oKToKLQkjIHNraXAgdGhlIHRvb2xib3ggaW5pdGlhbGl6YXRpb25zLCBhbHJlYWR5IGRvbmUKLQkjIFhYWFggU2hvdWxkIHVzZSBnZXN0YWx0IGhlcmUgdG8gY2hlY2sgZm9yIHF1aWNrdGltZSB2ZXJzaW9uCi0JUXQuRW50ZXJNb3ZpZXMoKQotCQotCSMgR2V0IHRoZSBtb3ZpZSBmaWxlCi0JaWYgbGVuKHN5cy5hcmd2KSA+IDE6Ci0JCWZpbGVuYW1lID0gc3lzLmFyZ3ZbMV0KLQllbHNlOgotCQlmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKCkgIyBXYXM6IFF1aWNrVGltZS5Nb3ZpZUZpbGVUeXBlCi0JaWYgbm90IGZpbGVuYW1lOgotCQlzeXMuZXhpdCgwKQotCQkKLQkjIE9wZW4gdGhlIHdpbmRvdwotCWJvdW5kcyA9ICgxNzUsIDc1LCAxNzUrMTYwLCA3NSsxMjApCi0JdGhlV2luZG93ID0gV2luLk5ld0NXaW5kb3coYm91bmRzLCBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXSwgMSwgMCwgLTEsIDAsIDApCi0JUWQuU2V0UG9ydCh0aGVXaW5kb3cpCi0JIyBYWFhYIE5lZWRlZD8gU2V0R1dvcmxkKChDR3JhZlB0cil0aGVXaW5kb3csIG5pbCkKLQkKLQlwbGF5TW92aWVJbldpbmRvdyh0aGVXaW5kb3csIGZpbGVuYW1lLCB0aGVXaW5kb3cuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCb3VuZHMoKSkKLQkKKyAgICAjIHNraXAgdGhlIHRvb2xib3ggaW5pdGlhbGl6YXRpb25zLCBhbHJlYWR5IGRvbmUKKyAgICAjIFhYWFggU2hvdWxkIHVzZSBnZXN0YWx0IGhlcmUgdG8gY2hlY2sgZm9yIHF1aWNrdGltZSB2ZXJzaW9uCisgICAgUXQuRW50ZXJNb3ZpZXMoKQorCisgICAgIyBHZXQgdGhlIG1vdmllIGZpbGUKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgZmlsZW5hbWUgPSBzeXMuYXJndlsxXQorICAgIGVsc2U6CisgICAgICAgIGZpbGVuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4oKSAjIFdhczogUXVpY2tUaW1lLk1vdmllRmlsZVR5cGUKKyAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAjIE9wZW4gdGhlIHdpbmRvdworICAgIGJvdW5kcyA9ICgxNzUsIDc1LCAxNzUrMTYwLCA3NSsxMjApCisgICAgdGhlV2luZG93ID0gV2luLk5ld0NXaW5kb3coYm91bmRzLCBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXSwgMSwgMCwgLTEsIDAsIDApCisgICAgUWQuU2V0UG9ydCh0aGVXaW5kb3cpCisgICAgIyBYWFhYIE5lZWRlZD8gU2V0R1dvcmxkKChDR3JhZlB0cil0aGVXaW5kb3csIG5pbCkKKworICAgIHBsYXlNb3ZpZUluV2luZG93KHRoZVdpbmRvdywgZmlsZW5hbWUsIHRoZVdpbmRvdy5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpKQorCiBkZWYgcGxheU1vdmllSW5XaW5kb3codGhlV2luZG93LCB0aGVGaWxlLCBtb3ZpZUJveCk6Ci0JIiIiUGxheSBhIG1vdmllIGluIGEgd2luZG93IiIiCi0JIyBYWFhYIE5lZWRlZD8gCVNldEdXb3JsZCgoQ0dyYWZQdHIpdGhlV2luZG93LCBuaWwpOwotCQotCSMgR2V0IHRoZSBtb3ZpZQotCXRoZU1vdmllID0gbG9hZE1vdmllKHRoZUZpbGUpCi0JCi0JIyBTZXQgd2hlcmUgd2Ugd2FudCBpdAotCXRoZU1vdmllLlNldE1vdmllQm94KG1vdmllQm94KQotCQotCSMgU3RhcnQgYXQgdGhlIGJlZ2lubmluZwotCXRoZU1vdmllLkdvVG9CZWdpbm5pbmdPZk1vdmllKCkKLQkKLQkjIEdpdmUgYSBsaXR0bGUgdGltZSB0byBwcmVyb2xsCi0JdGhlTW92aWUuTW92aWVzVGFzaygwKQotCQotCSMgU3RhcnQgcGxheWluZwotCXRoZU1vdmllLlN0YXJ0TW92aWUoKQotCQotCXdoaWxlIG5vdCB0aGVNb3ZpZS5Jc01vdmllRG9uZSgpIGFuZCBub3QgRXZ0LkJ1dHRvbigpOgotCQl0aGVNb3ZpZS5Nb3ZpZXNUYXNrKDApCi0JCQkKKyAgICAiIiJQbGF5IGEgbW92aWUgaW4gYSB3aW5kb3ciIiIKKyAgICAjIFhYWFggTmVlZGVkPyAgU2V0R1dvcmxkKChDR3JhZlB0cil0aGVXaW5kb3csIG5pbCk7CisKKyAgICAjIEdldCB0aGUgbW92aWUKKyAgICB0aGVNb3ZpZSA9IGxvYWRNb3ZpZSh0aGVGaWxlKQorCisgICAgIyBTZXQgd2hlcmUgd2Ugd2FudCBpdAorICAgIHRoZU1vdmllLlNldE1vdmllQm94KG1vdmllQm94KQorCisgICAgIyBTdGFydCBhdCB0aGUgYmVnaW5uaW5nCisgICAgdGhlTW92aWUuR29Ub0JlZ2lubmluZ09mTW92aWUoKQorCisgICAgIyBHaXZlIGEgbGl0dGxlIHRpbWUgdG8gcHJlcm9sbAorICAgIHRoZU1vdmllLk1vdmllc1Rhc2soMCkKKworICAgICMgU3RhcnQgcGxheWluZworICAgIHRoZU1vdmllLlN0YXJ0TW92aWUoKQorCisgICAgd2hpbGUgbm90IHRoZU1vdmllLklzTW92aWVEb25lKCkgYW5kIG5vdCBFdnQuQnV0dG9uKCk6CisgICAgICAgIHRoZU1vdmllLk1vdmllc1Rhc2soMCkKKwogZGVmIGxvYWRNb3ZpZSh0aGVGaWxlKToKLQkiIiJMb2FkIGEgbW92aWUgZ2l2ZW4gYW4gZnNzcGVjLiBSZXR1cm4gdGhlIG1vdmllIG9iamVjdCIiIgotCW1vdmllUmVzUmVmID0gUXQuT3Blbk1vdmllRmlsZSh0aGVGaWxlLCAxKQotCW1vdmllLCBkMSwgZDIgPSBRdC5OZXdNb3ZpZUZyb21GaWxlKG1vdmllUmVzUmVmLCAwLCBRdWlja1RpbWUubmV3TW92aWVBY3RpdmUpCi0JcmV0dXJuIG1vdmllCi0JCisgICAgIiIiTG9hZCBhIG1vdmllIGdpdmVuIGFuIGZzc3BlYy4gUmV0dXJuIHRoZSBtb3ZpZSBvYmplY3QiIiIKKyAgICBtb3ZpZVJlc1JlZiA9IFF0Lk9wZW5Nb3ZpZUZpbGUodGhlRmlsZSwgMSkKKyAgICBtb3ZpZSwgZDEsIGQyID0gUXQuTmV3TW92aWVGcm9tRmlsZShtb3ZpZVJlc1JlZiwgMCwgUXVpY2tUaW1lLm5ld01vdmllQWN0aXZlKQorICAgIHJldHVybiBtb3ZpZQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQotCQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vcXVpY2t0aW1lL1ZlcnlTaW1wbGVQbGF5ZXIucHkgYi9NYWMvRGVtby9xdWlja3RpbWUvVmVyeVNpbXBsZVBsYXllci5weQppbmRleCBkZTY0ZTNmLi4yOTMwZWFjIDEwMDY0NAotLS0gYS9NYWMvRGVtby9xdWlja3RpbWUvVmVyeVNpbXBsZVBsYXllci5weQorKysgYi9NYWMvRGVtby9xdWlja3RpbWUvVmVyeVNpbXBsZVBsYXllci5weQpAQCAtMTgsNzYgKzE4LDc1IEBACiAjIFhYWFggbWF4Ym91bmRzID0gKDQwLCA0MCwgMTAwMCwgMTAwMCkKIAogZGVmIG1haW4oKToKLQlwcmludCAnaGVsbG8gd29ybGQnICMgWFhYWAotCSMgc2tpcCB0aGUgdG9vbGJveCBpbml0aWFsaXphdGlvbnMsIGFscmVhZHkgZG9uZQotCSMgWFhYWCBTaG91bGQgdXNlIGdlc3RhbHQgaGVyZSB0byBjaGVjayBmb3IgcXVpY2t0aW1lIHZlcnNpb24KLQlRdC5FbnRlck1vdmllcygpCi0JCi0JIyBHZXQgdGhlIG1vdmllIGZpbGUKLQlmc3MgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih3YW50ZWQ9RmlsZS5GU1NwZWMpICMgV2FzOiBRdWlja1RpbWUuTW92aWVGaWxlVHlwZQotCWlmIG5vdCBmc3M6Ci0JCXN5cy5leGl0KDApCi0JCQotCSMgT3BlbiB0aGUgd2luZG93Ci0JYm91bmRzID0gKDE3NSwgNzUsIDE3NSsxNjAsIDc1KzEyMCkKLQl0aGVXaW5kb3cgPSBXaW4uTmV3Q1dpbmRvdyhib3VuZHMsIGZzcy5hc190dXBsZSgpWzJdLCAwLCAwLCAtMSwgMSwgMCkKLQkjIFhYWFggTmVlZGVkPyBTZXRHV29ybGQoKENHcmFmUHRyKXRoZVdpbmRvdywgbmlsKQotCVFkLlNldFBvcnQodGhlV2luZG93KQotCQotCSMgR2V0IHRoZSBtb3ZpZQotCXRoZU1vdmllID0gbG9hZE1vdmllKGZzcykKLQkKLQkjIFJlbG9jYXRlIHRvICgwLCAwKQotCWJvdW5kcyA9IHRoZU1vdmllLkdldE1vdmllQm94KCkKLQlib3VuZHMgPSAwLCAwLCBib3VuZHNbMl0tYm91bmRzWzBdLCBib3VuZHNbM10tYm91bmRzWzFdCi0JdGhlTW92aWUuU2V0TW92aWVCb3goYm91bmRzKQotCQotCSMgQ3JlYXRlIGEgY29udHJvbGxlcgotCXRoZUNvbnRyb2xsZXIgPSB0aGVNb3ZpZS5OZXdNb3ZpZUNvbnRyb2xsZXIoYm91bmRzLCBRdWlja1RpbWUubWNUb3BMZWZ0TW92aWUpCi0JCi0JIyBHZXQgbW92aWUgc2l6ZSBhbmQgdXBkYXRlIHdpbmRvdyBwYXJhbWV0ZXJzCi0JcnYsIGJvdW5kcyA9IHRoZUNvbnRyb2xsZXIuTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdCgpCi0JdGhlV2luZG93LlNpemVXaW5kb3coYm91bmRzWzJdLCBib3VuZHNbM10sIDApICAgIyBYWFhYIG9yIFszXSBbMl0/Ci0JUXQuQWxpZ25XaW5kb3codGhlV2luZG93LCAwKQotCXRoZVdpbmRvdy5TaG93V2luZG93KCkKLQkKLQkjIFhYWFggTUNEb0FjdGlvbih0aGVDb250cm9sbGVyLCBtY0FjdGlvblNldEdyb3dCb3hCb3VuZHMsICZtYXhCb3VuZHMpCi0JdGhlQ29udHJvbGxlci5NQ0RvQWN0aW9uKFF1aWNrVGltZS5tY0FjdGlvblNldEtleXNFbmFibGVkLCAnMScpCi0JCi0JIyBYWFhYIE1DU2V0QWN0aW9uRmlsdGVyV2l0aFJlZkNvbih0aGVDb250cm9sbGVyLCBtb3ZpZUNvbnRyb2xsZXJFdmVudEZpbHRlciwgKGxvbmcpdGhlV2luZG93KQotCQotCWRvbmUgPSAwCi0Jd2hpbGUgbm90IGRvbmU6Ci0JCWdvdG9uZSwgZXZ0ID0gRXZ0LldhaXROZXh0RXZlbnQoMHhmZmZmLCAwKQotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldnQKLSMjCQlwcmludCB3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzICMgWFhYWAotCQkKLQkJaWYgdGhlQ29udHJvbGxlci5NQ0lzUGxheWVyRXZlbnQoZXZ0KToKLQkJCWNvbnRpbnVlCi0JCQkKLQkJaWYgd2hhdCA9PSBFdmVudHMubW91c2VEb3duOgotCQkJcGFydCwgd2hpY2hXaW5kb3cgPSBXaW4uRmluZFdpbmRvdyh3aGVyZSkKLQkJCWlmIHBhcnQgPT0gV2luZG93cy5pbkdvQXdheToKLQkJCQlkb25lID0gd2hpY2hXaW5kb3cuVHJhY2tHb0F3YXkod2hlcmUpCi0JCQllbGlmIHBhcnQgPT0gV2luZG93cy5pbkRyYWc6Ci0JCQkJUXQuRHJhZ0FsaWduZWRXaW5kb3cod2hpY2hXaW5kb3csIHdoZXJlLCAoMCwgMCwgNDAwMCwgNDAwMCkpCi0JCWVsaWYgd2hhdCA9PSBFdmVudHMudXBkYXRlRXZ0OgotCQkJd2hpY2hXaW5kb3cgPSBXaW4uV2hpY2hXaW5kb3cobWVzc2FnZSkKLQkJCWlmIG5vdCB3aGljaFdpbmRvdzoKLQkJCQkjIFByb2JhYmx5IHRoZSBjb25zb2xlIHdpbmRvdy4gUHJpbnQgc29tZXRoaW5nLCBob3BlIGl0IGhlbHBzLgotCQkJCXByaW50ICd1cGRhdGUnCi0JCQllbHNlOgotCQkJCVFkLlNldFBvcnQod2hpY2hXaW5kb3cpCi0JCQkJd2hpY2hXaW5kb3cuQmVnaW5VcGRhdGUoKQotCQkJCVFkLkVyYXNlUmVjdCh3aGljaFdpbmRvdy5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpKQotCQkJCXdoaWNoV2luZG93LkVuZFVwZGF0ZSgpCi0JCQkKKyAgICBwcmludCAnaGVsbG8gd29ybGQnICMgWFhYWAorICAgICMgc2tpcCB0aGUgdG9vbGJveCBpbml0aWFsaXphdGlvbnMsIGFscmVhZHkgZG9uZQorICAgICMgWFhYWCBTaG91bGQgdXNlIGdlc3RhbHQgaGVyZSB0byBjaGVjayBmb3IgcXVpY2t0aW1lIHZlcnNpb24KKyAgICBRdC5FbnRlck1vdmllcygpCisKKyAgICAjIEdldCB0aGUgbW92aWUgZmlsZQorICAgIGZzcyA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHdhbnRlZD1GaWxlLkZTU3BlYykgIyBXYXM6IFF1aWNrVGltZS5Nb3ZpZUZpbGVUeXBlCisgICAgaWYgbm90IGZzczoKKyAgICAgICAgc3lzLmV4aXQoMCkKKworICAgICMgT3BlbiB0aGUgd2luZG93CisgICAgYm91bmRzID0gKDE3NSwgNzUsIDE3NSsxNjAsIDc1KzEyMCkKKyAgICB0aGVXaW5kb3cgPSBXaW4uTmV3Q1dpbmRvdyhib3VuZHMsIGZzcy5hc190dXBsZSgpWzJdLCAwLCAwLCAtMSwgMSwgMCkKKyAgICAjIFhYWFggTmVlZGVkPyBTZXRHV29ybGQoKENHcmFmUHRyKXRoZVdpbmRvdywgbmlsKQorICAgIFFkLlNldFBvcnQodGhlV2luZG93KQorCisgICAgIyBHZXQgdGhlIG1vdmllCisgICAgdGhlTW92aWUgPSBsb2FkTW92aWUoZnNzKQorCisgICAgIyBSZWxvY2F0ZSB0byAoMCwgMCkKKyAgICBib3VuZHMgPSB0aGVNb3ZpZS5HZXRNb3ZpZUJveCgpCisgICAgYm91bmRzID0gMCwgMCwgYm91bmRzWzJdLWJvdW5kc1swXSwgYm91bmRzWzNdLWJvdW5kc1sxXQorICAgIHRoZU1vdmllLlNldE1vdmllQm94KGJvdW5kcykKKworICAgICMgQ3JlYXRlIGEgY29udHJvbGxlcgorICAgIHRoZUNvbnRyb2xsZXIgPSB0aGVNb3ZpZS5OZXdNb3ZpZUNvbnRyb2xsZXIoYm91bmRzLCBRdWlja1RpbWUubWNUb3BMZWZ0TW92aWUpCisKKyAgICAjIEdldCBtb3ZpZSBzaXplIGFuZCB1cGRhdGUgd2luZG93IHBhcmFtZXRlcnMKKyAgICBydiwgYm91bmRzID0gdGhlQ29udHJvbGxlci5NQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0KCkKKyAgICB0aGVXaW5kb3cuU2l6ZVdpbmRvdyhib3VuZHNbMl0sIGJvdW5kc1szXSwgMCkgICAjIFhYWFggb3IgWzNdIFsyXT8KKyAgICBRdC5BbGlnbldpbmRvdyh0aGVXaW5kb3csIDApCisgICAgdGhlV2luZG93LlNob3dXaW5kb3coKQorCisgICAgIyBYWFhYIE1DRG9BY3Rpb24odGhlQ29udHJvbGxlciwgbWNBY3Rpb25TZXRHcm93Qm94Qm91bmRzLCAmbWF4Qm91bmRzKQorICAgIHRoZUNvbnRyb2xsZXIuTUNEb0FjdGlvbihRdWlja1RpbWUubWNBY3Rpb25TZXRLZXlzRW5hYmxlZCwgJzEnKQorCisgICAgIyBYWFhYIE1DU2V0QWN0aW9uRmlsdGVyV2l0aFJlZkNvbih0aGVDb250cm9sbGVyLCBtb3ZpZUNvbnRyb2xsZXJFdmVudEZpbHRlciwgKGxvbmcpdGhlV2luZG93KQorCisgICAgZG9uZSA9IDAKKyAgICB3aGlsZSBub3QgZG9uZToKKyAgICAgICAgZ290b25lLCBldnQgPSBFdnQuV2FpdE5leHRFdmVudCgweGZmZmYsIDApCisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2dAorIyMgICAgICAgICAgICAgIHByaW50IHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMgIyBYWFhYCisKKyAgICAgICAgaWYgdGhlQ29udHJvbGxlci5NQ0lzUGxheWVyRXZlbnQoZXZ0KToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgd2hhdCA9PSBFdmVudHMubW91c2VEb3duOgorICAgICAgICAgICAgcGFydCwgd2hpY2hXaW5kb3cgPSBXaW4uRmluZFdpbmRvdyh3aGVyZSkKKyAgICAgICAgICAgIGlmIHBhcnQgPT0gV2luZG93cy5pbkdvQXdheToKKyAgICAgICAgICAgICAgICBkb25lID0gd2hpY2hXaW5kb3cuVHJhY2tHb0F3YXkod2hlcmUpCisgICAgICAgICAgICBlbGlmIHBhcnQgPT0gV2luZG93cy5pbkRyYWc6CisgICAgICAgICAgICAgICAgUXQuRHJhZ0FsaWduZWRXaW5kb3cod2hpY2hXaW5kb3csIHdoZXJlLCAoMCwgMCwgNDAwMCwgNDAwMCkpCisgICAgICAgIGVsaWYgd2hhdCA9PSBFdmVudHMudXBkYXRlRXZ0OgorICAgICAgICAgICAgd2hpY2hXaW5kb3cgPSBXaW4uV2hpY2hXaW5kb3cobWVzc2FnZSkKKyAgICAgICAgICAgIGlmIG5vdCB3aGljaFdpbmRvdzoKKyAgICAgICAgICAgICAgICAjIFByb2JhYmx5IHRoZSBjb25zb2xlIHdpbmRvdy4gUHJpbnQgc29tZXRoaW5nLCBob3BlIGl0IGhlbHBzLgorICAgICAgICAgICAgICAgIHByaW50ICd1cGRhdGUnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFFkLlNldFBvcnQod2hpY2hXaW5kb3cpCisgICAgICAgICAgICAgICAgd2hpY2hXaW5kb3cuQmVnaW5VcGRhdGUoKQorICAgICAgICAgICAgICAgIFFkLkVyYXNlUmVjdCh3aGljaFdpbmRvdy5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpKQorICAgICAgICAgICAgICAgIHdoaWNoV2luZG93LkVuZFVwZGF0ZSgpCisKIGRlZiBsb2FkTW92aWUodGhlRmlsZSk6Ci0JIiIiTG9hZCBhIG1vdmllIGdpdmVuIGFuIGZzc3BlYy4gUmV0dXJuIHRoZSBtb3ZpZSBvYmplY3QiIiIKLQltb3ZpZVJlc1JlZiA9IFF0Lk9wZW5Nb3ZpZUZpbGUodGhlRmlsZSwgMSkKLQltb3ZpZSwgZDEsIGQyID0gUXQuTmV3TW92aWVGcm9tRmlsZShtb3ZpZVJlc1JlZiwgMCwgUXVpY2tUaW1lLm5ld01vdmllQWN0aXZlKQotCXJldHVybiBtb3ZpZQotCQorICAgICIiIkxvYWQgYSBtb3ZpZSBnaXZlbiBhbiBmc3NwZWMuIFJldHVybiB0aGUgbW92aWUgb2JqZWN0IiIiCisgICAgbW92aWVSZXNSZWYgPSBRdC5PcGVuTW92aWVGaWxlKHRoZUZpbGUsIDEpCisgICAgbW92aWUsIGQxLCBkMiA9IFF0Lk5ld01vdmllRnJvbUZpbGUobW92aWVSZXNSZWYsIDAsIFF1aWNrVGltZS5uZXdNb3ZpZUFjdGl2ZSkKKyAgICByZXR1cm4gbW92aWUKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKLQkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL3Jlc291cmNlcy9jb3B5cmVzLnB5IGIvTWFjL0RlbW8vcmVzb3VyY2VzL2NvcHlyZXMucHkKaW5kZXggYWU2MjdlZi4uNTI4ZmYxNiAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vcmVzb3VyY2VzL2NvcHlyZXMucHkKKysrIGIvTWFjL0RlbW8vcmVzb3VyY2VzL2NvcHlyZXMucHkKQEAgLTcsNTEgKzcsNTEgQEAKIHNtQWxsU2NyaXB0cyA9IC0zCiAKIGRlZiBjb3B5cmVzKHNyYywgZHN0KToKLQkiIiJDb3B5IHJlc291cmNlIGZyb20gc3JjIGZpbGUgdG8gZHN0IGZpbGUuIiIiCi0JCi0JY3VyID0gQ3VyUmVzRmlsZSgpCi0JY3RvciwgdHlwZSA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKHNyYykKLQlpbnB1dCA9IEZTcE9wZW5SZXNGaWxlKHNyYywgUkVBRCkKLQl0cnk6Ci0JCUZTcENyZWF0ZVJlc0ZpbGUoZHN0LCBjdG9yLCB0eXBlLCBzbUFsbFNjcmlwdHMpCi0JZXhjZXB0OgotCQlyYXdfaW5wdXQoIiVzIGFscmVhZHkgZXhpc3RzLi4uICBDUiB0byB3cml0ZSBhbnl3YXkhICIgJSBkc3QpCi0Jb3V0cHV0ID0gRlNwT3BlblJlc0ZpbGUoZHN0LCBXUklURSkKLQlVc2VSZXNGaWxlKGlucHV0KQotCW50eXBlcyA9IENvdW50MVR5cGVzKCkKLQlmb3IgaXR5cGUgaW4gcmFuZ2UoMSwgMStudHlwZXMpOgotCQl0eXBlID0gR2V0MUluZFR5cGUoaXR5cGUpCi0JCW5yZXNvdXJjZXMgPSBDb3VudDFSZXNvdXJjZXModHlwZSkKLQkJZm9yIGlyZXMgaW4gcmFuZ2UoMSwgMStucmVzb3VyY2VzKToKLQkJCXJlcyA9IEdldDFJbmRSZXNvdXJjZSh0eXBlLCBpcmVzKQotCQkJcmVzLkxvYWRSZXNvdXJjZSgpCi0JCQlpZCwgdHlwZSwgbmFtZSA9IHJlcy5HZXRSZXNJbmZvKCkKLQkJCXNpemUgPSByZXMuU2l6ZVJlc291cmNlKCkKLQkJCWF0dHJzID0gcmVzLkdldFJlc0F0dHJzKCkKLQkJCXByaW50IGlkLCB0eXBlLCBuYW1lLCBzaXplLCBoZXgoYXR0cnMpCi0JCQlyZXMuRGV0YWNoUmVzb3VyY2UoKQotCQkJVXNlUmVzRmlsZShvdXRwdXQpCi0JCQl0cnk6Ci0JCQkJcmVzMiA9IEdldDFSZXNvdXJjZSh0eXBlLCBpZCkKLQkJCWV4Y2VwdCAoUnVudGltZUVycm9yLCBSZXMuRXJyb3IpLCBtc2c6Ci0JCQkJcmVzMiA9IE5vbmUKLQkJCWlmIHJlczI6Ci0JCQkJcHJpbnQgIkR1cGxpY2F0ZSB0eXBlK2lkLCBub3QgY29waWVkIgotCQkJCXByaW50IChyZXMyLnNpemUsIHJlczIuZGF0YSkKLQkJCQlwcmludCByZXMyLkdldFJlc0luZm8oKQotCQkJCWlmIHJlczIuSG9tZVJlc0ZpbGUoKSA9PSBvdXRwdXQ6Ci0JCQkJCSdPSycKLQkJCQllbGlmIHJlczIuSG9tZVJlc0ZpbGUoKSA9PSBpbnB1dDoKLQkJCQkJJ0JBRCEnCi0JCQkJZWxzZToKLQkJCQkJcHJpbnQgJ0hvbWU6JywgcmVzMi5Ib21lUmVzRmlsZSgpCi0JCQllbHNlOgotCQkJCXJlcy5BZGRSZXNvdXJjZSh0eXBlLCBpZCwgbmFtZSkKLQkJCQkjcmVzLlNldFJlc0F0dHJzKGF0dHJzKQotCQkJCXJlcy5Xcml0ZVJlc291cmNlKCkKLQkJCVVzZVJlc0ZpbGUoaW5wdXQpCi0JVXNlUmVzRmlsZShjdXIpCi0JQ2xvc2VSZXNGaWxlKG91dHB1dCkKLQlDbG9zZVJlc0ZpbGUoaW5wdXQpCisgICAgIiIiQ29weSByZXNvdXJjZSBmcm9tIHNyYyBmaWxlIHRvIGRzdCBmaWxlLiIiIgorCisgICAgY3VyID0gQ3VyUmVzRmlsZSgpCisgICAgY3RvciwgdHlwZSA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKHNyYykKKyAgICBpbnB1dCA9IEZTcE9wZW5SZXNGaWxlKHNyYywgUkVBRCkKKyAgICB0cnk6CisgICAgICAgIEZTcENyZWF0ZVJlc0ZpbGUoZHN0LCBjdG9yLCB0eXBlLCBzbUFsbFNjcmlwdHMpCisgICAgZXhjZXB0OgorICAgICAgICByYXdfaW5wdXQoIiVzIGFscmVhZHkgZXhpc3RzLi4uICBDUiB0byB3cml0ZSBhbnl3YXkhICIgJSBkc3QpCisgICAgb3V0cHV0ID0gRlNwT3BlblJlc0ZpbGUoZHN0LCBXUklURSkKKyAgICBVc2VSZXNGaWxlKGlucHV0KQorICAgIG50eXBlcyA9IENvdW50MVR5cGVzKCkKKyAgICBmb3IgaXR5cGUgaW4gcmFuZ2UoMSwgMStudHlwZXMpOgorICAgICAgICB0eXBlID0gR2V0MUluZFR5cGUoaXR5cGUpCisgICAgICAgIG5yZXNvdXJjZXMgPSBDb3VudDFSZXNvdXJjZXModHlwZSkKKyAgICAgICAgZm9yIGlyZXMgaW4gcmFuZ2UoMSwgMStucmVzb3VyY2VzKToKKyAgICAgICAgICAgIHJlcyA9IEdldDFJbmRSZXNvdXJjZSh0eXBlLCBpcmVzKQorICAgICAgICAgICAgcmVzLkxvYWRSZXNvdXJjZSgpCisgICAgICAgICAgICBpZCwgdHlwZSwgbmFtZSA9IHJlcy5HZXRSZXNJbmZvKCkKKyAgICAgICAgICAgIHNpemUgPSByZXMuU2l6ZVJlc291cmNlKCkKKyAgICAgICAgICAgIGF0dHJzID0gcmVzLkdldFJlc0F0dHJzKCkKKyAgICAgICAgICAgIHByaW50IGlkLCB0eXBlLCBuYW1lLCBzaXplLCBoZXgoYXR0cnMpCisgICAgICAgICAgICByZXMuRGV0YWNoUmVzb3VyY2UoKQorICAgICAgICAgICAgVXNlUmVzRmlsZShvdXRwdXQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzMiA9IEdldDFSZXNvdXJjZSh0eXBlLCBpZCkKKyAgICAgICAgICAgIGV4Y2VwdCAoUnVudGltZUVycm9yLCBSZXMuRXJyb3IpLCBtc2c6CisgICAgICAgICAgICAgICAgcmVzMiA9IE5vbmUKKyAgICAgICAgICAgIGlmIHJlczI6CisgICAgICAgICAgICAgICAgcHJpbnQgIkR1cGxpY2F0ZSB0eXBlK2lkLCBub3QgY29waWVkIgorICAgICAgICAgICAgICAgIHByaW50IChyZXMyLnNpemUsIHJlczIuZGF0YSkKKyAgICAgICAgICAgICAgICBwcmludCByZXMyLkdldFJlc0luZm8oKQorICAgICAgICAgICAgICAgIGlmIHJlczIuSG9tZVJlc0ZpbGUoKSA9PSBvdXRwdXQ6CisgICAgICAgICAgICAgICAgICAgICdPSycKKyAgICAgICAgICAgICAgICBlbGlmIHJlczIuSG9tZVJlc0ZpbGUoKSA9PSBpbnB1dDoKKyAgICAgICAgICAgICAgICAgICAgJ0JBRCEnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ0hvbWU6JywgcmVzMi5Ib21lUmVzRmlsZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlcy5BZGRSZXNvdXJjZSh0eXBlLCBpZCwgbmFtZSkKKyAgICAgICAgICAgICAgICAjcmVzLlNldFJlc0F0dHJzKGF0dHJzKQorICAgICAgICAgICAgICAgIHJlcy5Xcml0ZVJlc291cmNlKCkKKyAgICAgICAgICAgIFVzZVJlc0ZpbGUoaW5wdXQpCisgICAgVXNlUmVzRmlsZShjdXIpCisgICAgQ2xvc2VSZXNGaWxlKG91dHB1dCkKKyAgICBDbG9zZVJlc0ZpbGUoaW5wdXQpCiAKIGNvcHlyZXMoJzo6cHl0aG9uLrkucnNyYycsICc6OmZvby5yc3JjJykKZGlmZiAtLWdpdCBhL01hYy9EZW1vL3Jlc291cmNlcy9saXN0cmVzLnB5IGIvTWFjL0RlbW8vcmVzb3VyY2VzL2xpc3RyZXMucHkKaW5kZXggZWFjZjJiNy4uNmNlNTc3OSAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vcmVzb3VyY2VzL2xpc3RyZXMucHkKKysrIGIvTWFjL0RlbW8vcmVzb3VyY2VzL2xpc3RyZXMucHkKQEAgLTQsNTcgKzQsNTcgQEAKIGZyb20gQ2FyYm9uLlJlc291cmNlcyBpbXBvcnQgKgogCiBkZWYgbGlzdDFyZXNvdXJjZXMoKToKLQludHlwZXMgPSBSZXMuQ291bnQxVHlwZXMoKQotCWZvciBpdHlwZSBpbiByYW5nZSgxLCAxK250eXBlcyk6Ci0JCXR5cGUgPSBSZXMuR2V0MUluZFR5cGUoaXR5cGUpCi0JCXByaW50ICJUeXBlOiIsIHJlcHIodHlwZSkKLQkJbnJlc291cmNlcyA9IFJlcy5Db3VudDFSZXNvdXJjZXModHlwZSkKLQkJZm9yIGkgaW4gcmFuZ2UoMSwgMSArIG5yZXNvdXJjZXMpOgotCQkJUmVzLlNldFJlc0xvYWQoMCkKLQkJCXJlcyA9IFJlcy5HZXQxSW5kUmVzb3VyY2UodHlwZSwgaSkKLQkJCVJlcy5TZXRSZXNMb2FkKDEpCi0JCQlpbmZvKHJlcykKKyAgICBudHlwZXMgPSBSZXMuQ291bnQxVHlwZXMoKQorICAgIGZvciBpdHlwZSBpbiByYW5nZSgxLCAxK250eXBlcyk6CisgICAgICAgIHR5cGUgPSBSZXMuR2V0MUluZFR5cGUoaXR5cGUpCisgICAgICAgIHByaW50ICJUeXBlOiIsIHJlcHIodHlwZSkKKyAgICAgICAgbnJlc291cmNlcyA9IFJlcy5Db3VudDFSZXNvdXJjZXModHlwZSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgMSArIG5yZXNvdXJjZXMpOgorICAgICAgICAgICAgUmVzLlNldFJlc0xvYWQoMCkKKyAgICAgICAgICAgIHJlcyA9IFJlcy5HZXQxSW5kUmVzb3VyY2UodHlwZSwgaSkKKyAgICAgICAgICAgIFJlcy5TZXRSZXNMb2FkKDEpCisgICAgICAgICAgICBpbmZvKHJlcykKIAogZGVmIGxpc3RyZXNvdXJjZXMoKToKLQludHlwZXMgPSBSZXMuQ291bnRUeXBlcygpCi0JZm9yIGl0eXBlIGluIHJhbmdlKDEsIDErbnR5cGVzKToKLQkJdHlwZSA9IFJlcy5HZXRJbmRUeXBlKGl0eXBlKQotCQlwcmludCAiVHlwZToiLCByZXByKHR5cGUpCi0JCW5yZXNvdXJjZXMgPSBSZXMuQ291bnRSZXNvdXJjZXModHlwZSkKLQkJZm9yIGkgaW4gcmFuZ2UoMSwgMSArIG5yZXNvdXJjZXMpOgotCQkJUmVzLlNldFJlc0xvYWQoMCkKLQkJCXJlcyA9IFJlcy5HZXRJbmRSZXNvdXJjZSh0eXBlLCBpKQotCQkJUmVzLlNldFJlc0xvYWQoMSkKLQkJCWluZm8ocmVzKQorICAgIG50eXBlcyA9IFJlcy5Db3VudFR5cGVzKCkKKyAgICBmb3IgaXR5cGUgaW4gcmFuZ2UoMSwgMStudHlwZXMpOgorICAgICAgICB0eXBlID0gUmVzLkdldEluZFR5cGUoaXR5cGUpCisgICAgICAgIHByaW50ICJUeXBlOiIsIHJlcHIodHlwZSkKKyAgICAgICAgbnJlc291cmNlcyA9IFJlcy5Db3VudFJlc291cmNlcyh0eXBlKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCAxICsgbnJlc291cmNlcyk6CisgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgwKQorICAgICAgICAgICAgcmVzID0gUmVzLkdldEluZFJlc291cmNlKHR5cGUsIGkpCisgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgxKQorICAgICAgICAgICAgaW5mbyhyZXMpCiAKIGRlZiBpbmZvKHJlcyk6Ci0JcHJpbnQgcmVzLkdldFJlc0luZm8oKSwgcmVzLlNpemVSZXNvdXJjZSgpLCBkZWNvZGVhdHRycyhyZXMuR2V0UmVzQXR0cnMoKSkKKyAgICBwcmludCByZXMuR2V0UmVzSW5mbygpLCByZXMuU2l6ZVJlc291cmNlKCksIGRlY29kZWF0dHJzKHJlcy5HZXRSZXNBdHRycygpKQogCiBhdHRybmFtZXMgPSB7Ci0JcmVzQ2hhbmdlZDoJJ0NoYW5nZWQnLAotCXJlc1ByZWxvYWQ6CSdQcmVsb2FkJywKLQlyZXNQcm90ZWN0ZWQ6CSdQcm90ZWN0ZWQnLAotCXJlc0xvY2tlZDoJJ0xvY2tlZCcsCi0JcmVzUHVyZ2VhYmxlOgknUHVyZ2VhYmxlJywKLQlyZXNTeXNIZWFwOgknU3lzSGVhcCcsCisgICAgICAgIHJlc0NoYW5nZWQ6ICAgICAnQ2hhbmdlZCcsCisgICAgICAgIHJlc1ByZWxvYWQ6ICAgICAnUHJlbG9hZCcsCisgICAgICAgIHJlc1Byb3RlY3RlZDogICAnUHJvdGVjdGVkJywKKyAgICAgICAgcmVzTG9ja2VkOiAgICAgICdMb2NrZWQnLAorICAgICAgICByZXNQdXJnZWFibGU6ICAgJ1B1cmdlYWJsZScsCisgICAgICAgIHJlc1N5c0hlYXA6ICAgICAnU3lzSGVhcCcsCiB9CiAKIGRlZiBkZWNvZGVhdHRycyhhdHRycyk6Ci0JbmFtZXMgPSBbXQotCWZvciBiaXQgaW4gcmFuZ2UoMTYpOgotCQltYXNrID0gMTw8Yml0Ci0JCWlmIGF0dHJzICYgbWFzazoKLQkJCWlmIGF0dHJuYW1lcy5oYXNfa2V5KG1hc2spOgotCQkJCW5hbWVzLmFwcGVuZChhdHRybmFtZXNbbWFza10pCi0JCQllbHNlOgotCQkJCW5hbWVzLmFwcGVuZChoZXgobWFzaykpCi0JcmV0dXJuIG5hbWVzCisgICAgbmFtZXMgPSBbXQorICAgIGZvciBiaXQgaW4gcmFuZ2UoMTYpOgorICAgICAgICBtYXNrID0gMTw8Yml0CisgICAgICAgIGlmIGF0dHJzICYgbWFzazoKKyAgICAgICAgICAgIGlmIGF0dHJuYW1lcy5oYXNfa2V5KG1hc2spOgorICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZChhdHRybmFtZXNbbWFza10pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZChoZXgobWFzaykpCisgICAgcmV0dXJuIG5hbWVzCiAKIGRlZiB0ZXN0KCk6Ci0JcHJpbnQgIj09PSBMb2NhbCByZXNvdXJjZXNzID09PSIKLQlsaXN0MXJlc291cmNlcygpCi0JcHJpbnQgIj09PSBBbGwgcmVzb3VyY2VzID09PSIKLQlsaXN0cmVzb3VyY2VzKCkKKyAgICBwcmludCAiPT09IExvY2FsIHJlc291cmNlc3MgPT09IgorICAgIGxpc3QxcmVzb3VyY2VzKCkKKyAgICBwcmludCAiPT09IEFsbCByZXNvdXJjZXMgPT09IgorICAgIGxpc3RyZXNvdXJjZXMoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCXRlc3QoKQorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vc291bmQvbW9yc2UucHkgYi9NYWMvRGVtby9zb3VuZC9tb3JzZS5weQppbmRleCBiZjVmYTVmLi5iMjZkNTU0IDEwMDY0NAotLS0gYS9NYWMvRGVtby9zb3VuZC9tb3JzZS5weQorKysgYi9NYWMvRGVtby9zb3VuZC9tb3JzZS5weQpAQCAtMiw2MSArMiw2MSBAQAogCiBET1QgPSAzMAogREFIID0gODAKLU9DVEFWRSA9IDIJCQkJIyAxID09IDQ0MSBIeiwgMiA9PSA4ODIgSHosIC4uLgorT0NUQVZFID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMSA9PSA0NDEgSHosIDIgPT0gODgyIEh6LCAuLi4KIFNBTVBXSURUSCA9IDIKIEZSQU1FUkFURSA9IDQ0MTAwCiBCQVNFRlJFUSA9IDQ0MQogUVNJWkUgPSAyMDAwMAogCiBtb3JzZXRhYiA9IHsKLQknQSc6ICcuLScsCQknYSc6ICcuLScsCi0JJ0InOiAnLS4uLicsCQknYic6ICctLi4uJywKLQknQyc6ICctLi0uJywJCSdjJzogJy0uLS4nLAotCSdEJzogJy0uLicsCQknZCc6ICctLi4nLAotCSdFJzogJy4nLAkJJ2UnOiAnLicsCi0JJ0YnOiAnLi4tLicsCQknZic6ICcuLi0uJywKLQknRyc6ICctLS4nLAkJJ2cnOiAnLS0uJywKLQknSCc6ICcuLi4uJywJCSdoJzogJy4uLi4nLAotCSdJJzogJy4uJywJCSdpJzogJy4uJywKLQknSic6ICcuLS0tJywJCSdqJzogJy4tLS0nLAotCSdLJzogJy0uLScsCQknayc6ICctLi0nLAotCSdMJzogJy4tLi4nLAkJJ2wnOiAnLi0uLicsCi0JJ00nOiAnLS0nLAkJJ20nOiAnLS0nLAotCSdOJzogJy0uJywJCSduJzogJy0uJywKLQknTyc6ICctLS0nLAkJJ28nOiAnLS0tJywKLQknUCc6ICcuLS0uJywJCSdwJzogJy4tLS4nLAotCSdRJzogJy0tLi0nLAkJJ3EnOiAnLS0uLScsCi0JJ1InOiAnLi0uJywJCSdyJzogJy4tLicsCi0JJ1MnOiAnLi4uJywJCSdzJzogJy4uLicsCi0JJ1QnOiAnLScsCQkndCc6ICctJywKLQknVSc6ICcuLi0nLAkJJ3UnOiAnLi4tJywKLQknVic6ICcuLi4tJywJCSd2JzogJy4uLi0nLAotCSdXJzogJy4tLScsCQkndyc6ICcuLS0nLAotCSdYJzogJy0uLi0nLAkJJ3gnOiAnLS4uLScsCi0JJ1knOiAnLS4tLScsCQkneSc6ICctLi0tJywKLQknWic6ICctLS4uJywJCSd6JzogJy0tLi4nLAotCScwJzogJy0tLS0tJywKLQknMSc6ICcuLS0tLScsCi0JJzInOiAnLi4tLS0nLAotCSczJzogJy4uLi0tJywKLQknNCc6ICcuLi4uLScsCi0JJzUnOiAnLi4uLi4nLAotCSc2JzogJy0uLi4uJywKLQknNyc6ICctLS4uLicsCi0JJzgnOiAnLS0tLi4nLAotCSc5JzogJy0tLS0uJywKLQknLCc6ICctLS4uLS0nLAotCScuJzogJy4tLi0uLScsCi0JJz8nOiAnLi4tLS4uJywKLQknOyc6ICctLi0uLS4nLAotCSc6JzogJy0tLS4uLicsCi0JIiciOiAnLi0tLS0uJywKLQknLSc6ICctLi4uLi0nLAotCScvJzogJy0uLi0uJywKLQknKCc6ICctLi0tLi0nLAotCScpJzogJy0uLS0uLScsCi0JJ18nOiAnLi4tLS4tJywKLQknICc6ICcgJworICAgICAgICAnQSc6ICcuLScsICAgICAgICAgICAgICAnYSc6ICcuLScsCisgICAgICAgICdCJzogJy0uLi4nLCAgICAgICAgICAgICdiJzogJy0uLi4nLAorICAgICAgICAnQyc6ICctLi0uJywgICAgICAgICAgICAnYyc6ICctLi0uJywKKyAgICAgICAgJ0QnOiAnLS4uJywgICAgICAgICAgICAgJ2QnOiAnLS4uJywKKyAgICAgICAgJ0UnOiAnLicsICAgICAgICAgICAgICAgJ2UnOiAnLicsCisgICAgICAgICdGJzogJy4uLS4nLCAgICAgICAgICAgICdmJzogJy4uLS4nLAorICAgICAgICAnRyc6ICctLS4nLCAgICAgICAgICAgICAnZyc6ICctLS4nLAorICAgICAgICAnSCc6ICcuLi4uJywgICAgICAgICAgICAnaCc6ICcuLi4uJywKKyAgICAgICAgJ0knOiAnLi4nLCAgICAgICAgICAgICAgJ2knOiAnLi4nLAorICAgICAgICAnSic6ICcuLS0tJywgICAgICAgICAgICAnaic6ICcuLS0tJywKKyAgICAgICAgJ0snOiAnLS4tJywgICAgICAgICAgICAgJ2snOiAnLS4tJywKKyAgICAgICAgJ0wnOiAnLi0uLicsICAgICAgICAgICAgJ2wnOiAnLi0uLicsCisgICAgICAgICdNJzogJy0tJywgICAgICAgICAgICAgICdtJzogJy0tJywKKyAgICAgICAgJ04nOiAnLS4nLCAgICAgICAgICAgICAgJ24nOiAnLS4nLAorICAgICAgICAnTyc6ICctLS0nLCAgICAgICAgICAgICAnbyc6ICctLS0nLAorICAgICAgICAnUCc6ICcuLS0uJywgICAgICAgICAgICAncCc6ICcuLS0uJywKKyAgICAgICAgJ1EnOiAnLS0uLScsICAgICAgICAgICAgJ3EnOiAnLS0uLScsCisgICAgICAgICdSJzogJy4tLicsICAgICAgICAgICAgICdyJzogJy4tLicsCisgICAgICAgICdTJzogJy4uLicsICAgICAgICAgICAgICdzJzogJy4uLicsCisgICAgICAgICdUJzogJy0nLCAgICAgICAgICAgICAgICd0JzogJy0nLAorICAgICAgICAnVSc6ICcuLi0nLCAgICAgICAgICAgICAndSc6ICcuLi0nLAorICAgICAgICAnVic6ICcuLi4tJywgICAgICAgICAgICAndic6ICcuLi4tJywKKyAgICAgICAgJ1cnOiAnLi0tJywgICAgICAgICAgICAgJ3cnOiAnLi0tJywKKyAgICAgICAgJ1gnOiAnLS4uLScsICAgICAgICAgICAgJ3gnOiAnLS4uLScsCisgICAgICAgICdZJzogJy0uLS0nLCAgICAgICAgICAgICd5JzogJy0uLS0nLAorICAgICAgICAnWic6ICctLS4uJywgICAgICAgICAgICAneic6ICctLS4uJywKKyAgICAgICAgJzAnOiAnLS0tLS0nLAorICAgICAgICAnMSc6ICcuLS0tLScsCisgICAgICAgICcyJzogJy4uLS0tJywKKyAgICAgICAgJzMnOiAnLi4uLS0nLAorICAgICAgICAnNCc6ICcuLi4uLScsCisgICAgICAgICc1JzogJy4uLi4uJywKKyAgICAgICAgJzYnOiAnLS4uLi4nLAorICAgICAgICAnNyc6ICctLS4uLicsCisgICAgICAgICc4JzogJy0tLS4uJywKKyAgICAgICAgJzknOiAnLS0tLS4nLAorICAgICAgICAnLCc6ICctLS4uLS0nLAorICAgICAgICAnLic6ICcuLS4tLi0nLAorICAgICAgICAnPyc6ICcuLi0tLi4nLAorICAgICAgICAnOyc6ICctLi0uLS4nLAorICAgICAgICAnOic6ICctLS0uLi4nLAorICAgICAgICAiJyI6ICcuLS0tLS4nLAorICAgICAgICAnLSc6ICctLi4uLi0nLAorICAgICAgICAnLyc6ICctLi4tLicsCisgICAgICAgICcoJzogJy0uLS0uLScsCisgICAgICAgICcpJzogJy0uLS0uLScsCisgICAgICAgICdfJzogJy4uLS0uLScsCisgICAgICAgICcgJzogJyAnCiB9CiAKICMgSWYgd2UgcGxheSBhdCA0NC4xIGtIeiAod2hpY2ggd2UgZG8pLCB0aGVuIGlmIHdlIHByb2R1Y2Ugb25lIHNpbmUKQEAgLTY0LDExNyArNjQsMTE3IEBACiAjIHNpbmUgd2F2ZXMgaW4gdGhlc2UgMTAwIHNhbXBsZXMsIHdlIGdldCBhIHRvbmUgb2YgODgyIEh6LiAgODgyIEh6CiAjIGFwcGVhcnMgdG8gYmUgYSBuaWNlIG9uZSBmb3IgcGxheWluZyBtb3JzZSBjb2RlLgogZGVmIG1rd2F2ZShvY3RhdmUpOgotCWdsb2JhbCBzaW5ld2F2ZSwgbm93YXZlCi0Jc2luZXdhdmUgPSAnJwotCW4gPSBpbnQoRlJBTUVSQVRFIC8gQkFTRUZSRVEpCi0JZm9yIGkgaW4gcmFuZ2Uobik6Ci0JCXZhbCA9IGludChtYXRoLnNpbigyICogbWF0aC5waSAqIGkgKiBvY3RhdmUgLyBuKSAqIDB4N2ZmZikKLQkJc2FtcGxlID0gY2hyKCh2YWwgPj4gOCkgJiAyNTUpICsgY2hyKHZhbCAmIDI1NSkKLQkJc2luZXdhdmUgPSBzaW5ld2F2ZSArIHNhbXBsZVs6U0FNUFdJRFRIXQotCW5vd2F2ZSA9ICdcMCcgKiAobipTQU1QV0lEVEgpCisgICAgZ2xvYmFsIHNpbmV3YXZlLCBub3dhdmUKKyAgICBzaW5ld2F2ZSA9ICcnCisgICAgbiA9IGludChGUkFNRVJBVEUgLyBCQVNFRlJFUSkKKyAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAgICAgdmFsID0gaW50KG1hdGguc2luKDIgKiBtYXRoLnBpICogaSAqIG9jdGF2ZSAvIG4pICogMHg3ZmZmKQorICAgICAgICBzYW1wbGUgPSBjaHIoKHZhbCA+PiA4KSAmIDI1NSkgKyBjaHIodmFsICYgMjU1KQorICAgICAgICBzaW5ld2F2ZSA9IHNpbmV3YXZlICsgc2FtcGxlWzpTQU1QV0lEVEhdCisgICAgbm93YXZlID0gJ1wwJyAqIChuKlNBTVBXSURUSCkKIAogbWt3YXZlKE9DVEFWRSkKIAogY2xhc3MgQnVmZmVyZWRBdWRpb0RldjoKLQlkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotCQlpbXBvcnQgYXVkaW9kZXYKLQkJc2VsZi5fYmFzZSA9IGFwcGx5KGF1ZGlvZGV2LkF1ZGlvRGV2LCBhcmdzKQotCQlzZWxmLl9idWZmZXIgPSBbXQotCQlzZWxmLl9maWxsZWQgPSAwCi0JCXNlbGYuX2FkZG1ldGhvZHMoc2VsZi5fYmFzZSwgc2VsZi5fYmFzZS5fX2NsYXNzX18pCi0JZGVmIF9hZGRtZXRob2RzKHNlbGYsIGluc3QsIGNscyk6Ci0JCWZvciBuYW1lIGluIGNscy5fX2RpY3RfXy5rZXlzKCk6Ci0JCQlpZiBub3QgaGFzYXR0cihzZWxmLCBuYW1lKToKLQkJCQl0cnk6Ci0JCQkJCXNldGF0dHIoc2VsZiwgbmFtZSwgZ2V0YXR0cihpbnN0LCBuYW1lKSkKLQkJCQlleGNlcHQ6Ci0JCQkJCXBhc3MKLQkJZm9yIGJhc2VjbHMgaW4gY2xzLl9fYmFzZXNfXzoKLQkJCXNlbGYuX2FkZG1ldGhvZHMoc2VsZiwgaW5zdCwgYmFzZWNscykKLQlkZWYgd3JpdGVmcmFtZXNyYXcoc2VsZiwgZnJhbWVzKToKLQkJc2VsZi5fYnVmZmVyLmFwcGVuZChmcmFtZXMpCi0JCXNlbGYuX2ZpbGxlZCA9IHNlbGYuX2ZpbGxlZCArIGxlbihmcmFtZXMpCi0JCWlmIHNlbGYuX2ZpbGxlZCA+PSBRU0laRToKLQkJCXNlbGYuZmx1c2goKQotCWRlZiB3YWl0KHNlbGYpOgotCQlzZWxmLmZsdXNoKCkKLQkJc2VsZi5fYmFzZS53YWl0KCkKLQlkZWYgZmx1c2goc2VsZik6Ci0JCXByaW50ICdmbHVzaDogJWQgYmxvY2tzLCAlZCBieXRlcycgJSAobGVuKHNlbGYuX2J1ZmZlciksIHNlbGYuX2ZpbGxlZCkKLQkJaWYgc2VsZi5fYnVmZmVyOgotCQkJaW1wb3J0IHN0cmluZwotCQkJc2VsZi5fYmFzZS53cml0ZWZyYW1lcyhzdHJpbmcuam9pbmZpZWxkcyhzZWxmLl9idWZmZXIsICcnKSkKLQkJCXNlbGYuX2J1ZmZlciA9IFtdCi0JCQlzZWxmLl9maWxsZWQgPSAwCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgaW1wb3J0IGF1ZGlvZGV2CisgICAgICAgIHNlbGYuX2Jhc2UgPSBhcHBseShhdWRpb2Rldi5BdWRpb0RldiwgYXJncykKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gW10KKyAgICAgICAgc2VsZi5fZmlsbGVkID0gMAorICAgICAgICBzZWxmLl9hZGRtZXRob2RzKHNlbGYuX2Jhc2UsIHNlbGYuX2Jhc2UuX19jbGFzc19fKQorICAgIGRlZiBfYWRkbWV0aG9kcyhzZWxmLCBpbnN0LCBjbHMpOgorICAgICAgICBmb3IgbmFtZSBpbiBjbHMuX19kaWN0X18ua2V5cygpOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGdldGF0dHIoaW5zdCwgbmFtZSkpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGZvciBiYXNlY2xzIGluIGNscy5fX2Jhc2VzX186CisgICAgICAgICAgICBzZWxmLl9hZGRtZXRob2RzKHNlbGYsIGluc3QsIGJhc2VjbHMpCisgICAgZGVmIHdyaXRlZnJhbWVzcmF3KHNlbGYsIGZyYW1lcyk6CisgICAgICAgIHNlbGYuX2J1ZmZlci5hcHBlbmQoZnJhbWVzKQorICAgICAgICBzZWxmLl9maWxsZWQgPSBzZWxmLl9maWxsZWQgKyBsZW4oZnJhbWVzKQorICAgICAgICBpZiBzZWxmLl9maWxsZWQgPj0gUVNJWkU6CisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICBkZWYgd2FpdChzZWxmKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHNlbGYuX2Jhc2Uud2FpdCgpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwcmludCAnZmx1c2g6ICVkIGJsb2NrcywgJWQgYnl0ZXMnICUgKGxlbihzZWxmLl9idWZmZXIpLCBzZWxmLl9maWxsZWQpCisgICAgICAgIGlmIHNlbGYuX2J1ZmZlcjoKKyAgICAgICAgICAgIGltcG9ydCBzdHJpbmcKKyAgICAgICAgICAgIHNlbGYuX2Jhc2Uud3JpdGVmcmFtZXMoc3RyaW5nLmpvaW5maWVsZHMoc2VsZi5fYnVmZmVyLCAnJykpCisgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSBbXQorICAgICAgICAgICAgc2VsZi5fZmlsbGVkID0gMAogCiBkZWYgbWFpbihhcmdzID0gc3lzLmFyZ3ZbMTpdKToKLQlpbXBvcnQgZ2V0b3B0LCBzdHJpbmcKLQl0cnk6Ci0JCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3MsICdvOnA6JykKLQlleGNlcHQgZ2V0b3B0LmVycm9yOgotCQlzeXMuc3RkZXJyLndyaXRlKCdVc2FnZSAnICsgc3lzLmFyZ3ZbMF0gKwotCQkJCSAnIFsgLW8gb3V0ZmlsZSBdIFsgYXJncyBdIC4uLlxuJykKLQkJc3lzLmV4aXQoMSkKLQlkZXYgPSBOb25lCi0JZm9yIG8sIGEgaW4gb3B0czoKLQkJaWYgbyA9PSAnLW8nOgotCQkJaW1wb3J0IGFpZmMKLQkJCWRldiA9IGFpZmMub3BlbihhLCAndycpCi0JCQlkZXYuc2V0ZnJhbWVyYXRlKEZSQU1FUkFURSkKLQkJCWRldi5zZXRzYW1wd2lkdGgoU0FNUFdJRFRIKQotCQkJZGV2LnNldG5jaGFubmVscygxKQotCQlpZiBvID09ICctcCc6Ci0JCQlta3dhdmUoc3RyaW5nLmF0b2koYSkpCi0JaWYgbm90IGRldjoKLQkJZGV2ID0gQnVmZmVyZWRBdWRpb0RldigpCi0JCWRldi5zZXRvdXRyYXRlKEZSQU1FUkFURSkKLQkJZGV2LnNldHNhbXB3aWR0aChTQU1QV0lEVEgpCi0JCWRldi5zZXRuY2hhbm5lbHMoMSkKLQkJZGV2LmNsb3NlID0gZGV2LnN0b3AKLQlpZiBhcmdzOgotCQlsaW5lID0gc3RyaW5nLmpvaW4oYXJncykKLQllbHNlOgotCQlsaW5lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKLQl3aGlsZSBsaW5lOgotCQlwcmludCBsaW5lCi0JCW1saW5lID0gbW9yc2UobGluZSkKLQkJcHJpbnQgbWxpbmUKLQkJcGxheShtbGluZSwgZGV2KQotCQlpZiBoYXNhdHRyKGRldiwgJ3dhaXQnKToKLQkJCWRldi53YWl0KCkKLQkJaWYgbm90IGFyZ3M6Ci0JCQlsaW5lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKLQkJZWxzZToKLQkJCWxpbmUgPSAnJwotCWRldi5jbG9zZSgpCisgICAgaW1wb3J0IGdldG9wdCwgc3RyaW5nCisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCAnbzpwOicpCisgICAgZXhjZXB0IGdldG9wdC5lcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnVXNhZ2UgJyArIHN5cy5hcmd2WzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIFsgLW8gb3V0ZmlsZSBdIFsgYXJncyBdIC4uLlxuJykKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBkZXYgPSBOb25lCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLW8nOgorICAgICAgICAgICAgaW1wb3J0IGFpZmMKKyAgICAgICAgICAgIGRldiA9IGFpZmMub3BlbihhLCAndycpCisgICAgICAgICAgICBkZXYuc2V0ZnJhbWVyYXRlKEZSQU1FUkFURSkKKyAgICAgICAgICAgIGRldi5zZXRzYW1wd2lkdGgoU0FNUFdJRFRIKQorICAgICAgICAgICAgZGV2LnNldG5jaGFubmVscygxKQorICAgICAgICBpZiBvID09ICctcCc6CisgICAgICAgICAgICBta3dhdmUoc3RyaW5nLmF0b2koYSkpCisgICAgaWYgbm90IGRldjoKKyAgICAgICAgZGV2ID0gQnVmZmVyZWRBdWRpb0RldigpCisgICAgICAgIGRldi5zZXRvdXRyYXRlKEZSQU1FUkFURSkKKyAgICAgICAgZGV2LnNldHNhbXB3aWR0aChTQU1QV0lEVEgpCisgICAgICAgIGRldi5zZXRuY2hhbm5lbHMoMSkKKyAgICAgICAgZGV2LmNsb3NlID0gZGV2LnN0b3AKKyAgICBpZiBhcmdzOgorICAgICAgICBsaW5lID0gc3RyaW5nLmpvaW4oYXJncykKKyAgICBlbHNlOgorICAgICAgICBsaW5lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKyAgICB3aGlsZSBsaW5lOgorICAgICAgICBwcmludCBsaW5lCisgICAgICAgIG1saW5lID0gbW9yc2UobGluZSkKKyAgICAgICAgcHJpbnQgbWxpbmUKKyAgICAgICAgcGxheShtbGluZSwgZGV2KQorICAgICAgICBpZiBoYXNhdHRyKGRldiwgJ3dhaXQnKToKKyAgICAgICAgICAgIGRldi53YWl0KCkKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICBsaW5lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpbmUgPSAnJworICAgIGRldi5jbG9zZSgpCiAKICMgQ29udmVydCBhIHN0cmluZyB0byBtb3JzZSBjb2RlIHdpdGggXDAwMSBiZXR3ZWVuIHRoZSBjaGFyYWN0ZXJzIGluCiAjIHRoZSBzdHJpbmcuCiBkZWYgbW9yc2UobGluZSk6Ci0JcmVzID0gJycKLQlmb3IgYyBpbiBsaW5lOgotCQl0cnk6Ci0JCQlyZXMgPSByZXMgKyBtb3JzZXRhYltjXSArICdcMDAxJwotCQlleGNlcHQgS2V5RXJyb3I6Ci0JCQlwYXNzCi0JcmV0dXJuIHJlcworICAgIHJlcyA9ICcnCisgICAgZm9yIGMgaW4gbGluZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzID0gcmVzICsgbW9yc2V0YWJbY10gKyAnXDAwMScKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgIHJldHVybiByZXMKIAogIyBQbGF5IGEgbGluZSBvZiBtb3JzZSBjb2RlLgogZGVmIHBsYXkobGluZSwgZGV2KToKLQlmb3IgYyBpbiBsaW5lOgotCQlpZiBjID09ICcuJzoKLQkJCXNpbmUoZGV2LCBET1QpCi0JCWVsaWYgYyA9PSAnLSc6Ci0JCQlzaW5lKGRldiwgREFIKQotCQllbHNlOgotCQkJcGF1c2UoZGV2LCBEQUgpCi0JCXBhdXNlKGRldiwgRE9UKQorICAgIGZvciBjIGluIGxpbmU6CisgICAgICAgIGlmIGMgPT0gJy4nOgorICAgICAgICAgICAgc2luZShkZXYsIERPVCkKKyAgICAgICAgZWxpZiBjID09ICctJzoKKyAgICAgICAgICAgIHNpbmUoZGV2LCBEQUgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXVzZShkZXYsIERBSCkKKyAgICAgICAgcGF1c2UoZGV2LCBET1QpCiAKIGRlZiBzaW5lKGRldiwgbGVuZ3RoKToKLQlkZXYud3JpdGVmcmFtZXNyYXcoc2luZXdhdmUqbGVuZ3RoKQorICAgIGRldi53cml0ZWZyYW1lc3JhdyhzaW5ld2F2ZSpsZW5ndGgpCiAKIGRlZiBwYXVzZShkZXYsIGxlbmd0aCk6Ci0JZGV2LndyaXRlZnJhbWVzcmF3KG5vd2F2ZSpsZW5ndGgpCisgICAgZGV2LndyaXRlZnJhbWVzcmF3KG5vd2F2ZSpsZW5ndGgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXycgb3Igc3lzLmFyZ3ZbMF0gPT0gX19uYW1lX186Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvRGVtby9zb3VuZC9tb3JzZWxpYi5weSBiL01hYy9EZW1vL3NvdW5kL21vcnNlbGliLnB5CmluZGV4IDZmOGVlZDYuLjk4ZTI1OTAgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL3NvdW5kL21vcnNlbGliLnB5CisrKyBiL01hYy9EZW1vL3NvdW5kL21vcnNlbGliLnB5CkBAIC0xMCwxNzkgKzEwLDE3OSBAQAogREFIID0gODAKIAogbW9yc2V0YWIgPSB7Ci0JJ2EnOiAnLi0nLAotCSdiJzogJy0uLi4nLAotCSdjJzogJy0uLS4nLAotCSdkJzogJy0uLicsCi0JJ2UnOiAnLicsCi0JJ2YnOiAnLi4tLicsCi0JJ2cnOiAnLS0uJywKLQknaCc6ICcuLi4uJywKLQknaSc6ICcuLicsCi0JJ2onOiAnLi0tLScsCi0JJ2snOiAnLS4tJywKLQknbCc6ICcuLS4uJywKLQknbSc6ICctLScsCi0JJ24nOiAnLS4nLAotCSdvJzogJy0tLScsCi0JJ3AnOiAnLi0tLicsCi0JJ3EnOiAnLS0uLScsCi0JJ3InOiAnLi0uJywKLQkncyc6ICcuLi4nLAotCSd0JzogJy0nLAotCSd1JzogJy4uLScsCi0JJ3YnOiAnLi4uLScsCi0JJ3cnOiAnLi0tJywKLQkneCc6ICctLi4tJywKLQkneSc6ICctLi0tJywKLQkneic6ICctLS4uJywKLQknMCc6ICctLS0tLScsCi0JJzEnOiAnLi0tLS0nLAotCScyJzogJy4uLS0tJywKLQknMyc6ICcuLi4tLScsCi0JJzQnOiAnLi4uLi0nLAotCSc1JzogJy4uLi4uJywKLQknNic6ICctLi4uLicsCi0JJzcnOiAnLS0uLi4nLAotCSc4JzogJy0tLS4uJywKLQknOSc6ICctLS0tLicsCi0JJywnOiAnLS0uLi0tJywKLQknLic6ICcuLS4tLi0nLAotCSc/JzogJy4uLS0uLicsCi0JJzsnOiAnLS4tLi0uJywKLQknOic6ICctLS0uLi4nLAotCSInIjogJy4tLS0tLicsCi0JJy0nOiAnLS4uLi4tJywKLQknLyc6ICctLi4tLicsCi0JJygnOiAnLS4tLS4tJywKLQknKSc6ICctLi0tLi0nLCAjIFhYWCBzYW1lIGFzIGNvZGUgZm9yICcoJyA/Pz8KLQknXyc6ICcuLi0tLi0nLAotCScgJzogJyAnCisgICAgICAgICdhJzogJy4tJywKKyAgICAgICAgJ2InOiAnLS4uLicsCisgICAgICAgICdjJzogJy0uLS4nLAorICAgICAgICAnZCc6ICctLi4nLAorICAgICAgICAnZSc6ICcuJywKKyAgICAgICAgJ2YnOiAnLi4tLicsCisgICAgICAgICdnJzogJy0tLicsCisgICAgICAgICdoJzogJy4uLi4nLAorICAgICAgICAnaSc6ICcuLicsCisgICAgICAgICdqJzogJy4tLS0nLAorICAgICAgICAnayc6ICctLi0nLAorICAgICAgICAnbCc6ICcuLS4uJywKKyAgICAgICAgJ20nOiAnLS0nLAorICAgICAgICAnbic6ICctLicsCisgICAgICAgICdvJzogJy0tLScsCisgICAgICAgICdwJzogJy4tLS4nLAorICAgICAgICAncSc6ICctLS4tJywKKyAgICAgICAgJ3InOiAnLi0uJywKKyAgICAgICAgJ3MnOiAnLi4uJywKKyAgICAgICAgJ3QnOiAnLScsCisgICAgICAgICd1JzogJy4uLScsCisgICAgICAgICd2JzogJy4uLi0nLAorICAgICAgICAndyc6ICcuLS0nLAorICAgICAgICAneCc6ICctLi4tJywKKyAgICAgICAgJ3knOiAnLS4tLScsCisgICAgICAgICd6JzogJy0tLi4nLAorICAgICAgICAnMCc6ICctLS0tLScsCisgICAgICAgICcxJzogJy4tLS0tJywKKyAgICAgICAgJzInOiAnLi4tLS0nLAorICAgICAgICAnMyc6ICcuLi4tLScsCisgICAgICAgICc0JzogJy4uLi4tJywKKyAgICAgICAgJzUnOiAnLi4uLi4nLAorICAgICAgICAnNic6ICctLi4uLicsCisgICAgICAgICc3JzogJy0tLi4uJywKKyAgICAgICAgJzgnOiAnLS0tLi4nLAorICAgICAgICAnOSc6ICctLS0tLicsCisgICAgICAgICcsJzogJy0tLi4tLScsCisgICAgICAgICcuJzogJy4tLi0uLScsCisgICAgICAgICc/JzogJy4uLS0uLicsCisgICAgICAgICc7JzogJy0uLS4tLicsCisgICAgICAgICc6JzogJy0tLS4uLicsCisgICAgICAgICInIjogJy4tLS0tLicsCisgICAgICAgICctJzogJy0uLi4uLScsCisgICAgICAgICcvJzogJy0uLi0uJywKKyAgICAgICAgJygnOiAnLS4tLS4tJywKKyAgICAgICAgJyknOiAnLS4tLS4tJywgIyBYWFggc2FtZSBhcyBjb2RlIGZvciAnKCcgPz8/CisgICAgICAgICdfJzogJy4uLS0uLScsCisgICAgICAgICcgJzogJyAnCiB9CiAKIGRlZiBtb3JzZWNvZGUocyk6Ci0JZnJvbSBzdHJpbmcgaW1wb3J0IGxvd2VyCi0JbSA9ICcnCi0JZm9yIGMgaW4gczoKLQkJYyA9IGxvd2VyKGMpCi0JCWlmIG1vcnNldGFiLmhhc19rZXkoYyk6Ci0JCQljID0gbW9yc2V0YWJbY10gKyAnICcKLQkJZWxzZToKLQkJCWMgPSAnPyAnCi0JCW0gPSBtICsgYwotCXJldHVybiBtCisgICAgZnJvbSBzdHJpbmcgaW1wb3J0IGxvd2VyCisgICAgbSA9ICcnCisgICAgZm9yIGMgaW4gczoKKyAgICAgICAgYyA9IGxvd2VyKGMpCisgICAgICAgIGlmIG1vcnNldGFiLmhhc19rZXkoYyk6CisgICAgICAgICAgICBjID0gbW9yc2V0YWJbY10gKyAnICcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGMgPSAnPyAnCisgICAgICAgIG0gPSBtICsgYworICAgIHJldHVybiBtCiAKIAogY2xhc3MgQmFzZU1vcnNlOgotCSJiYXNlIGNsYXNzIGZvciBtb3JzZSB0cmFuc21pc3Npb25zIiAKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCSJjb25zdHJ1Y3RvciIKLQkJc2VsZi5kb3RzID0gRE9UCi0JCXNlbGYuZGFocyA9IERBSAotCQotCWRlZiBub2lzZShzZWxmLCBkdXJhdGlvbik6Ci0JCSJiZWVwIGZvciBnaXZlbiBkdXJhdGlvbiIKLQkJcGFzcwotCQotCWRlZiBwYXVzZShzZWxmLCBkdXJhdGlvbik6Ci0JCSJwYXVzZSBmb3IgZ2l2ZW4gZHVyYXRpb24iCi0JCXBhc3MKLQkKLQlkZWYgZG90KHNlbGYpOgotCQkic2hvcnQgYmVlcCIKLQkJc2VsZi5ub2lzZShzZWxmLmRvdHMpCi0JCi0JZGVmIGRhaChzZWxmKToKLQkJImxvbmcgYmVlcCIKLQkJc2VsZi5ub2lzZShzZWxmLmRhaHMpCi0JCi0JZGVmIHBkb3Qoc2VsZik6Ci0JCSJwYXVzZSBhcyBsb25nIGFzIGEgZG90IgotCQlzZWxmLnBhdXNlKHNlbGYuZG90cykKLQkKLQlkZWYgcGRhaChzZWxmKToKLQkJInBhdXNlIGFzIGxvbmcgYXMgYSBkYWgiCi0JCXNlbGYucGF1c2Uoc2VsZi5kYWhzKQotCQotCWRlZiBzZW5kbW9yc2Uoc2VsZiwgcyk6Ci0JCWZvciBjIGluIHM6Ci0JCQlpZiBjID09ICcuJzogc2VsZi5kb3QoKQotCQkJZWxpZiBjID09ICctJzogc2VsZi5kYWgoKQotCQkJZWxzZTogc2VsZi5wZGFoKCkKLQkJCXNlbGYucGRvdCgpCi0JCi0JZGVmIHNlbmRhc2NpaShzZWxmLCBzKToKLQkJc2VsZi5zZW5kbW9yc2UobW9yc2Vjb2RlKHMpKQotCQotCWRlZiBzZW5kKHNlbGYsIHMpOgotCQlzZWxmLnNlbmRhc2NpaShzKQorICAgICJiYXNlIGNsYXNzIGZvciBtb3JzZSB0cmFuc21pc3Npb25zIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAiY29uc3RydWN0b3IiCisgICAgICAgIHNlbGYuZG90cyA9IERPVAorICAgICAgICBzZWxmLmRhaHMgPSBEQUgKKworICAgIGRlZiBub2lzZShzZWxmLCBkdXJhdGlvbik6CisgICAgICAgICJiZWVwIGZvciBnaXZlbiBkdXJhdGlvbiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIHBhdXNlKHNlbGYsIGR1cmF0aW9uKToKKyAgICAgICAgInBhdXNlIGZvciBnaXZlbiBkdXJhdGlvbiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIGRvdChzZWxmKToKKyAgICAgICAgInNob3J0IGJlZXAiCisgICAgICAgIHNlbGYubm9pc2Uoc2VsZi5kb3RzKQorCisgICAgZGVmIGRhaChzZWxmKToKKyAgICAgICAgImxvbmcgYmVlcCIKKyAgICAgICAgc2VsZi5ub2lzZShzZWxmLmRhaHMpCisKKyAgICBkZWYgcGRvdChzZWxmKToKKyAgICAgICAgInBhdXNlIGFzIGxvbmcgYXMgYSBkb3QiCisgICAgICAgIHNlbGYucGF1c2Uoc2VsZi5kb3RzKQorCisgICAgZGVmIHBkYWgoc2VsZik6CisgICAgICAgICJwYXVzZSBhcyBsb25nIGFzIGEgZGFoIgorICAgICAgICBzZWxmLnBhdXNlKHNlbGYuZGFocykKKworICAgIGRlZiBzZW5kbW9yc2Uoc2VsZiwgcyk6CisgICAgICAgIGZvciBjIGluIHM6CisgICAgICAgICAgICBpZiBjID09ICcuJzogc2VsZi5kb3QoKQorICAgICAgICAgICAgZWxpZiBjID09ICctJzogc2VsZi5kYWgoKQorICAgICAgICAgICAgZWxzZTogc2VsZi5wZGFoKCkKKyAgICAgICAgICAgIHNlbGYucGRvdCgpCisKKyAgICBkZWYgc2VuZGFzY2lpKHNlbGYsIHMpOgorICAgICAgICBzZWxmLnNlbmRtb3JzZShtb3JzZWNvZGUocykpCisKKyAgICBkZWYgc2VuZChzZWxmLCBzKToKKyAgICAgICAgc2VsZi5zZW5kYXNjaWkocykKIAogCiBpbXBvcnQgQXVkaW9fbWFjCiBjbGFzcyBNeUF1ZGlvKEF1ZGlvX21hYy5QbGF5X0F1ZGlvX21hYyk6Ci0JZGVmIF9jYWxsYmFjayhzZWxmLCAqYXJncyk6Ci0JCWlmIGhhc2F0dHIoc2VsZiwgJ3VzZXJjYWxsYmFjaycpOiBzZWxmLnVzZXJjYWxsYmFjaygpCi0JCWFwcGx5KEF1ZGlvX21hYy5QbGF5X0F1ZGlvX21hYy5fY2FsbGJhY2ssIChzZWxmLCkgKyBhcmdzKQorICAgIGRlZiBfY2FsbGJhY2soc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICd1c2VyY2FsbGJhY2snKTogc2VsZi51c2VyY2FsbGJhY2soKQorICAgICAgICBhcHBseShBdWRpb19tYWMuUGxheV9BdWRpb19tYWMuX2NhbGxiYWNrLCAoc2VsZiwpICsgYXJncykKIAogCiBjbGFzcyBNYWNNb3JzZShCYXNlTW9yc2UpOgotCSJNYWMgc3BlY2lmaWMgY2xhc3MgdG8gcGxheSBNb3JzZSBjb2RlIgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJQmFzZU1vcnNlLl9faW5pdF9fKHNlbGYpCi0JCXNlbGYuZGV2ID0gTXlBdWRpbygpCi0JCXNlbGYuZGV2LnNldG91dHJhdGUoRlJBTUVSQVRFKQotCQlzZWxmLmRldi5zZXRzYW1wd2lkdGgoU0FNUFdJRFRIKQotCQlzZWxmLmRldi5zZXRuY2hhbm5lbHMoMSkKLQkJc2VsZi5kZXYudXNlcmNhbGxiYWNrID0gc2VsZi51c2VyY2FsbGJhY2sKLQkJc2luZXdhdmUgPSAnJwotCQluID0gaW50KEZSQU1FUkFURSAvIEJBU0VGUkVRKQotCQlvY3RhdmUgPSBPQ1RBVkUKLQkJZnJvbSBtYXRoIGltcG9ydCBzaW4sIHBpCi0JCWZvciBpIGluIHJhbmdlKG4pOgotCQkJdmFsID0gaW50KHNpbigyICogcGkgKiBpICogb2N0YXZlIC8gbikgKiAweDdmZmYpCi0JCQlzYW1wbGUgPSBjaHIoKHZhbCA+PiA4KSAmIDI1NSkgKyBjaHIodmFsICYgMjU1KQotCQkJc2luZXdhdmUgPSBzaW5ld2F2ZSArIHNhbXBsZVs6U0FNUFdJRFRIXQotCQlzZWxmLnNpbmV3YXZlID0gc2luZXdhdmUKLQkJc2VsZi5zaWxlbmNlID0gJ1wwJyAqIChuKlNBTVBXSURUSCkKLQkJc2VsZi5tb3JzZXF1ZXVlID0gJycKLQkKLQlkZWYgX19kZWxfXyhzZWxmKToKLQkJc2VsZi5jbG9zZSgpCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlzZWxmLmRldiA9IE5vbmUKLQkKLQlkZWYgcGF1c2Uoc2VsZiwgZHVyYXRpb24pOgotCQlzZWxmLmRldi53cml0ZWZyYW1lcyhzZWxmLnNpbGVuY2UgKiBkdXJhdGlvbikKLQkKLQlkZWYgbm9pc2Uoc2VsZiwgZHVyYXRpb24pOgotCQlzZWxmLmRldi53cml0ZWZyYW1lcyhzZWxmLnNpbmV3YXZlICogZHVyYXRpb24pCi0JCi0JZGVmIHNlbmRtb3JzZShzZWxmLCBzKToKLQkJc2VsZi5tb3JzZXF1ZXVlID0gc2VsZi5tb3JzZXF1ZXVlICsgcwotCQlzZWxmLmRldi51c2VyY2FsbGJhY2soKQotCQlzZWxmLmRldi51c2VyY2FsbGJhY2soKQotCQlzZWxmLmRldi51c2VyY2FsbGJhY2soKQotCQotCWRlZiB1c2VyY2FsbGJhY2soc2VsZik6Ci0JCWlmIHNlbGYubW9yc2VxdWV1ZToKLQkJCWMsIHNlbGYubW9yc2VxdWV1ZSA9IHNlbGYubW9yc2VxdWV1ZVswXSwgc2VsZi5tb3JzZXF1ZXVlWzE6XQotCQkJaWYgYyA9PSAnLic6IHNlbGYuZG90KCkKLQkJCWVsaWYgYyA9PSAnLSc6IHNlbGYuZGFoKCkKLQkJCWVsc2U6IHNlbGYucGRhaCgpCi0JCQlzZWxmLnBkb3QoKQorICAgICJNYWMgc3BlY2lmaWMgY2xhc3MgdG8gcGxheSBNb3JzZSBjb2RlIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBCYXNlTW9yc2UuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5kZXYgPSBNeUF1ZGlvKCkKKyAgICAgICAgc2VsZi5kZXYuc2V0b3V0cmF0ZShGUkFNRVJBVEUpCisgICAgICAgIHNlbGYuZGV2LnNldHNhbXB3aWR0aChTQU1QV0lEVEgpCisgICAgICAgIHNlbGYuZGV2LnNldG5jaGFubmVscygxKQorICAgICAgICBzZWxmLmRldi51c2VyY2FsbGJhY2sgPSBzZWxmLnVzZXJjYWxsYmFjaworICAgICAgICBzaW5ld2F2ZSA9ICcnCisgICAgICAgIG4gPSBpbnQoRlJBTUVSQVRFIC8gQkFTRUZSRVEpCisgICAgICAgIG9jdGF2ZSA9IE9DVEFWRQorICAgICAgICBmcm9tIG1hdGggaW1wb3J0IHNpbiwgcGkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgICAgICB2YWwgPSBpbnQoc2luKDIgKiBwaSAqIGkgKiBvY3RhdmUgLyBuKSAqIDB4N2ZmZikKKyAgICAgICAgICAgIHNhbXBsZSA9IGNocigodmFsID4+IDgpICYgMjU1KSArIGNocih2YWwgJiAyNTUpCisgICAgICAgICAgICBzaW5ld2F2ZSA9IHNpbmV3YXZlICsgc2FtcGxlWzpTQU1QV0lEVEhdCisgICAgICAgIHNlbGYuc2luZXdhdmUgPSBzaW5ld2F2ZQorICAgICAgICBzZWxmLnNpbGVuY2UgPSAnXDAnICogKG4qU0FNUFdJRFRIKQorICAgICAgICBzZWxmLm1vcnNlcXVldWUgPSAnJworCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmRldiA9IE5vbmUKKworICAgIGRlZiBwYXVzZShzZWxmLCBkdXJhdGlvbik6CisgICAgICAgIHNlbGYuZGV2LndyaXRlZnJhbWVzKHNlbGYuc2lsZW5jZSAqIGR1cmF0aW9uKQorCisgICAgZGVmIG5vaXNlKHNlbGYsIGR1cmF0aW9uKToKKyAgICAgICAgc2VsZi5kZXYud3JpdGVmcmFtZXMoc2VsZi5zaW5ld2F2ZSAqIGR1cmF0aW9uKQorCisgICAgZGVmIHNlbmRtb3JzZShzZWxmLCBzKToKKyAgICAgICAgc2VsZi5tb3JzZXF1ZXVlID0gc2VsZi5tb3JzZXF1ZXVlICsgcworICAgICAgICBzZWxmLmRldi51c2VyY2FsbGJhY2soKQorICAgICAgICBzZWxmLmRldi51c2VyY2FsbGJhY2soKQorICAgICAgICBzZWxmLmRldi51c2VyY2FsbGJhY2soKQorCisgICAgZGVmIHVzZXJjYWxsYmFjayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tb3JzZXF1ZXVlOgorICAgICAgICAgICAgYywgc2VsZi5tb3JzZXF1ZXVlID0gc2VsZi5tb3JzZXF1ZXVlWzBdLCBzZWxmLm1vcnNlcXVldWVbMTpdCisgICAgICAgICAgICBpZiBjID09ICcuJzogc2VsZi5kb3QoKQorICAgICAgICAgICAgZWxpZiBjID09ICctJzogc2VsZi5kYWgoKQorICAgICAgICAgICAgZWxzZTogc2VsZi5wZGFoKCkKKyAgICAgICAgICAgIHNlbGYucGRvdCgpCiAKIAogZGVmIHRlc3QoKToKLQltID0gTWFjTW9yc2UoKQotCXdoaWxlIDE6Ci0JCXRyeToKLQkJCWxpbmUgPSByYXdfaW5wdXQoJ01vcnNlIGxpbmU6ICcpCi0JCWV4Y2VwdCAoRU9GRXJyb3IsIEtleWJvYXJkSW50ZXJydXB0KToKLQkJCWJyZWFrCi0JCW0uc2VuZChsaW5lKQotCQl3aGlsZSBtLm1vcnNlcXVldWU6IHBhc3MKKyAgICBtID0gTWFjTW9yc2UoKQorICAgIHdoaWxlIDE6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmUgPSByYXdfaW5wdXQoJ01vcnNlIGxpbmU6ICcpCisgICAgICAgIGV4Y2VwdCAoRU9GRXJyb3IsIEtleWJvYXJkSW50ZXJydXB0KToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG0uc2VuZChsaW5lKQorICAgICAgICB3aGlsZSBtLm1vcnNlcXVldWU6IHBhc3MKIAogdGVzdCgpCmRpZmYgLS1naXQgYS9NYWMvRGVtby90ZXh0ZWRpdC9wZWQucHkgYi9NYWMvRGVtby90ZXh0ZWRpdC9wZWQucHkKaW5kZXggZWVlODQ4Yi4uM2U5MWIzMiAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vdGV4dGVkaXQvcGVkLnB5CisrKyBiL01hYy9EZW1vL3RleHRlZGl0L3BlZC5weQpAQCAtMTUsMzQ2ICsxNSwzNDUgQEAKIGltcG9ydCBtYWNmcwogCiBjbGFzcyBURVdpbmRvdyhTY3JvbGxlZFdpbmRvdyk6Ci0JZGVmIG9wZW4oc2VsZiwgcGF0aCwgbmFtZSwgZGF0YSk6Ci0JCXNlbGYucGF0aCA9IHBhdGgKLQkJc2VsZi5uYW1lID0gbmFtZQotCQlyID0gd2luZG93Ym91bmRzKDQwMCwgNDAwKQotCQl3ID0gV2luLk5ld1dpbmRvdyhyLCBuYW1lLCAxLCAwLCAtMSwgMSwgMCkKLQkJc2VsZi53aWQgPSB3Ci0JCXgwLCB5MCwgeDEsIHkxID0gc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCb3VuZHMoKQotCQl4MCA9IHgwICsgNAotCQl5MCA9IHkwICsgNAotCQl4MSA9IHgxIC0gMjAKLQkJeTEgPSB5MSAtIDIwCi0JCXZyID0gZHIgPSB4MCwgeTAsIHgxLCB5MQotCQkjI3ZyID0gNCwgMCwgclsyXS1yWzBdLTE1LCByWzNdLXJbMV0tMTUKLQkJIyNkciA9ICgwLCAwLCB2clsyXSwgMCkKLQkJUWQuU2V0UG9ydCh3KQotCQlRZC5UZXh0Rm9udCg0KQotCQlRZC5UZXh0U2l6ZSg5KQotCQlzZWxmLnRlZCA9IFRFLlRFTmV3KGRyLCB2cikKLQkJc2VsZi50ZWQuVEVBdXRvVmlldygxKQotCQlzZWxmLnRlZC5URVNldFRleHQoZGF0YSkKLQkJdy5EcmF3R3Jvd0ljb24oKQotCQlzZWxmLnNjcm9sbGJhcnMoKQotCQlzZWxmLmNoYW5nZWQgPSAwCi0JCXNlbGYuZG9fcG9zdG9wZW4oKQotCQlzZWxmLmRvX2FjdGl2YXRlKDEsIE5vbmUpCi0JCQotCWRlZiBkb19pZGxlKHNlbGYpOgotCQlzZWxmLnRlZC5URUlkbGUoKQotCQkKLQlkZWYgZ2V0c2Nyb2xsYmFydmFsdWVzKHNlbGYpOgotCQlkciA9IHNlbGYudGVkLmRlc3RSZWN0Ci0JCXZyID0gc2VsZi50ZWQudmlld1JlY3QKLQkJaGVpZ2h0ID0gc2VsZi50ZWQubkxpbmVzICogc2VsZi50ZWQubGluZUhlaWdodAotCQl2eCA9IHNlbGYuc2NhbGViYXJ2YWx1ZShkclswXSwgZHJbMl0tZHJbMF0sIHZyWzBdLCB2clsyXSkKLQkJdnkgPSBzZWxmLnNjYWxlYmFydmFsdWUoZHJbMV0sIGRyWzFdK2hlaWdodCwgdnJbMV0sIHZyWzNdKQotCQlwcmludCBkciwgdnIsIGhlaWdodCwgdngsIHZ5Ci0JCXJldHVybiBOb25lLCB2eQotCQkKLQlkZWYgc2Nyb2xsYmFyX2NhbGxiYWNrKHNlbGYsIHdoaWNoLCB3aGF0LCB2YWx1ZSk6Ci0JCWlmIHdoaWNoID09ICd5JzoKLQkJCWlmIHdoYXQgPT0gJ3NldCc6Ci0JCQkJaGVpZ2h0ID0gc2VsZi50ZWQubkxpbmVzICogc2VsZi50ZWQubGluZUhlaWdodAotCQkJCWN1ciA9IHNlbGYuZ2V0c2Nyb2xsYmFydmFsdWVzKClbMV0KLQkJCQlkZWx0YSA9IChjdXItdmFsdWUpKmhlaWdodC8zMjc2NwotCQkJaWYgd2hhdCA9PSAnLSc6Ci0JCQkJZGVsdGEgPSBzZWxmLnRlZC5saW5lSGVpZ2h0Ci0JCQllbGlmIHdoYXQgPT0gJy0tJzoKLQkJCQlkZWx0YSA9IChzZWxmLnRlZC52aWV3UmVjdFszXS1zZWxmLnRlZC5saW5lSGVpZ2h0KQotCQkJCWlmIGRlbHRhIDw9IDA6Ci0JCQkJCWRlbHRhID0gc2VsZi50ZWQubGluZUhlaWdodAotCQkJZWxpZiB3aGF0ID09ICcrJzoKLQkJCQlkZWx0YSA9IC1zZWxmLnRlZC5saW5lSGVpZ2h0Ci0JCQllbGlmIHdoYXQgPT0gJysrJzoKLQkJCQlkZWx0YSA9IC0oc2VsZi50ZWQudmlld1JlY3RbM10tc2VsZi50ZWQubGluZUhlaWdodCkKLQkJCQlpZiBkZWx0YSA+PSAwOgotCQkJCQlkZWx0YSA9IC1zZWxmLnRlZC5saW5lSGVpZ2h0Ci0JCQlzZWxmLnRlZC5URVBpblNjcm9sbCgwLCBkZWx0YSkKLQkJCXByaW50ICdTQ1JPTEwgWScsIGRlbHRhCi0JCWVsc2U6Ci0JCQlwYXNzICMgTm8gaG9yaXpvbnRhbCBzY3JvbGxpbmcKLQkJCi0JZGVmIGRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpOgotCQlwcmludCAiQUNUSVZBVEUiLCBvbm9mZgotCQlTY3JvbGxlZFdpbmRvdy5kb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KQotCQlpZiBvbm9mZjoKLQkJCXNlbGYudGVkLlRFQWN0aXZhdGUoKQotCQkJc2VsZi5wYXJlbnQuYWN0aXZlID0gc2VsZgotCQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCWVsc2U6Ci0JCQlzZWxmLnRlZC5URURlYWN0aXZhdGUoKQorICAgIGRlZiBvcGVuKHNlbGYsIHBhdGgsIG5hbWUsIGRhdGEpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgciA9IHdpbmRvd2JvdW5kcyg0MDAsIDQwMCkKKyAgICAgICAgdyA9IFdpbi5OZXdXaW5kb3cociwgbmFtZSwgMSwgMCwgLTEsIDEsIDApCisgICAgICAgIHNlbGYud2lkID0gdworICAgICAgICB4MCwgeTAsIHgxLCB5MSA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qm91bmRzKCkKKyAgICAgICAgeDAgPSB4MCArIDQKKyAgICAgICAgeTAgPSB5MCArIDQKKyAgICAgICAgeDEgPSB4MSAtIDIwCisgICAgICAgIHkxID0geTEgLSAyMAorICAgICAgICB2ciA9IGRyID0geDAsIHkwLCB4MSwgeTEKKyAgICAgICAgIyN2ciA9IDQsIDAsIHJbMl0tclswXS0xNSwgclszXS1yWzFdLTE1CisgICAgICAgICMjZHIgPSAoMCwgMCwgdnJbMl0sIDApCisgICAgICAgIFFkLlNldFBvcnQodykKKyAgICAgICAgUWQuVGV4dEZvbnQoNCkKKyAgICAgICAgUWQuVGV4dFNpemUoOSkKKyAgICAgICAgc2VsZi50ZWQgPSBURS5URU5ldyhkciwgdnIpCisgICAgICAgIHNlbGYudGVkLlRFQXV0b1ZpZXcoMSkKKyAgICAgICAgc2VsZi50ZWQuVEVTZXRUZXh0KGRhdGEpCisgICAgICAgIHcuRHJhd0dyb3dJY29uKCkKKyAgICAgICAgc2VsZi5zY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMAorICAgICAgICBzZWxmLmRvX3Bvc3RvcGVuKCkKKyAgICAgICAgc2VsZi5kb19hY3RpdmF0ZSgxLCBOb25lKQogCi0JZGVmIGRvX3VwZGF0ZShzZWxmLCB3aWQsIGV2ZW50KToKLQkJUWQuRXJhc2VSZWN0KHdpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpKQotCQlzZWxmLnRlZC5URVVwZGF0ZSh3aWQuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCb3VuZHMoKSkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJCi0JZGVmIGRvX2NvbnRlbnRjbGljayhzZWxmLCBsb2NhbCwgbW9kaWZpZXJzLCBldnQpOgotCQlzaGlmdGVkID0gKG1vZGlmaWVycyAmIDB4MjAwKQotCQlzZWxmLnRlZC5URUNsaWNrKGxvY2FsLCBzaGlmdGVkKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKyAgICBkZWYgZG9faWRsZShzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuVEVJZGxlKCkKIAotCWRlZiBkb19jaGFyKHNlbGYsIGNoLCBldmVudCk6Ci0JCXNlbGYudGVkLlRFU2VsVmlldygpCi0JCXNlbGYudGVkLlRFS2V5KG9yZChjaCkpCi0JCXNlbGYuY2hhbmdlZCA9IDEKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgc2VsZi5jaGFuZ2VkOgotCQkJc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlIHdpbmRvdyAiJXMiIGJlZm9yZSBjbG9zaW5nPyclc2VsZi5uYW1lLCAxKQotCQkJaWYgc2F2ZSA+IDA6Ci0JCQkJc2VsZi5tZW51X3NhdmUoKQotCQkJZWxpZiBzYXZlIDwgMDoKLQkJCQlyZXR1cm4KLQkJaWYgc2VsZi5wYXJlbnQuYWN0aXZlID09IHNlbGY6Ci0JCQlzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQlkZWwgc2VsZi50ZWQKLQkJc2VsZi5kb19wb3N0Y2xvc2UoKQotCQkKLQlkZWYgbWVudV9zYXZlKHNlbGYpOgotCQlpZiBub3Qgc2VsZi5wYXRoOgotCQkJc2VsZi5tZW51X3NhdmVfYXMoKQotCQkJcmV0dXJuICMgV2lsbCBjYWxsIHVzIHJlY3Vyc2l2ZWx5Ci0JCXByaW50ICdTYXZpbmcgdG8gJywgc2VsZi5wYXRoCi0JCWRoYW5kbGUgPSBzZWxmLnRlZC5URUdldFRleHQoKQotCQlkYXRhID0gZGhhbmRsZS5kYXRhCi0JCWZwID0gb3BlbihzZWxmLnBhdGgsICd3YicpICAjIE5PVEU6IHdiLCBiZWNhdXNlIGRhdGEgaGFzIENSIGZvciBlbmQtb2YtbGluZQotCQlmcC53cml0ZShkYXRhKQotCQlpZiBkYXRhWy0xXSA8PiAnXHInOiBmcC53cml0ZSgnXHInKQotCQlmcC5jbG9zZSgpCi0JCXNlbGYuY2hhbmdlZCA9IDAKLQkJCi0JZGVmIG1lbnVfc2F2ZV9hcyhzZWxmKToKLQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgYXM6JykKLQkJaWYgbm90IHBhdGg6IHJldHVybgotCQlzZWxmLnBhdGggPSBwYXRoCi0JCXNlbGYubmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5wYXRoKVstMV0KLQkJc2VsZi53aWQuU2V0V1RpdGxlKHNlbGYubmFtZSkKLQkJc2VsZi5tZW51X3NhdmUoKQotCQkKLQlkZWYgbWVudV9jdXQoc2VsZik6Ci0JCXNlbGYudGVkLlRFU2VsVmlldygpCi0JCXNlbGYudGVkLlRFQ3V0KCkKLQkJaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgotCQkJU2NyYXAuWmVyb1NjcmFwKCkKLQkJZWxzZToKLQkJCVNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKLQkJVEUuVEVUb1NjcmFwKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCXNlbGYuY2hhbmdlZCA9IDEKLQkJCi0JZGVmIG1lbnVfY29weShzZWxmKToKLQkJc2VsZi50ZWQuVEVDb3B5KCkKLQkJaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgotCQkJU2NyYXAuWmVyb1NjcmFwKCkKLQkJZWxzZToKLQkJCVNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKLQkJVEUuVEVUb1NjcmFwKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBtZW51X3Bhc3RlKHNlbGYpOgotCQlURS5URUZyb21TY3JhcCgpCi0JCXNlbGYudGVkLlRFU2VsVmlldygpCi0JCXNlbGYudGVkLlRFUGFzdGUoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJc2VsZi5jaGFuZ2VkID0gMQotCQkKLQlkZWYgbWVudV9jbGVhcihzZWxmKToKLQkJc2VsZi50ZWQuVEVTZWxWaWV3KCkKLQkJc2VsZi50ZWQuVEVEZWxldGUoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJc2VsZi5jaGFuZ2VkID0gMQotCQkKLQlkZWYgaGF2ZV9zZWxlY3Rpb24oc2VsZik6Ci0JCXJldHVybiAoc2VsZi50ZWQuc2VsU3RhcnQgPCBzZWxmLnRlZC5zZWxFbmQpCisgICAgZGVmIGdldHNjcm9sbGJhcnZhbHVlcyhzZWxmKToKKyAgICAgICAgZHIgPSBzZWxmLnRlZC5kZXN0UmVjdAorICAgICAgICB2ciA9IHNlbGYudGVkLnZpZXdSZWN0CisgICAgICAgIGhlaWdodCA9IHNlbGYudGVkLm5MaW5lcyAqIHNlbGYudGVkLmxpbmVIZWlnaHQKKyAgICAgICAgdnggPSBzZWxmLnNjYWxlYmFydmFsdWUoZHJbMF0sIGRyWzJdLWRyWzBdLCB2clswXSwgdnJbMl0pCisgICAgICAgIHZ5ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzFdLCBkclsxXStoZWlnaHQsIHZyWzFdLCB2clszXSkKKyAgICAgICAgcHJpbnQgZHIsIHZyLCBoZWlnaHQsIHZ4LCB2eQorICAgICAgICByZXR1cm4gTm9uZSwgdnkKKworICAgIGRlZiBzY3JvbGxiYXJfY2FsbGJhY2soc2VsZiwgd2hpY2gsIHdoYXQsIHZhbHVlKToKKyAgICAgICAgaWYgd2hpY2ggPT0gJ3knOgorICAgICAgICAgICAgaWYgd2hhdCA9PSAnc2V0JzoKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBzZWxmLnRlZC5uTGluZXMgKiBzZWxmLnRlZC5saW5lSGVpZ2h0CisgICAgICAgICAgICAgICAgY3VyID0gc2VsZi5nZXRzY3JvbGxiYXJ2YWx1ZXMoKVsxXQorICAgICAgICAgICAgICAgIGRlbHRhID0gKGN1ci12YWx1ZSkqaGVpZ2h0LzMyNzY3CisgICAgICAgICAgICBpZiB3aGF0ID09ICctJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHNlbGYudGVkLmxpbmVIZWlnaHQKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnLS0nOgorICAgICAgICAgICAgICAgIGRlbHRhID0gKHNlbGYudGVkLnZpZXdSZWN0WzNdLXNlbGYudGVkLmxpbmVIZWlnaHQpCisgICAgICAgICAgICAgICAgaWYgZGVsdGEgPD0gMDoKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBzZWxmLnRlZC5saW5lSGVpZ2h0CisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJysnOgorICAgICAgICAgICAgICAgIGRlbHRhID0gLXNlbGYudGVkLmxpbmVIZWlnaHQKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnKysnOgorICAgICAgICAgICAgICAgIGRlbHRhID0gLShzZWxmLnRlZC52aWV3UmVjdFszXS1zZWxmLnRlZC5saW5lSGVpZ2h0KQorICAgICAgICAgICAgICAgIGlmIGRlbHRhID49IDA6CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLXNlbGYudGVkLmxpbmVIZWlnaHQKKyAgICAgICAgICAgIHNlbGYudGVkLlRFUGluU2Nyb2xsKDAsIGRlbHRhKQorICAgICAgICAgICAgcHJpbnQgJ1NDUk9MTCBZJywgZGVsdGEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3MgIyBObyBob3Jpem9udGFsIHNjcm9sbGluZworCisgICAgZGVmIGRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpOgorICAgICAgICBwcmludCAiQUNUSVZBVEUiLCBvbm9mZgorICAgICAgICBTY3JvbGxlZFdpbmRvdy5kb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KQorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYudGVkLlRFQWN0aXZhdGUoKQorICAgICAgICAgICAgc2VsZi5wYXJlbnQuYWN0aXZlID0gc2VsZgorICAgICAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRlZC5URURlYWN0aXZhdGUoKQorCisgICAgZGVmIGRvX3VwZGF0ZShzZWxmLCB3aWQsIGV2ZW50KToKKyAgICAgICAgUWQuRXJhc2VSZWN0KHdpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpKQorICAgICAgICBzZWxmLnRlZC5URVVwZGF0ZSh3aWQuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCb3VuZHMoKSkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKworICAgIGRlZiBkb19jb250ZW50Y2xpY2soc2VsZiwgbG9jYWwsIG1vZGlmaWVycywgZXZ0KToKKyAgICAgICAgc2hpZnRlZCA9IChtb2RpZmllcnMgJiAweDIwMCkKKyAgICAgICAgc2VsZi50ZWQuVEVDbGljayhsb2NhbCwgc2hpZnRlZCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgZG9fY2hhcihzZWxmLCBjaCwgZXZlbnQpOgorICAgICAgICBzZWxmLnRlZC5URVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5URUtleShvcmQoY2gpKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAxCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNoYW5nZWQ6CisgICAgICAgICAgICBzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgd2luZG93ICIlcyIgYmVmb3JlIGNsb3Npbmc/JyVzZWxmLm5hbWUsIDEpCisgICAgICAgICAgICBpZiBzYXZlID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLm1lbnVfc2F2ZSgpCisgICAgICAgICAgICBlbGlmIHNhdmUgPCAwOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnBhcmVudC5hY3RpdmUgPT0gc2VsZjoKKyAgICAgICAgICAgIHNlbGYucGFyZW50LmFjdGl2ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIGRlbCBzZWxmLnRlZAorICAgICAgICBzZWxmLmRvX3Bvc3RjbG9zZSgpCisKKyAgICBkZWYgbWVudV9zYXZlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5wYXRoOgorICAgICAgICAgICAgc2VsZi5tZW51X3NhdmVfYXMoKQorICAgICAgICAgICAgcmV0dXJuICMgV2lsbCBjYWxsIHVzIHJlY3Vyc2l2ZWx5CisgICAgICAgIHByaW50ICdTYXZpbmcgdG8gJywgc2VsZi5wYXRoCisgICAgICAgIGRoYW5kbGUgPSBzZWxmLnRlZC5URUdldFRleHQoKQorICAgICAgICBkYXRhID0gZGhhbmRsZS5kYXRhCisgICAgICAgIGZwID0gb3BlbihzZWxmLnBhdGgsICd3YicpICAjIE5PVEU6IHdiLCBiZWNhdXNlIGRhdGEgaGFzIENSIGZvciBlbmQtb2YtbGluZQorICAgICAgICBmcC53cml0ZShkYXRhKQorICAgICAgICBpZiBkYXRhWy0xXSA8PiAnXHInOiBmcC53cml0ZSgnXHInKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDAKKworICAgIGRlZiBtZW51X3NhdmVfYXMoc2VsZik6CisgICAgICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzOicpCisgICAgICAgIGlmIG5vdCBwYXRoOiByZXR1cm4KKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCisgICAgICAgIHNlbGYud2lkLlNldFdUaXRsZShzZWxmLm5hbWUpCisgICAgICAgIHNlbGYubWVudV9zYXZlKCkKKworICAgIGRlZiBtZW51X2N1dChzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuVEVTZWxWaWV3KCkKKyAgICAgICAgc2VsZi50ZWQuVEVDdXQoKQorICAgICAgICBpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6CisgICAgICAgICAgICBTY3JhcC5aZXJvU2NyYXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQorICAgICAgICBURS5URVRvU2NyYXAoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMQorCisgICAgZGVmIG1lbnVfY29weShzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuVEVDb3B5KCkKKyAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgorICAgICAgICAgICAgU2NyYXAuWmVyb1NjcmFwKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKKyAgICAgICAgVEUuVEVUb1NjcmFwKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV9wYXN0ZShzZWxmKToKKyAgICAgICAgVEUuVEVGcm9tU2NyYXAoKQorICAgICAgICBzZWxmLnRlZC5URVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5URVBhc3RlKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKKworICAgIGRlZiBtZW51X2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5URVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5URURlbGV0ZSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAxCisKKyAgICBkZWYgaGF2ZV9zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi50ZWQuc2VsU3RhcnQgPCBzZWxmLnRlZC5zZWxFbmQpCiAKIGNsYXNzIFBlZChBcHBsaWNhdGlvbik6Ci0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlBcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQotCQlzZWxmLm51bSA9IDAKLQkJc2VsZi5hY3RpdmUgPSBOb25lCi0JCXNlbGYudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgotCQlzZWxmLmZpbGVtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCi0JCXNlbGYubmV3aXRlbSA9IE1lbnVJdGVtKG0sICJOZXcgd2luZG93IiwgIk4iLCBzZWxmLm9wZW4pCi0JCXNlbGYub3Blbml0ZW0gPSBNZW51SXRlbShtLCAiT3Blbi4uLiIsICJPIiwgc2VsZi5vcGVuZmlsZSkKLQkJc2VsZi5jbG9zZWl0ZW0gPSBNZW51SXRlbShtLCAiQ2xvc2UiLCAiVyIsIHNlbGYuY2xvc2V3aW4pCi0JCW0uYWRkc2VwYXJhdG9yKCkKLQkJc2VsZi5zYXZlaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIiwgIlMiLCBzZWxmLnNhdmUpCi0JCXNlbGYuc2F2ZWFzaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIGFzLi4uIiwgIiIsIHNlbGYuc2F2ZWFzKQotCQltLmFkZHNlcGFyYXRvcigpCi0JCXNlbGYucXVpdGl0ZW0gPSBNZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQotCQkKLQkJc2VsZi5lZGl0bWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQotCQlzZWxmLnVuZG9pdGVtID0gTWVudUl0ZW0obSwgIlVuZG8iLCAiWiIsIHNlbGYudW5kbykKLQkJc2VsZi5jdXRpdGVtID0gTWVudUl0ZW0obSwgIkN1dCIsICJYIiwgc2VsZi5jdXQpCi0JCXNlbGYuY29weWl0ZW0gPSBNZW51SXRlbShtLCAiQ29weSIsICJDIiwgc2VsZi5jb3B5KQotCQlzZWxmLnBhc3RlaXRlbSA9IE1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgc2VsZi5wYXN0ZSkKLQkJc2VsZi5jbGVhcml0ZW0gPSBNZW51SXRlbShtLCAiQ2xlYXIiLCAiIiwgc2VsZi5jbGVhcikKLQkJCi0JCSMgTm90IHlldCBpbXBsZW1lbnRlZDoKLQkJc2VsZi51bmRvaXRlbS5lbmFibGUoMCkKLQkJCi0JCSMgR3JvdXBzIG9mIGl0ZW1zIGVuYWJsZWQgdG9nZXRoZXI6Ci0JCXNlbGYud2luZG93Z3JvdXAgPSBbc2VsZi5jbG9zZWl0ZW0sIHNlbGYuc2F2ZWl0ZW0sIHNlbGYuc2F2ZWFzaXRlbSwgc2VsZi5lZGl0bWVudV0KLQkJc2VsZi5mb2N1c2dyb3VwID0gW3NlbGYuY3V0aXRlbSwgc2VsZi5jb3B5aXRlbSwgc2VsZi5jbGVhcml0ZW1dCi0JCXNlbGYud2luZG93Z3JvdXBfb24gPSAtMQotCQlzZWxmLmZvY3VzZ3JvdXBfb24gPSAtMQotCQlzZWxmLnBhc3RlZ3JvdXBfb24gPSAtMQotCQkKLQlkZWYgdXBkYXRlbWVudWJhcihzZWxmKToKLQkJY2hhbmdlZCA9IDAKLQkJb24gPSAoc2VsZi5hY3RpdmUgPD4gTm9uZSkKLQkJaWYgb24gPD4gc2VsZi53aW5kb3dncm91cF9vbjoKLQkJCWZvciBtIGluIHNlbGYud2luZG93Z3JvdXA6Ci0JCQkJbS5lbmFibGUob24pCi0JCQlzZWxmLndpbmRvd2dyb3VwX29uID0gb24KLQkJCWNoYW5nZWQgPSAxCi0JCWlmIG9uOgotCQkJIyBvbmx5IGlmIHdlIGhhdmUgYW4gZWRpdCBtZW51Ci0JCQlvbiA9IHNlbGYuYWN0aXZlLmhhdmVfc2VsZWN0aW9uKCkKLQkJCWlmIG9uIDw+IHNlbGYuZm9jdXNncm91cF9vbjoKLQkJCQlmb3IgbSBpbiBzZWxmLmZvY3VzZ3JvdXA6Ci0JCQkJCW0uZW5hYmxlKG9uKQotCQkJCXNlbGYuZm9jdXNncm91cF9vbiA9IG9uCi0JCQkJY2hhbmdlZCA9IDEKLQkJCWlmIGhhc2F0dHIoU2NyYXAsICdJbmZvU2NyYXAnKToKLQkJCQlvbiA9IChTY3JhcC5JbmZvU2NyYXAoKVswXSA8PiAwKQotCQkJZWxzZToKLQkJCQlmbGF2b3JzID0gU2NyYXAuR2V0Q3VycmVudFNjcmFwKCkuR2V0U2NyYXBGbGF2b3JJbmZvTGlzdCgpCi0JCQkJZm9yIHRwLCBpbmZvIGluIGZsYXZvcnM6Ci0JCQkJCWlmIHRwID09ICdURVhUJzoKLQkJCQkJCW9uID0gMQotCQkJCQkJYnJlYWsKLQkJCQllbHNlOgotCQkJCQlvbiA9IDAKLQkJCWlmIG9uIDw+IHNlbGYucGFzdGVncm91cF9vbjoKLQkJCQlzZWxmLnBhc3RlaXRlbS5lbmFibGUob24pCi0JCQkJc2VsZi5wYXN0ZWdyb3VwX29uID0gb24KLQkJCQljaGFuZ2VkID0gMQotCQlpZiBjaGFuZ2VkOgotCQkJRHJhd01lbnVCYXIoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5udW0gPSAwCisgICAgICAgIHNlbGYuYWN0aXZlID0gTm9uZQorICAgICAgICBzZWxmLnVwZGF0ZW1lbnViYXIoKQogCi0JIwotCSMgQXBwbGUgbWVudQotCSMKLQkKLQlkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJBIHNpbXBsZSBzaW5nbGUtZm9udCB0ZXh0IGVkaXRvciIpCi0JCQkKLQkjCi0JIyBGaWxlIG1lbnUKLQkjCisgICAgZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgc2VsZi5uZXdpdGVtID0gTWVudUl0ZW0obSwgIk5ldyB3aW5kb3ciLCAiTiIsIHNlbGYub3BlbikKKyAgICAgICAgc2VsZi5vcGVuaXRlbSA9IE1lbnVJdGVtKG0sICJPcGVuLi4uIiwgIk8iLCBzZWxmLm9wZW5maWxlKQorICAgICAgICBzZWxmLmNsb3NlaXRlbSA9IE1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgc2VsZi5jbG9zZXdpbikKKyAgICAgICAgbS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnNhdmVpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsIHNlbGYuc2F2ZSkKKyAgICAgICAgc2VsZi5zYXZlYXNpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUgYXMuLi4iLCAiIiwgc2VsZi5zYXZlYXMpCisgICAgICAgIG0uYWRkc2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi5xdWl0aXRlbSA9IE1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCiAKLQlkZWYgb3BlbihzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX29wZW4oMCkKLQkJCi0JZGVmIG9wZW5maWxlKHNlbGYsICphcmdzKToKLQkJc2VsZi5fb3BlbigxKQorICAgICAgICBzZWxmLmVkaXRtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCisgICAgICAgIHNlbGYudW5kb2l0ZW0gPSBNZW51SXRlbShtLCAiVW5kbyIsICJaIiwgc2VsZi51bmRvKQorICAgICAgICBzZWxmLmN1dGl0ZW0gPSBNZW51SXRlbShtLCAiQ3V0IiwgIlgiLCBzZWxmLmN1dCkKKyAgICAgICAgc2VsZi5jb3B5aXRlbSA9IE1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCBzZWxmLmNvcHkpCisgICAgICAgIHNlbGYucGFzdGVpdGVtID0gTWVudUl0ZW0obSwgIlBhc3RlIiwgIlYiLCBzZWxmLnBhc3RlKQorICAgICAgICBzZWxmLmNsZWFyaXRlbSA9IE1lbnVJdGVtKG0sICJDbGVhciIsICIiLCBzZWxmLmNsZWFyKQogCi0JZGVmIF9vcGVuKHNlbGYsIGFza2ZpbGUpOgotCQlpZiBhc2tmaWxlOgotCQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKLQkJCWlmIG5vdCBwYXRoOgotCQkJCXJldHVybgotCQkJbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aClbLTFdCi0JCQl0cnk6Ci0JCQkJZnAgPSBvcGVuKHBhdGgsICdyYicpICMgTk9URSBiaW5hcnksIHdlIG5lZWQgY3IgYXMgZW5kLW9mLWxpbmUKLQkJCQlkYXRhID0gZnAucmVhZCgpCi0JCQkJZnAuY2xvc2UoKQotCQkJZXhjZXB0IElPRXJyb3IsIGFyZzoKLQkJCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJnLCkpCi0JCQkJcmV0dXJuCi0JCWVsc2U6Ci0JCQlwYXRoID0gTm9uZQotCQkJbmFtZSA9ICJVbnRpdGxlZCAlZCIlc2VsZi5udW0KLQkJCWRhdGEgPSAnJwotCQl3ID0gVEVXaW5kb3coc2VsZikKLQkJdy5vcGVuKHBhdGgsIG5hbWUsIGRhdGEpCi0JCXNlbGYubnVtID0gc2VsZi5udW0gKyAxCi0JCQotCWRlZiBjbG9zZXdpbihzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUuY2xvc2UoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgc2F2ZShzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9zYXZlKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIHNhdmVhcyhzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9zYXZlX2FzKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCQotCQkKLQlkZWYgcXVpdChzZWxmLCAqYXJncyk6Ci0JCWZvciB3IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6Ci0JCQl3LmNsb3NlKCkKLQkJaWYgc2VsZi5fd2luZG93czoKLQkJCXJldHVybgotCQlzZWxmLl9xdWl0KCkKLQkJCi0JIwotCSMgRWRpdCBtZW51Ci0JIwotCQotCWRlZiB1bmRvKHNlbGYsICphcmdzKToKLQkJcGFzcwotCQkKLQlkZWYgY3V0KHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2N1dCgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBjb3B5KHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2NvcHkoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgcGFzdGUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfcGFzdGUoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgICAgICAjIE5vdCB5ZXQgaW1wbGVtZW50ZWQ6CisgICAgICAgIHNlbGYudW5kb2l0ZW0uZW5hYmxlKDApCiAKLQlkZWYgY2xlYXIoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfY2xlYXIoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQkjCi0JIyBPdGhlciBzdHVmZgotCSMJCisgICAgICAgICMgR3JvdXBzIG9mIGl0ZW1zIGVuYWJsZWQgdG9nZXRoZXI6CisgICAgICAgIHNlbGYud2luZG93Z3JvdXAgPSBbc2VsZi5jbG9zZWl0ZW0sIHNlbGYuc2F2ZWl0ZW0sIHNlbGYuc2F2ZWFzaXRlbSwgc2VsZi5lZGl0bWVudV0KKyAgICAgICAgc2VsZi5mb2N1c2dyb3VwID0gW3NlbGYuY3V0aXRlbSwgc2VsZi5jb3B5aXRlbSwgc2VsZi5jbGVhcml0ZW1dCisgICAgICAgIHNlbGYud2luZG93Z3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLmZvY3VzZ3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLnBhc3RlZ3JvdXBfb24gPSAtMQogCi0JZGVmIGlkbGUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLmRvX2lkbGUoKQotCQllbHNlOgotCQkJUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCisgICAgZGVmIHVwZGF0ZW1lbnViYXIoc2VsZik6CisgICAgICAgIGNoYW5nZWQgPSAwCisgICAgICAgIG9uID0gKHNlbGYuYWN0aXZlIDw+IE5vbmUpCisgICAgICAgIGlmIG9uIDw+IHNlbGYud2luZG93Z3JvdXBfb246CisgICAgICAgICAgICBmb3IgbSBpbiBzZWxmLndpbmRvd2dyb3VwOgorICAgICAgICAgICAgICAgIG0uZW5hYmxlKG9uKQorICAgICAgICAgICAgc2VsZi53aW5kb3dncm91cF9vbiA9IG9uCisgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICBpZiBvbjoKKyAgICAgICAgICAgICMgb25seSBpZiB3ZSBoYXZlIGFuIGVkaXQgbWVudQorICAgICAgICAgICAgb24gPSBzZWxmLmFjdGl2ZS5oYXZlX3NlbGVjdGlvbigpCisgICAgICAgICAgICBpZiBvbiA8PiBzZWxmLmZvY3VzZ3JvdXBfb246CisgICAgICAgICAgICAgICAgZm9yIG0gaW4gc2VsZi5mb2N1c2dyb3VwOgorICAgICAgICAgICAgICAgICAgICBtLmVuYWJsZShvbikKKyAgICAgICAgICAgICAgICBzZWxmLmZvY3VzZ3JvdXBfb24gPSBvbgorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICBpZiBoYXNhdHRyKFNjcmFwLCAnSW5mb1NjcmFwJyk6CisgICAgICAgICAgICAgICAgb24gPSAoU2NyYXAuSW5mb1NjcmFwKClbMF0gPD4gMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmxhdm9ycyA9IFNjcmFwLkdldEN1cnJlbnRTY3JhcCgpLkdldFNjcmFwRmxhdm9ySW5mb0xpc3QoKQorICAgICAgICAgICAgICAgIGZvciB0cCwgaW5mbyBpbiBmbGF2b3JzOgorICAgICAgICAgICAgICAgICAgICBpZiB0cCA9PSAnVEVYVCc6CisgICAgICAgICAgICAgICAgICAgICAgICBvbiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb24gPSAwCisgICAgICAgICAgICBpZiBvbiA8PiBzZWxmLnBhc3RlZ3JvdXBfb246CisgICAgICAgICAgICAgICAgc2VsZi5wYXN0ZWl0ZW0uZW5hYmxlKG9uKQorICAgICAgICAgICAgICAgIHNlbGYucGFzdGVncm91cF9vbiA9IG9uCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgaWYgY2hhbmdlZDoKKyAgICAgICAgICAgIERyYXdNZW51QmFyKCkKKworICAgICMKKyAgICAjIEFwcGxlIG1lbnUKKyAgICAjCisKKyAgICBkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJBIHNpbXBsZSBzaW5nbGUtZm9udCB0ZXh0IGVkaXRvciIpCisKKyAgICAjCisgICAgIyBGaWxlIG1lbnUKKyAgICAjCisKKyAgICBkZWYgb3BlbihzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX29wZW4oMCkKKworICAgIGRlZiBvcGVuZmlsZShzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX29wZW4oMSkKKworICAgIGRlZiBfb3BlbihzZWxmLCBhc2tmaWxlKToKKyAgICAgICAgaWYgYXNrZmlsZToKKyAgICAgICAgICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oJ1RFWFQnLCkpCisgICAgICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpWy0xXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwID0gb3BlbihwYXRoLCAncmInKSAjIE5PVEUgYmluYXJ5LCB3ZSBuZWVkIGNyIGFzIGVuZC1vZi1saW5lCisgICAgICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBhcmc6CisgICAgICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiSU9FUlJPUjogJXIiICUgKGFyZywpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCA9IE5vbmUKKyAgICAgICAgICAgIG5hbWUgPSAiVW50aXRsZWQgJWQiJXNlbGYubnVtCisgICAgICAgICAgICBkYXRhID0gJycKKyAgICAgICAgdyA9IFRFV2luZG93KHNlbGYpCisgICAgICAgIHcub3BlbihwYXRoLCBuYW1lLCBkYXRhKQorICAgICAgICBzZWxmLm51bSA9IHNlbGYubnVtICsgMQorCisgICAgZGVmIGNsb3Nld2luKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgc2F2ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9zYXZlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBzYXZlYXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2F2ZV9hcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKworICAgIGRlZiBxdWl0KHNlbGYsICphcmdzKToKKyAgICAgICAgZm9yIHcgaW4gc2VsZi5fd2luZG93cy52YWx1ZXMoKToKKyAgICAgICAgICAgIHcuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLl93aW5kb3dzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgIworICAgICMgRWRpdCBtZW51CisgICAgIworCisgICAgZGVmIHVuZG8oc2VsZiwgKmFyZ3MpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgY3V0KHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2N1dCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY29weShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9jb3B5KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBwYXN0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9wYXN0ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY2xlYXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfY2xlYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgIworICAgICMgT3RoZXIgc3R1ZmYKKyAgICAjCisKKyAgICBkZWYgaWRsZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUuZG9faWRsZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBRZC5TZXRDdXJzb3IoUWQuR2V0UURHbG9iYWxzQXJyb3coKSkKIAogZGVmIG1haW4oKToKLQlBcHAgPSBQZWQoKQotCUFwcC5tYWlubG9vcCgpCi0JCisgICAgQXBwID0gUGVkKCkKKyAgICBBcHAubWFpbmxvb3AoKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQotCQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vd2FzdGUvaHRtbGVkLnB5IGIvTWFjL0RlbW8vd2FzdGUvaHRtbGVkLnB5CmluZGV4IDg3MTA3NjYuLmQ4Y2VhMWIgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL3dhc3RlL2h0bWxlZC5weQorKysgYi9NYWMvRGVtby93YXN0ZS9odG1sZWQucHkKQEAgLTIzLDgwOSArMjMsODA4IEBACiBMRUZUTUFSR0lOPTAKIAogVU5ET0xBQkVMUyA9IFsgIyBJbmRleGVkIGJ5IFdFR2V0VW5kb0luZm8oKSB2YWx1ZQotCU5vbmUsICIiLCAidHlwaW5nIiwgIkN1dCIsICJQYXN0ZSIsICJDbGVhciIsICJEcmFnIiwgIlN0eWxlIl0KLQkKKyAgICAgICAgTm9uZSwgIiIsICJ0eXBpbmciLCAiQ3V0IiwgIlBhc3RlIiwgIkNsZWFyIiwgIkRyYWciLCAiU3R5bGUiXQorCiAjIFN0eWxlIGFuZCBzaXplIG1lbnUuIE5vdGUgdGhhdCBzdHlsZSBvcmRlciBpcyBpbXBvcnRhbnQgKHRpZWQgdG8gYml0IHZhbHVlcykKIFNUWUxFUyA9IFsKLQkoIkJvbGQiLCAiQiIpLCAoIkl0YWxpYyIsICJJIiksICgiVW5kZXJsaW5lIiwgIlUiKSwgKCJPdXRsaW5lIiwgIk8iKSwKLQkoIlNoYWRvdyIsICIiKSwgKCJDb25kZW5zZWQiLCAiIiksICgiRXh0ZW5kZWQiLCAiIikKLQldCisgICAgICAgICgiQm9sZCIsICJCIiksICgiSXRhbGljIiwgIkkiKSwgKCJVbmRlcmxpbmUiLCAiVSIpLCAoIk91dGxpbmUiLCAiTyIpLAorICAgICAgICAoIlNoYWRvdyIsICIiKSwgKCJDb25kZW5zZWQiLCAiIiksICgiRXh0ZW5kZWQiLCAiIikKKyAgICAgICAgXQogU0laRVMgPSBbIDksIDEwLCAxMiwgMTQsIDE4LCAyNF0KIAogIyBTaXplcyBmb3IgSFRNTCB0YWcgdHlwZXMKIEhUTUxfU0laRT17Ci0JJ2gxJzogMTgsCi0JJ2gyJzogMTQKKyAgICAgICAgJ2gxJzogMTgsCisgICAgICAgICdoMic6IDE0CiB9Ci0JCisKIEJJR1JFR0lPTj1RZC5OZXdSZ24oKQogUWQuU2V0UmVjdFJnbihCSUdSRUdJT04sIC0xNjAwMCwgLTE2MDAwLCAxNjAwMCwgMTYwMDApCiAKIGNsYXNzIFdhc3RlV2luZG93KFNjcm9sbGVkV2luZG93KToKLQlkZWYgb3BlbihzZWxmLCBwYXRoLCBuYW1lLCBkYXRhKToKLQkJc2VsZi5wYXRoID0gcGF0aAotCQlzZWxmLm5hbWUgPSBuYW1lCi0JCXIgPSB3aW5kb3dib3VuZHMoNDAwLCA0MDApCi0JCXcgPSBXaW4uTmV3V2luZG93KHIsIG5hbWUsIDEsIDAsIC0xLCAxLCAwKQotCQlzZWxmLndpZCA9IHcKLQkJdnIgPSBMRUZUTUFSR0lOLCAwLCByWzJdLXJbMF0tMTUsIHJbM10tclsxXS0xNQotCQlkciA9ICgwLCAwLCB2clsyXSwgMCkKLQkJUWQuU2V0UG9ydCh3KQotCQlRZC5UZXh0Rm9udCg0KQotCQlRZC5UZXh0U2l6ZSg5KQotCQlmbGFncyA9IFdBU1RFY29uc3Qud2VEb0F1dG9TY3JvbGwgfCBXQVNURWNvbnN0LndlRG9PdXRsaW5lSGlsaXRlIHwgXAotCQkJV0FTVEVjb25zdC53ZURvTW9ub1N0eWxlZCB8IFdBU1RFY29uc3Qud2VEb1VuZG8KLQkJc2VsZi50ZWQgPSB3YXN0ZS5XRU5ldyhkciwgdnIsIGZsYWdzKQotCQlzZWxmLnRlZC5XRUluc3RhbGxUYWJIb29rcygpCi0JCXN0eWxlLCBzb3VwID0gc2VsZi5nZXRzdHlsZXNvdXAoc2VsZi5wYXRoKQotCQlzZWxmLnRlZC5XRUluc2VydChkYXRhLCBzdHlsZSwgc291cCkKLQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oMCwwKQotCQlzZWxmLnRlZC5XRUNhbFRleHQoKQotCQlzZWxmLnRlZC5XRVJlc2V0TW9kQ291bnQoKQotCQl3LkRyYXdHcm93SWNvbigpCi0JCXNlbGYuc2Nyb2xsYmFycygpCi0JCXNlbGYuZG9fcG9zdG9wZW4oKQotCQlzZWxmLmRvX2FjdGl2YXRlKDEsIE5vbmUpCi0JCQotCWRlZiBnZXRzdHlsZXNvdXAoc2VsZiwgcGF0aG5hbWUpOgotCQlpZiBub3QgcGF0aG5hbWU6Ci0JCQlyZXR1cm4gTm9uZSwgTm9uZQotCQlvbGRyZiA9IFJlcy5DdXJSZXNGaWxlKCkKLQkJdHJ5OgotCQkJcmYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAxKQotCQlleGNlcHQgUmVzLkVycm9yOgotCQkJcmV0dXJuIE5vbmUsIE5vbmUKLQkJdHJ5OgotCQkJaHN0eWxlID0gUmVzLkdldDFSZXNvdXJjZSgnc3R5bCcsIDEyOCkKLQkJCWhzdHlsZS5EZXRhY2hSZXNvdXJjZSgpCi0JCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQloc3R5bGUgPSBOb25lCi0JCXRyeToKLQkJCWhzb3VwID0gUmVzLkdldDFSZXNvdXJjZSgnU09VUCcsIDEyOCkKLQkJCWhzb3VwLkRldGFjaFJlc291cmNlKCkKLQkJZXhjZXB0IFJlcy5FcnJvcjoKLQkJCWhzb3VwID0gTm9uZQotCQlSZXMuQ2xvc2VSZXNGaWxlKHJmKQotCQlSZXMuVXNlUmVzRmlsZShvbGRyZikKLQkJcmV0dXJuIGhzdHlsZSwgaHNvdXAKLQkJCQkKLQlkZWYgZG9faWRsZShzZWxmLCBldmVudCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCVFkLlNldFBvcnQoc2VsZi53aWQpCi0JCXNlbGYudGVkLldFSWRsZSgpCQotCQlpZiBzZWxmLnRlZC5XRUFkanVzdEN1cnNvcih3aGVyZSwgQklHUkVHSU9OKToKLQkJCXJldHVybgotCQlRZC5TZXRDdXJzb3IoUWQuR2V0UURHbG9iYWxzQXJyb3coKSkKLQkJCi0JZGVmIGdldHNjcm9sbGJhcnZhbHVlcyhzZWxmKToKLQkJZHIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKLQkJdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJdnggPSBzZWxmLnNjYWxlYmFydmFsdWUoZHJbMF0sIGRyWzJdLCB2clswXSwgdnJbMl0pCi0JCXZ5ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzFdLCBkclszXSwgdnJbMV0sIHZyWzNdKQotCQlyZXR1cm4gdngsIHZ5Ci0JCQotCWRlZiBzY3JvbGxiYXJfY2FsbGJhY2soc2VsZiwgd2hpY2gsIHdoYXQsIHZhbHVlKToKLQkJaWYgd2hpY2ggPT0gJ3knOgotCQkJIwotCQkJIyAibGluZSIgc2l6ZSBpcyBtaW5pbXVtIG9mIHRvcCBhbmQgYm90dG9tIGxpbmUgc2l6ZQotCQkJIwotCQkJdG9wbGluZV9vZmYsZHVtbXkgPSBzZWxmLnRlZC5XRUdldE9mZnNldCgoMSwxKSkKLQkJCXRvcGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUodG9wbGluZV9vZmYpCi0JCQl0b3BsaW5laGVpZ2h0ID0gc2VsZi50ZWQuV0VHZXRIZWlnaHQodG9wbGluZV9udW0sIHRvcGxpbmVfbnVtKzEpCisgICAgZGVmIG9wZW4oc2VsZiwgcGF0aCwgbmFtZSwgZGF0YSk6CisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICByID0gd2luZG93Ym91bmRzKDQwMCwgNDAwKQorICAgICAgICB3ID0gV2luLk5ld1dpbmRvdyhyLCBuYW1lLCAxLCAwLCAtMSwgMSwgMCkKKyAgICAgICAgc2VsZi53aWQgPSB3CisgICAgICAgIHZyID0gTEVGVE1BUkdJTiwgMCwgclsyXS1yWzBdLTE1LCByWzNdLXJbMV0tMTUKKyAgICAgICAgZHIgPSAoMCwgMCwgdnJbMl0sIDApCisgICAgICAgIFFkLlNldFBvcnQodykKKyAgICAgICAgUWQuVGV4dEZvbnQoNCkKKyAgICAgICAgUWQuVGV4dFNpemUoOSkKKyAgICAgICAgZmxhZ3MgPSBXQVNURWNvbnN0LndlRG9BdXRvU2Nyb2xsIHwgV0FTVEVjb25zdC53ZURvT3V0bGluZUhpbGl0ZSB8IFwKKyAgICAgICAgICAgICAgICBXQVNURWNvbnN0LndlRG9Nb25vU3R5bGVkIHwgV0FTVEVjb25zdC53ZURvVW5kbworICAgICAgICBzZWxmLnRlZCA9IHdhc3RlLldFTmV3KGRyLCB2ciwgZmxhZ3MpCisgICAgICAgIHNlbGYudGVkLldFSW5zdGFsbFRhYkhvb2tzKCkKKyAgICAgICAgc3R5bGUsIHNvdXAgPSBzZWxmLmdldHN0eWxlc291cChzZWxmLnBhdGgpCisgICAgICAgIHNlbGYudGVkLldFSW5zZXJ0KGRhdGEsIHN0eWxlLCBzb3VwKQorICAgICAgICBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbigwLDApCisgICAgICAgIHNlbGYudGVkLldFQ2FsVGV4dCgpCisgICAgICAgIHNlbGYudGVkLldFUmVzZXRNb2RDb3VudCgpCisgICAgICAgIHcuRHJhd0dyb3dJY29uKCkKKyAgICAgICAgc2VsZi5zY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisgICAgICAgIHNlbGYuZG9fYWN0aXZhdGUoMSwgTm9uZSkKIAotCQkJYm90bGluZXBvcyA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXQkJCQotCQkJYm90bGluZV9vZmYsIGR1bW15ID0gc2VsZi50ZWQuV0VHZXRPZmZzZXQoKDEsIGJvdGxpbmVwb3MtMSkpCi0JCQlib3RsaW5lX251bSA9IHNlbGYudGVkLldFT2Zmc2V0VG9MaW5lKGJvdGxpbmVfb2ZmKQotCQkJYm90bGluZWhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KGJvdGxpbmVfbnVtLCBib3RsaW5lX251bSsxKQotCQkJCi0JCQlpZiBib3RsaW5laGVpZ2h0ID09IDA6Ci0JCQkJYm90bGluZWhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KGJvdGxpbmVfbnVtLTEsIGJvdGxpbmVfbnVtKQotCQkJaWYgYm90bGluZWhlaWdodCA8IHRvcGxpbmVoZWlnaHQ6Ci0JCQkJbGluZWhlaWdodCA9IGJvdGxpbmVoZWlnaHQKLQkJCWVsc2U6Ci0JCQkJbGluZWhlaWdodCA9IHRvcGxpbmVoZWlnaHQKLQkJCWlmIGxpbmVoZWlnaHQgPD0gMDoKLQkJCQlsaW5laGVpZ2h0ID0gMQotCQkJIwotCQkJIyBOb3cgZG8gdGhlIGNvbW1hbmQuCi0JCQkjCi0JCQlpZiB3aGF0ID09ICdzZXQnOgotCQkJCWhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KDAsIDB4M2ZmZmZmZmYpCi0JCQkJY3VyID0gc2VsZi5nZXRzY3JvbGxiYXJ2YWx1ZXMoKVsxXQotCQkJCWRlbHRhID0gKGN1ci12YWx1ZSkqaGVpZ2h0LzMyNzY3Ci0JCQlpZiB3aGF0ID09ICctJzoKLQkJCQlkZWx0YSA9IGxpbmVoZWlnaHQKLQkJCWVsaWYgd2hhdCA9PSAnLS0nOgotCQkJCWRlbHRhID0gKHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXS1saW5laGVpZ2h0KQotCQkJCWlmIGRlbHRhIDw9IDA6Ci0JCQkJCWRlbHRhID0gbGluZWhlaWdodAotCQkJZWxpZiB3aGF0ID09ICcrJzoKLQkJCQlkZWx0YSA9IC1saW5laGVpZ2h0Ci0JCQllbGlmIHdoYXQgPT0gJysrJzoKLQkJCQlkZWx0YSA9IC0oc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpWzNdLWxpbmVoZWlnaHQpCi0JCQkJaWYgZGVsdGEgPj0gMDoKLQkJCQkJZGVsdGEgPSAtbGluZWhlaWdodAotCQkJc2VsZi50ZWQuV0VTY3JvbGwoMCwgZGVsdGEpCi0JCWVsc2U6Ci0JCQlpZiB3aGF0ID09ICdzZXQnOgotCQkJCXJldHVybiAjIFhYWFgKLQkJCXZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCQl3aW53aWR0aCA9IHZyWzJdLXZyWzBdCi0JCQlpZiB3aGF0ID09ICctJzoKLQkJCQlkZWx0YSA9IHdpbndpZHRoLzEwCi0JCQllbGlmIHdoYXQgPT0gJy0tJzoKLQkJCQlkZWx0YSA9IHdpbndpZHRoLzIKLQkJCWVsaWYgd2hhdCA9PSAnKyc6Ci0JCQkJZGVsdGEgPSAtd2lud2lkdGgvMTAKLQkJCWVsaWYgd2hhdCA9PSAnKysnOgotCQkJCWRlbHRhID0gLXdpbndpZHRoLzIKLQkJCXNlbGYudGVkLldFU2Nyb2xsKGRlbHRhLCAwKQotCQkjIFBpbiB0aGUgc2Nyb2xsCi0JCWwsIHQsIHIsIGIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKLQkJdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJaWYgdCA+IDAgb3IgbCA+IDA6Ci0JCQlkeCA9IGR5ID0gMAotCQkJaWYgdCA+IDA6IGR5ID0gLXQKLQkJCWlmIGwgPiAwOiBkeCA9IC1sCi0JCQlzZWxmLnRlZC5XRVNjcm9sbChkeCwgZHkpCi0JCWVsaWYgYiA8IHZiOgotCQkJc2VsZi50ZWQuV0VTY3JvbGwoMCwgdmItYikKKyAgICBkZWYgZ2V0c3R5bGVzb3VwKHNlbGYsIHBhdGhuYW1lKToKKyAgICAgICAgaWYgbm90IHBhdGhuYW1lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKyAgICAgICAgb2xkcmYgPSBSZXMuQ3VyUmVzRmlsZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMSkKKyAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhzdHlsZSA9IFJlcy5HZXQxUmVzb3VyY2UoJ3N0eWwnLCAxMjgpCisgICAgICAgICAgICBoc3R5bGUuRGV0YWNoUmVzb3VyY2UoKQorICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgaHN0eWxlID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBoc291cCA9IFJlcy5HZXQxUmVzb3VyY2UoJ1NPVVAnLCAxMjgpCisgICAgICAgICAgICBoc291cC5EZXRhY2hSZXNvdXJjZSgpCisgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3I6CisgICAgICAgICAgICBoc291cCA9IE5vbmUKKyAgICAgICAgUmVzLkNsb3NlUmVzRmlsZShyZikKKyAgICAgICAgUmVzLlVzZVJlc0ZpbGUob2xkcmYpCisgICAgICAgIHJldHVybiBoc3R5bGUsIGhzb3VwCiAKLQkJCi0JZGVmIGRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpOgotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQlTY3JvbGxlZFdpbmRvdy5kb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KQotCQlpZiBvbm9mZjoKLQkJCXNlbGYudGVkLldFQWN0aXZhdGUoKQotCQkJc2VsZi5wYXJlbnQuYWN0aXZlID0gc2VsZgotCQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCWVsc2U6Ci0JCQlzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQorICAgIGRlZiBkb19pZGxlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgUWQuU2V0UG9ydChzZWxmLndpZCkKKyAgICAgICAgc2VsZi50ZWQuV0VJZGxlKCkKKyAgICAgICAgaWYgc2VsZi50ZWQuV0VBZGp1c3RDdXJzb3Iod2hlcmUsIEJJR1JFR0lPTik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCiAKLQlkZWYgZG9fdXBkYXRlKHNlbGYsIHdpZCwgZXZlbnQpOgotCQlyZWdpb24gPSB3aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbgotCQlpZiBRZC5FbXB0eVJnbihyZWdpb24pOgotCQkJcmV0dXJuCi0JCVFkLkVyYXNlUmduKHJlZ2lvbikKLQkJc2VsZi50ZWQuV0VVcGRhdGUocmVnaW9uKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQkKLQlkZWYgZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpOgotCQlsLCB0LCByLCBiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCXZyID0gKGwsIHQsIGwrd2lkdGgtMTUsIHQraGVpZ2h0LTE1KQotCQlzZWxmLnRlZC5XRVNldFZpZXdSZWN0KHZyKQotCQlzZWxmLndpZC5JbnZhbFdpbmRvd1JlY3QodnIpCi0JCVNjcm9sbGVkV2luZG93LmRvX3Bvc3RyZXNpemUoc2VsZiwgd2lkdGgsIGhlaWdodCwgd2luZG93KQotCQkKLQlkZWYgZG9fY29udGVudGNsaWNrKHNlbGYsIGxvY2FsLCBtb2RpZmllcnMsIGV2dCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2dAotCQlzZWxmLnRlZC5XRUNsaWNrKGxvY2FsLCBtb2RpZmllcnMsIHdoZW4pCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgIGRlZiBnZXRzY3JvbGxiYXJ2YWx1ZXMoc2VsZik6CisgICAgICAgIGRyID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCisgICAgICAgIHZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgIHZ4ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzBdLCBkclsyXSwgdnJbMF0sIHZyWzJdKQorICAgICAgICB2eSA9IHNlbGYuc2NhbGViYXJ2YWx1ZShkclsxXSwgZHJbM10sIHZyWzFdLCB2clszXSkKKyAgICAgICAgcmV0dXJuIHZ4LCB2eQogCi0JZGVmIGRvX2NoYXIoc2VsZiwgY2gsIGV2ZW50KToKLQkJc2VsZi50ZWQuV0VTZWxWaWV3KCkKLQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKLQkJc2VsZi50ZWQuV0VLZXkob3JkKGNoKSwgbW9kaWZpZXJzKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlpZiBzZWxmLnRlZC5XRUdldE1vZENvdW50KCk6Ci0JCQlzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgd2luZG93ICIlcyIgYmVmb3JlIGNsb3Npbmc/JyVzZWxmLm5hbWUsIDEpCi0JCQlpZiBzYXZlID4gMDoKLQkJCQlzZWxmLm1lbnVfc2F2ZSgpCi0JCQllbGlmIHNhdmUgPCAwOgotCQkJCXJldHVybgotCQlpZiBzZWxmLnBhcmVudC5hY3RpdmUgPT0gc2VsZjoKLQkJCXNlbGYucGFyZW50LmFjdGl2ZSA9IE5vbmUKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCWRlbCBzZWxmLnRlZAotCQlzZWxmLmRvX3Bvc3RjbG9zZSgpCi0JCQotCWRlZiBtZW51X3NhdmUoc2VsZik6Ci0JCWlmIG5vdCBzZWxmLnBhdGg6Ci0JCQlzZWxmLm1lbnVfc2F2ZV9hcygpCi0JCQlyZXR1cm4gIyBXaWxsIGNhbGwgdXMgcmVjdXJzaXZlbHkKLQkJIwotCQkjIEZpcnN0IHNhdmUgZGF0YQotCQkjCi0JCWRoYW5kbGUgPSBzZWxmLnRlZC5XRUdldFRleHQoKQotCQlkYXRhID0gZGhhbmRsZS5kYXRhCi0JCWZwID0gb3BlbihzZWxmLnBhdGgsICd3YicpICAjIE5PVEU6IHdiLCBiZWNhdXNlIGRhdGEgaGFzIENSIGZvciBlbmQtb2YtbGluZQotCQlmcC53cml0ZShkYXRhKQotCQlpZiBkYXRhWy0xXSA8PiAnXHInOiBmcC53cml0ZSgnXHInKQotCQlmcC5jbG9zZSgpCi0JCSMKLQkJIyBOb3cgc2F2ZSBzdHlsZSBhbmQgc291cAotCQkjCi0JCW9sZHJlc2ZpbGUgPSBSZXMuQ3VyUmVzRmlsZSgpCi0JCXRyeToKLQkJCXJmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMykKLQkJZXhjZXB0IFJlcy5FcnJvcjoKLQkJCVJlcy5GU3BDcmVhdGVSZXNGaWxlKHNlbGYucGF0aCwgJz8/Pz8nLCAnVEVYVCcsIG1hY2ZzLnNtQWxsU2NyaXB0cykKLQkJCXJmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMykKLQkJc3R5bGVzID0gUmVzLlJlc291cmNlKCcnKQotCQlzb3VwID0gUmVzLlJlc291cmNlKCcnKQotCQlzZWxmLnRlZC5XRUNvcHlSYW5nZSgwLCAweDNmZmZmZmZmLCBOb25lLCBzdHlsZXMsIHNvdXApCi0JCXN0eWxlcy5BZGRSZXNvdXJjZSgnc3R5bCcsIDEyOCwgJycpCi0JCXNvdXAuQWRkUmVzb3VyY2UoJ1NPVVAnLCAxMjgsICcnKQotCQlSZXMuQ2xvc2VSZXNGaWxlKHJmKQotCQlSZXMuVXNlUmVzRmlsZShvbGRyZXNmaWxlKQotCQkKLQkJc2VsZi50ZWQuV0VSZXNldE1vZENvdW50KCkKLQkJCi0JZGVmIG1lbnVfc2F2ZV9hcyhzZWxmKToKLQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgYXM6JykKLQkJaWYgbm90IHBhdGg6IHJldHVybgotCQlzZWxmLnBhdGggPSBwYXRoCi0JCXNlbGYubmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5wYXRoKVstMV0KLQkJc2VsZi53aWQuU2V0V1RpdGxlKHNlbGYubmFtZSkKLQkJc2VsZi5tZW51X3NhdmUoKQotCQkKLQlkZWYgbWVudV9pbnNlcnQoc2VsZiwgZnApOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlkYXRhID0gZnAucmVhZCgpCi0JCXNlbGYudGVkLldFSW5zZXJ0KGRhdGEsIE5vbmUsIE5vbmUpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgbWVudV9pbnNlcnRfaHRtbChzZWxmLCBmcCk6Ci0JCWltcG9ydCBodG1sbGliCi0JCWltcG9ydCBmb3JtYXR0ZXIKLQkJZiA9IGZvcm1hdHRlci5BYnN0cmFjdEZvcm1hdHRlcihzZWxmKQotCQkKLQkJIyBSZW1lbWJlciB3aGVyZSB3ZSBhcmUsIGFuZCBkb24ndCB1cGRhdGUKLQkJUWQuU2V0Q3Vyc29yKFdBVENIKQotCQlzdGFydCwgZHVtbXkgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZJbmhpYml0UmVjYWwsIDEpCisgICAgZGVmIHNjcm9sbGJhcl9jYWxsYmFjayhzZWxmLCB3aGljaCwgd2hhdCwgdmFsdWUpOgorICAgICAgICBpZiB3aGljaCA9PSAneSc6CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjICJsaW5lIiBzaXplIGlzIG1pbmltdW0gb2YgdG9wIGFuZCBib3R0b20gbGluZSBzaXplCisgICAgICAgICAgICAjCisgICAgICAgICAgICB0b3BsaW5lX29mZixkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLDEpKQorICAgICAgICAgICAgdG9wbGluZV9udW0gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZSh0b3BsaW5lX29mZikKKyAgICAgICAgICAgIHRvcGxpbmVoZWlnaHQgPSBzZWxmLnRlZC5XRUdldEhlaWdodCh0b3BsaW5lX251bSwgdG9wbGluZV9udW0rMSkKIAotCQlzZWxmLmh0bWxfaW5pdCgpCi0JCXAgPSBNeUhUTUxQYXJzZXIoZikKLQkJcC5mZWVkKGZwLnJlYWQoKSkKLQkJCi0JCSMgUmVzdG9yZSB1cGRhdGluZywgcmVjYWxjLCBzZXQgZm9jdXMKLQkJZHVtbXksIGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJc2VsZi50ZWQuV0VDYWxUZXh0KCkKLQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCkKLQkJc2VsZi50ZWQuV0VTZWxWaWV3KCkKLQkJc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkluaGliaXRSZWNhbCwgMCkKLQkJc2VsZi53aWQuSW52YWxXaW5kb3dSZWN0KHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKSkKKyAgICAgICAgICAgIGJvdGxpbmVwb3MgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KClbM10KKyAgICAgICAgICAgIGJvdGxpbmVfb2ZmLCBkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLCBib3RsaW5lcG9zLTEpKQorICAgICAgICAgICAgYm90bGluZV9udW0gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZShib3RsaW5lX29mZikKKyAgICAgICAgICAgIGJvdGxpbmVoZWlnaHQgPSBzZWxmLnRlZC5XRUdldEhlaWdodChib3RsaW5lX251bSwgYm90bGluZV9udW0rMSkKIAotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfY3V0KHNlbGYpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6Ci0JCQlTY3JhcC5aZXJvU2NyYXAoKQotCQllbHNlOgotCQkJU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQotCQlzZWxmLnRlZC5XRUN1dCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgbWVudV9jb3B5KHNlbGYpOgotCQlpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6Ci0JCQlTY3JhcC5aZXJvU2NyYXAoKQotCQllbHNlOgotCQkJU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQotCQlzZWxmLnRlZC5XRUNvcHkoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfcGFzdGUoc2VsZik6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCXNlbGYudGVkLldFUGFzdGUoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfY2xlYXIoc2VsZik6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCXNlbGYudGVkLldFRGVsZXRlKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgICAgICBpZiBib3RsaW5laGVpZ2h0ID09IDA6CisgICAgICAgICAgICAgICAgYm90bGluZWhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KGJvdGxpbmVfbnVtLTEsIGJvdGxpbmVfbnVtKQorICAgICAgICAgICAgaWYgYm90bGluZWhlaWdodCA8IHRvcGxpbmVoZWlnaHQ6CisgICAgICAgICAgICAgICAgbGluZWhlaWdodCA9IGJvdGxpbmVoZWlnaHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGluZWhlaWdodCA9IHRvcGxpbmVoZWlnaHQKKyAgICAgICAgICAgIGlmIGxpbmVoZWlnaHQgPD0gMDoKKyAgICAgICAgICAgICAgICBsaW5laGVpZ2h0ID0gMQorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBOb3cgZG8gdGhlIGNvbW1hbmQuCisgICAgICAgICAgICAjCisgICAgICAgICAgICBpZiB3aGF0ID09ICdzZXQnOgorICAgICAgICAgICAgICAgIGhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KDAsIDB4M2ZmZmZmZmYpCisgICAgICAgICAgICAgICAgY3VyID0gc2VsZi5nZXRzY3JvbGxiYXJ2YWx1ZXMoKVsxXQorICAgICAgICAgICAgICAgIGRlbHRhID0gKGN1ci12YWx1ZSkqaGVpZ2h0LzMyNzY3CisgICAgICAgICAgICBpZiB3aGF0ID09ICctJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IGxpbmVoZWlnaHQKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnLS0nOgorICAgICAgICAgICAgICAgIGRlbHRhID0gKHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXS1saW5laGVpZ2h0KQorICAgICAgICAgICAgICAgIGlmIGRlbHRhIDw9IDA6CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gbGluZWhlaWdodAorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICcrJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IC1saW5laGVpZ2h0CisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJysrJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IC0oc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpWzNdLWxpbmVoZWlnaHQpCisgICAgICAgICAgICAgICAgaWYgZGVsdGEgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAtbGluZWhlaWdodAorICAgICAgICAgICAgc2VsZi50ZWQuV0VTY3JvbGwoMCwgZGVsdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB3aGF0ID09ICdzZXQnOgorICAgICAgICAgICAgICAgIHJldHVybiAjIFhYWFgKKyAgICAgICAgICAgIHZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgICAgICB3aW53aWR0aCA9IHZyWzJdLXZyWzBdCisgICAgICAgICAgICBpZiB3aGF0ID09ICctJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHdpbndpZHRoLzEwCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJy0tJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHdpbndpZHRoLzIKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnKyc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAtd2lud2lkdGgvMTAKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnKysnOgorICAgICAgICAgICAgICAgIGRlbHRhID0gLXdpbndpZHRoLzIKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2Nyb2xsKGRlbHRhLCAwKQorICAgICAgICAjIFBpbiB0aGUgc2Nyb2xsCisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKKyAgICAgICAgdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgaWYgdCA+IDAgb3IgbCA+IDA6CisgICAgICAgICAgICBkeCA9IGR5ID0gMAorICAgICAgICAgICAgaWYgdCA+IDA6IGR5ID0gLXQKKyAgICAgICAgICAgIGlmIGwgPiAwOiBkeCA9IC1sCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNjcm9sbChkeCwgZHkpCisgICAgICAgIGVsaWYgYiA8IHZiOgorICAgICAgICAgICAgc2VsZi50ZWQuV0VTY3JvbGwoMCwgdmItYikKIAotCWRlZiBtZW51X3VuZG8oc2VsZik6Ci0JCXNlbGYudGVkLldFVW5kbygpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgbWVudV9zZXRmb250KHNlbGYsIGZvbnQpOgotCQlmb250ID0gRm0uR2V0Rk51bShmb250KQotCQlzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvRm9udCwgKGZvbnQsIDAsIDAsICgwLDAsMCkpKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCQkKLQlkZWYgbWVudV9tb2RmYWNlKHNlbGYsIGZhY2UpOgotCQlzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvRmFjZXxXQVNURWNvbnN0LndlRG9Ub2dnbGVGYWNlLCAKLQkJCSgwLCBmYWNlLCAwLCAoMCwwLDApKSkKIAotCWRlZiBtZW51X3NldGZhY2Uoc2VsZiwgZmFjZSk6Ci0JCXNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9GYWNlfFdBU1RFY29uc3Qud2VEb1JlcGxhY2VGYWNlLCAKLQkJCSgwLCBmYWNlLCAwLCAoMCwwLDApKSkKKyAgICBkZWYgZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2dCk6CisgICAgICAgIFFkLlNldFBvcnQoc2VsZi53aWQpCisgICAgICAgIFNjcm9sbGVkV2luZG93LmRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpCisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCisgICAgICAgICAgICBzZWxmLnBhcmVudC5hY3RpdmUgPSBzZWxmCisgICAgICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGVkLldFRGVhY3RpdmF0ZSgpCiAKLQlkZWYgbWVudV9zZXRzaXplKHNlbGYsIHNpemUpOgotCQlzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvU2l6ZSwgKDAsIDAsIHNpemUsICgwLDAsMCkpKQotCQkJCQkJCQkKLQlkZWYgbWVudV9pbmNzaXplKHNlbGYsIHNpemUpOgotCQlzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvQWRkU2l6ZSwgKDAsIDAsIHNpemUsICgwLDAsMCkpKQorICAgIGRlZiBkb191cGRhdGUoc2VsZiwgd2lkLCBldmVudCk6CisgICAgICAgIHJlZ2lvbiA9IHdpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduCisgICAgICAgIGlmIFFkLkVtcHR5UmduKHJlZ2lvbik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgUWQuRXJhc2VSZ24ocmVnaW9uKQorICAgICAgICBzZWxmLnRlZC5XRVVwZGF0ZShyZWdpb24pCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCiAKLQlkZWYgbXlzZXRzdHlsZShzZWxmLCB3aGljaCwgaG93KToKLQkJc2VsZi50ZWQuV0VTZWxWaWV3KCkKLQkJc2VsZi50ZWQuV0VTZXRTdHlsZSh3aGljaCwgaG93KQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCQkJCQkJCi0JZGVmIGhhdmVfc2VsZWN0aW9uKHNlbGYpOgotCQlzdGFydCwgc3RvcCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJcmV0dXJuIHN0YXJ0IDwgc3RvcAotCQkKLQlkZWYgY2FuX3Bhc3RlKHNlbGYpOgotCQlyZXR1cm4gc2VsZi50ZWQuV0VDYW5QYXN0ZSgpCi0JCQotCWRlZiBjYW5fdW5kbyhzZWxmKToKLQkJd2hpY2gsIHJlZG8gPSBzZWxmLnRlZC5XRUdldFVuZG9JbmZvKCkKLQkJd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQotCQlpZiB3aGljaCA9PSBOb25lOiByZXR1cm4gTm9uZQotCQlpZiByZWRvOgotCQkJcmV0dXJuICJSZWRvICIrd2hpY2gKLQkJZWxzZToKLQkJCXJldHVybiAiVW5kbyAiK3doaWNoCi0JCQkKLQlkZWYgZ2V0cnVuaW5mbyhzZWxmKToKLQkJYWxsID0gKFdBU1RFY29uc3Qud2VEb0ZvbnQgfCBXQVNURWNvbnN0LndlRG9GYWNlIHwgV0FTVEVjb25zdC53ZURvU2l6ZSkKLQkJZHVtbXksIG1vZGUsIChmb250LCBmYWNlLCBzaXplLCBjb2xvcikgPSBzZWxmLnRlZC5XRUNvbnRpbnVvdXNTdHlsZShhbGwpCi0JCWlmIG5vdCAobW9kZSAmIFdBU1RFY29uc3Qud2VEb0ZvbnQpOgotCQkJZm9udCA9IE5vbmUKLQkJZWxzZToKLQkJCWZvbnQgPSBGbS5HZXRGb250TmFtZShmb250KQotCQlpZiBub3QgKG1vZGUgJiBXQVNURWNvbnN0LndlRG9GYWNlKTogZmFjdCA9IE5vbmUKLQkJaWYgbm90IChtb2RlICYgV0FTVEVjb25zdC53ZURvU2l6ZSk6IHNpemUgPSBOb25lCi0JCXJldHVybiBmb250LCBmYWNlLCBzaXplCi0JCQotCSMKLQkjIE1ldGhvZHMgZm9yIHdyaXRlciBjbGFzcyBmb3IgaHRtbCBmb3JtYXR0ZXIKLQkjCi0JCi0JZGVmIGh0bWxfaW5pdChzZWxmKToKLQkJc2VsZi5odG1sX2ZvbnQgPSBbMTIsIDAsIDAsIDBdCi0JCXNlbGYuaHRtbF9zdHlsZSA9IDAKLQkJc2VsZi5odG1sX2NvbG9yID0gKDAsMCwwKQotCQlzZWxmLm5ld19mb250KHNlbGYuaHRtbF9mb250KQotCQotCWRlZiBuZXdfZm9udChzZWxmLCBmb250KToKLQkJaWYgZm9udCA9PSBOb25lOgotCQkJZm9udCA9ICgxMiwgMCwgMCwgMCkKLQkJZm9udCA9IG1hcChsYW1iZGEgeDp4LCBmb250KQotCQlmb3IgaSBpbiByYW5nZShsZW4oZm9udCkpOgotCQkJaWYgZm9udFtpXSA9PSBOb25lOgotCQkJCWZvbnRbaV0gPSBzZWxmLmh0bWxfZm9udFtpXQotCQlbc2l6ZSwgaXRhbGljLCBib2xkLCB0dF0gPSBmb250Ci0JCXNlbGYuaHRtbF9mb250ID0gZm9udFs6XQotCQlpZiB0dDoKLQkJCWZvbnQgPSBGbS5HZXRGTnVtKCdDb3VyaWVyJykKLQkJZWxzZToKLQkJCWZvbnQgPSBGbS5HZXRGTnVtKCdUaW1lcycpCi0JCWlmIEhUTUxfU0laRS5oYXNfa2V5KHNpemUpOgotCQkJc2l6ZSA9IEhUTUxfU0laRVtzaXplXQotCQllbHNlOgotCQkJc2l6ZSA9IDEyCi0JCWZhY2UgPSAwCi0JCWlmIGJvbGQ6IGZhY2UgPSBmYWNlIHwgMQotCQlpZiBpdGFsaWM6IGZhY2UgPSBmYWNlIHwgMgotCQlmYWNlID0gZmFjZSB8IHNlbGYuaHRtbF9zdHlsZQotCQlzZWxmLnRlZC5XRVNldFN0eWxlKFdBU1RFY29uc3Qud2VEb0ZvbnQgfCBXQVNURWNvbnN0LndlRG9GYWNlIHwgCi0JCQkJV0FTVEVjb25zdC53ZURvU2l6ZSB8IFdBU1RFY29uc3Qud2VEb0NvbG9yLAotCQkJCShmb250LCBmYWNlLCBzaXplLCBzZWxmLmh0bWxfY29sb3IpKQotCQkKLQlkZWYgbmV3X21hcmdpbihzZWxmLCBtYXJnaW4sIGxldmVsKToKLQkJc2VsZi50ZWQuV0VJbnNlcnQoJ1tNYXJnaW4gJXMgJXNdJyUobWFyZ2luLCBsZXZlbCksIE5vbmUsIE5vbmUpCi0JCQotCWRlZiBuZXdfc3BhY2luZyhzZWxmLCBzcGFjaW5nKToKLQkJc2VsZi50ZWQuV0VJbnNlcnQoJ1tzcGFjaW5nICVzXSclc3BhY2luZywgTm9uZSwgTm9uZSkKLQkJCQotCWRlZiBuZXdfc3R5bGVzKHNlbGYsIHN0eWxlcyk6Ci0JCXNlbGYuaHRtbF9zdHlsZSA9IDAKLQkJc2VsZi5odG1sX2NvbG9yID0gKDAsMCwwKQotCQlpZiAnYW5jaG9yJyBpbiBzdHlsZXM6Ci0JCQlzZWxmLmh0bWxfc3R5bGUgPSBzZWxmLmh0bWxfc3R5bGUgfCA0Ci0JCQlzZWxmLmh0bWxfY29sb3IgPSAoMHhmZmZmLCAwLCAwKQotCQlzZWxmLm5ld19mb250KHNlbGYuaHRtbF9mb250KQorICAgIGRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgdnIgPSAobCwgdCwgbCt3aWR0aC0xNSwgdCtoZWlnaHQtMTUpCisgICAgICAgIHNlbGYudGVkLldFU2V0Vmlld1JlY3QodnIpCisgICAgICAgIHNlbGYud2lkLkludmFsV2luZG93UmVjdCh2cikKKyAgICAgICAgU2Nyb2xsZWRXaW5kb3cuZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpCiAKLQlkZWYgc2VuZF9wYXJhZ3JhcGgoc2VsZiwgYmxhbmtsaW5lKToKLQkJc2VsZi50ZWQuV0VJbnNlcnQoJ1xyJyooYmxhbmtsaW5lKzEpLCBOb25lLCBOb25lKQotCQkKLQlkZWYgc2VuZF9saW5lX2JyZWFrKHNlbGYpOgotCQlzZWxmLnRlZC5XRUluc2VydCgnXHInLCBOb25lLCBOb25lKQotCQkKLQlkZWYgc2VuZF9ob3JfcnVsZShzZWxmLCAqYXJncywgKiprdyk6Ci0JCSMgSWdub3JlIHJ1bGVyIG9wdGlvbnMsIGZvciBub3cKLQkJZHVtbXlkYXRhID0gUmVzLlJlc291cmNlKCcnKQotCQlzZWxmLnRlZC5XRUluc2VydE9iamVjdCgncnVscicsIGR1bW15ZGF0YSwgKDAsMCkpCi0JCQotCWRlZiBzZW5kX2xhYmVsX2RhdGEoc2VsZiwgZGF0YSk6Ci0JCXNlbGYudGVkLldFSW5zZXJ0KGRhdGEsIE5vbmUsIE5vbmUpCi0JCQotCWRlZiBzZW5kX2Zsb3dpbmdfZGF0YShzZWxmLCBkYXRhKToKLQkJc2VsZi50ZWQuV0VJbnNlcnQoZGF0YSwgTm9uZSwgTm9uZSkKLQkJCi0JZGVmIHNlbmRfbGl0ZXJhbF9kYXRhKHNlbGYsIGRhdGEpOgotCQlkYXRhID0gc3RyaW5nLnJlcGxhY2UoZGF0YSwgJ1xuJywgJ1xyJykKLQkJZGF0YSA9IHN0cmluZy5leHBhbmR0YWJzKGRhdGEpCi0JCXNlbGYudGVkLldFSW5zZXJ0KGRhdGEsIE5vbmUsIE5vbmUpCi0JCQorICAgIGRlZiBkb19jb250ZW50Y2xpY2soc2VsZiwgbG9jYWwsIG1vZGlmaWVycywgZXZ0KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZ0CisgICAgICAgIHNlbGYudGVkLldFQ2xpY2sobG9jYWwsIG1vZGlmaWVycywgd2hlbikKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgZG9fY2hhcihzZWxmLCBjaCwgZXZlbnQpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICBzZWxmLnRlZC5XRUtleShvcmQoY2gpLCBtb2RpZmllcnMpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnRlZC5XRUdldE1vZENvdW50KCk6CisgICAgICAgICAgICBzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgd2luZG93ICIlcyIgYmVmb3JlIGNsb3Npbmc/JyVzZWxmLm5hbWUsIDEpCisgICAgICAgICAgICBpZiBzYXZlID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLm1lbnVfc2F2ZSgpCisgICAgICAgICAgICBlbGlmIHNhdmUgPCAwOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnBhcmVudC5hY3RpdmUgPT0gc2VsZjoKKyAgICAgICAgICAgIHNlbGYucGFyZW50LmFjdGl2ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIGRlbCBzZWxmLnRlZAorICAgICAgICBzZWxmLmRvX3Bvc3RjbG9zZSgpCisKKyAgICBkZWYgbWVudV9zYXZlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5wYXRoOgorICAgICAgICAgICAgc2VsZi5tZW51X3NhdmVfYXMoKQorICAgICAgICAgICAgcmV0dXJuICMgV2lsbCBjYWxsIHVzIHJlY3Vyc2l2ZWx5CisgICAgICAgICMKKyAgICAgICAgIyBGaXJzdCBzYXZlIGRhdGEKKyAgICAgICAgIworICAgICAgICBkaGFuZGxlID0gc2VsZi50ZWQuV0VHZXRUZXh0KCkKKyAgICAgICAgZGF0YSA9IGRoYW5kbGUuZGF0YQorICAgICAgICBmcCA9IG9wZW4oc2VsZi5wYXRoLCAnd2InKSAgIyBOT1RFOiB3YiwgYmVjYXVzZSBkYXRhIGhhcyBDUiBmb3IgZW5kLW9mLWxpbmUKKyAgICAgICAgZnAud3JpdGUoZGF0YSkKKyAgICAgICAgaWYgZGF0YVstMV0gPD4gJ1xyJzogZnAud3JpdGUoJ1xyJykKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAjCisgICAgICAgICMgTm93IHNhdmUgc3R5bGUgYW5kIHNvdXAKKyAgICAgICAgIworICAgICAgICBvbGRyZXNmaWxlID0gUmVzLkN1clJlc0ZpbGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDMpCisgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3I6CisgICAgICAgICAgICBSZXMuRlNwQ3JlYXRlUmVzRmlsZShzZWxmLnBhdGgsICc/Pz8/JywgJ1RFWFQnLCBtYWNmcy5zbUFsbFNjcmlwdHMpCisgICAgICAgICAgICByZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDMpCisgICAgICAgIHN0eWxlcyA9IFJlcy5SZXNvdXJjZSgnJykKKyAgICAgICAgc291cCA9IFJlcy5SZXNvdXJjZSgnJykKKyAgICAgICAgc2VsZi50ZWQuV0VDb3B5UmFuZ2UoMCwgMHgzZmZmZmZmZiwgTm9uZSwgc3R5bGVzLCBzb3VwKQorICAgICAgICBzdHlsZXMuQWRkUmVzb3VyY2UoJ3N0eWwnLCAxMjgsICcnKQorICAgICAgICBzb3VwLkFkZFJlc291cmNlKCdTT1VQJywgMTI4LCAnJykKKyAgICAgICAgUmVzLkNsb3NlUmVzRmlsZShyZikKKyAgICAgICAgUmVzLlVzZVJlc0ZpbGUob2xkcmVzZmlsZSkKKworICAgICAgICBzZWxmLnRlZC5XRVJlc2V0TW9kQ291bnQoKQorCisgICAgZGVmIG1lbnVfc2F2ZV9hcyhzZWxmKToKKyAgICAgICAgcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgYXM6JykKKyAgICAgICAgaWYgbm90IHBhdGg6IHJldHVybgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5wYXRoKVstMV0KKyAgICAgICAgc2VsZi53aWQuU2V0V1RpdGxlKHNlbGYubmFtZSkKKyAgICAgICAgc2VsZi5tZW51X3NhdmUoKQorCisgICAgZGVmIG1lbnVfaW5zZXJ0KHNlbGYsIGZwKToKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICBzZWxmLnRlZC5XRUluc2VydChkYXRhLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X2luc2VydF9odG1sKHNlbGYsIGZwKToKKyAgICAgICAgaW1wb3J0IGh0bWxsaWIKKyAgICAgICAgaW1wb3J0IGZvcm1hdHRlcgorICAgICAgICBmID0gZm9ybWF0dGVyLkFic3RyYWN0Rm9ybWF0dGVyKHNlbGYpCisKKyAgICAgICAgIyBSZW1lbWJlciB3aGVyZSB3ZSBhcmUsIGFuZCBkb24ndCB1cGRhdGUKKyAgICAgICAgUWQuU2V0Q3Vyc29yKFdBVENIKQorICAgICAgICBzdGFydCwgZHVtbXkgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZJbmhpYml0UmVjYWwsIDEpCisKKyAgICAgICAgc2VsZi5odG1sX2luaXQoKQorICAgICAgICBwID0gTXlIVE1MUGFyc2VyKGYpCisgICAgICAgIHAuZmVlZChmcC5yZWFkKCkpCisKKyAgICAgICAgIyBSZXN0b3JlIHVwZGF0aW5nLCByZWNhbGMsIHNldCBmb2N1cworICAgICAgICBkdW1teSwgZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICBzZWxmLnRlZC5XRUNhbFRleHQoKQorICAgICAgICBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihzdGFydCwgZW5kKQorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGSW5oaWJpdFJlY2FsLCAwKQorICAgICAgICBzZWxmLndpZC5JbnZhbFdpbmRvd1JlY3Qoc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpKQorCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfY3V0KHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6CisgICAgICAgICAgICBTY3JhcC5aZXJvU2NyYXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQorICAgICAgICBzZWxmLnRlZC5XRUN1dCgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfY29weShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgorICAgICAgICAgICAgU2NyYXAuWmVyb1NjcmFwKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKKyAgICAgICAgc2VsZi50ZWQuV0VDb3B5KCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV9wYXN0ZShzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgc2VsZi50ZWQuV0VQYXN0ZSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIHNlbGYudGVkLldFRGVsZXRlKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV91bmRvKHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVVuZG8oKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X3NldGZvbnQoc2VsZiwgZm9udCk6CisgICAgICAgIGZvbnQgPSBGbS5HZXRGTnVtKGZvbnQpCisgICAgICAgIHNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9Gb250LCAoZm9udCwgMCwgMCwgKDAsMCwwKSkpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfbW9kZmFjZShzZWxmLCBmYWNlKToKKyAgICAgICAgc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0ZhY2V8V0FTVEVjb25zdC53ZURvVG9nZ2xlRmFjZSwKKyAgICAgICAgICAgICAgICAoMCwgZmFjZSwgMCwgKDAsMCwwKSkpCisKKyAgICBkZWYgbWVudV9zZXRmYWNlKHNlbGYsIGZhY2UpOgorICAgICAgICBzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvRmFjZXxXQVNURWNvbnN0LndlRG9SZXBsYWNlRmFjZSwKKyAgICAgICAgICAgICAgICAoMCwgZmFjZSwgMCwgKDAsMCwwKSkpCisKKyAgICBkZWYgbWVudV9zZXRzaXplKHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvU2l6ZSwgKDAsIDAsIHNpemUsICgwLDAsMCkpKQorCisgICAgZGVmIG1lbnVfaW5jc2l6ZShzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0FkZFNpemUsICgwLCAwLCBzaXplLCAoMCwwLDApKSkKKworICAgIGRlZiBteXNldHN0eWxlKHNlbGYsIHdoaWNoLCBob3cpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5XRVNldFN0eWxlKHdoaWNoLCBob3cpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIGhhdmVfc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBzdGFydCwgc3RvcCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgcmV0dXJuIHN0YXJ0IDwgc3RvcAorCisgICAgZGVmIGNhbl9wYXN0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGVkLldFQ2FuUGFzdGUoKQorCisgICAgZGVmIGNhbl91bmRvKHNlbGYpOgorICAgICAgICB3aGljaCwgcmVkbyA9IHNlbGYudGVkLldFR2V0VW5kb0luZm8oKQorICAgICAgICB3aGljaCA9IFVORE9MQUJFTFNbd2hpY2hdCisgICAgICAgIGlmIHdoaWNoID09IE5vbmU6IHJldHVybiBOb25lCisgICAgICAgIGlmIHJlZG86CisgICAgICAgICAgICByZXR1cm4gIlJlZG8gIit3aGljaAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJVbmRvICIrd2hpY2gKKworICAgIGRlZiBnZXRydW5pbmZvKHNlbGYpOgorICAgICAgICBhbGwgPSAoV0FTVEVjb25zdC53ZURvRm9udCB8IFdBU1RFY29uc3Qud2VEb0ZhY2UgfCBXQVNURWNvbnN0LndlRG9TaXplKQorICAgICAgICBkdW1teSwgbW9kZSwgKGZvbnQsIGZhY2UsIHNpemUsIGNvbG9yKSA9IHNlbGYudGVkLldFQ29udGludW91c1N0eWxlKGFsbCkKKyAgICAgICAgaWYgbm90IChtb2RlICYgV0FTVEVjb25zdC53ZURvRm9udCk6CisgICAgICAgICAgICBmb250ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9udCA9IEZtLkdldEZvbnROYW1lKGZvbnQpCisgICAgICAgIGlmIG5vdCAobW9kZSAmIFdBU1RFY29uc3Qud2VEb0ZhY2UpOiBmYWN0ID0gTm9uZQorICAgICAgICBpZiBub3QgKG1vZGUgJiBXQVNURWNvbnN0LndlRG9TaXplKTogc2l6ZSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGZvbnQsIGZhY2UsIHNpemUKKworICAgICMKKyAgICAjIE1ldGhvZHMgZm9yIHdyaXRlciBjbGFzcyBmb3IgaHRtbCBmb3JtYXR0ZXIKKyAgICAjCisKKyAgICBkZWYgaHRtbF9pbml0KHNlbGYpOgorICAgICAgICBzZWxmLmh0bWxfZm9udCA9IFsxMiwgMCwgMCwgMF0KKyAgICAgICAgc2VsZi5odG1sX3N0eWxlID0gMAorICAgICAgICBzZWxmLmh0bWxfY29sb3IgPSAoMCwwLDApCisgICAgICAgIHNlbGYubmV3X2ZvbnQoc2VsZi5odG1sX2ZvbnQpCisKKyAgICBkZWYgbmV3X2ZvbnQoc2VsZiwgZm9udCk6CisgICAgICAgIGlmIGZvbnQgPT0gTm9uZToKKyAgICAgICAgICAgIGZvbnQgPSAoMTIsIDAsIDAsIDApCisgICAgICAgIGZvbnQgPSBtYXAobGFtYmRhIHg6eCwgZm9udCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGZvbnQpKToKKyAgICAgICAgICAgIGlmIGZvbnRbaV0gPT0gTm9uZToKKyAgICAgICAgICAgICAgICBmb250W2ldID0gc2VsZi5odG1sX2ZvbnRbaV0KKyAgICAgICAgW3NpemUsIGl0YWxpYywgYm9sZCwgdHRdID0gZm9udAorICAgICAgICBzZWxmLmh0bWxfZm9udCA9IGZvbnRbOl0KKyAgICAgICAgaWYgdHQ6CisgICAgICAgICAgICBmb250ID0gRm0uR2V0Rk51bSgnQ291cmllcicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb250ID0gRm0uR2V0Rk51bSgnVGltZXMnKQorICAgICAgICBpZiBIVE1MX1NJWkUuaGFzX2tleShzaXplKToKKyAgICAgICAgICAgIHNpemUgPSBIVE1MX1NJWkVbc2l6ZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNpemUgPSAxMgorICAgICAgICBmYWNlID0gMAorICAgICAgICBpZiBib2xkOiBmYWNlID0gZmFjZSB8IDEKKyAgICAgICAgaWYgaXRhbGljOiBmYWNlID0gZmFjZSB8IDIKKyAgICAgICAgZmFjZSA9IGZhY2UgfCBzZWxmLmh0bWxfc3R5bGUKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRTdHlsZShXQVNURWNvbnN0LndlRG9Gb250IHwgV0FTVEVjb25zdC53ZURvRmFjZSB8CisgICAgICAgICAgICAgICAgICAgICAgICBXQVNURWNvbnN0LndlRG9TaXplIHwgV0FTVEVjb25zdC53ZURvQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAoZm9udCwgZmFjZSwgc2l6ZSwgc2VsZi5odG1sX2NvbG9yKSkKKworICAgIGRlZiBuZXdfbWFyZ2luKHNlbGYsIG1hcmdpbiwgbGV2ZWwpOgorICAgICAgICBzZWxmLnRlZC5XRUluc2VydCgnW01hcmdpbiAlcyAlc10nJShtYXJnaW4sIGxldmVsKSwgTm9uZSwgTm9uZSkKKworICAgIGRlZiBuZXdfc3BhY2luZyhzZWxmLCBzcGFjaW5nKToKKyAgICAgICAgc2VsZi50ZWQuV0VJbnNlcnQoJ1tzcGFjaW5nICVzXSclc3BhY2luZywgTm9uZSwgTm9uZSkKKworICAgIGRlZiBuZXdfc3R5bGVzKHNlbGYsIHN0eWxlcyk6CisgICAgICAgIHNlbGYuaHRtbF9zdHlsZSA9IDAKKyAgICAgICAgc2VsZi5odG1sX2NvbG9yID0gKDAsMCwwKQorICAgICAgICBpZiAnYW5jaG9yJyBpbiBzdHlsZXM6CisgICAgICAgICAgICBzZWxmLmh0bWxfc3R5bGUgPSBzZWxmLmh0bWxfc3R5bGUgfCA0CisgICAgICAgICAgICBzZWxmLmh0bWxfY29sb3IgPSAoMHhmZmZmLCAwLCAwKQorICAgICAgICBzZWxmLm5ld19mb250KHNlbGYuaHRtbF9mb250KQorCisgICAgZGVmIHNlbmRfcGFyYWdyYXBoKHNlbGYsIGJsYW5rbGluZSk6CisgICAgICAgIHNlbGYudGVkLldFSW5zZXJ0KCdccicqKGJsYW5rbGluZSsxKSwgTm9uZSwgTm9uZSkKKworICAgIGRlZiBzZW5kX2xpbmVfYnJlYWsoc2VsZik6CisgICAgICAgIHNlbGYudGVkLldFSW5zZXJ0KCdccicsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgc2VuZF9ob3JfcnVsZShzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgICMgSWdub3JlIHJ1bGVyIG9wdGlvbnMsIGZvciBub3cKKyAgICAgICAgZHVtbXlkYXRhID0gUmVzLlJlc291cmNlKCcnKQorICAgICAgICBzZWxmLnRlZC5XRUluc2VydE9iamVjdCgncnVscicsIGR1bW15ZGF0YSwgKDAsMCkpCisKKyAgICBkZWYgc2VuZF9sYWJlbF9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnRlZC5XRUluc2VydChkYXRhLCBOb25lLCBOb25lKQorCisgICAgZGVmIHNlbmRfZmxvd2luZ19kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnRlZC5XRUluc2VydChkYXRhLCBOb25lLCBOb25lKQorCisgICAgZGVmIHNlbmRfbGl0ZXJhbF9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBkYXRhID0gc3RyaW5nLnJlcGxhY2UoZGF0YSwgJ1xuJywgJ1xyJykKKyAgICAgICAgZGF0YSA9IHN0cmluZy5leHBhbmR0YWJzKGRhdGEpCisgICAgICAgIHNlbGYudGVkLldFSW5zZXJ0KGRhdGEsIE5vbmUsIE5vbmUpCisKIGNsYXNzIFdlZChBcHBsaWNhdGlvbik6Ci0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlBcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQotCQlzZWxmLm51bSA9IDAKLQkJc2VsZi5hY3RpdmUgPSBOb25lCi0JCXNlbGYudXBkYXRlbWVudWJhcigpCi0JCXdhc3RlLlNURE9iamVjdEhhbmRsZXJzKCkKLQkJIyBIYW5kbGVyIGZvciBob3Jpem9udGFsIHJ1bGVyCi0JCXdhc3RlLldFSW5zdGFsbE9iamVjdEhhbmRsZXIoJ3J1bHInLCAnbmV3ICcsIHNlbGYubmV3UnVsZXIpCi0JCXdhc3RlLldFSW5zdGFsbE9iamVjdEhhbmRsZXIoJ3J1bHInLCAnZHJhdycsIHNlbGYuZHJhd1J1bGVyKQotCQkKLQlkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKLQkJc2VsZi5maWxlbWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQotCQlzZWxmLm5ld2l0ZW0gPSBNZW51SXRlbShtLCAiTmV3IHdpbmRvdyIsICJOIiwgc2VsZi5vcGVuKQotCQlzZWxmLm9wZW5pdGVtID0gTWVudUl0ZW0obSwgIk9wZW4uLi4iLCAiTyIsIHNlbGYub3BlbmZpbGUpCi0JCXNlbGYuY2xvc2VpdGVtID0gTWVudUl0ZW0obSwgIkNsb3NlIiwgIlciLCBzZWxmLmNsb3Nld2luKQotCQltLmFkZHNlcGFyYXRvcigpCi0JCXNlbGYuc2F2ZWl0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgc2VsZi5zYXZlKQotCQlzZWxmLnNhdmVhc2l0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSBhcy4uLiIsICIiLCBzZWxmLnNhdmVhcykKLQkJbS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLmluc2VydGl0ZW0gPSBNZW51SXRlbShtLCAiSW5zZXJ0IHBsYWludGV4dC4uLiIsICIiLCBzZWxmLmluc2VydGZpbGUpCi0JCXNlbGYuaHRtbGl0ZW0gPSBNZW51SXRlbShtLCAiSW5zZXJ0IEhUTUwuLi4iLCAiIiwgc2VsZi5pbnNlcnRodG1sKQotCQltLmFkZHNlcGFyYXRvcigpCi0JCXNlbGYucXVpdGl0ZW0gPSBNZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQotCQkKLQkJc2VsZi5lZGl0bWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQotCQlzZWxmLnVuZG9pdGVtID0gTWVudUl0ZW0obSwgIlVuZG8iLCAiWiIsIHNlbGYudW5kbykKLQkJc2VsZi5jdXRpdGVtID0gTWVudUl0ZW0obSwgIkN1dCIsICJYIiwgc2VsZi5jdXQpCi0JCXNlbGYuY29weWl0ZW0gPSBNZW51SXRlbShtLCAiQ29weSIsICJDIiwgc2VsZi5jb3B5KQotCQlzZWxmLnBhc3RlaXRlbSA9IE1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgc2VsZi5wYXN0ZSkKLQkJc2VsZi5jbGVhcml0ZW0gPSBNZW51SXRlbShtLCAiQ2xlYXIiLCAiIiwgc2VsZi5jbGVhcikKLQkJCi0JCXNlbGYubWFrZWZvbnRtZW51KCkKLQkJCi0JCSMgR3JvdXBzIG9mIGl0ZW1zIGVuYWJsZWQgdG9nZXRoZXI6Ci0JCXNlbGYud2luZG93Z3JvdXAgPSBbc2VsZi5jbG9zZWl0ZW0sIHNlbGYuc2F2ZWl0ZW0sIHNlbGYuc2F2ZWFzaXRlbSwKLQkJCXNlbGYuZWRpdG1lbnUsIHNlbGYuZm9udG1lbnUsIHNlbGYuZmFjZW1lbnUsIHNlbGYuc2l6ZW1lbnUsCi0JCQlzZWxmLmluc2VydGl0ZW1dCi0JCXNlbGYuZm9jdXNncm91cCA9IFtzZWxmLmN1dGl0ZW0sIHNlbGYuY29weWl0ZW0sIHNlbGYuY2xlYXJpdGVtXQotCQlzZWxmLndpbmRvd2dyb3VwX29uID0gLTEKLQkJc2VsZi5mb2N1c2dyb3VwX29uID0gLTEKLQkJc2VsZi5wYXN0ZWdyb3VwX29uID0gLTEKLQkJc2VsZi51bmRvX2xhYmVsID0gIm5ldmVyIgotCQlzZWxmLmZmc192YWx1ZXMgPSAoKQotCQkKLQlkZWYgbWFrZWZvbnRtZW51KHNlbGYpOgotCQlzZWxmLmZvbnRtZW51ID0gTWVudShzZWxmLm1lbnViYXIsICJGb250IikKLQkJc2VsZi5mb250bmFtZXMgPSBnZXRmb250bmFtZXMoKQotCQlzZWxmLmZvbnRpdGVtcyA9IFtdCi0JCWZvciBuIGluIHNlbGYuZm9udG5hbWVzOgotCQkJbSA9IE1lbnVJdGVtKHNlbGYuZm9udG1lbnUsIG4sICIiLCBzZWxmLnNlbGZvbnQpCi0JCQlzZWxmLmZvbnRpdGVtcy5hcHBlbmQobSkKLQkJc2VsZi5mYWNlbWVudSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiU3R5bGUiKQotCQlzZWxmLmZhY2VpdGVtcyA9IFtdCi0JCWZvciBuLCBzaG9ydGN1dCBpbiBTVFlMRVM6Ci0JCQltID0gTWVudUl0ZW0oc2VsZi5mYWNlbWVudSwgbiwgc2hvcnRjdXQsIHNlbGYuc2VsZmFjZSkKLQkJCXNlbGYuZmFjZWl0ZW1zLmFwcGVuZChtKQotCQlzZWxmLmZhY2VtZW51LmFkZHNlcGFyYXRvcigpCi0JCXNlbGYuZmFjZWl0ZW1fbm9ybWFsID0gTWVudUl0ZW0oc2VsZi5mYWNlbWVudSwgIk5vcm1hbCIsICJOIiwgCi0JCQlzZWxmLnNlbGZhY2Vub3JtYWwpCi0JCXNlbGYuc2l6ZW1lbnUgPSBNZW51KHNlbGYubWVudWJhciwgIlNpemUiKQotCQlzZWxmLnNpemVpdGVtcyA9IFtdCi0JCWZvciBuIGluIFNJWkVTOgotCQkJbSA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsIHJlcHIobiksICIiLCBzZWxmLnNlbHNpemUpCi0JCQlzZWxmLnNpemVpdGVtcy5hcHBlbmQobSkKLQkJc2VsZi5zaXplbWVudS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLnNpemVpdGVtX2JpZ2dlciA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsICJCaWdnZXIiLCAiKyIsIAotCQkJc2VsZi5zZWxzaXplYmlnZ2VyKQotCQlzZWxmLnNpemVpdGVtX3NtYWxsZXIgPSBNZW51SXRlbShzZWxmLnNpemVtZW51LCAiU21hbGxlciIsICItIiwgCi0JCQlzZWxmLnNlbHNpemVzbWFsbGVyKQotCQkJCQkKLQlkZWYgc2VsZm9udChzZWxmLCBpZCwgaXRlbSwgKnJlc3QpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCWZvbnQgPSBzZWxmLmZvbnRuYW1lc1tpdGVtLTFdCi0JCQlzZWxmLmFjdGl2ZS5tZW51X3NldGZvbnQoZm9udCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIEFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYubnVtID0gMAorICAgICAgICBzZWxmLmFjdGl2ZSA9IE5vbmUKKyAgICAgICAgc2VsZi51cGRhdGVtZW51YmFyKCkKKyAgICAgICAgd2FzdGUuU1RET2JqZWN0SGFuZGxlcnMoKQorICAgICAgICAjIEhhbmRsZXIgZm9yIGhvcml6b250YWwgcnVsZXIKKyAgICAgICAgd2FzdGUuV0VJbnN0YWxsT2JqZWN0SGFuZGxlcigncnVscicsICduZXcgJywgc2VsZi5uZXdSdWxlcikKKyAgICAgICAgd2FzdGUuV0VJbnN0YWxsT2JqZWN0SGFuZGxlcigncnVscicsICdkcmF3Jywgc2VsZi5kcmF3UnVsZXIpCiAKLQlkZWYgc2VsZmFjZShzZWxmLCBpZCwgaXRlbSwgKnJlc3QpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCWZhY2UgPSAoMTw8KGl0ZW0tMSkpCi0JCQlzZWxmLmFjdGl2ZS5tZW51X21vZGZhY2UoZmFjZSkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQorICAgICAgICBzZWxmLm5ld2l0ZW0gPSBNZW51SXRlbShtLCAiTmV3IHdpbmRvdyIsICJOIiwgc2VsZi5vcGVuKQorICAgICAgICBzZWxmLm9wZW5pdGVtID0gTWVudUl0ZW0obSwgIk9wZW4uLi4iLCAiTyIsIHNlbGYub3BlbmZpbGUpCisgICAgICAgIHNlbGYuY2xvc2VpdGVtID0gTWVudUl0ZW0obSwgIkNsb3NlIiwgIlciLCBzZWxmLmNsb3Nld2luKQorICAgICAgICBtLmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYuc2F2ZWl0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgc2VsZi5zYXZlKQorICAgICAgICBzZWxmLnNhdmVhc2l0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSBhcy4uLiIsICIiLCBzZWxmLnNhdmVhcykKKyAgICAgICAgbS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLmluc2VydGl0ZW0gPSBNZW51SXRlbShtLCAiSW5zZXJ0IHBsYWludGV4dC4uLiIsICIiLCBzZWxmLmluc2VydGZpbGUpCisgICAgICAgIHNlbGYuaHRtbGl0ZW0gPSBNZW51SXRlbShtLCAiSW5zZXJ0IEhUTUwuLi4iLCAiIiwgc2VsZi5pbnNlcnRodG1sKQorICAgICAgICBtLmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYucXVpdGl0ZW0gPSBNZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQogCi0JZGVmIHNlbGZhY2Vub3JtYWwoc2VsZiwgKnJlc3QpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfc2V0ZmFjZSgwKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgICAgICBzZWxmLmVkaXRtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCisgICAgICAgIHNlbGYudW5kb2l0ZW0gPSBNZW51SXRlbShtLCAiVW5kbyIsICJaIiwgc2VsZi51bmRvKQorICAgICAgICBzZWxmLmN1dGl0ZW0gPSBNZW51SXRlbShtLCAiQ3V0IiwgIlgiLCBzZWxmLmN1dCkKKyAgICAgICAgc2VsZi5jb3B5aXRlbSA9IE1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCBzZWxmLmNvcHkpCisgICAgICAgIHNlbGYucGFzdGVpdGVtID0gTWVudUl0ZW0obSwgIlBhc3RlIiwgIlYiLCBzZWxmLnBhc3RlKQorICAgICAgICBzZWxmLmNsZWFyaXRlbSA9IE1lbnVJdGVtKG0sICJDbGVhciIsICIiLCBzZWxmLmNsZWFyKQogCi0JZGVmIHNlbHNpemUoc2VsZiwgaWQsIGl0ZW0sICpyZXN0KToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzaXplID0gU0laRVNbaXRlbS0xXQotCQkJc2VsZi5hY3RpdmUubWVudV9zZXRzaXplKHNpemUpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgICAgIHNlbGYubWFrZWZvbnRtZW51KCkKIAotCWRlZiBzZWxzaXplYmlnZ2VyKHNlbGYsICpyZXN0KToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2luY3NpemUoMikKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICAgICAgIyBHcm91cHMgb2YgaXRlbXMgZW5hYmxlZCB0b2dldGhlcjoKKyAgICAgICAgc2VsZi53aW5kb3dncm91cCA9IFtzZWxmLmNsb3NlaXRlbSwgc2VsZi5zYXZlaXRlbSwgc2VsZi5zYXZlYXNpdGVtLAorICAgICAgICAgICAgICAgIHNlbGYuZWRpdG1lbnUsIHNlbGYuZm9udG1lbnUsIHNlbGYuZmFjZW1lbnUsIHNlbGYuc2l6ZW1lbnUsCisgICAgICAgICAgICAgICAgc2VsZi5pbnNlcnRpdGVtXQorICAgICAgICBzZWxmLmZvY3VzZ3JvdXAgPSBbc2VsZi5jdXRpdGVtLCBzZWxmLmNvcHlpdGVtLCBzZWxmLmNsZWFyaXRlbV0KKyAgICAgICAgc2VsZi53aW5kb3dncm91cF9vbiA9IC0xCisgICAgICAgIHNlbGYuZm9jdXNncm91cF9vbiA9IC0xCisgICAgICAgIHNlbGYucGFzdGVncm91cF9vbiA9IC0xCisgICAgICAgIHNlbGYudW5kb19sYWJlbCA9ICJuZXZlciIKKyAgICAgICAgc2VsZi5mZnNfdmFsdWVzID0gKCkKIAotCWRlZiBzZWxzaXplc21hbGxlcihzZWxmLCAqcmVzdCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9pbmNzaXplKC0yKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgIGRlZiBtYWtlZm9udG1lbnUoc2VsZik6CisgICAgICAgIHNlbGYuZm9udG1lbnUgPSBNZW51KHNlbGYubWVudWJhciwgIkZvbnQiKQorICAgICAgICBzZWxmLmZvbnRuYW1lcyA9IGdldGZvbnRuYW1lcygpCisgICAgICAgIHNlbGYuZm9udGl0ZW1zID0gW10KKyAgICAgICAgZm9yIG4gaW4gc2VsZi5mb250bmFtZXM6CisgICAgICAgICAgICBtID0gTWVudUl0ZW0oc2VsZi5mb250bWVudSwgbiwgIiIsIHNlbGYuc2VsZm9udCkKKyAgICAgICAgICAgIHNlbGYuZm9udGl0ZW1zLmFwcGVuZChtKQorICAgICAgICBzZWxmLmZhY2VtZW51ID0gTWVudShzZWxmLm1lbnViYXIsICJTdHlsZSIpCisgICAgICAgIHNlbGYuZmFjZWl0ZW1zID0gW10KKyAgICAgICAgZm9yIG4sIHNob3J0Y3V0IGluIFNUWUxFUzoKKyAgICAgICAgICAgIG0gPSBNZW51SXRlbShzZWxmLmZhY2VtZW51LCBuLCBzaG9ydGN1dCwgc2VsZi5zZWxmYWNlKQorICAgICAgICAgICAgc2VsZi5mYWNlaXRlbXMuYXBwZW5kKG0pCisgICAgICAgIHNlbGYuZmFjZW1lbnUuYWRkc2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi5mYWNlaXRlbV9ub3JtYWwgPSBNZW51SXRlbShzZWxmLmZhY2VtZW51LCAiTm9ybWFsIiwgIk4iLAorICAgICAgICAgICAgICAgIHNlbGYuc2VsZmFjZW5vcm1hbCkKKyAgICAgICAgc2VsZi5zaXplbWVudSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiU2l6ZSIpCisgICAgICAgIHNlbGYuc2l6ZWl0ZW1zID0gW10KKyAgICAgICAgZm9yIG4gaW4gU0laRVM6CisgICAgICAgICAgICBtID0gTWVudUl0ZW0oc2VsZi5zaXplbWVudSwgcmVwcihuKSwgIiIsIHNlbGYuc2Vsc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuc2l6ZWl0ZW1zLmFwcGVuZChtKQorICAgICAgICBzZWxmLnNpemVtZW51LmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYuc2l6ZWl0ZW1fYmlnZ2VyID0gTWVudUl0ZW0oc2VsZi5zaXplbWVudSwgIkJpZ2dlciIsICIrIiwKKyAgICAgICAgICAgICAgICBzZWxmLnNlbHNpemViaWdnZXIpCisgICAgICAgIHNlbGYuc2l6ZWl0ZW1fc21hbGxlciA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsICJTbWFsbGVyIiwgIi0iLAorICAgICAgICAgICAgICAgIHNlbGYuc2Vsc2l6ZXNtYWxsZXIpCiAKLQlkZWYgdXBkYXRlbWVudWJhcihzZWxmKToKLQkJY2hhbmdlZCA9IDAKLQkJb24gPSAoc2VsZi5hY3RpdmUgPD4gTm9uZSkKLQkJaWYgb24gPD4gc2VsZi53aW5kb3dncm91cF9vbjoKLQkJCWZvciBtIGluIHNlbGYud2luZG93Z3JvdXA6Ci0JCQkJbS5lbmFibGUob24pCi0JCQlzZWxmLndpbmRvd2dyb3VwX29uID0gb24KLQkJCWNoYW5nZWQgPSAxCi0JCWlmIG9uOgotCQkJIyBvbmx5IGlmIHdlIGhhdmUgYW4gZWRpdCBtZW51Ci0JCQlvbiA9IHNlbGYuYWN0aXZlLmhhdmVfc2VsZWN0aW9uKCkKLQkJCWlmIG9uIDw+IHNlbGYuZm9jdXNncm91cF9vbjoKLQkJCQlmb3IgbSBpbiBzZWxmLmZvY3VzZ3JvdXA6Ci0JCQkJCW0uZW5hYmxlKG9uKQotCQkJCXNlbGYuZm9jdXNncm91cF9vbiA9IG9uCi0JCQkJY2hhbmdlZCA9IDEKLQkJCW9uID0gc2VsZi5hY3RpdmUuY2FuX3Bhc3RlKCkKLQkJCWlmIG9uIDw+IHNlbGYucGFzdGVncm91cF9vbjoKLQkJCQlzZWxmLnBhc3RlaXRlbS5lbmFibGUob24pCi0JCQkJc2VsZi5wYXN0ZWdyb3VwX29uID0gb24KLQkJCQljaGFuZ2VkID0gMQotCQkJb24gPSBzZWxmLmFjdGl2ZS5jYW5fdW5kbygpCi0JCQlpZiBvbiA8PiBzZWxmLnVuZG9fbGFiZWw6Ci0JCQkJaWYgb246Ci0JCQkJCXNlbGYudW5kb2l0ZW0uZW5hYmxlKDEpCi0JCQkJCXNlbGYudW5kb2l0ZW0uc2V0dGV4dChvbikKLQkJCQkJc2VsZi51bmRvX2xhYmVsID0gb24KLQkJCQllbHNlOgotCQkJCQlzZWxmLnVuZG9pdGVtLnNldHRleHQoIk5vdGhpbmcgdG8gdW5kbyIpCi0JCQkJCXNlbGYudW5kb2l0ZW0uZW5hYmxlKDApCi0JCQkJY2hhbmdlZCA9IDEKLQkJCWlmIHNlbGYudXBkYXRlZm9udG1lbnVzKCk6Ci0JCQkJY2hhbmdlZCA9IDEKLQkJaWYgY2hhbmdlZDoKLQkJCURyYXdNZW51QmFyKCkKLQkJCQotCWRlZiB1cGRhdGVmb250bWVudXMoc2VsZik6Ci0JCWluZm8gPSBzZWxmLmFjdGl2ZS5nZXRydW5pbmZvKCkKLQkJaWYgaW5mbyA9PSBzZWxmLmZmc192YWx1ZXM6Ci0JCQlyZXR1cm4gMAotCQkjIFJlbW92ZSBvbGQgY2hlY2ttYXJrcwotCQlpZiBzZWxmLmZmc192YWx1ZXMgPT0gKCk6Ci0JCQlzZWxmLmZmc192YWx1ZXMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKLQkJZm9udCwgZmFjZSwgc2l6ZSA9IHNlbGYuZmZzX3ZhbHVlcwotCQlpZiBmb250IDw+IE5vbmU6Ci0JCQlmbnVtID0gc2VsZi5mb250bmFtZXMuaW5kZXgoZm9udCkKLQkJCXNlbGYuZm9udGl0ZW1zW2ZudW1dLmNoZWNrKDApCi0JCWlmIGZhY2UgPD4gTm9uZToKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZhY2VpdGVtcykpOgotCQkJCWlmIGZhY2UgJiAoMTw8aSk6Ci0JCQkJCXNlbGYuZmFjZWl0ZW1zW2ldLmNoZWNrKDApCi0JCWlmIHNpemUgPD4gTm9uZToKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgotCQkJCWlmIFNJWkVTW2ldID09IHNpemU6Ci0JCQkJCXNlbGYuc2l6ZWl0ZW1zW2ldLmNoZWNrKDApCi0JCQkJCi0JCXNlbGYuZmZzX3ZhbHVlcyA9IGluZm8KLQkJIyBTZXQgbmV3IGNoZWNrbWFya3MKLQkJZm9udCwgZmFjZSwgc2l6ZSA9IHNlbGYuZmZzX3ZhbHVlcwotCQlpZiBmb250IDw+IE5vbmU6Ci0JCQlmbnVtID0gc2VsZi5mb250bmFtZXMuaW5kZXgoZm9udCkKLQkJCXNlbGYuZm9udGl0ZW1zW2ZudW1dLmNoZWNrKDEpCi0JCWlmIGZhY2UgPD4gTm9uZToKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZhY2VpdGVtcykpOgotCQkJCWlmIGZhY2UgJiAoMTw8aSk6Ci0JCQkJCXNlbGYuZmFjZWl0ZW1zW2ldLmNoZWNrKDEpCi0JCWlmIHNpemUgPD4gTm9uZToKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgotCQkJCWlmIFNJWkVTW2ldID09IHNpemU6Ci0JCQkJCXNlbGYuc2l6ZWl0ZW1zW2ldLmNoZWNrKDEpCi0JCSMgU2V0IG91dGxpbmUvbm9ybWFsIGZvciBzaXplcwotCQlpZiBmb250OgotCQkJZXhpc3RzID0gZ2V0Zm9udHNpemVzKGZvbnQsIFNJWkVTKQotCQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuc2l6ZWl0ZW1zKSk6Ci0JCQkJaWYgZXhpc3RzW2ldOgotCQkJCQlzZWxmLnNpemVpdGVtc1tpXS5zZXRzdHlsZSgwKQotCQkJCWVsc2U6Ci0JCQkJCXNlbGYuc2l6ZWl0ZW1zW2ldLnNldHN0eWxlKDgpCisgICAgZGVmIHNlbGZvbnQoc2VsZiwgaWQsIGl0ZW0sICpyZXN0KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBmb250ID0gc2VsZi5mb250bmFtZXNbaXRlbS0xXQorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9zZXRmb250KGZvbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCiAKLQkjCi0JIyBBcHBsZSBtZW51Ci0JIwotCQotCWRlZiBkb19hYm91dChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIkEgc2ltcGxlIHNpbmdsZS1mb250IHRleHQgZWRpdG9yIGJhc2VkIG9uIFdBU1RFIikKLQkJCQotCSMKLQkjIEZpbGUgbWVudQotCSMKKyAgICBkZWYgc2VsZmFjZShzZWxmLCBpZCwgaXRlbSwgKnJlc3QpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIGZhY2UgPSAoMTw8KGl0ZW0tMSkpCisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X21vZGZhY2UoZmFjZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKIAotCWRlZiBvcGVuKHNlbGYsICphcmdzKToKLQkJc2VsZi5fb3BlbigwKQotCQkKLQlkZWYgb3BlbmZpbGUoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLl9vcGVuKDEpCisgICAgZGVmIHNlbGZhY2Vub3JtYWwoc2VsZiwgKnJlc3QpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2V0ZmFjZSgwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQogCi0JZGVmIF9vcGVuKHNlbGYsIGFza2ZpbGUpOgotCQlpZiBhc2tmaWxlOgotCQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKLQkJCWlmIG5vdCBwYXRoOgotCQkJCXJldHVybgotCQkJbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aClbLTFdCi0JCQl0cnk6Ci0JCQkJZnAgPSBvcGVuKHBhdGgsICdyYicpICMgTk9URSBiaW5hcnksIHdlIG5lZWQgY3IgYXMgZW5kLW9mLWxpbmUKLQkJCQlkYXRhID0gZnAucmVhZCgpCi0JCQkJZnAuY2xvc2UoKQotCQkJZXhjZXB0IElPRXJyb3IsIGFyZzoKLQkJCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJnLCkpCi0JCQkJcmV0dXJuCi0JCWVsc2U6Ci0JCQlwYXRoID0gTm9uZQotCQkJbmFtZSA9ICJVbnRpdGxlZCAlZCIlc2VsZi5udW0KLQkJCWRhdGEgPSAnJwotCQl3ID0gV2FzdGVXaW5kb3coc2VsZikKLQkJdy5vcGVuKHBhdGgsIG5hbWUsIGRhdGEpCi0JCXNlbGYubnVtID0gc2VsZi5udW0gKyAxCisgICAgZGVmIHNlbHNpemUoc2VsZiwgaWQsIGl0ZW0sICpyZXN0KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzaXplID0gU0laRVNbaXRlbS0xXQorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9zZXRzaXplKHNpemUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCiAKLQlkZWYgaW5zZXJ0ZmlsZShzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKLQkJCWlmIG5vdCBwYXRoOgotCQkJCXJldHVybgotCQkJdHJ5OgotCQkJCWZwID0gb3BlbihwYXRoLCAncmInKSAjIE5PVEUgYmluYXJ5LCB3ZSBuZWVkIGNyIGFzIGVuZC1vZi1saW5lCi0JCQlleGNlcHQgSU9FcnJvciwgYXJnOgotCQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIklPRVJST1I6ICVyIiAlIChhcmdzLCkpCi0JCQkJcmV0dXJuCi0JCQlzZWxmLmFjdGl2ZS5tZW51X2luc2VydChmcCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICBkZWYgc2Vsc2l6ZWJpZ2dlcihzZWxmLCAqcmVzdCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9pbmNzaXplKDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCiAKLQlkZWYgaW5zZXJ0aHRtbChzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKLQkJCWlmIG5vdCBwYXRoOgotCQkJCXJldHVybgotCQkJdHJ5OgotCQkJCWZwID0gb3BlbihwYXRoLCAncicpCi0JCQlleGNlcHQgSU9FcnJvciwgYXJnOgotCQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIklPRVJST1I6ICVyIiAlIChhcmcsKSkKLQkJCQlyZXR1cm4KLQkJCXNlbGYuYWN0aXZlLm1lbnVfaW5zZXJ0X2h0bWwoZnApCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgZGVmIHNlbHNpemVzbWFsbGVyKHNlbGYsICpyZXN0KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2luY3NpemUoLTIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCiAKLQkJCi0JZGVmIGNsb3Nld2luKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5jbG9zZSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBzYXZlKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3NhdmUoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgc2F2ZWFzKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3NhdmVfYXMoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkJCi0JCQotCWRlZiBxdWl0KHNlbGYsICphcmdzKToKLQkJZm9yIHcgaW4gc2VsZi5fd2luZG93cy52YWx1ZXMoKToKLQkJCXcuY2xvc2UoKQotCQlpZiBzZWxmLl93aW5kb3dzOgotCQkJcmV0dXJuCi0JCXNlbGYuX3F1aXQoKQotCQkKLQkjCi0JIyBFZGl0IG1lbnUKLQkjCi0JCi0JZGVmIHVuZG8oc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfdW5kbygpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBjdXQoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfY3V0KCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIGNvcHkoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfY29weSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBwYXN0ZShzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9wYXN0ZSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgZGVmIHVwZGF0ZW1lbnViYXIoc2VsZik6CisgICAgICAgIGNoYW5nZWQgPSAwCisgICAgICAgIG9uID0gKHNlbGYuYWN0aXZlIDw+IE5vbmUpCisgICAgICAgIGlmIG9uIDw+IHNlbGYud2luZG93Z3JvdXBfb246CisgICAgICAgICAgICBmb3IgbSBpbiBzZWxmLndpbmRvd2dyb3VwOgorICAgICAgICAgICAgICAgIG0uZW5hYmxlKG9uKQorICAgICAgICAgICAgc2VsZi53aW5kb3dncm91cF9vbiA9IG9uCisgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICBpZiBvbjoKKyAgICAgICAgICAgICMgb25seSBpZiB3ZSBoYXZlIGFuIGVkaXQgbWVudQorICAgICAgICAgICAgb24gPSBzZWxmLmFjdGl2ZS5oYXZlX3NlbGVjdGlvbigpCisgICAgICAgICAgICBpZiBvbiA8PiBzZWxmLmZvY3VzZ3JvdXBfb246CisgICAgICAgICAgICAgICAgZm9yIG0gaW4gc2VsZi5mb2N1c2dyb3VwOgorICAgICAgICAgICAgICAgICAgICBtLmVuYWJsZShvbikKKyAgICAgICAgICAgICAgICBzZWxmLmZvY3VzZ3JvdXBfb24gPSBvbgorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICBvbiA9IHNlbGYuYWN0aXZlLmNhbl9wYXN0ZSgpCisgICAgICAgICAgICBpZiBvbiA8PiBzZWxmLnBhc3RlZ3JvdXBfb246CisgICAgICAgICAgICAgICAgc2VsZi5wYXN0ZWl0ZW0uZW5hYmxlKG9uKQorICAgICAgICAgICAgICAgIHNlbGYucGFzdGVncm91cF9vbiA9IG9uCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgICAgIG9uID0gc2VsZi5hY3RpdmUuY2FuX3VuZG8oKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi51bmRvX2xhYmVsOgorICAgICAgICAgICAgICAgIGlmIG9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLmVuYWJsZSgxKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLnNldHRleHQob24pCisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb19sYWJlbCA9IG9uCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5zZXR0ZXh0KCJOb3RoaW5nIHRvIHVuZG8iKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLmVuYWJsZSgwKQorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICBpZiBzZWxmLnVwZGF0ZWZvbnRtZW51cygpOgorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgIGlmIGNoYW5nZWQ6CisgICAgICAgICAgICBEcmF3TWVudUJhcigpCiAKLQlkZWYgY2xlYXIoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfY2xlYXIoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQkjCi0JIyBPdGhlciBzdHVmZgotCSMJCisgICAgZGVmIHVwZGF0ZWZvbnRtZW51cyhzZWxmKToKKyAgICAgICAgaW5mbyA9IHNlbGYuYWN0aXZlLmdldHJ1bmluZm8oKQorICAgICAgICBpZiBpbmZvID09IHNlbGYuZmZzX3ZhbHVlczoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICMgUmVtb3ZlIG9sZCBjaGVja21hcmtzCisgICAgICAgIGlmIHNlbGYuZmZzX3ZhbHVlcyA9PSAoKToKKyAgICAgICAgICAgIHNlbGYuZmZzX3ZhbHVlcyA9IChOb25lLCBOb25lLCBOb25lKQorICAgICAgICBmb250LCBmYWNlLCBzaXplID0gc2VsZi5mZnNfdmFsdWVzCisgICAgICAgIGlmIGZvbnQgPD4gTm9uZToKKyAgICAgICAgICAgIGZudW0gPSBzZWxmLmZvbnRuYW1lcy5pbmRleChmb250KQorICAgICAgICAgICAgc2VsZi5mb250aXRlbXNbZm51bV0uY2hlY2soMCkKKyAgICAgICAgaWYgZmFjZSA8PiBOb25lOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZmFjZWl0ZW1zKSk6CisgICAgICAgICAgICAgICAgaWYgZmFjZSAmICgxPDxpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWNlaXRlbXNbaV0uY2hlY2soMCkKKyAgICAgICAgaWYgc2l6ZSA8PiBOb25lOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuc2l6ZWl0ZW1zKSk6CisgICAgICAgICAgICAgICAgaWYgU0laRVNbaV0gPT0gc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaXplaXRlbXNbaV0uY2hlY2soMCkKIAotCWRlZiBpZGxlKHNlbGYsIGV2ZW50KToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5kb19pZGxlKGV2ZW50KQotCQllbHNlOgotCQkJUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCi0JCQkKLQlkZWYgbmV3UnVsZXIoc2VsZiwgb2JqKToKLQkJIiIiSW5zZXJ0IGEgbmV3IHJ1bGVyLiBNYWtlIGl0IGFzIHdpZGUgYXMgdGhlIHdpbmRvdyBtaW51cyAyIHB4bHMiIiIKLQkJdGVkID0gb2JqLldFR2V0T2JqZWN0T3duZXIoKQotCQlsLCB0LCByLCBiID0gdGVkLldFR2V0RGVzdFJlY3QoKQotCQlyZXR1cm4gci1sLCA0Ci0JCQotCWRlZiBkcmF3UnVsZXIoc2VsZiwgKGwsIHQsIHIsIGIpLCBvYmopOgotCQl5ID0gKHQrYikvMgotCQlRZC5Nb3ZlVG8obCsyLCB5KQotCQlRZC5MaW5lVG8oci0yLCB5KQotCQlyZXR1cm4gMAotCQkJCisgICAgICAgIHNlbGYuZmZzX3ZhbHVlcyA9IGluZm8KKyAgICAgICAgIyBTZXQgbmV3IGNoZWNrbWFya3MKKyAgICAgICAgZm9udCwgZmFjZSwgc2l6ZSA9IHNlbGYuZmZzX3ZhbHVlcworICAgICAgICBpZiBmb250IDw+IE5vbmU6CisgICAgICAgICAgICBmbnVtID0gc2VsZi5mb250bmFtZXMuaW5kZXgoZm9udCkKKyAgICAgICAgICAgIHNlbGYuZm9udGl0ZW1zW2ZudW1dLmNoZWNrKDEpCisgICAgICAgIGlmIGZhY2UgPD4gTm9uZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZhY2VpdGVtcykpOgorICAgICAgICAgICAgICAgIGlmIGZhY2UgJiAoMTw8aSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFjZWl0ZW1zW2ldLmNoZWNrKDEpCisgICAgICAgIGlmIHNpemUgPD4gTm9uZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgorICAgICAgICAgICAgICAgIGlmIFNJWkVTW2ldID09IHNpemU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2l6ZWl0ZW1zW2ldLmNoZWNrKDEpCisgICAgICAgICMgU2V0IG91dGxpbmUvbm9ybWFsIGZvciBzaXplcworICAgICAgICBpZiBmb250OgorICAgICAgICAgICAgZXhpc3RzID0gZ2V0Zm9udHNpemVzKGZvbnQsIFNJWkVTKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuc2l6ZWl0ZW1zKSk6CisgICAgICAgICAgICAgICAgaWYgZXhpc3RzW2ldOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNpemVpdGVtc1tpXS5zZXRzdHlsZSgwKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2l6ZWl0ZW1zW2ldLnNldHN0eWxlKDgpCisKKyAgICAjCisgICAgIyBBcHBsZSBtZW51CisgICAgIworCisgICAgZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiQSBzaW1wbGUgc2luZ2xlLWZvbnQgdGV4dCBlZGl0b3IgYmFzZWQgb24gV0FTVEUiKQorCisgICAgIworICAgICMgRmlsZSBtZW51CisgICAgIworCisgICAgZGVmIG9wZW4oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9vcGVuKDApCisKKyAgICBkZWYgb3BlbmZpbGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9vcGVuKDEpCisKKyAgICBkZWYgX29wZW4oc2VsZiwgYXNrZmlsZSk6CisgICAgICAgIGlmIGFza2ZpbGU6CisgICAgICAgICAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4odHlwZUxpc3Q9KCdURVhUJywpKQorICAgICAgICAgICAgaWYgbm90IHBhdGg6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5zcGxpdChwYXRoKVstMV0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmcCA9IG9wZW4ocGF0aCwgJ3JiJykgIyBOT1RFIGJpbmFyeSwgd2UgbmVlZCBjciBhcyBlbmQtb2YtbGluZQorICAgICAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgYXJnOgorICAgICAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIklPRVJST1I6ICVyIiAlIChhcmcsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBOb25lCisgICAgICAgICAgICBuYW1lID0gIlVudGl0bGVkICVkIiVzZWxmLm51bQorICAgICAgICAgICAgZGF0YSA9ICcnCisgICAgICAgIHcgPSBXYXN0ZVdpbmRvdyhzZWxmKQorICAgICAgICB3Lm9wZW4ocGF0aCwgbmFtZSwgZGF0YSkKKyAgICAgICAgc2VsZi5udW0gPSBzZWxmLm51bSArIDEKKworICAgIGRlZiBpbnNlcnRmaWxlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4odHlwZUxpc3Q9KCdURVhUJywpKQorICAgICAgICAgICAgaWYgbm90IHBhdGg6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnAgPSBvcGVuKHBhdGgsICdyYicpICMgTk9URSBiaW5hcnksIHdlIG5lZWQgY3IgYXMgZW5kLW9mLWxpbmUKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBhcmc6CisgICAgICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiSU9FUlJPUjogJXIiICUgKGFyZ3MsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfaW5zZXJ0KGZwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIGluc2VydGh0bWwoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oJ1RFWFQnLCkpCisgICAgICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmcCA9IG9wZW4ocGF0aCwgJ3InKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGFyZzoKKyAgICAgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJnLCkpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2luc2VydF9odG1sKGZwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisKKyAgICBkZWYgY2xvc2V3aW4oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBzYXZlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3NhdmUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIHNhdmVhcyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9zYXZlX2FzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworCisgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aW5kb3dzLnZhbHVlcygpOgorICAgICAgICAgICAgdy5jbG9zZSgpCisgICAgICAgIGlmIHNlbGYuX3dpbmRvd3M6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fcXVpdCgpCisKKyAgICAjCisgICAgIyBFZGl0IG1lbnUKKyAgICAjCisKKyAgICBkZWYgdW5kbyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV91bmRvKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBjdXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfY3V0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBjb3B5KHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2NvcHkoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIHBhc3RlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3Bhc3RlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBjbGVhcihzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9jbGVhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICAjCisgICAgIyBPdGhlciBzdHVmZgorICAgICMKKworICAgIGRlZiBpZGxlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5kb19pZGxlKGV2ZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCisKKyAgICBkZWYgbmV3UnVsZXIoc2VsZiwgb2JqKToKKyAgICAgICAgIiIiSW5zZXJ0IGEgbmV3IHJ1bGVyLiBNYWtlIGl0IGFzIHdpZGUgYXMgdGhlIHdpbmRvdyBtaW51cyAyIHB4bHMiIiIKKyAgICAgICAgdGVkID0gb2JqLldFR2V0T2JqZWN0T3duZXIoKQorICAgICAgICBsLCB0LCByLCBiID0gdGVkLldFR2V0RGVzdFJlY3QoKQorICAgICAgICByZXR1cm4gci1sLCA0CisKKyAgICBkZWYgZHJhd1J1bGVyKHNlbGYsIChsLCB0LCByLCBiKSwgb2JqKToKKyAgICAgICAgeSA9ICh0K2IpLzIKKyAgICAgICAgUWQuTW92ZVRvKGwrMiwgeSkKKyAgICAgICAgUWQuTGluZVRvKHItMiwgeSkKKyAgICAgICAgcmV0dXJuIDAKKwogY2xhc3MgTXlIVE1MUGFyc2VyKGh0bWxsaWIuSFRNTFBhcnNlcik6Ci0JCisKICAgICBkZWYgYW5jaG9yX2JnbihzZWxmLCBocmVmLCBuYW1lLCB0eXBlKToKLQkgICAgc2VsZi5hbmNob3IgPSBocmVmCi0JICAgIGlmIHNlbGYuYW5jaG9yOgotCQkgICAgc2VsZi5hbmNob3JsaXN0LmFwcGVuZChocmVmKQotCQkgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9zdHlsZSgnYW5jaG9yJykKKyAgICAgICAgc2VsZi5hbmNob3IgPSBocmVmCisgICAgICAgIGlmIHNlbGYuYW5jaG9yOgorICAgICAgICAgICAgc2VsZi5hbmNob3JsaXN0LmFwcGVuZChocmVmKQorICAgICAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9zdHlsZSgnYW5jaG9yJykKIAogICAgIGRlZiBhbmNob3JfZW5kKHNlbGYpOgotCSAgICBpZiBzZWxmLmFuY2hvcjoKLQkJICAgIHNlbGYuYW5jaG9yID0gTm9uZQotCQkgICAgc2VsZi5mb3JtYXR0ZXIucG9wX3N0eWxlKCkKKyAgICAgICAgaWYgc2VsZi5hbmNob3I6CisgICAgICAgICAgICBzZWxmLmFuY2hvciA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9zdHlsZSgpCiAKLQkJCQorCiBkZWYgZ2V0Zm9udG5hbWVzKCk6Ci0JbmFtZXMgPSBbXQotCWZvciBpIGluIHJhbmdlKDI1Nik6Ci0JCW4gPSBGbS5HZXRGb250TmFtZShpKQotCQlpZiBuOiBuYW1lcy5hcHBlbmQobikKLQlyZXR1cm4gbmFtZXMKLQkKKyAgICBuYW1lcyA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgbiA9IEZtLkdldEZvbnROYW1lKGkpCisgICAgICAgIGlmIG46IG5hbWVzLmFwcGVuZChuKQorICAgIHJldHVybiBuYW1lcworCiBkZWYgZ2V0Zm9udHNpemVzKG5hbWUsIHNpemVzKToKLQlleGlzdCA9IFtdCi0JbnVtID0gRm0uR2V0Rk51bShuYW1lKQotCWZvciBzeiBpbiBzaXplczoKLQkJaWYgRm0uUmVhbEZvbnQobnVtLCBzeik6Ci0JCQlleGlzdC5hcHBlbmQoMSkKLQkJZWxzZToKLQkJCWV4aXN0LmFwcGVuZCgwKQotCXJldHVybiBleGlzdAorICAgIGV4aXN0ID0gW10KKyAgICBudW0gPSBGbS5HZXRGTnVtKG5hbWUpCisgICAgZm9yIHN6IGluIHNpemVzOgorICAgICAgICBpZiBGbS5SZWFsRm9udChudW0sIHN6KToKKyAgICAgICAgICAgIGV4aXN0LmFwcGVuZCgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhpc3QuYXBwZW5kKDApCisgICAgcmV0dXJuIGV4aXN0CiAKIGRlZiBtYWluKCk6Ci0JQXBwID0gV2VkKCkKLQlBcHAubWFpbmxvb3AoKQotCQorICAgIEFwcCA9IFdlZCgpCisgICAgQXBwLm1haW5sb29wKCkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKLQkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL3dhc3RlL3N3ZWQucHkgYi9NYWMvRGVtby93YXN0ZS9zd2VkLnB5CmluZGV4IGNhNzcyOTMuLjIwNzhjY2UgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL3dhc3RlL3N3ZWQucHkKKysrIGIvTWFjL0RlbW8vd2FzdGUvc3dlZC5weQpAQCAtMTYsNjIwICsxNiw2MTkgQEAKIGltcG9ydCBtYWNmcwogCiBVTkRPTEFCRUxTID0gWyAjIEluZGV4ZWQgYnkgV0VHZXRVbmRvSW5mbygpIHZhbHVlCi0JTm9uZSwgIiIsICJ0eXBpbmciLCAiQ3V0IiwgIlBhc3RlIiwgIkNsZWFyIiwgIkRyYWciLCAiU3R5bGUiXQotCQorICAgICAgICBOb25lLCAiIiwgInR5cGluZyIsICJDdXQiLCAiUGFzdGUiLCAiQ2xlYXIiLCAiRHJhZyIsICJTdHlsZSJdCisKICMgU3R5bGUgYW5kIHNpemUgbWVudS4gTm90ZSB0aGF0IHN0eWxlIG9yZGVyIGlzIGltcG9ydGFudCAodGllZCB0byBiaXQgdmFsdWVzKQogU1RZTEVTID0gWwotCSgiQm9sZCIsICJCIiksICgiSXRhbGljIiwgIkkiKSwgKCJVbmRlcmxpbmUiLCAiVSIpLCAoIk91dGxpbmUiLCAiTyIpLAotCSgiU2hhZG93IiwgIiIpLCAoIkNvbmRlbnNlZCIsICIiKSwgKCJFeHRlbmRlZCIsICIiKQotCV0KKyAgICAgICAgKCJCb2xkIiwgIkIiKSwgKCJJdGFsaWMiLCAiSSIpLCAoIlVuZGVybGluZSIsICJVIiksICgiT3V0bGluZSIsICJPIiksCisgICAgICAgICgiU2hhZG93IiwgIiIpLCAoIkNvbmRlbnNlZCIsICIiKSwgKCJFeHRlbmRlZCIsICIiKQorICAgICAgICBdCiBTSVpFUyA9IFsgOSwgMTAsIDEyLCAxNCwgMTgsIDI0XQotCQorCiBCSUdSRUdJT049UWQuTmV3UmduKCkKIFFkLlNldFJlY3RSZ24oQklHUkVHSU9OLCAtMTYwMDAsIC0xNjAwMCwgMTYwMDAsIDE2MDAwKQogCiBjbGFzcyBXYXN0ZVdpbmRvdyhTY3JvbGxlZFdpbmRvdyk6Ci0JZGVmIG9wZW4oc2VsZiwgcGF0aCwgbmFtZSwgZGF0YSk6Ci0JCXNlbGYucGF0aCA9IHBhdGgKLQkJc2VsZi5uYW1lID0gbmFtZQotCQlyID0gd2luZG93Ym91bmRzKDQwMCwgNDAwKQotCQl3ID0gV2luLk5ld1dpbmRvdyhyLCBuYW1lLCAxLCAwLCAtMSwgMSwgMCkKLQkJc2VsZi53aWQgPSB3Ci0JCXZyID0gMCwgMCwgclsyXS1yWzBdLTE1LCByWzNdLXJbMV0tMTUKLQkJZHIgPSAoMCwgMCwgMTAyNDAsIDApCi0JCVFkLlNldFBvcnQodykKLQkJUWQuVGV4dEZvbnQoNCkKLQkJUWQuVGV4dFNpemUoOSkKLQkJZmxhZ3MgPSBXQVNURWNvbnN0LndlRG9BdXRvU2Nyb2xsIHwgV0FTVEVjb25zdC53ZURvT3V0bGluZUhpbGl0ZSB8IFwKLQkJCQlXQVNURWNvbnN0LndlRG9VbmRvCi0JCXNlbGYudGVkID0gd2FzdGUuV0VOZXcoZHIsIHZyLCBmbGFncykKLQkJc2VsZi50ZWQuV0VJbnN0YWxsVGFiSG9va3MoKQotCQlzdHlsZSwgc291cCA9IHNlbGYuZ2V0c3R5bGVzb3VwKCkKLQkJc2VsZi50ZWQuV0VJbnNlcnQoZGF0YSwgc3R5bGUsIHNvdXApCi0JCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKDAsMCkKLQkJc2VsZi50ZWQuV0VDYWxUZXh0KCkKLQkJc2VsZi50ZWQuV0VSZXNldE1vZENvdW50KCkKLQkJdy5EcmF3R3Jvd0ljb24oKQotCQlzZWxmLnNjcm9sbGJhcnMoKQotCQlzZWxmLmRvX3Bvc3RvcGVuKCkKLQkJc2VsZi5kb19hY3RpdmF0ZSgxLCBOb25lKQotCQkKLQlkZWYgZ2V0c3R5bGVzb3VwKHNlbGYpOgotCQlpZiBub3Qgc2VsZi5wYXRoOgotCQkJcmV0dXJuIE5vbmUsIE5vbmUKLQkJb2xkcmYgPSBSZXMuQ3VyUmVzRmlsZSgpCi0JCXRyeToKLQkJCXJmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMSkKLQkJZXhjZXB0IFJlcy5FcnJvcjoKLQkJCXJldHVybiBOb25lLCBOb25lCi0JCXRyeToKLQkJCWhzdHlsZSA9IFJlcy5HZXQxUmVzb3VyY2UoJ3N0eWwnLCAxMjgpCi0JCQloc3R5bGUuRGV0YWNoUmVzb3VyY2UoKQotCQlleGNlcHQgUmVzLkVycm9yOgotCQkJaHN0eWxlID0gTm9uZQotCQl0cnk6Ci0JCQloc291cCA9IFJlcy5HZXQxUmVzb3VyY2UoJ1NPVVAnLCAxMjgpCi0JCQloc291cC5EZXRhY2hSZXNvdXJjZSgpCi0JCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQloc291cCA9IE5vbmUKLQkJUmVzLkNsb3NlUmVzRmlsZShyZikKLQkJUmVzLlVzZVJlc0ZpbGUob2xkcmYpCi0JCXJldHVybiBoc3R5bGUsIGhzb3VwCi0JCQkJCi0JZGVmIGRvX2lkbGUoc2VsZiwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQlzZWxmLnRlZC5XRUlkbGUoKQkKLQkJaWYgc2VsZi50ZWQuV0VBZGp1c3RDdXJzb3Iod2hlcmUsIEJJR1JFR0lPTik6Ci0JCQlyZXR1cm4KLQkJUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCi0JCQotCWRlZiBnZXRzY3JvbGxiYXJ2YWx1ZXMoc2VsZik6Ci0JCWRyID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCi0JCXZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCXZ4ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzBdLCBkclsyXSwgdnJbMF0sIHZyWzJdKQotCQl2eSA9IHNlbGYuc2NhbGViYXJ2YWx1ZShkclsxXSwgZHJbM10sIHZyWzFdLCB2clszXSkKLQkJcmV0dXJuIHZ4LCB2eQotCQkKLQlkZWYgc2Nyb2xsYmFyX2NhbGxiYWNrKHNlbGYsIHdoaWNoLCB3aGF0LCB2YWx1ZSk6Ci0JCWlmIHdoaWNoID09ICd5JzoKLQkJCWlmIHdoYXQgPT0gJ3NldCc6Ci0JCQkJaGVpZ2h0ID0gc2VsZi50ZWQuV0VHZXRIZWlnaHQoMCwgMHgzZmZmZmZmZikKLQkJCQljdXIgPSBzZWxmLmdldHNjcm9sbGJhcnZhbHVlcygpWzFdCi0JCQkJZGVsdGEgPSAoY3VyLXZhbHVlKSpoZWlnaHQvMzI3NjcKLQkJCWlmIHdoYXQgPT0gJy0nOgotCQkJCXRvcGxpbmVfb2ZmLGR1bW15ID0gc2VsZi50ZWQuV0VHZXRPZmZzZXQoKDEsMSkpCi0JCQkJdG9wbGluZV9udW0gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZSh0b3BsaW5lX29mZikKLQkJCQlkZWx0YSA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KHRvcGxpbmVfbnVtLCB0b3BsaW5lX251bSsxKQotCQkJZWxpZiB3aGF0ID09ICctLSc6Ci0JCQkJZGVsdGEgPSAoc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpWzNdLTEwKQotCQkJCWlmIGRlbHRhIDw9IDA6Ci0JCQkJCWRlbHRhID0gMTAgIyBSYW5kb20gdmFsdWUKLQkJCWVsaWYgd2hhdCA9PSAnKyc6Ci0JCQkJIyBYWFhYIFdyb25nOiBzaG91bGQgYmUgYm90dG9tIGxpbmUgc2l6ZQotCQkJCXRvcGxpbmVfb2ZmLGR1bW15ID0gc2VsZi50ZWQuV0VHZXRPZmZzZXQoKDEsMSkpCi0JCQkJdG9wbGluZV9udW0gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZSh0b3BsaW5lX29mZikKLQkJCQlkZWx0YSA9IC1zZWxmLnRlZC5XRUdldEhlaWdodCh0b3BsaW5lX251bSwgdG9wbGluZV9udW0rMSkKLQkJCWVsaWYgd2hhdCA9PSAnKysnOgotCQkJCWRlbHRhID0gLShzZWxmLnRlZC5XRUdldFZpZXdSZWN0KClbM10tMTApCi0JCQkJaWYgZGVsdGEgPj0gMDoKLQkJCQkJZGVsdGEgPSAtMTAKLQkJCXNlbGYudGVkLldFU2Nyb2xsKDAsIGRlbHRhKQotCQllbHNlOgotCQkJaWYgd2hhdCA9PSAnc2V0JzoKLQkJCQlyZXR1cm4gIyBYWFhYCi0JCQl2ciA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQotCQkJd2lud2lkdGggPSB2clsyXS12clswXQotCQkJaWYgd2hhdCA9PSAnLSc6Ci0JCQkJZGVsdGEgPSB3aW53aWR0aC8xMAotCQkJZWxpZiB3aGF0ID09ICctLSc6Ci0JCQkJZGVsdGEgPSB3aW53aWR0aC8yCi0JCQllbGlmIHdoYXQgPT0gJysnOgotCQkJCWRlbHRhID0gLXdpbndpZHRoLzEwCi0JCQllbGlmIHdoYXQgPT0gJysrJzoKLQkJCQlkZWx0YSA9IC13aW53aWR0aC8yCi0JCQlzZWxmLnRlZC5XRVNjcm9sbChkZWx0YSwgMCkKLQkJIyBQaW4gdGhlIHNjcm9sbAotCQlsLCB0LCByLCBiID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCi0JCXZsLCB2dCwgdnIsIHZiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCWlmIHQgPiAwIG9yIGwgPiAwOgotCQkJZHggPSBkeSA9IDAKLQkJCWlmIHQgPiAwOiBkeSA9IC10Ci0JCQlpZiBsID4gMDogZHggPSAtbAotCQkJc2VsZi50ZWQuV0VTY3JvbGwoZHgsIGR5KQotCQllbGlmIGIgPCB2YjoKLQkJCXNlbGYudGVkLldFU2Nyb2xsKDAsIGItdmIpCisgICAgZGVmIG9wZW4oc2VsZiwgcGF0aCwgbmFtZSwgZGF0YSk6CisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICByID0gd2luZG93Ym91bmRzKDQwMCwgNDAwKQorICAgICAgICB3ID0gV2luLk5ld1dpbmRvdyhyLCBuYW1lLCAxLCAwLCAtMSwgMSwgMCkKKyAgICAgICAgc2VsZi53aWQgPSB3CisgICAgICAgIHZyID0gMCwgMCwgclsyXS1yWzBdLTE1LCByWzNdLXJbMV0tMTUKKyAgICAgICAgZHIgPSAoMCwgMCwgMTAyNDAsIDApCisgICAgICAgIFFkLlNldFBvcnQodykKKyAgICAgICAgUWQuVGV4dEZvbnQoNCkKKyAgICAgICAgUWQuVGV4dFNpemUoOSkKKyAgICAgICAgZmxhZ3MgPSBXQVNURWNvbnN0LndlRG9BdXRvU2Nyb2xsIHwgV0FTVEVjb25zdC53ZURvT3V0bGluZUhpbGl0ZSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdBU1RFY29uc3Qud2VEb1VuZG8KKyAgICAgICAgc2VsZi50ZWQgPSB3YXN0ZS5XRU5ldyhkciwgdnIsIGZsYWdzKQorICAgICAgICBzZWxmLnRlZC5XRUluc3RhbGxUYWJIb29rcygpCisgICAgICAgIHN0eWxlLCBzb3VwID0gc2VsZi5nZXRzdHlsZXNvdXAoKQorICAgICAgICBzZWxmLnRlZC5XRUluc2VydChkYXRhLCBzdHlsZSwgc291cCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oMCwwKQorICAgICAgICBzZWxmLnRlZC5XRUNhbFRleHQoKQorICAgICAgICBzZWxmLnRlZC5XRVJlc2V0TW9kQ291bnQoKQorICAgICAgICB3LkRyYXdHcm93SWNvbigpCisgICAgICAgIHNlbGYuc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYuZG9fcG9zdG9wZW4oKQorICAgICAgICBzZWxmLmRvX2FjdGl2YXRlKDEsIE5vbmUpCiAKLQkJCi0JZGVmIGRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpOgotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQlTY3JvbGxlZFdpbmRvdy5kb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KQotCQlpZiBvbm9mZjoKLQkJCXNlbGYudGVkLldFQWN0aXZhdGUoKQotCQkJc2VsZi5wYXJlbnQuYWN0aXZlID0gc2VsZgotCQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCWVsc2U6Ci0JCQlzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQorICAgIGRlZiBnZXRzdHlsZXNvdXAoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnBhdGg6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorICAgICAgICBvbGRyZiA9IFJlcy5DdXJSZXNGaWxlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAxKQorICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaHN0eWxlID0gUmVzLkdldDFSZXNvdXJjZSgnc3R5bCcsIDEyOCkKKyAgICAgICAgICAgIGhzdHlsZS5EZXRhY2hSZXNvdXJjZSgpCisgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3I6CisgICAgICAgICAgICBoc3R5bGUgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhzb3VwID0gUmVzLkdldDFSZXNvdXJjZSgnU09VUCcsIDEyOCkKKyAgICAgICAgICAgIGhzb3VwLkRldGFjaFJlc291cmNlKCkKKyAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjoKKyAgICAgICAgICAgIGhzb3VwID0gTm9uZQorICAgICAgICBSZXMuQ2xvc2VSZXNGaWxlKHJmKQorICAgICAgICBSZXMuVXNlUmVzRmlsZShvbGRyZikKKyAgICAgICAgcmV0dXJuIGhzdHlsZSwgaHNvdXAKIAotCWRlZiBkb191cGRhdGUoc2VsZiwgd2lkLCBldmVudCk6Ci0JCXJlZ2lvbiA9IHdpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduCi0JCWlmIFFkLkVtcHR5UmduKHJlZ2lvbik6Ci0JCQlyZXR1cm4KLQkJUWQuRXJhc2VSZ24ocmVnaW9uKQotCQlzZWxmLnRlZC5XRVVwZGF0ZShyZWdpb24pCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCQotCWRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6Ci0JCWwsIHQsIHIsIGIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJdnIgPSAobCwgdCwgbCt3aWR0aC0xNSwgdCtoZWlnaHQtMTUpCi0JCXNlbGYudGVkLldFU2V0Vmlld1JlY3QodnIpCi0JCXNlbGYud2lkLkludmFsV2luZG93UmVjdCh2cikKLQkJU2Nyb2xsZWRXaW5kb3cuZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpCi0JCQotCWRlZiBkb19jb250ZW50Y2xpY2soc2VsZiwgbG9jYWwsIG1vZGlmaWVycywgZXZ0KToKLQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZ0Ci0JCXNlbGYudGVkLldFQ2xpY2sobG9jYWwsIG1vZGlmaWVycywgd2hlbikKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgZGVmIGRvX2lkbGUoc2VsZiwgZXZlbnQpOgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICBRZC5TZXRQb3J0KHNlbGYud2lkKQorICAgICAgICBzZWxmLnRlZC5XRUlkbGUoKQorICAgICAgICBpZiBzZWxmLnRlZC5XRUFkanVzdEN1cnNvcih3aGVyZSwgQklHUkVHSU9OKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBRZC5TZXRDdXJzb3IoUWQuR2V0UURHbG9iYWxzQXJyb3coKSkKIAotCWRlZiBkb19jaGFyKHNlbGYsIGNoLCBldmVudCk6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCXNlbGYudGVkLldFS2V5KG9yZChjaCksIG1vZGlmaWVycykKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgc2VsZi50ZWQuV0VHZXRNb2RDb3VudCgpOgotCQkJc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlIHdpbmRvdyAiJXMiIGJlZm9yZSBjbG9zaW5nPyclc2VsZi5uYW1lLCAxKQotCQkJaWYgc2F2ZSA+IDA6Ci0JCQkJc2VsZi5tZW51X3NhdmUoKQotCQkJZWxpZiBzYXZlIDwgMDoKLQkJCQlyZXR1cm4KLQkJaWYgc2VsZi5wYXJlbnQuYWN0aXZlID09IHNlbGY6Ci0JCQlzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQlkZWwgc2VsZi50ZWQKLQkJc2VsZi5kb19wb3N0Y2xvc2UoKQotCQkKLQlkZWYgbWVudV9zYXZlKHNlbGYpOgotCQlpZiBub3Qgc2VsZi5wYXRoOgotCQkJc2VsZi5tZW51X3NhdmVfYXMoKQotCQkJcmV0dXJuICMgV2lsbCBjYWxsIHVzIHJlY3Vyc2l2ZWx5Ci0JCSMKLQkJIyBGaXJzdCBzYXZlIGRhdGEKLQkJIwotCQlkaGFuZGxlID0gc2VsZi50ZWQuV0VHZXRUZXh0KCkKLQkJZGF0YSA9IGRoYW5kbGUuZGF0YQotCQlmcCA9IG9wZW4oc2VsZi5wYXRoLCAnd2InKSAgIyBOT1RFOiB3YiwgYmVjYXVzZSBkYXRhIGhhcyBDUiBmb3IgZW5kLW9mLWxpbmUKLQkJZnAud3JpdGUoZGF0YSkKLQkJaWYgZGF0YVstMV0gPD4gJ1xyJzogZnAud3JpdGUoJ1xyJykKLQkJZnAuY2xvc2UoKQotCQkjCi0JCSMgTm93IHNhdmUgc3R5bGUgYW5kIHNvdXAKLQkJIwotCQlvbGRyZXNmaWxlID0gUmVzLkN1clJlc0ZpbGUoKQotCQl0cnk6Ci0JCQlyZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDMpCi0JCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQlSZXMuRlNwQ3JlYXRlUmVzRmlsZShzZWxmLnBhdGgsICc/Pz8/JywgJ1RFWFQnLCBtYWNmcy5zbUFsbFNjcmlwdHMpCi0JCQlyZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDMpCi0JCXN0eWxlcyA9IFJlcy5SZXNvdXJjZSgnJykKLQkJc291cCA9IFJlcy5SZXNvdXJjZSgnJykKLQkJc2VsZi50ZWQuV0VDb3B5UmFuZ2UoMCwgMHgzZmZmZmZmZiwgTm9uZSwgc3R5bGVzLCBzb3VwKQotCQlzdHlsZXMuQWRkUmVzb3VyY2UoJ3N0eWwnLCAxMjgsICcnKQotCQlzb3VwLkFkZFJlc291cmNlKCdTT1VQJywgMTI4LCAnJykKLQkJUmVzLkNsb3NlUmVzRmlsZShyZikKLQkJUmVzLlVzZVJlc0ZpbGUob2xkcmVzZmlsZSkKLQkJCi0JCXNlbGYudGVkLldFUmVzZXRNb2RDb3VudCgpCi0JCQotCWRlZiBtZW51X3NhdmVfYXMoc2VsZik6Ci0JCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzOicpCi0JCWlmIG5vdCBwYXRoOiByZXR1cm4KLQkJc2VsZi5wYXRoID0gcGF0aAotCQlzZWxmLm5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCi0JCXNlbGYud2lkLlNldFdUaXRsZShzZWxmLm5hbWUpCi0JCXNlbGYubWVudV9zYXZlKCkKLQkJCi0JZGVmIG1lbnVfY3V0KHNlbGYpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6Ci0JCQlTY3JhcC5aZXJvU2NyYXAoKQotCQllbHNlOgotCQkJU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQotCQlzZWxmLnRlZC5XRUN1dCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgbWVudV9jb3B5KHNlbGYpOgotCQlpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6Ci0JCQlTY3JhcC5aZXJvU2NyYXAoKQotCQllbHNlOgotCQkJU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQotCQlzZWxmLnRlZC5XRUNvcHkoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfcGFzdGUoc2VsZik6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCXNlbGYudGVkLldFUGFzdGUoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfY2xlYXIoc2VsZik6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCXNlbGYudGVkLldFRGVsZXRlKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgZGVmIGdldHNjcm9sbGJhcnZhbHVlcyhzZWxmKToKKyAgICAgICAgZHIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKKyAgICAgICAgdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgdnggPSBzZWxmLnNjYWxlYmFydmFsdWUoZHJbMF0sIGRyWzJdLCB2clswXSwgdnJbMl0pCisgICAgICAgIHZ5ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzFdLCBkclszXSwgdnJbMV0sIHZyWzNdKQorICAgICAgICByZXR1cm4gdngsIHZ5CiAKLQlkZWYgbWVudV91bmRvKHNlbGYpOgotCQlzZWxmLnRlZC5XRVVuZG8oKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfc2V0Zm9udChzZWxmLCBmb250KToKLQkJZm9udCA9IEZtLkdldEZOdW0oZm9udCkKLQkJc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0ZvbnQsIChmb250LCAwLCAwLCAoMCwwLDApKSkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQkJCi0JZGVmIG1lbnVfbW9kZmFjZShzZWxmLCBmYWNlKToKLQkJc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0ZhY2V8V0FTVEVjb25zdC53ZURvVG9nZ2xlRmFjZSwgCi0JCQkoMCwgZmFjZSwgMCwgKDAsMCwwKSkpCisgICAgZGVmIHNjcm9sbGJhcl9jYWxsYmFjayhzZWxmLCB3aGljaCwgd2hhdCwgdmFsdWUpOgorICAgICAgICBpZiB3aGljaCA9PSAneSc6CisgICAgICAgICAgICBpZiB3aGF0ID09ICdzZXQnOgorICAgICAgICAgICAgICAgIGhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KDAsIDB4M2ZmZmZmZmYpCisgICAgICAgICAgICAgICAgY3VyID0gc2VsZi5nZXRzY3JvbGxiYXJ2YWx1ZXMoKVsxXQorICAgICAgICAgICAgICAgIGRlbHRhID0gKGN1ci12YWx1ZSkqaGVpZ2h0LzMyNzY3CisgICAgICAgICAgICBpZiB3aGF0ID09ICctJzoKKyAgICAgICAgICAgICAgICB0b3BsaW5lX29mZixkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLDEpKQorICAgICAgICAgICAgICAgIHRvcGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUodG9wbGluZV9vZmYpCisgICAgICAgICAgICAgICAgZGVsdGEgPSBzZWxmLnRlZC5XRUdldEhlaWdodCh0b3BsaW5lX251bSwgdG9wbGluZV9udW0rMSkKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnLS0nOgorICAgICAgICAgICAgICAgIGRlbHRhID0gKHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXS0xMCkKKyAgICAgICAgICAgICAgICBpZiBkZWx0YSA8PSAwOgorICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDEwICMgUmFuZG9tIHZhbHVlCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJysnOgorICAgICAgICAgICAgICAgICMgWFhYWCBXcm9uZzogc2hvdWxkIGJlIGJvdHRvbSBsaW5lIHNpemUKKyAgICAgICAgICAgICAgICB0b3BsaW5lX29mZixkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLDEpKQorICAgICAgICAgICAgICAgIHRvcGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUodG9wbGluZV9vZmYpCisgICAgICAgICAgICAgICAgZGVsdGEgPSAtc2VsZi50ZWQuV0VHZXRIZWlnaHQodG9wbGluZV9udW0sIHRvcGxpbmVfbnVtKzEpCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJysrJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IC0oc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpWzNdLTEwKQorICAgICAgICAgICAgICAgIGlmIGRlbHRhID49IDA6CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLTEwCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNjcm9sbCgwLCBkZWx0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHdoYXQgPT0gJ3NldCc6CisgICAgICAgICAgICAgICAgcmV0dXJuICMgWFhYWAorICAgICAgICAgICAgdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgICAgIHdpbndpZHRoID0gdnJbMl0tdnJbMF0KKyAgICAgICAgICAgIGlmIHdoYXQgPT0gJy0nOgorICAgICAgICAgICAgICAgIGRlbHRhID0gd2lud2lkdGgvMTAKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnLS0nOgorICAgICAgICAgICAgICAgIGRlbHRhID0gd2lud2lkdGgvMgorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICcrJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IC13aW53aWR0aC8xMAorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICcrKyc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAtd2lud2lkdGgvMgorICAgICAgICAgICAgc2VsZi50ZWQuV0VTY3JvbGwoZGVsdGEsIDApCisgICAgICAgICMgUGluIHRoZSBzY3JvbGwKKyAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQorICAgICAgICB2bCwgdnQsIHZyLCB2YiA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQorICAgICAgICBpZiB0ID4gMCBvciBsID4gMDoKKyAgICAgICAgICAgIGR4ID0gZHkgPSAwCisgICAgICAgICAgICBpZiB0ID4gMDogZHkgPSAtdAorICAgICAgICAgICAgaWYgbCA+IDA6IGR4ID0gLWwKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2Nyb2xsKGR4LCBkeSkKKyAgICAgICAgZWxpZiBiIDwgdmI6CisgICAgICAgICAgICBzZWxmLnRlZC5XRVNjcm9sbCgwLCBiLXZiKQogCi0JZGVmIG1lbnVfc2V0ZmFjZShzZWxmLCBmYWNlKToKLQkJc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0ZhY2V8V0FTVEVjb25zdC53ZURvUmVwbGFjZUZhY2UsIAotCQkJKDAsIGZhY2UsIDAsICgwLDAsMCkpKQogCi0JZGVmIG1lbnVfc2V0c2l6ZShzZWxmLCBzaXplKToKLQkJc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb1NpemUsICgwLCAwLCBzaXplLCAoMCwwLDApKSkKLQkJCQkJCQkJCi0JZGVmIG1lbnVfaW5jc2l6ZShzZWxmLCBzaXplKToKLQkJc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0FkZFNpemUsICgwLCAwLCBzaXplLCAoMCwwLDApKSkKKyAgICBkZWYgZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2dCk6CisgICAgICAgIFFkLlNldFBvcnQoc2VsZi53aWQpCisgICAgICAgIFNjcm9sbGVkV2luZG93LmRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpCisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCisgICAgICAgICAgICBzZWxmLnBhcmVudC5hY3RpdmUgPSBzZWxmCisgICAgICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGVkLldFRGVhY3RpdmF0ZSgpCiAKLQlkZWYgbXlzZXRzdHlsZShzZWxmLCB3aGljaCwgaG93KToKLQkJc2VsZi50ZWQuV0VTZWxWaWV3KCkKLQkJc2VsZi50ZWQuV0VTZXRTdHlsZSh3aGljaCwgaG93KQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCQkJCQkJCi0JZGVmIGhhdmVfc2VsZWN0aW9uKHNlbGYpOgotCQlzdGFydCwgc3RvcCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJcmV0dXJuIHN0YXJ0IDwgc3RvcAotCQkKLQlkZWYgY2FuX3Bhc3RlKHNlbGYpOgotCQlyZXR1cm4gc2VsZi50ZWQuV0VDYW5QYXN0ZSgpCi0JCQotCWRlZiBjYW5fdW5kbyhzZWxmKToKLQkJd2hpY2gsIHJlZG8gPSBzZWxmLnRlZC5XRUdldFVuZG9JbmZvKCkKLQkJd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQotCQlpZiB3aGljaCA9PSBOb25lOiByZXR1cm4gTm9uZQotCQlpZiByZWRvOgotCQkJcmV0dXJuICJSZWRvICIrd2hpY2gKLQkJZWxzZToKLQkJCXJldHVybiAiVW5kbyAiK3doaWNoCi0JCQkKLQlkZWYgZ2V0cnVuaW5mbyhzZWxmKToKLQkJYWxsID0gKFdBU1RFY29uc3Qud2VEb0ZvbnQgfCBXQVNURWNvbnN0LndlRG9GYWNlIHwgV0FTVEVjb25zdC53ZURvU2l6ZSkKLQkJZHVtbXksIG1vZGUsIChmb250LCBmYWNlLCBzaXplLCBjb2xvcikgPSBzZWxmLnRlZC5XRUNvbnRpbnVvdXNTdHlsZShhbGwpCi0JCWlmIG5vdCAobW9kZSAmIFdBU1RFY29uc3Qud2VEb0ZvbnQpOgotCQkJZm9udCA9IE5vbmUKLQkJZWxzZToKLQkJCWZvbnQgPSBGbS5HZXRGb250TmFtZShmb250KQotCQlpZiBub3QgKG1vZGUgJiBXQVNURWNvbnN0LndlRG9GYWNlKTogZmFjdCA9IE5vbmUKLQkJaWYgbm90IChtb2RlICYgV0FTVEVjb25zdC53ZURvU2l6ZSk6IHNpemUgPSBOb25lCi0JCXJldHVybiBmb250LCBmYWNlLCBzaXplCisgICAgZGVmIGRvX3VwZGF0ZShzZWxmLCB3aWQsIGV2ZW50KToKKyAgICAgICAgcmVnaW9uID0gd2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KKyAgICAgICAgaWYgUWQuRW1wdHlSZ24ocmVnaW9uKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBRZC5FcmFzZVJnbihyZWdpb24pCisgICAgICAgIHNlbGYudGVkLldFVXBkYXRlKHJlZ2lvbikKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKworICAgIGRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgdnIgPSAobCwgdCwgbCt3aWR0aC0xNSwgdCtoZWlnaHQtMTUpCisgICAgICAgIHNlbGYudGVkLldFU2V0Vmlld1JlY3QodnIpCisgICAgICAgIHNlbGYud2lkLkludmFsV2luZG93UmVjdCh2cikKKyAgICAgICAgU2Nyb2xsZWRXaW5kb3cuZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpCisKKyAgICBkZWYgZG9fY29udGVudGNsaWNrKHNlbGYsIGxvY2FsLCBtb2RpZmllcnMsIGV2dCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2dAorICAgICAgICBzZWxmLnRlZC5XRUNsaWNrKGxvY2FsLCBtb2RpZmllcnMsIHdoZW4pCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIGRvX2NoYXIoc2VsZiwgY2gsIGV2ZW50KToKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgc2VsZi50ZWQuV0VLZXkob3JkKGNoKSwgbW9kaWZpZXJzKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi50ZWQuV0VHZXRNb2RDb3VudCgpOgorICAgICAgICAgICAgc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlIHdpbmRvdyAiJXMiIGJlZm9yZSBjbG9zaW5nPyclc2VsZi5uYW1lLCAxKQorICAgICAgICAgICAgaWYgc2F2ZSA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5tZW51X3NhdmUoKQorICAgICAgICAgICAgZWxpZiBzYXZlIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5wYXJlbnQuYWN0aXZlID09IHNlbGY6CisgICAgICAgICAgICBzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBkZWwgc2VsZi50ZWQKKyAgICAgICAgc2VsZi5kb19wb3N0Y2xvc2UoKQorCisgICAgZGVmIG1lbnVfc2F2ZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucGF0aDoKKyAgICAgICAgICAgIHNlbGYubWVudV9zYXZlX2FzKCkKKyAgICAgICAgICAgIHJldHVybiAjIFdpbGwgY2FsbCB1cyByZWN1cnNpdmVseQorICAgICAgICAjCisgICAgICAgICMgRmlyc3Qgc2F2ZSBkYXRhCisgICAgICAgICMKKyAgICAgICAgZGhhbmRsZSA9IHNlbGYudGVkLldFR2V0VGV4dCgpCisgICAgICAgIGRhdGEgPSBkaGFuZGxlLmRhdGEKKyAgICAgICAgZnAgPSBvcGVuKHNlbGYucGF0aCwgJ3diJykgICMgTk9URTogd2IsIGJlY2F1c2UgZGF0YSBoYXMgQ1IgZm9yIGVuZC1vZi1saW5lCisgICAgICAgIGZwLndyaXRlKGRhdGEpCisgICAgICAgIGlmIGRhdGFbLTFdIDw+ICdccic6IGZwLndyaXRlKCdccicpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgIworICAgICAgICAjIE5vdyBzYXZlIHN0eWxlIGFuZCBzb3VwCisgICAgICAgICMKKyAgICAgICAgb2xkcmVzZmlsZSA9IFJlcy5DdXJSZXNGaWxlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAzKQorICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgUmVzLkZTcENyZWF0ZVJlc0ZpbGUoc2VsZi5wYXRoLCAnPz8/PycsICdURVhUJywgbWFjZnMuc21BbGxTY3JpcHRzKQorICAgICAgICAgICAgcmYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAzKQorICAgICAgICBzdHlsZXMgPSBSZXMuUmVzb3VyY2UoJycpCisgICAgICAgIHNvdXAgPSBSZXMuUmVzb3VyY2UoJycpCisgICAgICAgIHNlbGYudGVkLldFQ29weVJhbmdlKDAsIDB4M2ZmZmZmZmYsIE5vbmUsIHN0eWxlcywgc291cCkKKyAgICAgICAgc3R5bGVzLkFkZFJlc291cmNlKCdzdHlsJywgMTI4LCAnJykKKyAgICAgICAgc291cC5BZGRSZXNvdXJjZSgnU09VUCcsIDEyOCwgJycpCisgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUocmYpCisgICAgICAgIFJlcy5Vc2VSZXNGaWxlKG9sZHJlc2ZpbGUpCisKKyAgICAgICAgc2VsZi50ZWQuV0VSZXNldE1vZENvdW50KCkKKworICAgIGRlZiBtZW51X3NhdmVfYXMoc2VsZik6CisgICAgICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzOicpCisgICAgICAgIGlmIG5vdCBwYXRoOiByZXR1cm4KKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCisgICAgICAgIHNlbGYud2lkLlNldFdUaXRsZShzZWxmLm5hbWUpCisgICAgICAgIHNlbGYubWVudV9zYXZlKCkKKworICAgIGRlZiBtZW51X2N1dChzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgorICAgICAgICAgICAgU2NyYXAuWmVyb1NjcmFwKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKKyAgICAgICAgc2VsZi50ZWQuV0VDdXQoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X2NvcHkoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKKyAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCisgICAgICAgIHNlbGYudGVkLldFQ29weSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfcGFzdGUoc2VsZik6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIHNlbGYudGVkLldFUGFzdGUoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5XRURlbGV0ZSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfdW5kbyhzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuV0VVbmRvKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV9zZXRmb250KHNlbGYsIGZvbnQpOgorICAgICAgICBmb250ID0gRm0uR2V0Rk51bShmb250KQorICAgICAgICBzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvRm9udCwgKGZvbnQsIDAsIDAsICgwLDAsMCkpKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X21vZGZhY2Uoc2VsZiwgZmFjZSk6CisgICAgICAgIHNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9GYWNlfFdBU1RFY29uc3Qud2VEb1RvZ2dsZUZhY2UsCisgICAgICAgICAgICAgICAgKDAsIGZhY2UsIDAsICgwLDAsMCkpKQorCisgICAgZGVmIG1lbnVfc2V0ZmFjZShzZWxmLCBmYWNlKToKKyAgICAgICAgc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0ZhY2V8V0FTVEVjb25zdC53ZURvUmVwbGFjZUZhY2UsCisgICAgICAgICAgICAgICAgKDAsIGZhY2UsIDAsICgwLDAsMCkpKQorCisgICAgZGVmIG1lbnVfc2V0c2l6ZShzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb1NpemUsICgwLCAwLCBzaXplLCAoMCwwLDApKSkKKworICAgIGRlZiBtZW51X2luY3NpemUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9BZGRTaXplLCAoMCwgMCwgc2l6ZSwgKDAsMCwwKSkpCisKKyAgICBkZWYgbXlzZXRzdHlsZShzZWxmLCB3aGljaCwgaG93KToKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRTdHlsZSh3aGljaCwgaG93KQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBoYXZlX3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIHJldHVybiBzdGFydCA8IHN0b3AKKworICAgIGRlZiBjYW5fcGFzdGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRlZC5XRUNhblBhc3RlKCkKKworICAgIGRlZiBjYW5fdW5kbyhzZWxmKToKKyAgICAgICAgd2hpY2gsIHJlZG8gPSBzZWxmLnRlZC5XRUdldFVuZG9JbmZvKCkKKyAgICAgICAgd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQorICAgICAgICBpZiB3aGljaCA9PSBOb25lOiByZXR1cm4gTm9uZQorICAgICAgICBpZiByZWRvOgorICAgICAgICAgICAgcmV0dXJuICJSZWRvICIrd2hpY2gKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiVW5kbyAiK3doaWNoCisKKyAgICBkZWYgZ2V0cnVuaW5mbyhzZWxmKToKKyAgICAgICAgYWxsID0gKFdBU1RFY29uc3Qud2VEb0ZvbnQgfCBXQVNURWNvbnN0LndlRG9GYWNlIHwgV0FTVEVjb25zdC53ZURvU2l6ZSkKKyAgICAgICAgZHVtbXksIG1vZGUsIChmb250LCBmYWNlLCBzaXplLCBjb2xvcikgPSBzZWxmLnRlZC5XRUNvbnRpbnVvdXNTdHlsZShhbGwpCisgICAgICAgIGlmIG5vdCAobW9kZSAmIFdBU1RFY29uc3Qud2VEb0ZvbnQpOgorICAgICAgICAgICAgZm9udCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvbnQgPSBGbS5HZXRGb250TmFtZShmb250KQorICAgICAgICBpZiBub3QgKG1vZGUgJiBXQVNURWNvbnN0LndlRG9GYWNlKTogZmFjdCA9IE5vbmUKKyAgICAgICAgaWYgbm90IChtb2RlICYgV0FTVEVjb25zdC53ZURvU2l6ZSk6IHNpemUgPSBOb25lCisgICAgICAgIHJldHVybiBmb250LCBmYWNlLCBzaXplCiAKIGNsYXNzIFdlZChBcHBsaWNhdGlvbik6Ci0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlBcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQotCQlzZWxmLm51bSA9IDAKLQkJc2VsZi5hY3RpdmUgPSBOb25lCi0JCXNlbGYudXBkYXRlbWVudWJhcigpCi0JCXdhc3RlLlNURE9iamVjdEhhbmRsZXJzKCkKLQkJCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCXNlbGYuZmlsZW1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJc2VsZi5uZXdpdGVtID0gTWVudUl0ZW0obSwgIk5ldyB3aW5kb3ciLCAiTiIsIHNlbGYub3BlbikKLQkJc2VsZi5vcGVuaXRlbSA9IE1lbnVJdGVtKG0sICJPcGVuLi4uIiwgIk8iLCBzZWxmLm9wZW5maWxlKQotCQlzZWxmLmNsb3NlaXRlbSA9IE1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgc2VsZi5jbG9zZXdpbikKLQkJbS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLnNhdmVpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsIHNlbGYuc2F2ZSkKLQkJc2VsZi5zYXZlYXNpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUgYXMuLi4iLCAiIiwgc2VsZi5zYXZlYXMpCi0JCW0uYWRkc2VwYXJhdG9yKCkKLQkJc2VsZi5xdWl0aXRlbSA9IE1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCi0JCQotCQlzZWxmLmVkaXRtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCi0JCXNlbGYudW5kb2l0ZW0gPSBNZW51SXRlbShtLCAiVW5kbyIsICJaIiwgc2VsZi51bmRvKQotCQlzZWxmLmN1dGl0ZW0gPSBNZW51SXRlbShtLCAiQ3V0IiwgIlgiLCBzZWxmLmN1dCkKLQkJc2VsZi5jb3B5aXRlbSA9IE1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCBzZWxmLmNvcHkpCi0JCXNlbGYucGFzdGVpdGVtID0gTWVudUl0ZW0obSwgIlBhc3RlIiwgIlYiLCBzZWxmLnBhc3RlKQotCQlzZWxmLmNsZWFyaXRlbSA9IE1lbnVJdGVtKG0sICJDbGVhciIsICIiLCBzZWxmLmNsZWFyKQotCQkKLQkJc2VsZi5tYWtlZm9udG1lbnUoKQotCQkKLQkJIyBHcm91cHMgb2YgaXRlbXMgZW5hYmxlZCB0b2dldGhlcjoKLQkJc2VsZi53aW5kb3dncm91cCA9IFtzZWxmLmNsb3NlaXRlbSwgc2VsZi5zYXZlaXRlbSwgc2VsZi5zYXZlYXNpdGVtLAotCQkJc2VsZi5lZGl0bWVudSwgc2VsZi5mb250bWVudSwgc2VsZi5mYWNlbWVudSwgc2VsZi5zaXplbWVudV0KLQkJc2VsZi5mb2N1c2dyb3VwID0gW3NlbGYuY3V0aXRlbSwgc2VsZi5jb3B5aXRlbSwgc2VsZi5jbGVhcml0ZW1dCi0JCXNlbGYud2luZG93Z3JvdXBfb24gPSAtMQotCQlzZWxmLmZvY3VzZ3JvdXBfb24gPSAtMQotCQlzZWxmLnBhc3RlZ3JvdXBfb24gPSAtMQotCQlzZWxmLnVuZG9fbGFiZWwgPSAibmV2ZXIiCi0JCXNlbGYuZmZzX3ZhbHVlcyA9ICgpCi0JCQotCWRlZiBtYWtlZm9udG1lbnUoc2VsZik6Ci0JCXNlbGYuZm9udG1lbnUgPSBNZW51KHNlbGYubWVudWJhciwgIkZvbnQiKQotCQlzZWxmLmZvbnRuYW1lcyA9IGdldGZvbnRuYW1lcygpCi0JCXNlbGYuZm9udGl0ZW1zID0gW10KLQkJZm9yIG4gaW4gc2VsZi5mb250bmFtZXM6Ci0JCQltID0gTWVudUl0ZW0oc2VsZi5mb250bWVudSwgbiwgIiIsIHNlbGYuc2VsZm9udCkKLQkJCXNlbGYuZm9udGl0ZW1zLmFwcGVuZChtKQotCQlzZWxmLmZhY2VtZW51ID0gTWVudShzZWxmLm1lbnViYXIsICJTdHlsZSIpCi0JCXNlbGYuZmFjZWl0ZW1zID0gW10KLQkJZm9yIG4sIHNob3J0Y3V0IGluIFNUWUxFUzoKLQkJCW0gPSBNZW51SXRlbShzZWxmLmZhY2VtZW51LCBuLCBzaG9ydGN1dCwgc2VsZi5zZWxmYWNlKQotCQkJc2VsZi5mYWNlaXRlbXMuYXBwZW5kKG0pCi0JCXNlbGYuZmFjZW1lbnUuYWRkc2VwYXJhdG9yKCkKLQkJc2VsZi5mYWNlaXRlbV9ub3JtYWwgPSBNZW51SXRlbShzZWxmLmZhY2VtZW51LCAiTm9ybWFsIiwgIk4iLCAKLQkJCXNlbGYuc2VsZmFjZW5vcm1hbCkKLQkJc2VsZi5zaXplbWVudSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiU2l6ZSIpCi0JCXNlbGYuc2l6ZWl0ZW1zID0gW10KLQkJZm9yIG4gaW4gU0laRVM6Ci0JCQltID0gTWVudUl0ZW0oc2VsZi5zaXplbWVudSwgcmVwcihuKSwgIiIsIHNlbGYuc2Vsc2l6ZSkKLQkJCXNlbGYuc2l6ZWl0ZW1zLmFwcGVuZChtKQotCQlzZWxmLnNpemVtZW51LmFkZHNlcGFyYXRvcigpCi0JCXNlbGYuc2l6ZWl0ZW1fYmlnZ2VyID0gTWVudUl0ZW0oc2VsZi5zaXplbWVudSwgIkJpZ2dlciIsICIrIiwgCi0JCQlzZWxmLnNlbHNpemViaWdnZXIpCi0JCXNlbGYuc2l6ZWl0ZW1fc21hbGxlciA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsICJTbWFsbGVyIiwgIi0iLCAKLQkJCXNlbGYuc2Vsc2l6ZXNtYWxsZXIpCi0JCQkJCQotCWRlZiBzZWxmb250KHNlbGYsIGlkLCBpdGVtLCAqcmVzdCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJZm9udCA9IHNlbGYuZm9udG5hbWVzW2l0ZW0tMV0KLQkJCXNlbGYuYWN0aXZlLm1lbnVfc2V0Zm9udChmb250KQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5udW0gPSAwCisgICAgICAgIHNlbGYuYWN0aXZlID0gTm9uZQorICAgICAgICBzZWxmLnVwZGF0ZW1lbnViYXIoKQorICAgICAgICB3YXN0ZS5TVERPYmplY3RIYW5kbGVycygpCiAKLQlkZWYgc2VsZmFjZShzZWxmLCBpZCwgaXRlbSwgKnJlc3QpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCWZhY2UgPSAoMTw8KGl0ZW0tMSkpCi0JCQlzZWxmLmFjdGl2ZS5tZW51X21vZGZhY2UoZmFjZSkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQorICAgICAgICBzZWxmLm5ld2l0ZW0gPSBNZW51SXRlbShtLCAiTmV3IHdpbmRvdyIsICJOIiwgc2VsZi5vcGVuKQorICAgICAgICBzZWxmLm9wZW5pdGVtID0gTWVudUl0ZW0obSwgIk9wZW4uLi4iLCAiTyIsIHNlbGYub3BlbmZpbGUpCisgICAgICAgIHNlbGYuY2xvc2VpdGVtID0gTWVudUl0ZW0obSwgIkNsb3NlIiwgIlciLCBzZWxmLmNsb3Nld2luKQorICAgICAgICBtLmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYuc2F2ZWl0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgc2VsZi5zYXZlKQorICAgICAgICBzZWxmLnNhdmVhc2l0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSBhcy4uLiIsICIiLCBzZWxmLnNhdmVhcykKKyAgICAgICAgbS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnF1aXRpdGVtID0gTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKIAotCWRlZiBzZWxmYWNlbm9ybWFsKHNlbGYsICpyZXN0KToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3NldGZhY2UoMCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICAgICAgc2VsZi5lZGl0bWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQorICAgICAgICBzZWxmLnVuZG9pdGVtID0gTWVudUl0ZW0obSwgIlVuZG8iLCAiWiIsIHNlbGYudW5kbykKKyAgICAgICAgc2VsZi5jdXRpdGVtID0gTWVudUl0ZW0obSwgIkN1dCIsICJYIiwgc2VsZi5jdXQpCisgICAgICAgIHNlbGYuY29weWl0ZW0gPSBNZW51SXRlbShtLCAiQ29weSIsICJDIiwgc2VsZi5jb3B5KQorICAgICAgICBzZWxmLnBhc3RlaXRlbSA9IE1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgc2VsZi5wYXN0ZSkKKyAgICAgICAgc2VsZi5jbGVhcml0ZW0gPSBNZW51SXRlbShtLCAiQ2xlYXIiLCAiIiwgc2VsZi5jbGVhcikKIAotCWRlZiBzZWxzaXplKHNlbGYsIGlkLCBpdGVtLCAqcmVzdCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2l6ZSA9IFNJWkVTW2l0ZW0tMV0KLQkJCXNlbGYuYWN0aXZlLm1lbnVfc2V0c2l6ZShzaXplKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgICAgICBzZWxmLm1ha2Vmb250bWVudSgpCiAKLQlkZWYgc2Vsc2l6ZWJpZ2dlcihzZWxmLCAqcmVzdCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9pbmNzaXplKDIpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgICAgICMgR3JvdXBzIG9mIGl0ZW1zIGVuYWJsZWQgdG9nZXRoZXI6CisgICAgICAgIHNlbGYud2luZG93Z3JvdXAgPSBbc2VsZi5jbG9zZWl0ZW0sIHNlbGYuc2F2ZWl0ZW0sIHNlbGYuc2F2ZWFzaXRlbSwKKyAgICAgICAgICAgICAgICBzZWxmLmVkaXRtZW51LCBzZWxmLmZvbnRtZW51LCBzZWxmLmZhY2VtZW51LCBzZWxmLnNpemVtZW51XQorICAgICAgICBzZWxmLmZvY3VzZ3JvdXAgPSBbc2VsZi5jdXRpdGVtLCBzZWxmLmNvcHlpdGVtLCBzZWxmLmNsZWFyaXRlbV0KKyAgICAgICAgc2VsZi53aW5kb3dncm91cF9vbiA9IC0xCisgICAgICAgIHNlbGYuZm9jdXNncm91cF9vbiA9IC0xCisgICAgICAgIHNlbGYucGFzdGVncm91cF9vbiA9IC0xCisgICAgICAgIHNlbGYudW5kb19sYWJlbCA9ICJuZXZlciIKKyAgICAgICAgc2VsZi5mZnNfdmFsdWVzID0gKCkKIAotCWRlZiBzZWxzaXplc21hbGxlcihzZWxmLCAqcmVzdCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9pbmNzaXplKC0yKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgIGRlZiBtYWtlZm9udG1lbnUoc2VsZik6CisgICAgICAgIHNlbGYuZm9udG1lbnUgPSBNZW51KHNlbGYubWVudWJhciwgIkZvbnQiKQorICAgICAgICBzZWxmLmZvbnRuYW1lcyA9IGdldGZvbnRuYW1lcygpCisgICAgICAgIHNlbGYuZm9udGl0ZW1zID0gW10KKyAgICAgICAgZm9yIG4gaW4gc2VsZi5mb250bmFtZXM6CisgICAgICAgICAgICBtID0gTWVudUl0ZW0oc2VsZi5mb250bWVudSwgbiwgIiIsIHNlbGYuc2VsZm9udCkKKyAgICAgICAgICAgIHNlbGYuZm9udGl0ZW1zLmFwcGVuZChtKQorICAgICAgICBzZWxmLmZhY2VtZW51ID0gTWVudShzZWxmLm1lbnViYXIsICJTdHlsZSIpCisgICAgICAgIHNlbGYuZmFjZWl0ZW1zID0gW10KKyAgICAgICAgZm9yIG4sIHNob3J0Y3V0IGluIFNUWUxFUzoKKyAgICAgICAgICAgIG0gPSBNZW51SXRlbShzZWxmLmZhY2VtZW51LCBuLCBzaG9ydGN1dCwgc2VsZi5zZWxmYWNlKQorICAgICAgICAgICAgc2VsZi5mYWNlaXRlbXMuYXBwZW5kKG0pCisgICAgICAgIHNlbGYuZmFjZW1lbnUuYWRkc2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi5mYWNlaXRlbV9ub3JtYWwgPSBNZW51SXRlbShzZWxmLmZhY2VtZW51LCAiTm9ybWFsIiwgIk4iLAorICAgICAgICAgICAgICAgIHNlbGYuc2VsZmFjZW5vcm1hbCkKKyAgICAgICAgc2VsZi5zaXplbWVudSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiU2l6ZSIpCisgICAgICAgIHNlbGYuc2l6ZWl0ZW1zID0gW10KKyAgICAgICAgZm9yIG4gaW4gU0laRVM6CisgICAgICAgICAgICBtID0gTWVudUl0ZW0oc2VsZi5zaXplbWVudSwgcmVwcihuKSwgIiIsIHNlbGYuc2Vsc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuc2l6ZWl0ZW1zLmFwcGVuZChtKQorICAgICAgICBzZWxmLnNpemVtZW51LmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYuc2l6ZWl0ZW1fYmlnZ2VyID0gTWVudUl0ZW0oc2VsZi5zaXplbWVudSwgIkJpZ2dlciIsICIrIiwKKyAgICAgICAgICAgICAgICBzZWxmLnNlbHNpemViaWdnZXIpCisgICAgICAgIHNlbGYuc2l6ZWl0ZW1fc21hbGxlciA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsICJTbWFsbGVyIiwgIi0iLAorICAgICAgICAgICAgICAgIHNlbGYuc2Vsc2l6ZXNtYWxsZXIpCiAKLQlkZWYgdXBkYXRlbWVudWJhcihzZWxmKToKLQkJY2hhbmdlZCA9IDAKLQkJb24gPSAoc2VsZi5hY3RpdmUgPD4gTm9uZSkKLQkJaWYgb24gPD4gc2VsZi53aW5kb3dncm91cF9vbjoKLQkJCWZvciBtIGluIHNlbGYud2luZG93Z3JvdXA6Ci0JCQkJbS5lbmFibGUob24pCi0JCQlzZWxmLndpbmRvd2dyb3VwX29uID0gb24KLQkJCWNoYW5nZWQgPSAxCi0JCWlmIG9uOgotCQkJIyBvbmx5IGlmIHdlIGhhdmUgYW4gZWRpdCBtZW51Ci0JCQlvbiA9IHNlbGYuYWN0aXZlLmhhdmVfc2VsZWN0aW9uKCkKLQkJCWlmIG9uIDw+IHNlbGYuZm9jdXNncm91cF9vbjoKLQkJCQlmb3IgbSBpbiBzZWxmLmZvY3VzZ3JvdXA6Ci0JCQkJCW0uZW5hYmxlKG9uKQotCQkJCXNlbGYuZm9jdXNncm91cF9vbiA9IG9uCi0JCQkJY2hhbmdlZCA9IDEKLQkJCW9uID0gc2VsZi5hY3RpdmUuY2FuX3Bhc3RlKCkKLQkJCWlmIG9uIDw+IHNlbGYucGFzdGVncm91cF9vbjoKLQkJCQlzZWxmLnBhc3RlaXRlbS5lbmFibGUob24pCi0JCQkJc2VsZi5wYXN0ZWdyb3VwX29uID0gb24KLQkJCQljaGFuZ2VkID0gMQotCQkJb24gPSBzZWxmLmFjdGl2ZS5jYW5fdW5kbygpCi0JCQlpZiBvbiA8PiBzZWxmLnVuZG9fbGFiZWw6Ci0JCQkJaWYgb246Ci0JCQkJCXNlbGYudW5kb2l0ZW0uZW5hYmxlKDEpCi0JCQkJCXNlbGYudW5kb2l0ZW0uc2V0dGV4dChvbikKLQkJCQkJc2VsZi51bmRvX2xhYmVsID0gb24KLQkJCQllbHNlOgotCQkJCQlzZWxmLnVuZG9pdGVtLnNldHRleHQoIk5vdGhpbmcgdG8gdW5kbyIpCi0JCQkJCXNlbGYudW5kb2l0ZW0uZW5hYmxlKDApCi0JCQkJY2hhbmdlZCA9IDEKLQkJCWlmIHNlbGYudXBkYXRlZm9udG1lbnVzKCk6Ci0JCQkJY2hhbmdlZCA9IDEKLQkJaWYgY2hhbmdlZDoKLQkJCURyYXdNZW51QmFyKCkKLQkJCQotCWRlZiB1cGRhdGVmb250bWVudXMoc2VsZik6Ci0JCWluZm8gPSBzZWxmLmFjdGl2ZS5nZXRydW5pbmZvKCkKLQkJaWYgaW5mbyA9PSBzZWxmLmZmc192YWx1ZXM6Ci0JCQlyZXR1cm4gMAotCQkjIFJlbW92ZSBvbGQgY2hlY2ttYXJrcwotCQlpZiBzZWxmLmZmc192YWx1ZXMgPT0gKCk6Ci0JCQlzZWxmLmZmc192YWx1ZXMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKLQkJZm9udCwgZmFjZSwgc2l6ZSA9IHNlbGYuZmZzX3ZhbHVlcwotCQlpZiBmb250IDw+IE5vbmU6Ci0JCQlmbnVtID0gc2VsZi5mb250bmFtZXMuaW5kZXgoZm9udCkKLQkJCXNlbGYuZm9udGl0ZW1zW2ZudW1dLmNoZWNrKDApCi0JCWlmIGZhY2UgPD4gTm9uZToKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZhY2VpdGVtcykpOgotCQkJCWlmIGZhY2UgJiAoMTw8aSk6Ci0JCQkJCXNlbGYuZmFjZWl0ZW1zW2ldLmNoZWNrKDApCi0JCWlmIHNpemUgPD4gTm9uZToKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgotCQkJCWlmIFNJWkVTW2ldID09IHNpemU6Ci0JCQkJCXNlbGYuc2l6ZWl0ZW1zW2ldLmNoZWNrKDApCi0JCQkJCi0JCXNlbGYuZmZzX3ZhbHVlcyA9IGluZm8KLQkJIyBTZXQgbmV3IGNoZWNrbWFya3MKLQkJZm9udCwgZmFjZSwgc2l6ZSA9IHNlbGYuZmZzX3ZhbHVlcwotCQlpZiBmb250IDw+IE5vbmU6Ci0JCQlmbnVtID0gc2VsZi5mb250bmFtZXMuaW5kZXgoZm9udCkKLQkJCXNlbGYuZm9udGl0ZW1zW2ZudW1dLmNoZWNrKDEpCi0JCWlmIGZhY2UgPD4gTm9uZToKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZhY2VpdGVtcykpOgotCQkJCWlmIGZhY2UgJiAoMTw8aSk6Ci0JCQkJCXNlbGYuZmFjZWl0ZW1zW2ldLmNoZWNrKDEpCi0JCWlmIHNpemUgPD4gTm9uZToKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgotCQkJCWlmIFNJWkVTW2ldID09IHNpemU6Ci0JCQkJCXNlbGYuc2l6ZWl0ZW1zW2ldLmNoZWNrKDEpCi0JCSMgU2V0IG91dGxpbmUvbm9ybWFsIGZvciBzaXplcwotCQlpZiBmb250OgotCQkJZXhpc3RzID0gZ2V0Zm9udHNpemVzKGZvbnQsIFNJWkVTKQotCQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuc2l6ZWl0ZW1zKSk6Ci0JCQkJaWYgZXhpc3RzW2ldOgotCQkJCQlzZWxmLnNpemVpdGVtc1tpXS5zZXRzdHlsZSgwKQotCQkJCWVsc2U6Ci0JCQkJCXNlbGYuc2l6ZWl0ZW1zW2ldLnNldHN0eWxlKDgpCisgICAgZGVmIHNlbGZvbnQoc2VsZiwgaWQsIGl0ZW0sICpyZXN0KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBmb250ID0gc2VsZi5mb250bmFtZXNbaXRlbS0xXQorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9zZXRmb250KGZvbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCiAKLQkjCi0JIyBBcHBsZSBtZW51Ci0JIwotCQotCWRlZiBkb19hYm91dChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIkEgc2ltcGxlIHNpbmdsZS1mb250IHRleHQgZWRpdG9yIGJhc2VkIG9uIFdBU1RFIikKLQkJCQotCSMKLQkjIEZpbGUgbWVudQotCSMKKyAgICBkZWYgc2VsZmFjZShzZWxmLCBpZCwgaXRlbSwgKnJlc3QpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIGZhY2UgPSAoMTw8KGl0ZW0tMSkpCisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X21vZGZhY2UoZmFjZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKIAotCWRlZiBvcGVuKHNlbGYsICphcmdzKToKLQkJc2VsZi5fb3BlbigwKQotCQkKLQlkZWYgb3BlbmZpbGUoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLl9vcGVuKDEpCisgICAgZGVmIHNlbGZhY2Vub3JtYWwoc2VsZiwgKnJlc3QpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2V0ZmFjZSgwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQogCi0JZGVmIF9vcGVuKHNlbGYsIGFza2ZpbGUpOgotCQlpZiBhc2tmaWxlOgotCQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKLQkJCWlmIG5vdCBwYXRoOgotCQkJCXJldHVybgotCQkJbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aClbLTFdCi0JCQl0cnk6Ci0JCQkJZnAgPSBvcGVuKHBhdGgsICdyYicpICMgTk9URSBiaW5hcnksIHdlIG5lZWQgY3IgYXMgZW5kLW9mLWxpbmUKLQkJCQlkYXRhID0gZnAucmVhZCgpCi0JCQkJZnAuY2xvc2UoKQotCQkJZXhjZXB0IElPRXJyb3IsIGFyZzoKLQkJCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJnLCkpCi0JCQkJcmV0dXJuCi0JCWVsc2U6Ci0JCQlwYXRoID0gTm9uZQotCQkJbmFtZSA9ICJVbnRpdGxlZCAlZCIlc2VsZi5udW0KLQkJCWRhdGEgPSAnJwotCQl3ID0gV2FzdGVXaW5kb3coc2VsZikKLQkJdy5vcGVuKHBhdGgsIG5hbWUsIGRhdGEpCi0JCXNlbGYubnVtID0gc2VsZi5udW0gKyAxCi0JCQotCWRlZiBjbG9zZXdpbihzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUuY2xvc2UoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgc2F2ZShzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9zYXZlKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIHNhdmVhcyhzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9zYXZlX2FzKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCQotCQkKLQlkZWYgcXVpdChzZWxmLCAqYXJncyk6Ci0JCWZvciB3IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6Ci0JCQl3LmNsb3NlKCkKLQkJaWYgc2VsZi5fd2luZG93czoKLQkJCXJldHVybgotCQlzZWxmLl9xdWl0KCkKLQkJCi0JIwotCSMgRWRpdCBtZW51Ci0JIwotCQotCWRlZiB1bmRvKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3VuZG8oKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgY3V0KHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2N1dCgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBjb3B5KHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2NvcHkoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgcGFzdGUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfcGFzdGUoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgIGRlZiBzZWxzaXplKHNlbGYsIGlkLCBpdGVtLCAqcmVzdCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2l6ZSA9IFNJWkVTW2l0ZW0tMV0KKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2V0c2l6ZShzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQogCi0JZGVmIGNsZWFyKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2NsZWFyKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JIwotCSMgT3RoZXIgc3R1ZmYKLQkjCQorICAgIGRlZiBzZWxzaXplYmlnZ2VyKHNlbGYsICpyZXN0KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2luY3NpemUoMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKIAotCWRlZiBpZGxlKHNlbGYsIGV2ZW50KToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5kb19pZGxlKGV2ZW50KQotCQllbHNlOgotCQkJUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCi0JCQkKKyAgICBkZWYgc2Vsc2l6ZXNtYWxsZXIoc2VsZiwgKnJlc3QpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfaW5jc2l6ZSgtMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiB1cGRhdGVtZW51YmFyKHNlbGYpOgorICAgICAgICBjaGFuZ2VkID0gMAorICAgICAgICBvbiA9IChzZWxmLmFjdGl2ZSA8PiBOb25lKQorICAgICAgICBpZiBvbiA8PiBzZWxmLndpbmRvd2dyb3VwX29uOgorICAgICAgICAgICAgZm9yIG0gaW4gc2VsZi53aW5kb3dncm91cDoKKyAgICAgICAgICAgICAgICBtLmVuYWJsZShvbikKKyAgICAgICAgICAgIHNlbGYud2luZG93Z3JvdXBfb24gPSBvbgorICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgaWYgb246CisgICAgICAgICAgICAjIG9ubHkgaWYgd2UgaGF2ZSBhbiBlZGl0IG1lbnUKKyAgICAgICAgICAgIG9uID0gc2VsZi5hY3RpdmUuaGF2ZV9zZWxlY3Rpb24oKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi5mb2N1c2dyb3VwX29uOgorICAgICAgICAgICAgICAgIGZvciBtIGluIHNlbGYuZm9jdXNncm91cDoKKyAgICAgICAgICAgICAgICAgICAgbS5lbmFibGUob24pCisgICAgICAgICAgICAgICAgc2VsZi5mb2N1c2dyb3VwX29uID0gb24KKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICAgICAgb24gPSBzZWxmLmFjdGl2ZS5jYW5fcGFzdGUoKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi5wYXN0ZWdyb3VwX29uOgorICAgICAgICAgICAgICAgIHNlbGYucGFzdGVpdGVtLmVuYWJsZShvbikKKyAgICAgICAgICAgICAgICBzZWxmLnBhc3RlZ3JvdXBfb24gPSBvbgorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICBvbiA9IHNlbGYuYWN0aXZlLmNhbl91bmRvKCkKKyAgICAgICAgICAgIGlmIG9uIDw+IHNlbGYudW5kb19sYWJlbDoKKyAgICAgICAgICAgICAgICBpZiBvbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5lbmFibGUoMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5zZXR0ZXh0KG9uKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9fbGFiZWwgPSBvbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2l0ZW0uc2V0dGV4dCgiTm90aGluZyB0byB1bmRvIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5lbmFibGUoMCkKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICAgICAgaWYgc2VsZi51cGRhdGVmb250bWVudXMoKToKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICBpZiBjaGFuZ2VkOgorICAgICAgICAgICAgRHJhd01lbnVCYXIoKQorCisgICAgZGVmIHVwZGF0ZWZvbnRtZW51cyhzZWxmKToKKyAgICAgICAgaW5mbyA9IHNlbGYuYWN0aXZlLmdldHJ1bmluZm8oKQorICAgICAgICBpZiBpbmZvID09IHNlbGYuZmZzX3ZhbHVlczoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICMgUmVtb3ZlIG9sZCBjaGVja21hcmtzCisgICAgICAgIGlmIHNlbGYuZmZzX3ZhbHVlcyA9PSAoKToKKyAgICAgICAgICAgIHNlbGYuZmZzX3ZhbHVlcyA9IChOb25lLCBOb25lLCBOb25lKQorICAgICAgICBmb250LCBmYWNlLCBzaXplID0gc2VsZi5mZnNfdmFsdWVzCisgICAgICAgIGlmIGZvbnQgPD4gTm9uZToKKyAgICAgICAgICAgIGZudW0gPSBzZWxmLmZvbnRuYW1lcy5pbmRleChmb250KQorICAgICAgICAgICAgc2VsZi5mb250aXRlbXNbZm51bV0uY2hlY2soMCkKKyAgICAgICAgaWYgZmFjZSA8PiBOb25lOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZmFjZWl0ZW1zKSk6CisgICAgICAgICAgICAgICAgaWYgZmFjZSAmICgxPDxpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWNlaXRlbXNbaV0uY2hlY2soMCkKKyAgICAgICAgaWYgc2l6ZSA8PiBOb25lOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuc2l6ZWl0ZW1zKSk6CisgICAgICAgICAgICAgICAgaWYgU0laRVNbaV0gPT0gc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaXplaXRlbXNbaV0uY2hlY2soMCkKKworICAgICAgICBzZWxmLmZmc192YWx1ZXMgPSBpbmZvCisgICAgICAgICMgU2V0IG5ldyBjaGVja21hcmtzCisgICAgICAgIGZvbnQsIGZhY2UsIHNpemUgPSBzZWxmLmZmc192YWx1ZXMKKyAgICAgICAgaWYgZm9udCA8PiBOb25lOgorICAgICAgICAgICAgZm51bSA9IHNlbGYuZm9udG5hbWVzLmluZGV4KGZvbnQpCisgICAgICAgICAgICBzZWxmLmZvbnRpdGVtc1tmbnVtXS5jaGVjaygxKQorICAgICAgICBpZiBmYWNlIDw+IE5vbmU6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5mYWNlaXRlbXMpKToKKyAgICAgICAgICAgICAgICBpZiBmYWNlICYgKDE8PGkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhY2VpdGVtc1tpXS5jaGVjaygxKQorICAgICAgICBpZiBzaXplIDw+IE5vbmU6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5zaXplaXRlbXMpKToKKyAgICAgICAgICAgICAgICBpZiBTSVpFU1tpXSA9PSBzaXplOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNpemVpdGVtc1tpXS5jaGVjaygxKQorICAgICAgICAjIFNldCBvdXRsaW5lL25vcm1hbCBmb3Igc2l6ZXMKKyAgICAgICAgaWYgZm9udDoKKyAgICAgICAgICAgIGV4aXN0cyA9IGdldGZvbnRzaXplcyhmb250LCBTSVpFUykKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgorICAgICAgICAgICAgICAgIGlmIGV4aXN0c1tpXToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaXplaXRlbXNbaV0uc2V0c3R5bGUoMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNpemVpdGVtc1tpXS5zZXRzdHlsZSg4KQorCisgICAgIworICAgICMgQXBwbGUgbWVudQorICAgICMKKworICAgIGRlZiBkb19hYm91dChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6CisgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIkEgc2ltcGxlIHNpbmdsZS1mb250IHRleHQgZWRpdG9yIGJhc2VkIG9uIFdBU1RFIikKKworICAgICMKKyAgICAjIEZpbGUgbWVudQorICAgICMKKworICAgIGRlZiBvcGVuKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fb3BlbigwKQorCisgICAgZGVmIG9wZW5maWxlKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fb3BlbigxKQorCisgICAgZGVmIF9vcGVuKHNlbGYsIGFza2ZpbGUpOgorICAgICAgICBpZiBhc2tmaWxlOgorICAgICAgICAgICAgcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKKyAgICAgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aClbLTFdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnAgPSBvcGVuKHBhdGgsICdyYicpICMgTk9URSBiaW5hcnksIHdlIG5lZWQgY3IgYXMgZW5kLW9mLWxpbmUKKyAgICAgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGFyZzoKKyAgICAgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJnLCkpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gTm9uZQorICAgICAgICAgICAgbmFtZSA9ICJVbnRpdGxlZCAlZCIlc2VsZi5udW0KKyAgICAgICAgICAgIGRhdGEgPSAnJworICAgICAgICB3ID0gV2FzdGVXaW5kb3coc2VsZikKKyAgICAgICAgdy5vcGVuKHBhdGgsIG5hbWUsIGRhdGEpCisgICAgICAgIHNlbGYubnVtID0gc2VsZi5udW0gKyAxCisKKyAgICBkZWYgY2xvc2V3aW4oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBzYXZlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3NhdmUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIHNhdmVhcyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9zYXZlX2FzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworCisgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aW5kb3dzLnZhbHVlcygpOgorICAgICAgICAgICAgdy5jbG9zZSgpCisgICAgICAgIGlmIHNlbGYuX3dpbmRvd3M6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fcXVpdCgpCisKKyAgICAjCisgICAgIyBFZGl0IG1lbnUKKyAgICAjCisKKyAgICBkZWYgdW5kbyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV91bmRvKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBjdXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfY3V0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBjb3B5KHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2NvcHkoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIHBhc3RlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3Bhc3RlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBjbGVhcihzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9jbGVhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICAjCisgICAgIyBPdGhlciBzdHVmZgorICAgICMKKworICAgIGRlZiBpZGxlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5kb19pZGxlKGV2ZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCisKIGRlZiBnZXRmb250bmFtZXMoKToKLQluYW1lcyA9IFtdCi0JZm9yIGkgaW4gcmFuZ2UoMjU2KToKLQkJbiA9IEZtLkdldEZvbnROYW1lKGkpCi0JCWlmIG46IG5hbWVzLmFwcGVuZChuKQotCXJldHVybiBuYW1lcwotCQorICAgIG5hbWVzID0gW10KKyAgICBmb3IgaSBpbiByYW5nZSgyNTYpOgorICAgICAgICBuID0gRm0uR2V0Rm9udE5hbWUoaSkKKyAgICAgICAgaWYgbjogbmFtZXMuYXBwZW5kKG4pCisgICAgcmV0dXJuIG5hbWVzCisKIGRlZiBnZXRmb250c2l6ZXMobmFtZSwgc2l6ZXMpOgotCWV4aXN0ID0gW10KLQludW0gPSBGbS5HZXRGTnVtKG5hbWUpCi0JZm9yIHN6IGluIHNpemVzOgotCQlpZiBGbS5SZWFsRm9udChudW0sIHN6KToKLQkJCWV4aXN0LmFwcGVuZCgxKQotCQllbHNlOgotCQkJZXhpc3QuYXBwZW5kKDApCi0JcmV0dXJuIGV4aXN0CisgICAgZXhpc3QgPSBbXQorICAgIG51bSA9IEZtLkdldEZOdW0obmFtZSkKKyAgICBmb3Igc3ogaW4gc2l6ZXM6CisgICAgICAgIGlmIEZtLlJlYWxGb250KG51bSwgc3opOgorICAgICAgICAgICAgZXhpc3QuYXBwZW5kKDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleGlzdC5hcHBlbmQoMCkKKyAgICByZXR1cm4gZXhpc3QKIAogZGVmIG1haW4oKToKLQlBcHAgPSBXZWQoKQotCUFwcC5tYWlubG9vcCgpCi0JCisgICAgQXBwID0gV2VkKCkKKyAgICBBcHAubWFpbmxvb3AoKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQotCQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vd2FzdGUvd2VkLnB5IGIvTWFjL0RlbW8vd2FzdGUvd2VkLnB5CmluZGV4IDVkODRiNDAuLjI4ZWU5MzggMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL3dhc3RlL3dlZC5weQorKysgYi9NYWMvRGVtby93YXN0ZS93ZWQucHkKQEAgLTE1LDQxMyArMTUsNDEyIEBACiBpbXBvcnQgRWFzeURpYWxvZ3MKIAogVU5ET0xBQkVMUyA9IFsgIyBJbmRleGVkIGJ5IFdFR2V0VW5kb0luZm8oKSB2YWx1ZQotCU5vbmUsICIiLCAidHlwaW5nIiwgIkN1dCIsICJQYXN0ZSIsICJDbGVhciIsICJEcmFnIiwgIlN0eWxlIl0KLQkKKyAgICAgICAgTm9uZSwgIiIsICJ0eXBpbmciLCAiQ3V0IiwgIlBhc3RlIiwgIkNsZWFyIiwgIkRyYWciLCAiU3R5bGUiXQorCiBCSUdSRUdJT049UWQuTmV3UmduKCkKIFFkLlNldFJlY3RSZ24oQklHUkVHSU9OLCAtMTYwMDAsIC0xNjAwMCwgMTYwMDAsIDE2MDAwKQogCiBjbGFzcyBXYXN0ZVdpbmRvdyhTY3JvbGxlZFdpbmRvdyk6Ci0JZGVmIG9wZW4oc2VsZiwgcGF0aCwgbmFtZSwgZGF0YSk6Ci0JCXNlbGYucGF0aCA9IHBhdGgKLQkJc2VsZi5uYW1lID0gbmFtZQotCQlyID0gd2luZG93Ym91bmRzKDQwMCwgNDAwKQotCQl3ID0gV2luLk5ld1dpbmRvdyhyLCBuYW1lLCAxLCAwLCAtMSwgMSwgMCkKLQkJc2VsZi53aWQgPSB3Ci0JCXZyID0gMCwgMCwgclsyXS1yWzBdLTE1LCByWzNdLXJbMV0tMTUKLQkJZHIgPSAoMCwgMCwgMTAyNDAsIDApCi0JCVFkLlNldFBvcnQodykKLQkJUWQuVGV4dEZvbnQoNCkKLQkJUWQuVGV4dFNpemUoOSkKLQkJZmxhZ3MgPSBXQVNURWNvbnN0LndlRG9BdXRvU2Nyb2xsIHwgV0FTVEVjb25zdC53ZURvT3V0bGluZUhpbGl0ZSB8IFwKLQkJCVdBU1RFY29uc3Qud2VEb01vbm9TdHlsZWQgfCBXQVNURWNvbnN0LndlRG9VbmRvCi0JCXNlbGYudGVkID0gd2FzdGUuV0VOZXcoZHIsIHZyLCBmbGFncykKLQkJc2VsZi50ZWR0ZXh0aGFuZGxlID0gUmVzLlJlc291cmNlKGRhdGEpCi0JCXNlbGYudGVkLldFVXNlVGV4dChzZWxmLnRlZHRleHRoYW5kbGUpCi0JCXNlbGYudGVkLldFQ2FsVGV4dCgpCi0JCXcuRHJhd0dyb3dJY29uKCkKLQkJc2VsZi5zY3JvbGxiYXJzKCkKLQkJc2VsZi5jaGFuZ2VkID0gMAotCQlzZWxmLmRvX3Bvc3RvcGVuKCkKLQkJc2VsZi5kb19hY3RpdmF0ZSgxLCBOb25lKQotCQkKLQlkZWYgZG9faWRsZShzZWxmLCBldmVudCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCVFkLlNldFBvcnQoc2VsZi53aWQpCi0JCXNlbGYudGVkLldFSWRsZSgpCQotCQlpZiBzZWxmLnRlZC5XRUFkanVzdEN1cnNvcih3aGVyZSwgQklHUkVHSU9OKToKLQkJCXJldHVybgotCQlRZC5TZXRDdXJzb3IoUWQuR2V0UURHbG9iYWxzQXJyb3coKSkKLQkJCi0JZGVmIGdldHNjcm9sbGJhcnZhbHVlcyhzZWxmKToKLQkJZHIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKLQkJdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJdnggPSBzZWxmLnNjYWxlYmFydmFsdWUoZHJbMF0sIGRyWzJdLCB2clswXSwgdnJbMl0pCi0JCXZ5ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzFdLCBkclszXSwgdnJbMV0sIHZyWzNdKQotIyMJCXByaW50IGRyLCB2ciwgdngsIHZ5Ci0JCXJldHVybiB2eCwgdnkKLQkJCi0JZGVmIHNjcm9sbGJhcl9jYWxsYmFjayhzZWxmLCB3aGljaCwgd2hhdCwgdmFsdWUpOgotCQlpZiB3aGljaCA9PSAneSc6Ci0JCQlpZiB3aGF0ID09ICdzZXQnOgotCQkJCWhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KDAsIDB4M2ZmZmZmZmYpCi0JCQkJY3VyID0gc2VsZi5nZXRzY3JvbGxiYXJ2YWx1ZXMoKVsxXQotCQkJCWRlbHRhID0gKGN1ci12YWx1ZSkqaGVpZ2h0LzMyNzY3Ci0JCQlpZiB3aGF0ID09ICctJzoKLQkJCQl0b3BsaW5lX29mZixkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLDEpKQotCQkJCXRvcGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUodG9wbGluZV9vZmYpCi0JCQkJZGVsdGEgPSBzZWxmLnRlZC5XRUdldEhlaWdodCh0b3BsaW5lX251bSwgdG9wbGluZV9udW0rMSkKLQkJCWVsaWYgd2hhdCA9PSAnLS0nOgotCQkJCWRlbHRhID0gKHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXS0xMCkKLQkJCQlpZiBkZWx0YSA8PSAwOgotCQkJCQlkZWx0YSA9IDEwICMgUmFuZG9tIHZhbHVlCi0JCQllbGlmIHdoYXQgPT0gJysnOgotCQkJCSMgWFhYWCBXcm9uZzogc2hvdWxkIGJlIGJvdHRvbSBsaW5lIHNpemUKLQkJCQl0b3BsaW5lX29mZixkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLDEpKQotCQkJCXRvcGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUodG9wbGluZV9vZmYpCi0JCQkJZGVsdGEgPSAtc2VsZi50ZWQuV0VHZXRIZWlnaHQodG9wbGluZV9udW0sIHRvcGxpbmVfbnVtKzEpCi0JCQllbGlmIHdoYXQgPT0gJysrJzoKLQkJCQlkZWx0YSA9IC0oc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpWzNdLTEwKQotCQkJCWlmIGRlbHRhID49IDA6Ci0JCQkJCWRlbHRhID0gLTEwCi0JCQlzZWxmLnRlZC5XRVNjcm9sbCgwLCBkZWx0YSkKLSMjCQkJcHJpbnQgJ1NDUk9MTCBZJywgZGVsdGEKLQkJZWxzZToKLQkJCWlmIHdoYXQgPT0gJ3NldCc6Ci0JCQkJcmV0dXJuICMgWFhYWAotCQkJdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJCXdpbndpZHRoID0gdnJbMl0tdnJbMF0KLQkJCWlmIHdoYXQgPT0gJy0nOgotCQkJCWRlbHRhID0gd2lud2lkdGgvMTAKLQkJCWVsaWYgd2hhdCA9PSAnLS0nOgotCQkJCWRlbHRhID0gd2lud2lkdGgvMgotCQkJZWxpZiB3aGF0ID09ICcrJzoKLQkJCQlkZWx0YSA9IC13aW53aWR0aC8xMAotCQkJZWxpZiB3aGF0ID09ICcrKyc6Ci0JCQkJZGVsdGEgPSAtd2lud2lkdGgvMgotCQkJc2VsZi50ZWQuV0VTY3JvbGwoZGVsdGEsIDApCi0JCSMgUGluIHRoZSBzY3JvbGwKLQkJbCwgdCwgciwgYiA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQotCQl2bCwgdnQsIHZyLCB2YiA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQotCQlpZiB0ID4gMCBvciBsID4gMDoKLQkJCWR4ID0gZHkgPSAwCi0JCQlpZiB0ID4gMDogZHkgPSAtdAotCQkJaWYgbCA+IDA6IGR4ID0gLWwKLSMjCQkJcHJpbnQgJ0V4dHJhIHNjcm9sbCcsIGR4LCBkeQotCQkJc2VsZi50ZWQuV0VTY3JvbGwoZHgsIGR5KQotCQllbGlmIGIgPCB2YjoKLSMjCQkJcHJpbnQgJ0V4dHJhIGRvd25zY3JvbGwnLCBiLXZiCi0JCQlzZWxmLnRlZC5XRVNjcm9sbCgwLCBiLXZiKQorICAgIGRlZiBvcGVuKHNlbGYsIHBhdGgsIG5hbWUsIGRhdGEpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgciA9IHdpbmRvd2JvdW5kcyg0MDAsIDQwMCkKKyAgICAgICAgdyA9IFdpbi5OZXdXaW5kb3cociwgbmFtZSwgMSwgMCwgLTEsIDEsIDApCisgICAgICAgIHNlbGYud2lkID0gdworICAgICAgICB2ciA9IDAsIDAsIHJbMl0tclswXS0xNSwgclszXS1yWzFdLTE1CisgICAgICAgIGRyID0gKDAsIDAsIDEwMjQwLCAwKQorICAgICAgICBRZC5TZXRQb3J0KHcpCisgICAgICAgIFFkLlRleHRGb250KDQpCisgICAgICAgIFFkLlRleHRTaXplKDkpCisgICAgICAgIGZsYWdzID0gV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb091dGxpbmVIaWxpdGUgfCBcCisgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvTW9ub1N0eWxlZCB8IFdBU1RFY29uc3Qud2VEb1VuZG8KKyAgICAgICAgc2VsZi50ZWQgPSB3YXN0ZS5XRU5ldyhkciwgdnIsIGZsYWdzKQorICAgICAgICBzZWxmLnRlZHRleHRoYW5kbGUgPSBSZXMuUmVzb3VyY2UoZGF0YSkKKyAgICAgICAgc2VsZi50ZWQuV0VVc2VUZXh0KHNlbGYudGVkdGV4dGhhbmRsZSkKKyAgICAgICAgc2VsZi50ZWQuV0VDYWxUZXh0KCkKKyAgICAgICAgdy5EcmF3R3Jvd0ljb24oKQorICAgICAgICBzZWxmLnNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAwCisgICAgICAgIHNlbGYuZG9fcG9zdG9wZW4oKQorICAgICAgICBzZWxmLmRvX2FjdGl2YXRlKDEsIE5vbmUpCiAKLQkJCi0JZGVmIGRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpOgotIyMJCXByaW50ICJBQ1RJVkFURSIsIG9ub2ZmCi0JCVFkLlNldFBvcnQoc2VsZi53aWQpCi0JCVNjcm9sbGVkV2luZG93LmRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpCi0JCWlmIG9ub2ZmOgotCQkJc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCi0JCQlzZWxmLnBhcmVudC5hY3RpdmUgPSBzZWxmCi0JCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJZWxzZToKLQkJCXNlbGYudGVkLldFRGVhY3RpdmF0ZSgpCisgICAgZGVmIGRvX2lkbGUoc2VsZiwgZXZlbnQpOgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICBRZC5TZXRQb3J0KHNlbGYud2lkKQorICAgICAgICBzZWxmLnRlZC5XRUlkbGUoKQorICAgICAgICBpZiBzZWxmLnRlZC5XRUFkanVzdEN1cnNvcih3aGVyZSwgQklHUkVHSU9OKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBRZC5TZXRDdXJzb3IoUWQuR2V0UURHbG9iYWxzQXJyb3coKSkKIAotCWRlZiBkb191cGRhdGUoc2VsZiwgd2lkLCBldmVudCk6Ci0JCXJlZ2lvbiA9IHdpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduCi0JCWlmIFFkLkVtcHR5UmduKHJlZ2lvbik6Ci0JCQlyZXR1cm4KLQkJUWQuRXJhc2VSZ24ocmVnaW9uKQotCQlzZWxmLnRlZC5XRVVwZGF0ZShyZWdpb24pCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCQotCWRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6Ci0JCWwsIHQsIHIsIGIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJdnIgPSAobCwgdCwgbCt3aWR0aC0xNSwgdCtoZWlnaHQtMTUpCi0JCXNlbGYudGVkLldFU2V0Vmlld1JlY3QodnIpCi0JCXNlbGYud2lkLkludmFsV2luZG93UmVjdCh2cikKLQkJU2Nyb2xsZWRXaW5kb3cuZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpCi0JCQotCWRlZiBkb19jb250ZW50Y2xpY2soc2VsZiwgbG9jYWwsIG1vZGlmaWVycywgZXZ0KToKLQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZ0Ci0JCXNlbGYudGVkLldFQ2xpY2sobG9jYWwsIG1vZGlmaWVycywgd2hlbikKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgZGVmIGdldHNjcm9sbGJhcnZhbHVlcyhzZWxmKToKKyAgICAgICAgZHIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKKyAgICAgICAgdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgdnggPSBzZWxmLnNjYWxlYmFydmFsdWUoZHJbMF0sIGRyWzJdLCB2clswXSwgdnJbMl0pCisgICAgICAgIHZ5ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzFdLCBkclszXSwgdnJbMV0sIHZyWzNdKQorIyMgICAgICAgICAgICAgIHByaW50IGRyLCB2ciwgdngsIHZ5CisgICAgICAgIHJldHVybiB2eCwgdnkKIAotCWRlZiBkb19jaGFyKHNlbGYsIGNoLCBldmVudCk6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCXNlbGYudGVkLldFS2V5KG9yZChjaCksIG1vZGlmaWVycykKLQkJc2VsZi5jaGFuZ2VkID0gMQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlpZiBzZWxmLmNoYW5nZWQ6Ci0JCQlzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgd2luZG93ICIlcyIgYmVmb3JlIGNsb3Npbmc/JyVzZWxmLm5hbWUsIDEpCi0JCQlpZiBzYXZlID4gMDoKLQkJCQlzZWxmLm1lbnVfc2F2ZSgpCi0JCQllbGlmIHNhdmUgPCAwOgotCQkJCXJldHVybgotCQlpZiBzZWxmLnBhcmVudC5hY3RpdmUgPT0gc2VsZjoKLQkJCXNlbGYucGFyZW50LmFjdGl2ZSA9IE5vbmUKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCWRlbCBzZWxmLnRlZAotCQlkZWwgc2VsZi50ZWR0ZXh0aGFuZGxlCi0JCXNlbGYuZG9fcG9zdGNsb3NlKCkKLQkJCi0JZGVmIG1lbnVfc2F2ZShzZWxmKToKLQkJaWYgbm90IHNlbGYucGF0aDoKLQkJCXNlbGYubWVudV9zYXZlX2FzKCkKLQkJCXJldHVybiAjIFdpbGwgY2FsbCB1cyByZWN1cnNpdmVseQotIyMJCXByaW50ICdTYXZpbmcgdG8gJywgc2VsZi5wYXRoCi0JCWRoYW5kbGUgPSBzZWxmLnRlZC5XRUdldFRleHQoKQotCQlkYXRhID0gZGhhbmRsZS5kYXRhCi0JCWZwID0gb3BlbihzZWxmLnBhdGgsICd3YicpICAjIE5PVEU6IHdiLCBiZWNhdXNlIGRhdGEgaGFzIENSIGZvciBlbmQtb2YtbGluZQotCQlmcC53cml0ZShkYXRhKQotCQlpZiBkYXRhWy0xXSA8PiAnXHInOiBmcC53cml0ZSgnXHInKQotCQlmcC5jbG9zZSgpCi0JCXNlbGYuY2hhbmdlZCA9IDAKLQkJCi0JZGVmIG1lbnVfc2F2ZV9hcyhzZWxmKToKLQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgYXM6JykKLQkJaWYgbm90IHBhdGg6IHJldHVybgotCQlzZWxmLnBhdGggPSBwYXRoCi0JCXNlbGYubmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5wYXRoKVstMV0KLQkJc2VsZi53aWQuU2V0V1RpdGxlKHNlbGYubmFtZSkKLQkJc2VsZi5tZW51X3NhdmUoKQotCQkKLQlkZWYgbWVudV9jdXQoc2VsZik6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCWlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKLQkJCVNjcmFwLlplcm9TY3JhcCgpCi0JCWVsc2U6Ci0JCQlTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCi0JCXNlbGYudGVkLldFQ3V0KCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCXNlbGYuY2hhbmdlZCA9IDEKLQkJCi0JZGVmIG1lbnVfY29weShzZWxmKToKLQkJaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgotCQkJU2NyYXAuWmVyb1NjcmFwKCkKLQkJZWxzZToKLQkJCVNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKLQkJc2VsZi50ZWQuV0VDb3B5KCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBtZW51X3Bhc3RlKHNlbGYpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlzZWxmLnRlZC5XRVBhc3RlKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCXNlbGYuY2hhbmdlZCA9IDEKLQkJCi0JZGVmIG1lbnVfY2xlYXIoc2VsZik6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCXNlbGYudGVkLldFRGVsZXRlKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCXNlbGYuY2hhbmdlZCA9IDEKKyAgICBkZWYgc2Nyb2xsYmFyX2NhbGxiYWNrKHNlbGYsIHdoaWNoLCB3aGF0LCB2YWx1ZSk6CisgICAgICAgIGlmIHdoaWNoID09ICd5JzoKKyAgICAgICAgICAgIGlmIHdoYXQgPT0gJ3NldCc6CisgICAgICAgICAgICAgICAgaGVpZ2h0ID0gc2VsZi50ZWQuV0VHZXRIZWlnaHQoMCwgMHgzZmZmZmZmZikKKyAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLmdldHNjcm9sbGJhcnZhbHVlcygpWzFdCisgICAgICAgICAgICAgICAgZGVsdGEgPSAoY3VyLXZhbHVlKSpoZWlnaHQvMzI3NjcKKyAgICAgICAgICAgIGlmIHdoYXQgPT0gJy0nOgorICAgICAgICAgICAgICAgIHRvcGxpbmVfb2ZmLGR1bW15ID0gc2VsZi50ZWQuV0VHZXRPZmZzZXQoKDEsMSkpCisgICAgICAgICAgICAgICAgdG9wbGluZV9udW0gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZSh0b3BsaW5lX29mZikKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KHRvcGxpbmVfbnVtLCB0b3BsaW5lX251bSsxKQorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICctLSc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAoc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpWzNdLTEwKQorICAgICAgICAgICAgICAgIGlmIGRlbHRhIDw9IDA6CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gMTAgIyBSYW5kb20gdmFsdWUKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnKyc6CisgICAgICAgICAgICAgICAgIyBYWFhYIFdyb25nOiBzaG91bGQgYmUgYm90dG9tIGxpbmUgc2l6ZQorICAgICAgICAgICAgICAgIHRvcGxpbmVfb2ZmLGR1bW15ID0gc2VsZi50ZWQuV0VHZXRPZmZzZXQoKDEsMSkpCisgICAgICAgICAgICAgICAgdG9wbGluZV9udW0gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZSh0b3BsaW5lX29mZikKKyAgICAgICAgICAgICAgICBkZWx0YSA9IC1zZWxmLnRlZC5XRUdldEhlaWdodCh0b3BsaW5lX251bSwgdG9wbGluZV9udW0rMSkKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnKysnOgorICAgICAgICAgICAgICAgIGRlbHRhID0gLShzZWxmLnRlZC5XRUdldFZpZXdSZWN0KClbM10tMTApCisgICAgICAgICAgICAgICAgaWYgZGVsdGEgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAtMTAKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2Nyb2xsKDAsIGRlbHRhKQorIyMgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1NDUk9MTCBZJywgZGVsdGEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHdoYXQgPT0gJ3NldCc6CisgICAgICAgICAgICAgICAgcmV0dXJuICMgWFhYWAorICAgICAgICAgICAgdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgICAgIHdpbndpZHRoID0gdnJbMl0tdnJbMF0KKyAgICAgICAgICAgIGlmIHdoYXQgPT0gJy0nOgorICAgICAgICAgICAgICAgIGRlbHRhID0gd2lud2lkdGgvMTAKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnLS0nOgorICAgICAgICAgICAgICAgIGRlbHRhID0gd2lud2lkdGgvMgorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICcrJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IC13aW53aWR0aC8xMAorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICcrKyc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAtd2lud2lkdGgvMgorICAgICAgICAgICAgc2VsZi50ZWQuV0VTY3JvbGwoZGVsdGEsIDApCisgICAgICAgICMgUGluIHRoZSBzY3JvbGwKKyAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQorICAgICAgICB2bCwgdnQsIHZyLCB2YiA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQorICAgICAgICBpZiB0ID4gMCBvciBsID4gMDoKKyAgICAgICAgICAgIGR4ID0gZHkgPSAwCisgICAgICAgICAgICBpZiB0ID4gMDogZHkgPSAtdAorICAgICAgICAgICAgaWYgbCA+IDA6IGR4ID0gLWwKKyMjICAgICAgICAgICAgICAgICAgICAgIHByaW50ICdFeHRyYSBzY3JvbGwnLCBkeCwgZHkKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2Nyb2xsKGR4LCBkeSkKKyAgICAgICAgZWxpZiBiIDwgdmI6CisjIyAgICAgICAgICAgICAgICAgICAgICBwcmludCAnRXh0cmEgZG93bnNjcm9sbCcsIGItdmIKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2Nyb2xsKDAsIGItdmIpCiAKLQlkZWYgbWVudV91bmRvKHNlbGYpOgotCQlzZWxmLnRlZC5XRVVuZG8oKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCQkKLQlkZWYgaGF2ZV9zZWxlY3Rpb24oc2VsZik6Ci0JCXN0YXJ0LCBzdG9wID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQlyZXR1cm4gc3RhcnQgPCBzdG9wCi0JCQotCWRlZiBjYW5fcGFzdGUoc2VsZik6Ci0JCXJldHVybiBzZWxmLnRlZC5XRUNhblBhc3RlKCkKLQkJCi0JZGVmIGNhbl91bmRvKHNlbGYpOgotCQl3aGljaCwgcmVkbyA9IHNlbGYudGVkLldFR2V0VW5kb0luZm8oKQotCQl3aGljaCA9IFVORE9MQUJFTFNbd2hpY2hdCi0JCWlmIHdoaWNoID09IE5vbmU6IHJldHVybiBOb25lCi0JCWlmIHJlZG86Ci0JCQlyZXR1cm4gIlJlZG8gIit3aGljaAotCQllbHNlOgotCQkJcmV0dXJuICJVbmRvICIrd2hpY2gKKworICAgIGRlZiBkb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KToKKyMjICAgICAgICAgICAgICBwcmludCAiQUNUSVZBVEUiLCBvbm9mZgorICAgICAgICBRZC5TZXRQb3J0KHNlbGYud2lkKQorICAgICAgICBTY3JvbGxlZFdpbmRvdy5kb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KQorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYudGVkLldFQWN0aXZhdGUoKQorICAgICAgICAgICAgc2VsZi5wYXJlbnQuYWN0aXZlID0gc2VsZgorICAgICAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQorCisgICAgZGVmIGRvX3VwZGF0ZShzZWxmLCB3aWQsIGV2ZW50KToKKyAgICAgICAgcmVnaW9uID0gd2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KKyAgICAgICAgaWYgUWQuRW1wdHlSZ24ocmVnaW9uKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBRZC5FcmFzZVJnbihyZWdpb24pCisgICAgICAgIHNlbGYudGVkLldFVXBkYXRlKHJlZ2lvbikKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKworICAgIGRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgdnIgPSAobCwgdCwgbCt3aWR0aC0xNSwgdCtoZWlnaHQtMTUpCisgICAgICAgIHNlbGYudGVkLldFU2V0Vmlld1JlY3QodnIpCisgICAgICAgIHNlbGYud2lkLkludmFsV2luZG93UmVjdCh2cikKKyAgICAgICAgU2Nyb2xsZWRXaW5kb3cuZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpCisKKyAgICBkZWYgZG9fY29udGVudGNsaWNrKHNlbGYsIGxvY2FsLCBtb2RpZmllcnMsIGV2dCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2dAorICAgICAgICBzZWxmLnRlZC5XRUNsaWNrKGxvY2FsLCBtb2RpZmllcnMsIHdoZW4pCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIGRvX2NoYXIoc2VsZiwgY2gsIGV2ZW50KToKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgc2VsZi50ZWQuV0VLZXkob3JkKGNoKSwgbW9kaWZpZXJzKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAxCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNoYW5nZWQ6CisgICAgICAgICAgICBzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgd2luZG93ICIlcyIgYmVmb3JlIGNsb3Npbmc/JyVzZWxmLm5hbWUsIDEpCisgICAgICAgICAgICBpZiBzYXZlID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLm1lbnVfc2F2ZSgpCisgICAgICAgICAgICBlbGlmIHNhdmUgPCAwOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnBhcmVudC5hY3RpdmUgPT0gc2VsZjoKKyAgICAgICAgICAgIHNlbGYucGFyZW50LmFjdGl2ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIGRlbCBzZWxmLnRlZAorICAgICAgICBkZWwgc2VsZi50ZWR0ZXh0aGFuZGxlCisgICAgICAgIHNlbGYuZG9fcG9zdGNsb3NlKCkKKworICAgIGRlZiBtZW51X3NhdmUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnBhdGg6CisgICAgICAgICAgICBzZWxmLm1lbnVfc2F2ZV9hcygpCisgICAgICAgICAgICByZXR1cm4gIyBXaWxsIGNhbGwgdXMgcmVjdXJzaXZlbHkKKyMjICAgICAgICAgICAgICBwcmludCAnU2F2aW5nIHRvICcsIHNlbGYucGF0aAorICAgICAgICBkaGFuZGxlID0gc2VsZi50ZWQuV0VHZXRUZXh0KCkKKyAgICAgICAgZGF0YSA9IGRoYW5kbGUuZGF0YQorICAgICAgICBmcCA9IG9wZW4oc2VsZi5wYXRoLCAnd2InKSAgIyBOT1RFOiB3YiwgYmVjYXVzZSBkYXRhIGhhcyBDUiBmb3IgZW5kLW9mLWxpbmUKKyAgICAgICAgZnAud3JpdGUoZGF0YSkKKyAgICAgICAgaWYgZGF0YVstMV0gPD4gJ1xyJzogZnAud3JpdGUoJ1xyJykKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAwCisKKyAgICBkZWYgbWVudV9zYXZlX2FzKHNlbGYpOgorICAgICAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSBhczonKQorICAgICAgICBpZiBub3QgcGF0aDogcmV0dXJuCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5uYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLnBhdGgpWy0xXQorICAgICAgICBzZWxmLndpZC5TZXRXVGl0bGUoc2VsZi5uYW1lKQorICAgICAgICBzZWxmLm1lbnVfc2F2ZSgpCisKKyAgICBkZWYgbWVudV9jdXQoc2VsZik6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIGlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKKyAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCisgICAgICAgIHNlbGYudGVkLldFQ3V0KCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKKworICAgIGRlZiBtZW51X2NvcHkoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKKyAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCisgICAgICAgIHNlbGYudGVkLldFQ29weSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfcGFzdGUoc2VsZik6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIHNlbGYudGVkLldFUGFzdGUoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMQorCisgICAgZGVmIG1lbnVfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIHNlbGYudGVkLldFRGVsZXRlKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKKworICAgIGRlZiBtZW51X3VuZG8oc2VsZik6CisgICAgICAgIHNlbGYudGVkLldFVW5kbygpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIGhhdmVfc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBzdGFydCwgc3RvcCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgcmV0dXJuIHN0YXJ0IDwgc3RvcAorCisgICAgZGVmIGNhbl9wYXN0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGVkLldFQ2FuUGFzdGUoKQorCisgICAgZGVmIGNhbl91bmRvKHNlbGYpOgorICAgICAgICB3aGljaCwgcmVkbyA9IHNlbGYudGVkLldFR2V0VW5kb0luZm8oKQorICAgICAgICB3aGljaCA9IFVORE9MQUJFTFNbd2hpY2hdCisgICAgICAgIGlmIHdoaWNoID09IE5vbmU6IHJldHVybiBOb25lCisgICAgICAgIGlmIHJlZG86CisgICAgICAgICAgICByZXR1cm4gIlJlZG8gIit3aGljaAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJVbmRvICIrd2hpY2gKIAogY2xhc3MgV2VkKEFwcGxpY2F0aW9uKToKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCUFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCi0JCXNlbGYubnVtID0gMAotCQlzZWxmLmFjdGl2ZSA9IE5vbmUKLQkJc2VsZi51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCXNlbGYuZmlsZW1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJc2VsZi5uZXdpdGVtID0gTWVudUl0ZW0obSwgIk5ldyB3aW5kb3ciLCAiTiIsIHNlbGYub3BlbikKLQkJc2VsZi5vcGVuaXRlbSA9IE1lbnVJdGVtKG0sICJPcGVuLi4uIiwgIk8iLCBzZWxmLm9wZW5maWxlKQotCQlzZWxmLmNsb3NlaXRlbSA9IE1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgc2VsZi5jbG9zZXdpbikKLQkJbS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLnNhdmVpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsIHNlbGYuc2F2ZSkKLQkJc2VsZi5zYXZlYXNpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUgYXMuLi4iLCAiIiwgc2VsZi5zYXZlYXMpCi0JCW0uYWRkc2VwYXJhdG9yKCkKLQkJc2VsZi5xdWl0aXRlbSA9IE1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCi0JCQotCQlzZWxmLmVkaXRtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCi0JCXNlbGYudW5kb2l0ZW0gPSBNZW51SXRlbShtLCAiVW5kbyIsICJaIiwgc2VsZi51bmRvKQotCQlzZWxmLmN1dGl0ZW0gPSBNZW51SXRlbShtLCAiQ3V0IiwgIlgiLCBzZWxmLmN1dCkKLQkJc2VsZi5jb3B5aXRlbSA9IE1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCBzZWxmLmNvcHkpCi0JCXNlbGYucGFzdGVpdGVtID0gTWVudUl0ZW0obSwgIlBhc3RlIiwgIlYiLCBzZWxmLnBhc3RlKQotCQlzZWxmLmNsZWFyaXRlbSA9IE1lbnVJdGVtKG0sICJDbGVhciIsICIiLCBzZWxmLmNsZWFyKQotCQkKLQkJIyBHcm91cHMgb2YgaXRlbXMgZW5hYmxlZCB0b2dldGhlcjoKLQkJc2VsZi53aW5kb3dncm91cCA9IFtzZWxmLmNsb3NlaXRlbSwgc2VsZi5zYXZlaXRlbSwgc2VsZi5zYXZlYXNpdGVtLCBzZWxmLmVkaXRtZW51XQotCQlzZWxmLmZvY3VzZ3JvdXAgPSBbc2VsZi5jdXRpdGVtLCBzZWxmLmNvcHlpdGVtLCBzZWxmLmNsZWFyaXRlbV0KLQkJc2VsZi53aW5kb3dncm91cF9vbiA9IC0xCi0JCXNlbGYuZm9jdXNncm91cF9vbiA9IC0xCi0JCXNlbGYucGFzdGVncm91cF9vbiA9IC0xCi0JCXNlbGYudW5kb19sYWJlbCA9ICJuZXZlciIKLQkJCi0JZGVmIHVwZGF0ZW1lbnViYXIoc2VsZik6Ci0JCWNoYW5nZWQgPSAwCi0JCW9uID0gKHNlbGYuYWN0aXZlIDw+IE5vbmUpCi0JCWlmIG9uIDw+IHNlbGYud2luZG93Z3JvdXBfb246Ci0JCQlmb3IgbSBpbiBzZWxmLndpbmRvd2dyb3VwOgotCQkJCW0uZW5hYmxlKG9uKQotCQkJc2VsZi53aW5kb3dncm91cF9vbiA9IG9uCi0JCQljaGFuZ2VkID0gMQotCQlpZiBvbjoKLQkJCSMgb25seSBpZiB3ZSBoYXZlIGFuIGVkaXQgbWVudQotCQkJb24gPSBzZWxmLmFjdGl2ZS5oYXZlX3NlbGVjdGlvbigpCi0JCQlpZiBvbiA8PiBzZWxmLmZvY3VzZ3JvdXBfb246Ci0JCQkJZm9yIG0gaW4gc2VsZi5mb2N1c2dyb3VwOgotCQkJCQltLmVuYWJsZShvbikKLQkJCQlzZWxmLmZvY3VzZ3JvdXBfb24gPSBvbgotCQkJCWNoYW5nZWQgPSAxCi0JCQlvbiA9IHNlbGYuYWN0aXZlLmNhbl9wYXN0ZSgpCi0JCQlpZiBvbiA8PiBzZWxmLnBhc3RlZ3JvdXBfb246Ci0JCQkJc2VsZi5wYXN0ZWl0ZW0uZW5hYmxlKG9uKQotCQkJCXNlbGYucGFzdGVncm91cF9vbiA9IG9uCi0JCQkJY2hhbmdlZCA9IDEKLQkJCW9uID0gc2VsZi5hY3RpdmUuY2FuX3VuZG8oKQotCQkJaWYgb24gPD4gc2VsZi51bmRvX2xhYmVsOgotCQkJCWlmIG9uOgotCQkJCQlzZWxmLnVuZG9pdGVtLmVuYWJsZSgxKQotCQkJCQlzZWxmLnVuZG9pdGVtLnNldHRleHQob24pCi0JCQkJCXNlbGYudW5kb19sYWJlbCA9IG9uCi0JCQkJZWxzZToKLQkJCQkJc2VsZi51bmRvaXRlbS5zZXR0ZXh0KCJOb3RoaW5nIHRvIHVuZG8iKQotCQkJCQlzZWxmLnVuZG9pdGVtLmVuYWJsZSgwKQotCQkJCWNoYW5nZWQgPSAxCi0JCWlmIGNoYW5nZWQ6Ci0JCQlEcmF3TWVudUJhcigpCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBBcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm51bSA9IDAKKyAgICAgICAgc2VsZi5hY3RpdmUgPSBOb25lCisgICAgICAgIHNlbGYudXBkYXRlbWVudWJhcigpCiAKLQkjCi0JIyBBcHBsZSBtZW51Ci0JIwotCQotCWRlZiBkb19hYm91dChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIkEgc2ltcGxlIHNpbmdsZS1mb250IHRleHQgZWRpdG9yIGJhc2VkIG9uIFdBU1RFIikKLQkJCQotCSMKLQkjIEZpbGUgbWVudQotCSMKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQorICAgICAgICBzZWxmLm5ld2l0ZW0gPSBNZW51SXRlbShtLCAiTmV3IHdpbmRvdyIsICJOIiwgc2VsZi5vcGVuKQorICAgICAgICBzZWxmLm9wZW5pdGVtID0gTWVudUl0ZW0obSwgIk9wZW4uLi4iLCAiTyIsIHNlbGYub3BlbmZpbGUpCisgICAgICAgIHNlbGYuY2xvc2VpdGVtID0gTWVudUl0ZW0obSwgIkNsb3NlIiwgIlciLCBzZWxmLmNsb3Nld2luKQorICAgICAgICBtLmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYuc2F2ZWl0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgc2VsZi5zYXZlKQorICAgICAgICBzZWxmLnNhdmVhc2l0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSBhcy4uLiIsICIiLCBzZWxmLnNhdmVhcykKKyAgICAgICAgbS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnF1aXRpdGVtID0gTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKIAotCWRlZiBvcGVuKHNlbGYsICphcmdzKToKLQkJc2VsZi5fb3BlbigwKQotCQkKLQlkZWYgb3BlbmZpbGUoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLl9vcGVuKDEpCisgICAgICAgIHNlbGYuZWRpdG1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJFZGl0IikKKyAgICAgICAgc2VsZi51bmRvaXRlbSA9IE1lbnVJdGVtKG0sICJVbmRvIiwgIloiLCBzZWxmLnVuZG8pCisgICAgICAgIHNlbGYuY3V0aXRlbSA9IE1lbnVJdGVtKG0sICJDdXQiLCAiWCIsIHNlbGYuY3V0KQorICAgICAgICBzZWxmLmNvcHlpdGVtID0gTWVudUl0ZW0obSwgIkNvcHkiLCAiQyIsIHNlbGYuY29weSkKKyAgICAgICAgc2VsZi5wYXN0ZWl0ZW0gPSBNZW51SXRlbShtLCAiUGFzdGUiLCAiViIsIHNlbGYucGFzdGUpCisgICAgICAgIHNlbGYuY2xlYXJpdGVtID0gTWVudUl0ZW0obSwgIkNsZWFyIiwgIiIsIHNlbGYuY2xlYXIpCiAKLQlkZWYgX29wZW4oc2VsZiwgYXNrZmlsZSk6Ci0JCWlmIGFza2ZpbGU6Ci0JCQlwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4odHlwZUxpc3Q9KCdURVhUJywpKQotCQkJaWYgbm90IHBhdGg6Ci0JCQkJcmV0dXJuCi0JCQluYW1lID0gb3MucGF0aC5zcGxpdChwYXRoKVstMV0KLQkJCXRyeToKLQkJCQlmcCA9IG9wZW4ocGF0aCwgJ3JiJykgIyBOT1RFIGJpbmFyeSwgd2UgbmVlZCBjciBhcyBlbmQtb2YtbGluZQotCQkJCWRhdGEgPSBmcC5yZWFkKCkKLQkJCQlmcC5jbG9zZSgpCi0JCQlleGNlcHQgSU9FcnJvciwgYXJnOgotCQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIklPRVJST1I6ICVyIiAlIChhcmcsKSkKLQkJCQlyZXR1cm4KLQkJZWxzZToKLQkJCXBhdGggPSBOb25lCi0JCQluYW1lID0gIlVudGl0bGVkICVkIiVzZWxmLm51bQotCQkJZGF0YSA9ICcnCi0JCXcgPSBXYXN0ZVdpbmRvdyhzZWxmKQotCQl3Lm9wZW4ocGF0aCwgbmFtZSwgZGF0YSkKLQkJc2VsZi5udW0gPSBzZWxmLm51bSArIDEKLQkJCi0JZGVmIGNsb3Nld2luKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5jbG9zZSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBzYXZlKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3NhdmUoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgc2F2ZWFzKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3NhdmVfYXMoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkJCi0JCQotCWRlZiBxdWl0KHNlbGYsICphcmdzKToKLQkJZm9yIHcgaW4gc2VsZi5fd2luZG93cy52YWx1ZXMoKToKLQkJCXcuY2xvc2UoKQotCQlpZiBzZWxmLl93aW5kb3dzOgotCQkJcmV0dXJuCi0JCXNlbGYuX3F1aXQoKQotCQkKLQkjCi0JIyBFZGl0IG1lbnUKLQkjCi0JCi0JZGVmIHVuZG8oc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfdW5kbygpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBjdXQoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfY3V0KCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIGNvcHkoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfY29weSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBwYXN0ZShzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9wYXN0ZSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgICAgICMgR3JvdXBzIG9mIGl0ZW1zIGVuYWJsZWQgdG9nZXRoZXI6CisgICAgICAgIHNlbGYud2luZG93Z3JvdXAgPSBbc2VsZi5jbG9zZWl0ZW0sIHNlbGYuc2F2ZWl0ZW0sIHNlbGYuc2F2ZWFzaXRlbSwgc2VsZi5lZGl0bWVudV0KKyAgICAgICAgc2VsZi5mb2N1c2dyb3VwID0gW3NlbGYuY3V0aXRlbSwgc2VsZi5jb3B5aXRlbSwgc2VsZi5jbGVhcml0ZW1dCisgICAgICAgIHNlbGYud2luZG93Z3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLmZvY3VzZ3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLnBhc3RlZ3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLnVuZG9fbGFiZWwgPSAibmV2ZXIiCiAKLQlkZWYgY2xlYXIoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfY2xlYXIoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQkjCi0JIyBPdGhlciBzdHVmZgotCSMJCisgICAgZGVmIHVwZGF0ZW1lbnViYXIoc2VsZik6CisgICAgICAgIGNoYW5nZWQgPSAwCisgICAgICAgIG9uID0gKHNlbGYuYWN0aXZlIDw+IE5vbmUpCisgICAgICAgIGlmIG9uIDw+IHNlbGYud2luZG93Z3JvdXBfb246CisgICAgICAgICAgICBmb3IgbSBpbiBzZWxmLndpbmRvd2dyb3VwOgorICAgICAgICAgICAgICAgIG0uZW5hYmxlKG9uKQorICAgICAgICAgICAgc2VsZi53aW5kb3dncm91cF9vbiA9IG9uCisgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICBpZiBvbjoKKyAgICAgICAgICAgICMgb25seSBpZiB3ZSBoYXZlIGFuIGVkaXQgbWVudQorICAgICAgICAgICAgb24gPSBzZWxmLmFjdGl2ZS5oYXZlX3NlbGVjdGlvbigpCisgICAgICAgICAgICBpZiBvbiA8PiBzZWxmLmZvY3VzZ3JvdXBfb246CisgICAgICAgICAgICAgICAgZm9yIG0gaW4gc2VsZi5mb2N1c2dyb3VwOgorICAgICAgICAgICAgICAgICAgICBtLmVuYWJsZShvbikKKyAgICAgICAgICAgICAgICBzZWxmLmZvY3VzZ3JvdXBfb24gPSBvbgorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICBvbiA9IHNlbGYuYWN0aXZlLmNhbl9wYXN0ZSgpCisgICAgICAgICAgICBpZiBvbiA8PiBzZWxmLnBhc3RlZ3JvdXBfb246CisgICAgICAgICAgICAgICAgc2VsZi5wYXN0ZWl0ZW0uZW5hYmxlKG9uKQorICAgICAgICAgICAgICAgIHNlbGYucGFzdGVncm91cF9vbiA9IG9uCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgICAgIG9uID0gc2VsZi5hY3RpdmUuY2FuX3VuZG8oKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi51bmRvX2xhYmVsOgorICAgICAgICAgICAgICAgIGlmIG9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLmVuYWJsZSgxKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLnNldHRleHQob24pCisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb19sYWJlbCA9IG9uCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5zZXR0ZXh0KCJOb3RoaW5nIHRvIHVuZG8iKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLmVuYWJsZSgwKQorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgIGlmIGNoYW5nZWQ6CisgICAgICAgICAgICBEcmF3TWVudUJhcigpCiAKLQlkZWYgaWRsZShzZWxmLCBldmVudCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUuZG9faWRsZShldmVudCkKLQkJZWxzZToKLQkJCVFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQorICAgICMKKyAgICAjIEFwcGxlIG1lbnUKKyAgICAjCisKKyAgICBkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJBIHNpbXBsZSBzaW5nbGUtZm9udCB0ZXh0IGVkaXRvciBiYXNlZCBvbiBXQVNURSIpCisKKyAgICAjCisgICAgIyBGaWxlIG1lbnUKKyAgICAjCisKKyAgICBkZWYgb3BlbihzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX29wZW4oMCkKKworICAgIGRlZiBvcGVuZmlsZShzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX29wZW4oMSkKKworICAgIGRlZiBfb3BlbihzZWxmLCBhc2tmaWxlKToKKyAgICAgICAgaWYgYXNrZmlsZToKKyAgICAgICAgICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oJ1RFWFQnLCkpCisgICAgICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpWy0xXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwID0gb3BlbihwYXRoLCAncmInKSAjIE5PVEUgYmluYXJ5LCB3ZSBuZWVkIGNyIGFzIGVuZC1vZi1saW5lCisgICAgICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBhcmc6CisgICAgICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiSU9FUlJPUjogJXIiICUgKGFyZywpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCA9IE5vbmUKKyAgICAgICAgICAgIG5hbWUgPSAiVW50aXRsZWQgJWQiJXNlbGYubnVtCisgICAgICAgICAgICBkYXRhID0gJycKKyAgICAgICAgdyA9IFdhc3RlV2luZG93KHNlbGYpCisgICAgICAgIHcub3BlbihwYXRoLCBuYW1lLCBkYXRhKQorICAgICAgICBzZWxmLm51bSA9IHNlbGYubnVtICsgMQorCisgICAgZGVmIGNsb3Nld2luKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgc2F2ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9zYXZlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBzYXZlYXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2F2ZV9hcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKworICAgIGRlZiBxdWl0KHNlbGYsICphcmdzKToKKyAgICAgICAgZm9yIHcgaW4gc2VsZi5fd2luZG93cy52YWx1ZXMoKToKKyAgICAgICAgICAgIHcuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLl93aW5kb3dzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgIworICAgICMgRWRpdCBtZW51CisgICAgIworCisgICAgZGVmIHVuZG8oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfdW5kbygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY3V0KHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2N1dCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY29weShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9jb3B5KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBwYXN0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9wYXN0ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY2xlYXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfY2xlYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgIworICAgICMgT3RoZXIgc3R1ZmYKKyAgICAjCisKKyAgICBkZWYgaWRsZShzZWxmLCBldmVudCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUuZG9faWRsZShldmVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQogCiBkZWYgbWFpbigpOgotCUFwcCA9IFdlZCgpCi0JQXBwLm1haW5sb29wKCkKLQkKKyAgICBBcHAgPSBXZWQoKQorICAgIEFwcC5tYWlubG9vcCgpCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCi0JCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL0FjdGl2YXRlV2luZG93RGVtby5weSBiL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvQWN0aXZhdGVXaW5kb3dEZW1vLnB5CmluZGV4IDNjZDgzMmIuLmQ4ZmM5NDYgMTAwNjQ0Ci0tLSBhL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvQWN0aXZhdGVXaW5kb3dEZW1vLnB5CisrKyBiL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvQWN0aXZhdGVXaW5kb3dEZW1vLnB5CkBAIC00LDE4ICs0LDE4IEBACiAjIGV2YiAyMiA0IDk5CiAKIGNsYXNzIEFjdGl2YXRlRGVtbzoKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCXNlbGYudyA9IFcuV2luZG93KCgyMDAsIDIwMCksICdBY3RpdmF0ZSBkZW1vJykKLQkJc2VsZi53LmJpbmQoIjxhY3RpdmF0ZT4iLCBzZWxmLm15X2FjdGl2YXRlX2NhbGxiYWNrKQotCQlzZWxmLncub3BlbigpCi0JCi0JZGVmIG15X2FjdGl2YXRlX2NhbGxiYWNrKHNlbGYsIG9ub2ZmKToKLQkJJycndGhlIGNhbGxiYWNrIGdldHMgMSBwYXJhbWV0ZXIgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHdpbmRvdwotCQloYXMgYmVlbiBhY3RpdmF0ZWQgKDEpIG9yIGNsaWNrZWQgdG8gdGhlIGJhY2sgKDApJycnCi0JCWlmIG9ub2ZmID09IDE6Ci0JCQlwcmludCAiSSdtIGluIHRoZSBmcm9udCBub3chIgotCQllbHNlOgotCQkJcHJpbnQgIkkndmUgYmVlbiBjbGlja2VkIGF3YXksIE9oIE5vISIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi53ID0gVy5XaW5kb3coKDIwMCwgMjAwKSwgJ0FjdGl2YXRlIGRlbW8nKQorICAgICAgICBzZWxmLncuYmluZCgiPGFjdGl2YXRlPiIsIHNlbGYubXlfYWN0aXZhdGVfY2FsbGJhY2spCisgICAgICAgIHNlbGYudy5vcGVuKCkKKworICAgIGRlZiBteV9hY3RpdmF0ZV9jYWxsYmFjayhzZWxmLCBvbm9mZik6CisgICAgICAgICcnJ3RoZSBjYWxsYmFjayBnZXRzIDEgcGFyYW1ldGVyIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSB3aW5kb3cKKyAgICAgICAgaGFzIGJlZW4gYWN0aXZhdGVkICgxKSBvciBjbGlja2VkIHRvIHRoZSBiYWNrICgwKScnJworICAgICAgICBpZiBvbm9mZiA9PSAxOgorICAgICAgICAgICAgcHJpbnQgIkknbSBpbiB0aGUgZnJvbnQgbm93ISIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJJJ3ZlIGJlZW4gY2xpY2tlZCBhd2F5LCBPaCBObyEiCiAKIGFkID0gQWN0aXZhdGVEZW1vKCkKZGlmZiAtLWdpdCBhL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvS2V5VGVzdGVyLnB5IGIvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9LZXlUZXN0ZXIucHkKaW5kZXggYTlmMzE0MC4uYWU0NzU1MCAxMDA2NDQKLS0tIGEvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9LZXlUZXN0ZXIucHkKKysrIGIvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9LZXlUZXN0ZXIucHkKQEAgLTQsMTIgKzQsMTIgQEAKIAogIyBrZXkgY2FsbGJhY2sgZnVuY3Rpb24KIGRlZiB0ZXN0ZXIoY2hhciwgZXZlbnQpOgotCXRleHQgPSAiJXJcciVkXHIlc1xyJXMiICUgKGNoYXIsIG9yZChjaGFyKSwgaGV4KG9yZChjaGFydCkpLCBvY3Qob3JkKGNoYXIpKSkKLQl3aW5kb3cua2V5cy5zZXQodGV4dCkKKyAgICB0ZXh0ID0gIiVyXHIlZFxyJXNcciVzIiAlIChjaGFyLCBvcmQoY2hhciksIGhleChvcmQoY2hhcnQpKSwgb2N0KG9yZChjaGFyKSkpCisgICAgd2luZG93LmtleXMuc2V0KHRleHQpCiAKICMgY2xvc2UgY2FsbGJhY2sKIGRlZiBjbG9zZSgpOgotCXdpbmRvdy5jbG9zZSgpCisgICAgd2luZG93LmNsb3NlKCkKIAogIyBuZXcgd2luZG93CiB3aW5kb3cgPSBXLkRpYWxvZygoMTgwLCAxMDApLCAiVHlwZSBhIGNoYXJhY3RlciIpCmRpZmYgLS1naXQgYS9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL0xpc3RXaW5kb3cucHkgYi9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL0xpc3RXaW5kb3cucHkKaW5kZXggZWYwNjZiOS4uZjc4YjRiOCAxMDA2NDQKLS0tIGEvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9MaXN0V2luZG93LnB5CisrKyBiL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvTGlzdFdpbmRvdy5weQpAQCAtMSwxMCArMSwxMCBAQAogaW1wb3J0IFcKIAogZGVmIGxpc3RoaXQoaXNkYmwpOgotCWlmIGlzZGJsOgotCQlwcmludCAiZG91YmxlLWNsaWNrIGluIGxpc3QhIgotCWVsc2U6Ci0JCXByaW50ICJjbGljayBpbiBsaXN0LiIKKyAgICBpZiBpc2RibDoKKyAgICAgICAgcHJpbnQgImRvdWJsZS1jbGljayBpbiBsaXN0ISIKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiY2xpY2sgaW4gbGlzdC4iCiAKIHdpbmRvdyA9IFcuV2luZG93KCgyMDAsIDQwMCksICJXaW5kb3cgd2l0aCBMaXN0IiwgbWluc2l6ZSA9ICgxNTAsIDIwMCkpCiAKZGlmZiAtLWdpdCBhL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvVHdvTGlzdHMucHkgYi9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL1R3b0xpc3RzLnB5CmluZGV4IGVlNTJjODkuLmYxYjU4ZjIgMTAwNjQ0Ci0tLSBhL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvVHdvTGlzdHMucHkKKysrIGIvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9Ud29MaXN0cy5weQpAQCAtMSwxNiArMSwxNiBAQAogaW1wb3J0IFcKIAogZGVmIHR3b3RoaXJkKHdpZHRoLCBoZWlnaHQpOgotCXJldHVybiAoOCwgOCwgd2lkdGggLSA4LCAyKmhlaWdodC8zIC0gNCkKKyAgICByZXR1cm4gKDgsIDgsIHdpZHRoIC0gOCwgMipoZWlnaHQvMyAtIDQpCiAKIGRlZiBvbmV0aGlyZCh3aWR0aCwgaGVpZ2h0KToKLQlyZXR1cm4gKDgsIDIqaGVpZ2h0LzMgKyA0LCB3aWR0aCAtIDgsIGhlaWdodCAtIDIyKQorICAgIHJldHVybiAoOCwgMipoZWlnaHQvMyArIDQsIHdpZHRoIC0gOCwgaGVpZ2h0IC0gMjIpCiAKIGRlZiBoYWxmYm91bmRzMSh3aWR0aCwgaGVpZ2h0KToKLQlyZXR1cm4gKDAsIDAsIHdpZHRoLzIgLSA0LCBoZWlnaHQpCisgICAgcmV0dXJuICgwLCAwLCB3aWR0aC8yIC0gNCwgaGVpZ2h0KQogCiBkZWYgaGFsZmJvdW5kczIod2lkdGgsIGhlaWdodCk6Ci0JcmV0dXJuICh3aWR0aC8yICsgNCwgMCwgd2lkdGgsIGhlaWdodCkKKyAgICByZXR1cm4gKHdpZHRoLzIgKyA0LCAwLCB3aWR0aCwgaGVpZ2h0KQogCiB3aW5kb3cgPSBXLldpbmRvdygoNDAwLCA0MDApLCAiU2l6YWJsZSB3aW5kb3cgd2l0aCB0d28gbGlzdHMiLCBtaW5zaXplID0gKDIwMCwgMjAwKSkKIApkaWZmIC0tZ2l0IGEvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9XaWRnZXRUZXN0LnB5IGIvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9XaWRnZXRUZXN0LnB5CmluZGV4IDQyNGU3MGQuLmEyZThkMDggMTAwNjQ0Ci0tLSBhL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvV2lkZ2V0VGVzdC5weQorKysgYi9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL1dpZGdldFRlc3QucHkKQEAgLTIsMzQgKzIsMzQgQEAKIAogIyBkZWZpbmUgc29tZSBjYWxsYmFja3MKIGRlZiBjYWxsYmFjaygpOgotCXdpbmRvdy5jbG9zZSgpCisgICAgd2luZG93LmNsb3NlKCkKIAogZGVmIGNoZWNrY2FsbGJhY2sodmFsdWUpOgotCXByaW50ICJoaXQgdGhlIGNoZWNrYm94IiwgdmFsdWUKKyAgICBwcmludCAiaGl0IHRoZSBjaGVja2JveCIsIHZhbHVlCiAKIGRlZiByYWRpb2NhbGxiYWNrKHZhbHVlKToKLQlwcmludCAiaGl0IHJhZGlvYnV0dG9uICMzIiwgdmFsdWUKKyAgICBwcmludCAiaGl0IHJhZGlvYnV0dG9uICMzIiwgdmFsdWUKIAogZGVmIHNjcm9sbGNhbGxiYWNrKHZhbHVlKToKLQl3aWRnZXQgPSB3aW5kb3cuaGJhcgotCWlmIHZhbHVlID09ICIrIjoKLQkJd2lkZ2V0LnNldCh3aWRnZXQuZ2V0KCkgLSAxKQotCWVsaWYgdmFsdWUgPT0gIi0iOgotCQl3aWRnZXQuc2V0KHdpZGdldC5nZXQoKSArIDEpCi0JZWxpZiB2YWx1ZSA9PSAiKysiOgotCQl3aWRnZXQuc2V0KHdpZGdldC5nZXQoKSAtIDEwKQotCWVsaWYgdmFsdWUgPT0gIi0tIjoKLQkJd2lkZ2V0LnNldCh3aWRnZXQuZ2V0KCkgKyAxMCkKLQllbHNlOiAgICMgaW4gdGh1bWIKLQkJd2lkZ2V0LnNldCh2YWx1ZSkKLQlwcmludCAic2Nyb2xsLi4uIiwgd2lkZ2V0LmdldCgpCisgICAgd2lkZ2V0ID0gd2luZG93LmhiYXIKKyAgICBpZiB2YWx1ZSA9PSAiKyI6CisgICAgICAgIHdpZGdldC5zZXQod2lkZ2V0LmdldCgpIC0gMSkKKyAgICBlbGlmIHZhbHVlID09ICItIjoKKyAgICAgICAgd2lkZ2V0LnNldCh3aWRnZXQuZ2V0KCkgKyAxKQorICAgIGVsaWYgdmFsdWUgPT0gIisrIjoKKyAgICAgICAgd2lkZ2V0LnNldCh3aWRnZXQuZ2V0KCkgLSAxMCkKKyAgICBlbGlmIHZhbHVlID09ICItLSI6CisgICAgICAgIHdpZGdldC5zZXQod2lkZ2V0LmdldCgpICsgMTApCisgICAgZWxzZTogICAjIGluIHRodW1iCisgICAgICAgIHdpZGdldC5zZXQodmFsdWUpCisgICAgcHJpbnQgInNjcm9sbC4uLiIsIHdpZGdldC5nZXQoKQogCiBkZWYgdGV4dGNhbGxiYWNrKCk6Ci0Jd2luZG93LmV0My5zZXQod2luZG93LmV0MS5nZXQoKSkKKyAgICB3aW5kb3cuZXQzLnNldCh3aW5kb3cuZXQxLmdldCgpKQogCiBkZWYgY2FuY2VsKCk6Ci0JaW1wb3J0IEVhc3lEaWFsb2dzCi0JRWFzeURpYWxvZ3MuTWVzc2FnZSgiQ2FuY2VsISIpCisgICAgaW1wb3J0IEVhc3lEaWFsb2dzCisgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiQ2FuY2VsISIpCiAKICMgbWFrZSBhIG5vbi1zaXphYmxlIHdpbmRvdwogI3dpbmRvdyA9IFcuV2luZG93KCgyMDAsIDMwMCksICJGaXhlZCBTaXplIikKQEAgLTc3LDkgKzc3LDkgQEAKIHdpbmRvdy5vcGVuKCkKIAogaWYgMDoKLQlpbXBvcnQgdGltZQotCWZvciBpIGluIHJhbmdlKDIwKToKLQkJd2luZG93LmV0Mi5zZXQocmVwcihpKSkKLQkJI3dpbmRvdy5ldDIuU2V0UG9ydCgpCi0JCSN3aW5kb3cuZXQyLmRyYXcoKQotCQl0aW1lLnNsZWVwKDAuMSkKKyAgICBpbXBvcnQgdGltZQorICAgIGZvciBpIGluIHJhbmdlKDIwKToKKyAgICAgICAgd2luZG93LmV0Mi5zZXQocmVwcihpKSkKKyAgICAgICAgI3dpbmRvdy5ldDIuU2V0UG9ydCgpCisgICAgICAgICN3aW5kb3cuZXQyLmRyYXcoKQorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2FlL2Flc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2FlL2Flc2Nhbi5weQppbmRleCA4MGMxOThjLi4xMjgzYzFkIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9hZS9hZXNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvYWUvYWVzY2FuLnB5CkBAIC0xMyw4NyArMTMsODcgQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyCiAKIGRlZiBtYWluKCk6Ci0JcHJpbnQgIj09PSBTY2FubmluZyBBRURhdGFNb2RlbC5oLCBBcHBsZUV2ZW50cy5oLCBBRVJlZ2lzdHJ5LmgsIEFFT2JqZWN0cy5oID09PSIKLQlpbnB1dCA9IFsiQUVEYXRhTW9kZWwuaCIsICJBRUludGVyYWN0aW9uLmgiLCAiQXBwbGVFdmVudHMuaCIsICJBRVJlZ2lzdHJ5LmgiLCAiQUVPYmplY3RzLmgiXQotCW91dHB1dCA9ICJhZWdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJBcHBsZUV2ZW50cy5weSIKLQlzY2FubmVyID0gQXBwbGVFdmVudHNTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgU2Nhbm5pbmcgYW5kIEdlbmVyYXRpbmcsIG5vdyBkb2luZyAnaW1wb3J0IGFlc3VwcG9ydCcgPT09IgotCWltcG9ydCBhZXN1cHBvcnQKLQlwcmludCAiPT09IERvbmUgJ2ltcG9ydCBhZXN1cHBvcnQnLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBBRW1vZHVsZS5jID09PSIKKyAgICBwcmludCAiPT09IFNjYW5uaW5nIEFFRGF0YU1vZGVsLmgsIEFwcGxlRXZlbnRzLmgsIEFFUmVnaXN0cnkuaCwgQUVPYmplY3RzLmggPT09IgorICAgIGlucHV0ID0gWyJBRURhdGFNb2RlbC5oIiwgIkFFSW50ZXJhY3Rpb24uaCIsICJBcHBsZUV2ZW50cy5oIiwgIkFFUmVnaXN0cnkuaCIsICJBRU9iamVjdHMuaCJdCisgICAgb3V0cHV0ID0gImFlZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIkFwcGxlRXZlbnRzLnB5IgorICAgIHNjYW5uZXIgPSBBcHBsZUV2ZW50c1NjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBTY2FubmluZyBhbmQgR2VuZXJhdGluZywgbm93IGRvaW5nICdpbXBvcnQgYWVzdXBwb3J0JyA9PT0iCisgICAgaW1wb3J0IGFlc3VwcG9ydAorICAgIHByaW50ICI9PT0gRG9uZSAnaW1wb3J0IGFlc3VwcG9ydCcuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIEFFbW9kdWxlLmMgPT09IgogCiBjbGFzcyBBcHBsZUV2ZW50c1NjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJBRUZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdFstNDpdID09ICJfcHRyIiBhbmQgbSA9PSAiSW5Nb2RlIiBhbmQgXAotCQkJICAgdFs6LTRdIGluICgiQUVEZXNjIiwgIkFFQWRkcmVzc0Rlc2MiLCAiQUVEZXNjTGlzdCIsCi0JCQkgICAgICAgICAiQUVSZWNvcmQiLCAiQXBwbGVFdmVudCIpOgotCQkJCWNsYXNzbmFtZSA9ICJBRU1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJhZWRlc2NtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkFFRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0Wy00Ol0gPT0gIl9wdHIiIGFuZCBtID09ICJJbk1vZGUiIGFuZCBcCisgICAgICAgICAgICAgICB0WzotNF0gaW4gKCJBRURlc2MiLCAiQUVBZGRyZXNzRGVzYyIsICJBRURlc2NMaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICJBRVJlY29yZCIsICJBcHBsZUV2ZW50Iik6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIkFFTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gImFlZGVzY21ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkFFRGlzcG9zZURlc2MiLAotIwkJCSJBRUdldEV2ZW50SGFuZGxlciIsCi0JCQkiQUVHZXREZXNjRGF0YSIsICMgVXNlIG9iamVjdC5kYXRhCi0JCQkiQUVHZXRTcGVjaWFsSGFuZGxlciIsCi0JCQkjIENvbnN0YW50cyB3aXRoIGZ1bm55IGRlZmluaXRpb25zCi0JCQkia0FFRG9udERpc3Bvc2VPblJlc3VtZSIsCi0JCQkia0FFVXNlU3RhbmRhcmREaXNwYXRjaCIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiQUVEaXNwb3NlRGVzYyIsCisjICAgICAgICAgICAgICAgICAgICAgICAiQUVHZXRFdmVudEhhbmRsZXIiLAorICAgICAgICAgICAgICAgICJBRUdldERlc2NEYXRhIiwgIyBVc2Ugb2JqZWN0LmRhdGEKKyAgICAgICAgICAgICAgICAiQUVHZXRTcGVjaWFsSGFuZGxlciIsCisgICAgICAgICAgICAgICAgIyBDb25zdGFudHMgd2l0aCBmdW5ueSBkZWZpbml0aW9ucworICAgICAgICAgICAgICAgICJrQUVEb250RGlzcG9zZU9uUmVzdW1lIiwKKyAgICAgICAgICAgICAgICAia0FFVXNlU3RhbmRhcmREaXNwYXRjaCIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJQcm9jUHRyIiwKLQkJCSJBRUFycmF5VHlwZSIsCi0JCQkiQUVDb2VyY2lvbkhhbmRsZXJVUFAiLAotCQkJIlVuaXZlcnNhbFByb2NQdHIiLAotCQkJIk9TTENvbXBhcmVVUFAiLAotCQkJIk9TTEFjY2Vzc29yVVBQIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJQcm9jUHRyIiwKKyAgICAgICAgICAgICAgICAiQUVBcnJheVR5cGUiLAorICAgICAgICAgICAgICAgICJBRUNvZXJjaW9uSGFuZGxlclVQUCIsCisgICAgICAgICAgICAgICAgIlVuaXZlcnNhbFByb2NQdHIiLAorICAgICAgICAgICAgICAgICJPU0xDb21wYXJlVVBQIiwKKyAgICAgICAgICAgICAgICAiT1NMQWNjZXNzb3JVUFAiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoIkJvb2xlYW4iLCAiaXNTeXNIYW5kbGVyIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJBbHdheXNGYWxzZSIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJTaXplIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJFdmVudEhhbmRsZXJQcm9jUHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJFdmVudEhhbmRsZXIiLCAiKiIsICIqIildKSwKLQkJCQotCQkJKFsoIkV2ZW50SGFuZGxlclByb2NQdHIiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiRXZlbnRIYW5kbGVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJBRUV2ZW50SGFuZGxlclVQUCIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiRXZlbnRIYW5kbGVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJBRUV2ZW50SGFuZGxlclVQUCIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJFdmVudEhhbmRsZXIiLCAiKiIsICIqIildKSwKLQkJCQotCQkJKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgiU2l6ZSIsICIqIiwgIkluTW9kZSIpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiU2l6ZSIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiVmFyVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKLQkJCSAKLQkJCShbKCJBcHBsZUV2ZW50IiwgInRoZUFwcGxlRXZlbnQiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJBcHBsZUV2ZW50X3B0ciIsICIqIiwgIkluTW9kZSIpXSksCi0JCQkgCi0JCQkoWygiQUVEZXNjTGlzdCIsICJ0aGVBRURlc2NMaXN0IiwgIk91dE1vZGUiKV0sCi0JCQkgWygiQUVEZXNjTGlzdF9wdHIiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJXQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCJCb29sZWFuIiwgImlzU3lzSGFuZGxlciIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkFsd2F5c0ZhbHNlIiwgIioiLCAiKiIpXSksCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJTaXplIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIkV2ZW50SGFuZGxlclByb2NQdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJFdmVudEhhbmRsZXIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJFdmVudEhhbmRsZXJQcm9jUHRyIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJFdmVudEhhbmRsZXIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJBRUV2ZW50SGFuZGxlclVQUCIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkV2ZW50SGFuZGxlciIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIkFFRXZlbnRIYW5kbGVyVVBQIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJFdmVudEhhbmRsZXIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoIlNpemUiLCAiKiIsICJJbk1vZGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJTaXplIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiVmFyVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJBcHBsZUV2ZW50IiwgInRoZUFwcGxlRXZlbnQiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiQXBwbGVFdmVudF9wdHIiLCAiKiIsICJJbk1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIkFFRGVzY0xpc3QiLCAidGhlQUVEZXNjTGlzdCIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJBRURlc2NMaXN0X3B0ciIsICIqIiwgIkluTW9kZSIpXSksCisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9hZS9hZXN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9hZS9hZXN1cHBvcnQucHkKaW5kZXggMTcxODRkYi4uOTFjNWI4MiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYWUvYWVzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2FlL2Flc3VwcG9ydC5weQpAQCAtMzksMjkgKzM5LDI5IEBACiAKIAogY2xhc3MgRUhUeXBlKFR5cGUpOgotCWRlZiBfX2luaXRfXyhzZWxmLCBuYW1lID0gJ0V2ZW50SGFuZGxlcicsIGZvcm1hdCA9ICcnKToKLQkJVHlwZS5fX2luaXRfXyhzZWxmLCBuYW1lLCBmb3JtYXQpCi0JZGVmIGRlY2xhcmUoc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgiQUVFdmVudEhhbmRsZXJVUFAgJXNfX3Byb2NfXyA9IHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyOyIsIG5hbWUpCi0JCU91dHB1dCgiUHlPYmplY3QgKiVzOyIsIG5hbWUpCi0JZGVmIGdldGFyZ3NGb3JtYXQoc2VsZik6Ci0JCXJldHVybiAiTyIKLQlkZWYgZ2V0YXJnc0FyZ3Moc2VsZiwgbmFtZSk6Ci0JCXJldHVybiAiJiVzIiAlIG5hbWUKLQlkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIiVzX19wcm9jX18sIChsb25nKSVzIiAlIChuYW1lLCBuYW1lKQotCWRlZiBwYXNzT3V0cHV0KHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIiYlc19fcHJvY19fLCAobG9uZyAqKSYlcyIgJSAobmFtZSwgbmFtZSkKLQlkZWYgbWt2YWx1ZUZvcm1hdChzZWxmKToKLQkJcmV0dXJuICJPIgotCWRlZiBta3ZhbHVlQXJncyhzZWxmLCBuYW1lKToKLQkJcmV0dXJuIG5hbWUKLQlkZWYgY2xlYW51cChzZWxmLCBuYW1lKToKLQkJT3V0cHV0KCJQeV9JTkNSRUYoJXMpOyAvKiBYWFggbGVhaywgYnV0IG5lZWRlZCAqLyIsIG5hbWUpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgPSAnRXZlbnRIYW5kbGVyJywgZm9ybWF0ID0gJycpOgorICAgICAgICBUeXBlLl9faW5pdF9fKHNlbGYsIG5hbWUsIGZvcm1hdCkKKyAgICBkZWYgZGVjbGFyZShzZWxmLCBuYW1lKToKKyAgICAgICAgT3V0cHV0KCJBRUV2ZW50SGFuZGxlclVQUCAlc19fcHJvY19fID0gdXBwX0dlbmVyaWNFdmVudEhhbmRsZXI7IiwgbmFtZSkKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqJXM7IiwgbmFtZSkKKyAgICBkZWYgZ2V0YXJnc0Zvcm1hdChzZWxmKToKKyAgICAgICAgcmV0dXJuICJPIgorICAgIGRlZiBnZXRhcmdzQXJncyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuICImJXMiICUgbmFtZQorICAgIGRlZiBwYXNzSW5wdXQoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAiJXNfX3Byb2NfXywgKGxvbmcpJXMiICUgKG5hbWUsIG5hbWUpCisgICAgZGVmIHBhc3NPdXRwdXQoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAiJiVzX19wcm9jX18sIChsb25nICopJiVzIiAlIChuYW1lLCBuYW1lKQorICAgIGRlZiBta3ZhbHVlRm9ybWF0KHNlbGYpOgorICAgICAgICByZXR1cm4gIk8iCisgICAgZGVmIG1rdmFsdWVBcmdzKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gbmFtZQorICAgIGRlZiBjbGVhbnVwKHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoIlB5X0lOQ1JFRiglcyk7IC8qIFhYWCBsZWFrLCBidXQgbmVlZGVkICovIiwgbmFtZSkKIAogY2xhc3MgRUhOb1JlZkNvblR5cGUoRUhUeXBlKToKLQlkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gInVwcF9HZW5lcmljRXZlbnRIYW5kbGVyIgorICAgIGRlZiBwYXNzSW5wdXQoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAidXBwX0dlbmVyaWNFdmVudEhhbmRsZXIiCiAKIEV2ZW50SGFuZGxlciA9IEVIVHlwZSgpCiBFdmVudEhhbmRsZXJOb1JlZkNvbiA9IEVITm9SZWZDb25UeXBlKCkKQEAgLTEwMSw5ICsxMDEsOSBAQAogCiBzdGF0aWMgcGFzY2FsIEJvb2xlYW4gQUVJZGxlUHJvYyhFdmVudFJlY29yZCAqdGhlRXZlbnQsIGxvbmcgKnNsZWVwVGltZSwgUmduSGFuZGxlICptb3VzZVJnbikKIHsKLQlpZiAoIFB5T1NfSW50ZXJydXB0T2NjdXJyZWQoKSApCi0JCXJldHVybiAxOwotCXJldHVybiAwOworICAgICAgICBpZiAoIFB5T1NfSW50ZXJydXB0T2NjdXJyZWQoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOwogfQogCiBBRUlkbGVVUFAgdXBwX0FFSWRsZVByb2M7CkBAIC0xMTMsOTkgKzExMyw5OSBAQAogc3RhdGljIHBhc2NhbCBPU0VycgogR2VuZXJpY0V2ZW50SGFuZGxlcihjb25zdCBBcHBsZUV2ZW50ICpyZXF1ZXN0LCBBcHBsZUV2ZW50ICpyZXBseSwgcmVmY29udHlwZSByZWZjb24pCiB7Ci0JUHlPYmplY3QgKmhhbmRsZXIgPSAoUHlPYmplY3QgKilyZWZjb247Ci0JQUVEZXNjT2JqZWN0ICpyZXF1ZXN0T2JqZWN0LCAqcmVwbHlPYmplY3Q7Ci0JUHlPYmplY3QgKmFyZ3MsICpyZXM7Ci0JaWYgKChyZXF1ZXN0T2JqZWN0ID0gKEFFRGVzY09iamVjdCAqKUFFRGVzY19OZXcoKEFwcGxlRXZlbnQgKilyZXF1ZXN0KSkgPT0gTlVMTCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgocmVwbHlPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldyhyZXBseSkpID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlcXVlc3RPYmplY3QpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoYXJncyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgcmVxdWVzdE9iamVjdCwgcmVwbHlPYmplY3QpKSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihyZXF1ZXN0T2JqZWN0KTsKLQkJUHlfREVDUkVGKHJlcGx5T2JqZWN0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChoYW5kbGVyLCBhcmdzKTsKLQlyZXF1ZXN0T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7Ci0JcmVxdWVzdE9iamVjdC0+b2JfaXRzZWxmLmRhdGFIYW5kbGUgPSBOVUxMOwotCXJlcGx5T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7Ci0JcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gQUUgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxcbiIpOwotCQlQeUVycl9QcmludCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBub0VycjsKKyAgICAgICAgUHlPYmplY3QgKmhhbmRsZXIgPSAoUHlPYmplY3QgKilyZWZjb247CisgICAgICAgIEFFRGVzY09iamVjdCAqcmVxdWVzdE9iamVjdCwgKnJlcGx5T2JqZWN0OworICAgICAgICBQeU9iamVjdCAqYXJncywgKnJlczsKKyAgICAgICAgaWYgKChyZXF1ZXN0T2JqZWN0ID0gKEFFRGVzY09iamVjdCAqKUFFRGVzY19OZXcoKEFwcGxlRXZlbnQgKilyZXF1ZXN0KSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJlcGx5T2JqZWN0ID0gKEFFRGVzY09iamVjdCAqKUFFRGVzY19OZXcocmVwbHkpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcXVlc3RPYmplY3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIHJlcXVlc3RPYmplY3QsIHJlcGx5T2JqZWN0KSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXF1ZXN0T2JqZWN0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwbHlPYmplY3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChoYW5kbGVyLCBhcmdzKTsKKyAgICAgICAgcmVxdWVzdE9iamVjdC0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlID0gJ251bGwnOworICAgICAgICByZXF1ZXN0T2JqZWN0LT5vYl9pdHNlbGYuZGF0YUhhbmRsZSA9IE5VTEw7CisgICAgICAgIHJlcGx5T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7CisgICAgICAgIHJlcGx5T2JqZWN0LT5vYl9pdHNlbGYuZGF0YUhhbmRsZSA9IE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBBRSBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXFxuIik7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiBub0VycjsKIH0KIAogUHlPYmplY3QgKkFFRGVzY19OZXdCb3Jyb3dlZChBRURlc2MgKml0c2VsZikKIHsKLQlQeU9iamVjdCAqaXQ7Ci0JCi0JaXQgPSBBRURlc2NfTmV3KGl0c2VsZik7Ci0JaWYgKGl0KQotCQkoKEFFRGVzY09iamVjdCAqKWl0KS0+b2Jfb3duZWQgPSAwOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICAgICAgUHlPYmplY3QgKml0OworCisgICAgICAgIGl0ID0gQUVEZXNjX05ldyhpdHNlbGYpOworICAgICAgICBpZiAoaXQpCisgICAgICAgICAgICAgICAgKChBRURlc2NPYmplY3QgKilpdCktPm9iX293bmVkID0gMDsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiAiIiIKIAogaW5pdHN0dWZmID0gaW5pdHN0dWZmICsgIiIiCi0JdXBwX0FFSWRsZVByb2MgPSBOZXdBRUlkbGVVUFAoQUVJZGxlUHJvYyk7Ci0JdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIgPSBOZXdBRUV2ZW50SGFuZGxlclVQUChHZW5lcmljRXZlbnRIYW5kbGVyKTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhBRURlc2MgKiwgQUVEZXNjX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXdCb3Jyb3dlZCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEFFRGVzYywgQUVEZXNjX0NvbnZlcnQpOworICAgICAgICB1cHBfQUVJZGxlUHJvYyA9IE5ld0FFSWRsZVVQUChBRUlkbGVQcm9jKTsKKyAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIgPSBOZXdBRUV2ZW50SGFuZGxlclVQUChHZW5lcmljRXZlbnRIYW5kbGVyKTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhBRURlc2MgKiwgQUVEZXNjX05ld0JvcnJvd2VkKTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEFFRGVzYywgQUVEZXNjX0NvbnZlcnQpOwogIiIiCiAKIG1vZHVsZSA9IE1hY01vZHVsZSgnX0FFJywgJ0FFJywgaW5jbHVkZXN0dWZmLCBmaW5hbHN0dWZmLCBpbml0c3R1ZmYpCiAKIGNsYXNzIEFFRGVzY0RlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWdldHNldGxpc3QgPSBbKAotCQkndHlwZScsCi0JCSdyZXR1cm4gUHlNYWNfQnVpbGRPU1R5cGUoc2VsZi0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlKTsnLAotCQlOb25lLAotCQknVHlwZSBvZiB0aGlzIEFFRGVzYycKLQkJKSwgKAotCQknZGF0YScsCi0JCSIiIgotCQlQeU9iamVjdCAqcmVzOwotCQlTaXplIHNpemU7Ci0JCWNoYXIgKnB0cjsKLQkJT1NFcnIgZXJyOwotCQkKLQkJc2l6ZSA9IEFFR2V0RGVzY0RhdGFTaXplKCZzZWxmLT5vYl9pdHNlbGYpOwotCQlpZiAoIChyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKSkgPT0gTlVMTCApCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCAocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSkgPT0gTlVMTCApCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCAoZXJyPUFFR2V0RGVzY0RhdGEoJnNlbGYtPm9iX2l0c2VsZiwgcHRyLCBzaXplKSkgPCAwICkKLQkJCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwkKLQkJcmV0dXJuIHJlczsKLQkJIiIiLAotCQlOb25lLAotCQknVGhlIHJhdyBkYXRhIGluIHRoaXMgQUVEZXNjJwotCQkpXQorICAgIGdldHNldGxpc3QgPSBbKAorICAgICAgICAgICAgJ3R5cGUnLAorICAgICAgICAgICAgJ3JldHVybiBQeU1hY19CdWlsZE9TVHlwZShzZWxmLT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ1R5cGUgb2YgdGhpcyBBRURlc2MnCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnZGF0YScsCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgICAgICBTaXplIHNpemU7CisgICAgICAgICAgICBjaGFyICpwdHI7CisgICAgICAgICAgICBPU0VyciBlcnI7CiAKLQlkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4ID0gTm9uZSwgaXRzZWxmdHlwZSA9IE5vbmUpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLl9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCBvciBuYW1lLCBpdHNlbGZ0eXBlIG9yIG5hbWUpCi0JCXNlbGYuYXJncmVmID0gIioiCisgICAgICAgICAgICBzaXplID0gQUVHZXREZXNjRGF0YVNpemUoJnNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICBpZiAoIChyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKSkgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKCAocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSkgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKCAoZXJyPUFFR2V0RGVzY0RhdGEoJnNlbGYtPm9iX2l0c2VsZiwgcHRyLCBzaXplKSkgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdUaGUgcmF3IGRhdGEgaW4gdGhpcyBBRURlc2MnCisgICAgICAgICAgICApXQogCi0JZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCUdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoImludCBvYl9vd25lZDsiKQotCQkKLQlkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCUdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJpdC0+b2Jfb3duZWQgPSAxOyIpCi0JCQotCWRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoc2VsZi0+b2Jfb3duZWQpIEFFRGlzcG9zZURlc2MoJnNlbGYtPm9iX2l0c2VsZik7IikKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4ID0gTm9uZSwgaXRzZWxmdHlwZSA9IE5vbmUpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLl9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCBvciBuYW1lLCBpdHNlbGZ0eXBlIG9yIG5hbWUpCisgICAgICAgIHNlbGYuYXJncmVmID0gIioiCisKKyAgICBkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiaW50IG9iX293bmVkOyIpCisKKyAgICBkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICAgICAgT3V0cHV0KCJpdC0+b2Jfb3duZWQgPSAxOyIpCisKKyAgICBkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKHNlbGYtPm9iX293bmVkKSBBRURpc3Bvc2VEZXNjKCZzZWxmLT5vYl9pdHNlbGYpOyIpCiAKIGFlZGVzY29iamVjdCA9IEFFRGVzY0RlZmluaXRpb24oJ0FFRGVzYycpCiBtb2R1bGUuYWRkb2JqZWN0KGFlZGVzY29iamVjdCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2FoL2Foc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2FoL2Foc2Nhbi5weQppbmRleCBjY2VkMTlmLi4wYjdmZTA4IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9haC9haHNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvYWgvYWhzY2FuLnB5CkBAIC0xMSw0MiArMTEsNDIgQEAKIE9CSkVDVCA9ICJOT1RVU0VEIgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gTE9ORyArICIuaCIKLQlvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9IExPTkcgKyAiLmgiCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyX09TWCk6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCSMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQotCQkJaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgIyBUaGlzIGlzIG5vbi1mdW5jdGlvbmFsIHRvZGF5CisgICAgICAgICAgICBpZiB0ID09IE9CSkVDVCBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJXQotCQkJCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYWgvYWhzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvYWgvYWhzdXBwb3J0LnB5CmluZGV4IGM5MWMyOTguLmM1ZjI0YmUgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2FoL2Foc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9haC9haHN1cHBvcnQucHkKQEAgLTYsMTMgKzYsMTMgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdBcHBsZUhlbHAuaCcJCSMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCi1NT0ROQU1FID0gJ19BSCcJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitNQUNIRUFERVJGSUxFID0gJ0FwcGxlSGVscC5oJyAgICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnX0FIJyAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0FoJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK01PRFBSRUZJWCA9ICdBaCcgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC00Myw0ICs0MywzIEBACiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9hcHAvYXBwc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2FwcC9hcHBzY2FuLnB5CmluZGV4IDgyMjY1MWQuLjFiMDQ4NTkgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2FwcC9hcHBzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2FwcC9hcHBzY2FuLnB5CkBAIC0xMSw3MSArMTEsNzEgQEAKIE9CSkVDVCA9ICJUaGVtZURyYXdpbmdTdGF0ZSIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IExPTkcgKyAiLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBMT05HICsgIi5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCSMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQotCQkJaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgIyBUaGlzIGlzIG5vbi1mdW5jdGlvbmFsIHRvZGF5CisgICAgICAgICAgICBpZiB0ID09IE9CSkVDVCBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiR2V0VGhlbWVGb250IiwJCSMgRnVubnkgc3RyaW5nYnVmZmVyIGluL291dCBwYXJhbWV0ZXIsIEkgdGhpbmsuLi4KLQkJCSMgQ29uc3RhbnRzIHdpdGggZnVubnkgZGVmaW5pdGlvbnMKLQkJCSJhcHBlYXJhbmNlQmFkQnJ1c2hJbmRleEVyciIsCi0JCQkiYXBwZWFyYW5jZVByb2Nlc3NSZWdpc3RlcmVkRXJyIiwKLQkJCSJhcHBlYXJhbmNlUHJvY2Vzc05vdFJlZ2lzdGVyZWRFcnIiLAotCQkJImFwcGVhcmFuY2VCYWRUZXh0Q29sb3JJbmRleEVyciIsCi0JCQkiYXBwZWFyYW5jZVRoZW1lSGFzTm9BY2NlbnRzIiwKLQkJCSJhcHBlYXJhbmNlQmFkQ3Vyc29ySW5kZXhFcnIiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkdldFRoZW1lRm9udCIsICAgICAgICAgIyBGdW5ueSBzdHJpbmdidWZmZXIgaW4vb3V0IHBhcmFtZXRlciwgSSB0aGluay4uLgorICAgICAgICAgICAgICAgICMgQ29uc3RhbnRzIHdpdGggZnVubnkgZGVmaW5pdGlvbnMKKyAgICAgICAgICAgICAgICAiYXBwZWFyYW5jZUJhZEJydXNoSW5kZXhFcnIiLAorICAgICAgICAgICAgICAgICJhcHBlYXJhbmNlUHJvY2Vzc1JlZ2lzdGVyZWRFcnIiLAorICAgICAgICAgICAgICAgICJhcHBlYXJhbmNlUHJvY2Vzc05vdFJlZ2lzdGVyZWRFcnIiLAorICAgICAgICAgICAgICAgICJhcHBlYXJhbmNlQmFkVGV4dENvbG9ySW5kZXhFcnIiLAorICAgICAgICAgICAgICAgICJhcHBlYXJhbmNlVGhlbWVIYXNOb0FjY2VudHMiLAorICAgICAgICAgICAgICAgICJhcHBlYXJhbmNlQmFkQ3Vyc29ySW5kZXhFcnIiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiTWVudVRpdGxlRHJhd2luZ1VQUCIsCi0JCQkiTWVudUl0ZW1EcmF3aW5nVVBQIiwKLQkJCSJUaGVtZUl0ZXJhdG9yVVBQIiwKLQkJCSJUaGVtZVRhYlRpdGxlRHJhd1VQUCIsCi0jCQkJIlRoZW1lRXJhc2VVUFAiLAotIwkJCSJUaGVtZUJ1dHRvbkRyYXdVUFAiLAotCQkJIldpbmRvd1RpdGxlRHJhd2luZ1VQUCIsCi0JCQkiUHJvY2Vzc1NlcmlhbE51bWJlcl9wdHIiLAkJIyBUb28gbXVjaCB3b3JrIGZvciBub3cuCi0JCQkiVGhlbWVUcmFja0RyYXdJbmZvX3B0ciIsIAkjIFRvbyBtdWNoIHdvcmsKLSMJCQkiVGhlbWVCdXR0b25EcmF3SW5mb19wdHIiLAkjIGRpdHRvCi0JCQkiVGhlbWVXaW5kb3dNZXRyaWNzX3B0ciIsCSMgZGl0dG8KLSMJCQkiVGhlbWVEcmF3aW5nU3RhdGUiLAkjIFRoaXMgaXMgYW4gb3BhcXVlIHBvaW50ZXIsIHNvIGl0IHNob3VsZCBiZSBzaW1wbGUuIExhdGVyLgotCQkJIkNvbGxlY3Rpb24iLAkJIyBObyBpbnRlcmZhY2UgdG8gY29sbGVjdGlvbiBtZ3IgeWV0LgotCQkJIkJ5dGVQdHIiLAkJIyBOb3QgeWV0LgotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIk1lbnVUaXRsZURyYXdpbmdVUFAiLAorICAgICAgICAgICAgICAgICJNZW51SXRlbURyYXdpbmdVUFAiLAorICAgICAgICAgICAgICAgICJUaGVtZUl0ZXJhdG9yVVBQIiwKKyAgICAgICAgICAgICAgICAiVGhlbWVUYWJUaXRsZURyYXdVUFAiLAorIyAgICAgICAgICAgICAgICAgICAgICAgIlRoZW1lRXJhc2VVUFAiLAorIyAgICAgICAgICAgICAgICAgICAgICAgIlRoZW1lQnV0dG9uRHJhd1VQUCIsCisgICAgICAgICAgICAgICAgIldpbmRvd1RpdGxlRHJhd2luZ1VQUCIsCisgICAgICAgICAgICAgICAgIlByb2Nlc3NTZXJpYWxOdW1iZXJfcHRyIiwgICAgICAgICAgICAgICMgVG9vIG11Y2ggd29yayBmb3Igbm93LgorICAgICAgICAgICAgICAgICJUaGVtZVRyYWNrRHJhd0luZm9fcHRyIiwgICAgICAgIyBUb28gbXVjaCB3b3JrCisjICAgICAgICAgICAgICAgICAgICAgICAiVGhlbWVCdXR0b25EcmF3SW5mb19wdHIiLCAgICAgICMgZGl0dG8KKyAgICAgICAgICAgICAgICAiVGhlbWVXaW5kb3dNZXRyaWNzX3B0ciIsICAgICAgICMgZGl0dG8KKyMgICAgICAgICAgICAgICAgICAgICAgICJUaGVtZURyYXdpbmdTdGF0ZSIsICAgICMgVGhpcyBpcyBhbiBvcGFxdWUgcG9pbnRlciwgc28gaXQgc2hvdWxkIGJlIHNpbXBsZS4gTGF0ZXIuCisgICAgICAgICAgICAgICAgIkNvbGxlY3Rpb24iLCAgICAgICAgICAgIyBObyBpbnRlcmZhY2UgdG8gY29sbGVjdGlvbiBtZ3IgeWV0LgorICAgICAgICAgICAgICAgICJCeXRlUHRyIiwgICAgICAgICAgICAgICMgTm90IHlldC4KKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCJ2b2lkIiwgJ2luQ29udGV4dCcsICJPdXRNb2RlIildLAotCQkJIFsoIk5VTEwiLCAnaW5Db250ZXh0JywgIkluTW9kZSIpXSksCi0JCQkoWygiUG9pbnQiLCAnaW9Cb3VuZHMnLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJQb2ludCIsICdpb0JvdW5kcycsICJJbk91dE1vZGUiKV0pLAotCQkJXQotCQkJCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAnaW5Db250ZXh0JywgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIk5VTEwiLCAnaW5Db250ZXh0JywgIkluTW9kZSIpXSksCisgICAgICAgICAgICAgICAgKFsoIlBvaW50IiwgJ2lvQm91bmRzJywgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlBvaW50IiwgJ2lvQm91bmRzJywgIkluT3V0TW9kZSIpXSksCisgICAgICAgICAgICAgICAgXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYXBwL2FwcHN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9hcHAvYXBwc3VwcG9ydC5weQppbmRleCBhOWQ4NzY4Li4xNzdkZmQ1IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9hcHAvYXBwc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9hcHAvYXBwc3VwcG9ydC5weQpAQCAtNiwxNyArNiwxNyBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ0FwcGVhcmFuY2UuaCcJCSMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCi1NT0ROQU1FID0gJ19BcHAnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICdUaGVtZURyYXdpbmdTdGF0ZScJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQotS0lORCA9ICcnCQkJCSMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJworTUFDSEVBREVSRklMRSA9ICdBcHBlYXJhbmNlLmgnICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19BcHAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK09CSkVDVE5BTUUgPSAnVGhlbWVEcmF3aW5nU3RhdGUnICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK0tJTkQgPSAnJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0FwcCcJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArIEtJTkQJCSMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCi1PQkpFQ1RQUkVGSVggPSBPQkpFQ1ROQU1FICsgJ09iaicJIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcworTU9EUFJFRklYID0gJ0FwcCcgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK09CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgS0lORCAgICAgICAgICAjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQorT0JKRUNUUFJFRklYID0gT0JKRUNUTkFNRSArICdPYmonICAgICAgICMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTg0LDI0ICs4NCwyNCBAQAogCiBpbnQgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0KFB5T2JqZWN0ICp2LCBUaGVtZUJ1dHRvbkRyYXdJbmZvICpwX2l0c2VsZikKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihpSEgpIiwgJnBfaXRzZWxmLT5zdGF0ZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5hZG9ybm1lbnQpOworICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihpSEgpIiwgJnBfaXRzZWxmLT5zdGF0ZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5hZG9ybm1lbnQpOwogfQogCiAiIiIKIAogY2xhc3MgTXlPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlwYXNzCi0jIyAJZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotIyMgCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQotIyMgCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0jIyAJCU91dExicmFjZSgiaWYgKERsZ09ial9DaGVjayh2KSkiKQotIyMgCQlPdXRwdXQoIipwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsiKQotIyMgCQlPdXRwdXQoInJldHVybiAxOyIpCi0jIyAJCU91dFJicmFjZSgpCi0jIyAJCU91dCgiIiIKLSMjIAkJaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotIyMgCQlpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKFdpbmRvd1B0cilQeUludF9Bc0xvbmcodik7IHJldHVybiAxOyB9Ci0jIyAJCSIiIikKKyAgICBwYXNzCisjIyAgICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyMjICAgICAgICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorIyMgICAgICBkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgorIyMgICAgICAgICAgICAgIE91dExicmFjZSgiaWYgKERsZ09ial9DaGVjayh2KSkiKQorIyMgICAgICAgICAgICAgIE91dHB1dCgiKnBfaXRzZWxmID0gKChXaW5kb3dPYmplY3QgKil2KS0+b2JfaXRzZWxmOyIpCisjIyAgICAgICAgICAgICAgT3V0cHV0KCJyZXR1cm4gMTsiKQorIyMgICAgICAgICAgICAgIE91dFJicmFjZSgpCisjIyAgICAgICAgICAgICAgT3V0KCIiIgorIyMgICAgICAgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyMjICAgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKFdpbmRvd1B0cilQeUludF9Bc0xvbmcodik7IHJldHVybiAxOyB9CisjIyAgICAgICAgICAgICAgIiIiKQogCiAjIEZyb20gaGVyZSBvbiBpdCdzIGJhc2ljYWxseSBhbGwgYm9pbGVyIHBsYXRlLi4uCiAKQEAgLTEzMSw0ICsxMzEsMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L0NhcmJvbkV2dHNjYW4ucHkgYi9NYWMvTW9kdWxlcy9jYXJib25ldnQvQ2FyYm9uRXZ0c2Nhbi5weQppbmRleCBjNmJmOTNmLi5lM2M3MmFlIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jYXJib25ldnQvQ2FyYm9uRXZ0c2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9jYXJib25ldnQvQ2FyYm9uRXZ0c2Nhbi5weQpAQCAtMTIsMTA2ICsxMiwxMDYgQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyLCBTY2FubmVyX09TWAogCiBkZWYgbWFpbigpOgotCXByaW50ICItLS1TY2FubmluZyBDYXJib25FdmVudHMuaC0tLSIKLQlpbnB1dCA9IFsiQ2FyYm9uRXZlbnRzLmgiXQotCW91dHB1dCA9ICJDYXJib25FdmVudHNnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiQ2FyYm9uRXZlbnRzLnB5IgotCXNjYW5uZXIgPSBDYXJib25FdmVudHNfU2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIi0tZG9uZSBzY2FubmluZywgaW1wb3J0aW5nLS0iCi0JaW1wb3J0IENhcmJvbkV2dHN1cHBvcnQKLQlwcmludCAiZG9uZSIKKyAgICBwcmludCAiLS0tU2Nhbm5pbmcgQ2FyYm9uRXZlbnRzLmgtLS0iCisgICAgaW5wdXQgPSBbIkNhcmJvbkV2ZW50cy5oIl0KKyAgICBvdXRwdXQgPSAiQ2FyYm9uRXZlbnRzZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIkNhcmJvbkV2ZW50cy5weSIKKyAgICBzY2FubmVyID0gQ2FyYm9uRXZlbnRzX1NjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICItLWRvbmUgc2Nhbm5pbmcsIGltcG9ydGluZy0tIgorICAgIGltcG9ydCBDYXJib25FdnRzdXBwb3J0CisgICAgcHJpbnQgImRvbmUiCiAKLVJlZk9iamVjdFR5cGVzID0gWyJFdmVudFJlZiIsIAotCQkJCSJFdmVudFF1ZXVlUmVmIiwgCi0JCQkJIkV2ZW50TG9vcFJlZiIsCi0JCQkJIkV2ZW50TG9vcFRpbWVyUmVmIiwKLQkJCQkiRXZlbnRIYW5kbGVyUmVmIiwKLQkJCQkiRXZlbnRIYW5kbGVyQ2FsbFJlZiIsCi0JCQkJIkV2ZW50VGFyZ2V0UmVmIiwKLQkJCQkiRXZlbnRIb3RLZXlSZWYiLAotCQkJCV0KK1JlZk9iamVjdFR5cGVzID0gWyJFdmVudFJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdmVudFF1ZXVlUmVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV2ZW50TG9vcFJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdmVudExvb3BUaW1lclJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdmVudEhhbmRsZXJSZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXZlbnRIYW5kbGVyQ2FsbFJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdmVudFRhcmdldFJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdmVudEhvdEtleVJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KIAogY2xhc3MgQ2FyYm9uRXZlbnRzX1NjYW5uZXIoU2Nhbm5lcl9PU1gpOgotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkNhcmJvbkV2ZW50c0Z1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCBpbiBSZWZPYmplY3RUeXBlcyBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQlpZiB0ID09ICJFdmVudEhhbmRsZXJSZWYiOgotCQkJCQljbGFzc25hbWUgPSAiRXZlbnRIYW5kbGVyUmVmTWV0aG9kIgotCQkJCWVsc2U6Ci0JCQkJCWNsYXNzbmFtZSA9ICJDYXJib25FdmVudHNNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSB0ICsgIm1ldGhvZHMiCi0JCQkjZWxzZToKLQkJCSMJcHJpbnQgIm5vdCBtZXRob2QiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiQ2FyYm9uRXZlbnRzRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0IGluIFJlZk9iamVjdFR5cGVzIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGlmIHQgPT0gIkV2ZW50SGFuZGxlclJlZiI6CisgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJFdmVudEhhbmRsZXJSZWZNZXRob2QiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIkNhcmJvbkV2ZW50c01ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9IHQgKyAibWV0aG9kcyIKKyAgICAgICAgICAgICNlbHNlOgorICAgICAgICAgICAgIyAgICAgICBwcmludCAibm90IG1ldGhvZCIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJmYWxzZSA9IDBcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoInRydWUgPSAxXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrZXlBRUV2ZW50Q2xhc3MgPSBGT1VSX0NIQVJfQ09ERSgnZXZjbCcpXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrZXlBRUV2ZW50SUQgPSBGT1VSX0NIQVJfQ09ERSgnZXZ0aScpXG4iKQotCQotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkic0hhbmRsZXIiLAotCQkJIk1hY0NyZWF0ZUV2ZW50IiwKLSMJCQkiVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMiLAotIwkJCSJUcmFja01vdXNlTG9jYXRpb24iLAotIwkJCSJUcmFja01vdXNlUmVnaW9uIiwKLQkJCSJSZWdpc3RlclRvb2xib3hPYmplY3RDbGFzcyIsCi0JCQkiVW5yZWdpc3RlclRvb2xib3hPYmplY3RDbGFzcyIsCi0JCQkiUHJvY2Vzc0hJQ29tbWFuZCIsCi0JCQkiR2V0Q0ZSdW5Mb29wRnJvbUV2ZW50TG9vcCIsCi0JCQkKLQkJCSJJbnZva2VFdmVudEhhbmRsZXJVUFAiLAotCQkJIkludm9rZUV2ZW50Q29tcGFyYXRvclVQUCIsCi0JCQkiSW52b2tlRXZlbnRMb29wVGltZXJVUFAiLAotCQkJIk5ld0V2ZW50Q29tcGFyYXRvclVQUCIsCi0JCQkiTmV3RXZlbnRMb29wVGltZXJVUFAiLAotCQkJIk5ld0V2ZW50SGFuZGxlclVQUCIsCi0JCQkiRGlzcG9zZUV2ZW50Q29tcGFyYXRvclVQUCIsCi0JCQkiRGlzcG9zZUV2ZW50TG9vcFRpbWVyVVBQIiwKLQkJCSJEaXNwb3NlRXZlbnRIYW5kbGVyVVBQIiwKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZmFsc2UgPSAwXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJ0cnVlID0gMVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgia2V5QUVFdmVudENsYXNzID0gRk9VUl9DSEFSX0NPREUoJ2V2Y2wnKVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgia2V5QUVFdmVudElEID0gRk9VUl9DSEFSX0NPREUoJ2V2dGknKVxuIikKIAotCQkJIyBXcm90ZSBieSBoYW5kCi0JCQkiSW5zdGFsbEV2ZW50SGFuZGxlciIsCi0JCQkiUmVtb3ZlRXZlbnRIYW5kbGVyIiwKLQkJCQkJCQotCQkJIyBXcml0ZSBieSBoYW5kPwotCQkJIkdldEV2ZW50UGFyYW1ldGVyIiwKLQkJCSJGbHVzaFNwZWNpZmljRXZlbnRzRnJvbVF1ZXVlIiwKLQkJCSJGaW5kU3BlY2lmaWNFdmVudEluUXVldWUiLAotCQkJIkluc3RhbGxFdmVudExvb3BUaW1lciIsCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAic0hhbmRsZXIiLAorICAgICAgICAgICAgICAgICJNYWNDcmVhdGVFdmVudCIsCisjICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMiLAorIyAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrTW91c2VMb2NhdGlvbiIsCisjICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2tNb3VzZVJlZ2lvbiIsCisgICAgICAgICAgICAgICAgIlJlZ2lzdGVyVG9vbGJveE9iamVjdENsYXNzIiwKKyAgICAgICAgICAgICAgICAiVW5yZWdpc3RlclRvb2xib3hPYmplY3RDbGFzcyIsCisgICAgICAgICAgICAgICAgIlByb2Nlc3NISUNvbW1hbmQiLAorICAgICAgICAgICAgICAgICJHZXRDRlJ1bkxvb3BGcm9tRXZlbnRMb29wIiwKIAotCQkJIyBEb24ndCBkbyB0aGVzZSBiZWNhdXNlIHRoZXkgcmVxdWlyZSBhIENGUmVsZWFzZQotCQkJIkNyZWF0ZVR5cGVTdHJpbmdXaXRoT1NUeXBlIiwKLQkJCSJDb3B5RXZlbnQiLAotCQkJXQorICAgICAgICAgICAgICAgICJJbnZva2VFdmVudEhhbmRsZXJVUFAiLAorICAgICAgICAgICAgICAgICJJbnZva2VFdmVudENvbXBhcmF0b3JVUFAiLAorICAgICAgICAgICAgICAgICJJbnZva2VFdmVudExvb3BUaW1lclVQUCIsCisgICAgICAgICAgICAgICAgIk5ld0V2ZW50Q29tcGFyYXRvclVQUCIsCisgICAgICAgICAgICAgICAgIk5ld0V2ZW50TG9vcFRpbWVyVVBQIiwKKyAgICAgICAgICAgICAgICAiTmV3RXZlbnRIYW5kbGVyVVBQIiwKKyAgICAgICAgICAgICAgICAiRGlzcG9zZUV2ZW50Q29tcGFyYXRvclVQUCIsCisgICAgICAgICAgICAgICAgIkRpc3Bvc2VFdmVudExvb3BUaW1lclVQUCIsCisgICAgICAgICAgICAgICAgIkRpc3Bvc2VFdmVudEhhbmRsZXJVUFAiLAogCi0jCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0jCQlyZXR1cm4gWyJFdmVudENvbXBhcmF0b3JVUFAiLAotIwkJCQkiRXZlbnRMb29wVGltZXJVUFAiLAotIwkJCQkjIkV2ZW50SGFuZGxlclVQUCIsCi0jCQkJCSJFdmVudENvbXBhcmF0b3JQcm9jUHRyIiwKLSMJCQkJIkV2ZW50TG9vcFRpbWVyUHJvY1B0ciIsCi0jCQkJCSJFdmVudEhhbmRsZXJQcm9jUHRyIiwKLSMJCQkJXQorICAgICAgICAgICAgICAgICMgV3JvdGUgYnkgaGFuZAorICAgICAgICAgICAgICAgICJJbnN0YWxsRXZlbnRIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAiUmVtb3ZlRXZlbnRIYW5kbGVyIiwKIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoIlVJbnQzMiIsICdpblNpemUnLCAiSW5Nb2RlIiksICgidm9pZF9wdHIiLCAnaW5EYXRhUHRyJywgIkluTW9kZSIpXSwKLQkJCSBbKCJNeUluQnVmZmVyIiwgJ2luRGF0YVB0cicsICJJbk1vZGUiKV0pLAotCQkJKFsoIkJvb2xlYW4iLCAnaW9XYXNJblJnbicsICJPdXRNb2RlIildLAotCQkJIFsoIkJvb2xlYW4iLCAnaW9XYXNJblJnbicsICJJbk91dE1vZGUiKV0pLAotCQldCisgICAgICAgICAgICAgICAgIyBXcml0ZSBieSBoYW5kPworICAgICAgICAgICAgICAgICJHZXRFdmVudFBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgIkZsdXNoU3BlY2lmaWNFdmVudHNGcm9tUXVldWUiLAorICAgICAgICAgICAgICAgICJGaW5kU3BlY2lmaWNFdmVudEluUXVldWUiLAorICAgICAgICAgICAgICAgICJJbnN0YWxsRXZlbnRMb29wVGltZXIiLAorCisgICAgICAgICAgICAgICAgIyBEb24ndCBkbyB0aGVzZSBiZWNhdXNlIHRoZXkgcmVxdWlyZSBhIENGUmVsZWFzZQorICAgICAgICAgICAgICAgICJDcmVhdGVUeXBlU3RyaW5nV2l0aE9TVHlwZSIsCisgICAgICAgICAgICAgICAgIkNvcHlFdmVudCIsCisgICAgICAgICAgICAgICAgXQorCisjICAgICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisjICAgICAgICAgICAgICAgcmV0dXJuIFsiRXZlbnRDb21wYXJhdG9yVVBQIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV2ZW50TG9vcFRpbWVyVVBQIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyJFdmVudEhhbmRsZXJVUFAiLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXZlbnRDb21wYXJhdG9yUHJvY1B0ciIsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdmVudExvb3BUaW1lclByb2NQdHIiLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXZlbnRIYW5kbGVyUHJvY1B0ciIsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCJVSW50MzIiLCAnaW5TaXplJywgIkluTW9kZSIpLCAoInZvaWRfcHRyIiwgJ2luRGF0YVB0cicsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIk15SW5CdWZmZXIiLCAnaW5EYXRhUHRyJywgIkluTW9kZSIpXSksCisgICAgICAgICAgICAgICAgKFsoIkJvb2xlYW4iLCAnaW9XYXNJblJnbicsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJCb29sZWFuIiwgJ2lvV2FzSW5SZ24nLCAiSW5PdXRNb2RlIildKSwKKyAgICAgICAgXQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L0NhcmJvbkV2dHN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9jYXJib25ldnQvQ2FyYm9uRXZ0c3VwcG9ydC5weQppbmRleCAzY2MxNjcyLi43N2QxMmI2IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jYXJib25ldnQvQ2FyYm9uRXZ0c3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9jYXJib25ldnQvQ2FyYm9uRXZ0c3VwcG9ydC5weQpAQCAtOCwyMyArOCwyMyBAQAogQ0ZTdHJpbmdSZWYgPSBPcGFxdWVCeVZhbHVlVHlwZSgnQ0ZTdHJpbmdSZWYnKQogCiBmb3IgdHlwIGluIFJlZk9iamVjdFR5cGVzOgotCWV4ZWNzdHIgPSAiJShuYW1lKXMgPSBPcGFxdWVCeVZhbHVlVHlwZSgnJShuYW1lKXMnKSIgJSB7Im5hbWUiOiB0eXB9Ci0JZXhlYyBleGVjc3RyCisgICAgZXhlY3N0ciA9ICIlKG5hbWUpcyA9IE9wYXF1ZUJ5VmFsdWVUeXBlKCclKG5hbWUpcycpIiAlIHsibmFtZSI6IHR5cH0KKyAgICBleGVjIGV4ZWNzdHIKIAogCiBpZiAwOgotCSMgdGhlc2UgdHlwZXMgd2lsbCBoYXZlIG5vIG1ldGhvZHMgYW5kIHdpbGwgbWVyZWx5IGJlIG9wYXF1ZSBibG9icwotCSMgc2hvdWxkIHdyaXRlIGdldGF0dHIgYW5kIHNldGF0dHIgZm9yIHRoZW0/CisgICAgIyB0aGVzZSB0eXBlcyB3aWxsIGhhdmUgbm8gbWV0aG9kcyBhbmQgd2lsbCBtZXJlbHkgYmUgb3BhcXVlIGJsb2JzCisgICAgIyBzaG91bGQgd3JpdGUgZ2V0YXR0ciBhbmQgc2V0YXR0ciBmb3IgdGhlbT8KIAotCVN0cnVjdE9iamVjdFR5cGVzID0gWyJFdmVudFR5cGVTcGVjIiwKLQkJCQkJCSJISVBvaW50IiwKLQkJCQkJCSJISUNvbW1hbmQiLAotCQkJCQkJIkV2ZW50SG90S2V5SUQiLAotCQkJCQkJXQorICAgIFN0cnVjdE9iamVjdFR5cGVzID0gWyJFdmVudFR5cGVTcGVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhJUG9pbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSElDb21tYW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV2ZW50SG90S2V5SUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAKLQlmb3IgdHlwIGluIFN0cnVjdE9iamVjdFR5cGVzOgotCQlleGVjc3RyID0gIiUobmFtZSlzID0gT3BhcXVlVHlwZSgnJShuYW1lKXMnKSIgJSB7Im5hbWUiOiB0eXB9Ci0JCWV4ZWMgZXhlY3N0cgorICAgIGZvciB0eXAgaW4gU3RydWN0T2JqZWN0VHlwZXM6CisgICAgICAgIGV4ZWNzdHIgPSAiJShuYW1lKXMgPSBPcGFxdWVUeXBlKCclKG5hbWUpcycpIiAlIHsibmFtZSI6IHR5cH0KKyAgICAgICAgZXhlYyBleGVjc3RyCiAKIEV2ZW50SG90S2V5SUQgPSBPcGFxdWVCeVZhbHVlVHlwZSgiRXZlbnRIb3RLZXlJRCIsICJFdmVudEhvdEtleUlEIikKIEV2ZW50VHlwZVNwZWNfcHRyID0gT3BhcXVlVHlwZSgiRXZlbnRUeXBlU3BlYyIsICJFdmVudFR5cGVTcGVjIikKQEAgLTM1LDEwICszNSwxMCBAQAogIyBoZXJlIGFyZSBzb21lIHR5cGVzIHRoYXQgYXJlIHJlYWxseSBvdGhlciB0eXBlcwogCiBjbGFzcyBNeVZhcklucHV0QnVmZmVyVHlwZShWYXJJbnB1dEJ1ZmZlclR5cGUpOgotCWRlZiBwYXNzSW5wdXQoc2VsZiwgbmFtZSk6Ci0JCXJldHVybiAiJXNfX2xlbl9fLCAlc19faW5fXyIgJSAobmFtZSwgbmFtZSkKKyAgICBkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gIiVzX19sZW5fXywgJXNfX2luX18iICUgKG5hbWUsIG5hbWUpCiAKLU15SW5CdWZmZXIgPSBNeVZhcklucHV0QnVmZmVyVHlwZSgnY2hhcicsICdsb25nJywgJ2wnKQkJIyAoYnVmLCBsZW4pCitNeUluQnVmZmVyID0gTXlWYXJJbnB1dEJ1ZmZlclR5cGUoJ2NoYXInLCAnbG9uZycsICdsJykgICAgICAgICAgIyAoYnVmLCBsZW4pCiAKIEV2ZW50VGltZSA9IGRvdWJsZQogRXZlbnRUaW1lb3V0ID0gRXZlbnRUaW1lCkBAIC02MSwxMSArNjEsMTEgQEAKIENhcmJvbkV2ZW50c01ldGhvZCA9IE9TRXJyTWV0aG9kR2VuZXJhdG9yCiAKIGNsYXNzIEV2ZW50SGFuZGxlclJlZk1ldGhvZChPU0Vyck1ldGhvZEdlbmVyYXRvcik6Ci0JZGVmIHByZWNoZWNrKHNlbGYpOgotCQlPdXRMYnJhY2UoJ2lmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpJykKLQkJT3V0cHV0KCdQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7JykKLQkJT3V0cHV0KCdyZXR1cm4gTlVMTDsnKQotCQlPdXRSYnJhY2UoKQorICAgIGRlZiBwcmVjaGVjayhzZWxmKToKKyAgICAgICAgT3V0TGJyYWNlKCdpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKScpCisgICAgICAgIE91dHB1dCgnUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOycpCisgICAgICAgIE91dHB1dCgncmV0dXJuIE5VTEw7JykKKyAgICAgICAgT3V0UmJyYWNlKCkKIAogCiBSZ25IYW5kbGUgPSBPcGFxdWVCeVZhbHVlVHlwZSgiUmduSGFuZGxlIiwgIlJlc09iaiIpCkBAIC04OSwxNyArODksMTcgQEAKIHN0YXRpYyBQeU9iamVjdCoKIEV2ZW50VHlwZVNwZWNfTmV3KEV2ZW50VHlwZVNwZWMgKmluKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIGluLT5ldmVudENsYXNzLCBpbi0+ZXZlbnRLaW5kKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgaW4tPmV2ZW50Q2xhc3MsIGluLT5ldmVudEtpbmQpOwogfQogCiBzdGF0aWMgaW50CiBFdmVudFR5cGVTcGVjX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50VHlwZVNwZWMgKm91dCkKIHsKLQlpZiAoUHlBcmdfUGFyc2UodiwgIihPJmwpIiwKLQkgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmKG91dC0+ZXZlbnRDbGFzcyksCi0JICAgICAgICAgICAgICAgICYob3V0LT5ldmVudEtpbmQpKSkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeUFyZ19QYXJzZSh2LCAiKE8mbCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmKG91dC0+ZXZlbnRDbGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAmKG91dC0+ZXZlbnRLaW5kKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiBOVUxMOwogfQogCiAvKioqKioqKioqKiBlbmQgRXZlbnRUeXBlU3BlYyAqKioqKioqLwpAQCAtMTEwLDE1ICsxMTAsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCoKIEhJUG9pbnRfTmV3KEhJUG9pbnQgKmluKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJmZiIsIGluLT54LCBpbi0+eSk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJmZiIsIGluLT54LCBpbi0+eSk7CiB9CiAKIHN0YXRpYyBpbnQKIEhJUG9pbnRfQ29udmVydChQeU9iamVjdCAqdiwgSElQb2ludCAqb3V0KQogewotCWlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJmZiIsICYob3V0LT54KSwgJihvdXQtPnkpKSkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJmZiIsICYob3V0LT54KSwgJihvdXQtPnkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYKIApAQCAtMTI5LDE1ICsxMjksMTUgQEAKIHN0YXRpYyBQeU9iamVjdCoKIEV2ZW50SG90S2V5SURfTmV3KEV2ZW50SG90S2V5SUQgKmluKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIGluLT5zaWduYXR1cmUsIGluLT5pZCk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIGluLT5zaWduYXR1cmUsIGluLT5pZCk7CiB9CiAKIHN0YXRpYyBpbnQKIEV2ZW50SG90S2V5SURfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRIb3RLZXlJRCAqb3V0KQogewotCWlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJsbCIsICZvdXQtPnNpZ25hdHVyZSwgJm91dC0+aWQpKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJm91dC0+c2lnbmF0dXJlLCAmb3V0LT5pZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiBOVUxMOwogfQogCiAvKioqKioqKioqKiBlbmQgRXZlbnRIb3RLZXlJRCAqKioqKioqLwpAQCAtMTQ4LDI3ICsxNDgsMjcgQEAKIAogc3RhdGljIHBhc2NhbCBPU1N0YXR1cwogbXlFdmVudEhhbmRsZXIoRXZlbnRIYW5kbGVyQ2FsbFJlZiBoYW5kbGVyUmVmLCBFdmVudFJlZiBldmVudCwgdm9pZCAqb3V0UHlPYmplY3QpIHsKLQlQeU9iamVjdCAqcmV0VmFsdWU7Ci0JaW50IHN0YXR1czsKKyAgICAgICAgUHlPYmplY3QgKnJldFZhbHVlOworICAgICAgICBpbnQgc3RhdHVzOwogCi0JcmV0VmFsdWUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopb3V0UHlPYmplY3QsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXJDYWxsUmVmX05ldywgaGFuZGxlclJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9OZXcsIGV2ZW50KTsKLQlpZiAocmV0VmFsdWUgPT0gTlVMTCkgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiRXJyb3IgaW4gZXZlbnQgaGFuZGxlciBjYWxsYmFjazpcbiIpOwotCQlQeUVycl9QcmludCgpOyAgLyogdGhpcyBhbHNvIGNsZWFycyB0aGUgZXJyb3IgKi8KLQkJc3RhdHVzID0gbm9FcnI7IC8qIGNvbXBsYWluPyBob3c/ICovCi0JfSBlbHNlIHsKLQkJaWYgKHJldFZhbHVlID09IFB5X05vbmUpCi0JCQlzdGF0dXMgPSBub0VycjsKLQkJZWxzZSBpZiAoUHlJbnRfQ2hlY2socmV0VmFsdWUpKSB7Ci0JCQlzdGF0dXMgPSBQeUludF9Bc0xvbmcocmV0VmFsdWUpOwotCQl9IGVsc2UKLQkJCXN0YXR1cyA9IG5vRXJyOyAvKiB3cm9uZyBvYmplY3QgdHlwZSwgY29tcGxhaW4/ICovCi0JCVB5X0RFQ1JFRihyZXRWYWx1ZSk7Ci0JfQorICAgICAgICByZXRWYWx1ZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKilvdXRQeU9iamVjdCwgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXJDYWxsUmVmX05ldywgaGFuZGxlclJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfTmV3LCBldmVudCk7CisgICAgICAgIGlmIChyZXRWYWx1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkVycm9yIGluIGV2ZW50IGhhbmRsZXIgY2FsbGJhY2s6XG4iKTsKKyAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOyAgLyogdGhpcyBhbHNvIGNsZWFycyB0aGUgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBub0VycjsgLyogY29tcGxhaW4/IGhvdz8gKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocmV0VmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5vRXJyOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHJldFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUHlJbnRfQXNMb25nKHJldFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5vRXJyOyAvKiB3cm9uZyBvYmplY3QgdHlwZSwgY29tcGxhaW4/ICovCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJldFZhbHVlKTsKKyAgICAgICAgfQogCi0JcmV0dXJuIHN0YXR1czsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqKioqKioqIGVuZCBteUV2ZW50SGFuZGxlciAqKioqKioqKioqKi8KQEAgLTE4NCw1NiArMTg0LDU2IEBACiAKIAogY2xhc3MgRXZlbnRIYW5kbGVyUmVmT2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU91dHB1dCgiJXMgb2JfaXRzZWxmOyIsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJQeU9iamVjdCAqb2JfY2FsbGJhY2s7IikKLQlkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU91dHB1dCgiaXQtPm9iX2l0c2VsZiA9ICVzaXRzZWxmOyIsIHNlbGYuYXJncmVmKQotCQlPdXRwdXQoIml0LT5vYl9jYWxsYmFjayA9IE5VTEw7IikKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIG5hbWUpOgotCQlPdXRMYnJhY2UoImlmIChzZWxmLT5vYl9pdHNlbGYgIT0gTlVMTCkiKQotCQlPdXRwdXQoIlJlbW92ZUV2ZW50SGFuZGxlcihzZWxmLT5vYl9pdHNlbGYpOyIpCi0JCU91dHB1dCgiUHlfREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrKTsiKQotCQlPdXRSYnJhY2UoKQotCQkKKyAgICBkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCIlcyBvYl9pdHNlbGY7Iiwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpvYl9jYWxsYmFjazsiKQorICAgIGRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfaXRzZWxmID0gJXNpdHNlbGY7Iiwgc2VsZi5hcmdyZWYpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsiKQorICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgbmFtZSk6CisgICAgICAgIE91dExicmFjZSgiaWYgKHNlbGYtPm9iX2l0c2VsZiAhPSBOVUxMKSIpCisgICAgICAgIE91dHB1dCgiUmVtb3ZlRXZlbnRIYW5kbGVyKHNlbGYtPm9iX2l0c2VsZik7IikKKyAgICAgICAgT3V0cHV0KCJQeV9ERUNSRUYoc2VsZi0+b2JfY2FsbGJhY2spOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKIGNsYXNzIE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JcGFzcworICAgIHBhc3MKIAogZm9yIHR5cCBpbiBSZWZPYmplY3RUeXBlczoKLQlpZiB0eXAgPT0gJ0V2ZW50SGFuZGxlclJlZic6Ci0JCUV2ZW50SGFuZGxlclJlZm9iamVjdCA9IEV2ZW50SGFuZGxlclJlZk9iamVjdERlZmluaXRpb24oJ0V2ZW50SGFuZGxlclJlZicpCi0JZWxzZToKLQkJZXhlY3N0ciA9IHR5cCArICdvYmplY3QgPSBNeUdsb2JhbE9iamVjdERlZmluaXRpb24odHlwKScKLQkJZXhlYyBleGVjc3RyCi0JbW9kdWxlLmFkZG9iamVjdChldmFsKHR5cCArICdvYmplY3QnKSkKKyAgICBpZiB0eXAgPT0gJ0V2ZW50SGFuZGxlclJlZic6CisgICAgICAgIEV2ZW50SGFuZGxlclJlZm9iamVjdCA9IEV2ZW50SGFuZGxlclJlZk9iamVjdERlZmluaXRpb24oJ0V2ZW50SGFuZGxlclJlZicpCisgICAgZWxzZToKKyAgICAgICAgZXhlY3N0ciA9IHR5cCArICdvYmplY3QgPSBNeUdsb2JhbE9iamVjdERlZmluaXRpb24odHlwKScKKyAgICAgICAgZXhlYyBleGVjc3RyCisgICAgbW9kdWxlLmFkZG9iamVjdChldmFsKHR5cCArICdvYmplY3QnKSkKIAogCiBmdW5jdGlvbnMgPSBbXQogZm9yIHR5cCBpbiBSZWZPYmplY3RUeXBlczogIyMgZ28gdGhydSBhbGwgT2JqZWN0VHlwZXMgYXMgZGVmaW5lZCBpbiBDYXJib25FdmVudHNzY2FuLnB5Ci0JIyBpbml0aWFsaXplIHRoZSBsaXN0cyBmb3IgY2FyYm9uZ2VuIHRvIGZpbGwKLQlleGVjc3RyID0gdHlwICsgJ21ldGhvZHMgPSBbXScKLQlleGVjIGV4ZWNzdHIKKyAgICAjIGluaXRpYWxpemUgdGhlIGxpc3RzIGZvciBjYXJib25nZW4gdG8gZmlsbAorICAgIGV4ZWNzdHIgPSB0eXAgKyAnbWV0aG9kcyA9IFtdJworICAgIGV4ZWMgZXhlY3N0cgogCiBleGVjZmlsZSgnQ2FyYm9uRXZlbnRzZ2VuLnB5JykKIAogCiAKLWZvciBmIGluIGZ1bmN0aW9uczogbW9kdWxlLmFkZChmKQkjIGFkZCBhbGwgdGhlIGZ1bmN0aW9ucyBjYXJib25ldmVudHNnZW4gcHV0IGluIHRoZSBsaXN0Citmb3IgZiBpbiBmdW5jdGlvbnM6IG1vZHVsZS5hZGQoZikgICAgICAgIyBhZGQgYWxsIHRoZSBmdW5jdGlvbnMgY2FyYm9uZXZlbnRzZ2VuIHB1dCBpbiB0aGUgbGlzdAogCi1mb3IgdHlwIGluIFJlZk9iamVjdFR5cGVzOgkJCQkgIyMgZ28gdGhydSBhbGwgT2JqZWN0VHlwZXMgYXMgZGVmaW5lZCBpbiBDYXJib25FdmVudHNzY2FuLnB5Ci0JbWV0aG9kcyA9IGV2YWwodHlwICsgJ21ldGhvZHMnKSAgIyMgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBtZXRob2QgbGlzdCBmcm9tIHRoZSBtYWluIG5hbWVzcGFjZQotCW9iaiA9IGV2YWwodHlwICsgJ29iamVjdCcpCQkgICMjIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0Ci0JZm9yIG0gaW4gbWV0aG9kczogb2JqLmFkZChtKQkjIyBhZGQgZWFjaCBtZXRob2QgaW4gdGhlIGxpc3QgdG8gdGhlIG9iamVjdAorZm9yIHR5cCBpbiBSZWZPYmplY3RUeXBlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgZ28gdGhydSBhbGwgT2JqZWN0VHlwZXMgYXMgZGVmaW5lZCBpbiBDYXJib25FdmVudHNzY2FuLnB5CisgICAgbWV0aG9kcyA9IGV2YWwodHlwICsgJ21ldGhvZHMnKSAgIyMgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBtZXRob2QgbGlzdCBmcm9tIHRoZSBtYWluIG5hbWVzcGFjZQorICAgIG9iaiA9IGV2YWwodHlwICsgJ29iamVjdCcpICAgICAgICAgICAgICAgICMjIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0CisgICAgZm9yIG0gaW4gbWV0aG9kczogb2JqLmFkZChtKSAgICAjIyBhZGQgZWFjaCBtZXRob2QgaW4gdGhlIGxpc3QgdG8gdGhlIG9iamVjdAogCiAKIHJlbW92ZWV2ZW50aGFuZGxlciA9ICIiIgogT1NTdGF0dXMgX2VycjsKIGlmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpIHsKLQlQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDYXJib25FdmVudHNfRXJyb3IsICJIYW5kbGVyIGhhcyBiZWVuIHJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBfZXJyID0gUmVtb3ZlRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYpOwogaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIF9zZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwpAQCAtMjU1LDE1ICsyNTUsMTUgQEAKIE9TU3RhdHVzIF9lcnI7CiAKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyIsIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluU3BlYywgJmNhbGxiYWNrKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKIF9lcnIgPSBJbnN0YWxsRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsIG15RXZlbnRIYW5kbGVyVVBQLCAxLCAmaW5TcGVjLCAodm9pZCAqKWNhbGxiYWNrLCAmb3V0UmVmKTsKIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiAKIF9yZXMgPSBFdmVudEhhbmRsZXJSZWZfTmV3KG91dFJlZik7CiBpZiAoX3JlcyAhPSBOVUxMKSB7Ci0JKChFdmVudEhhbmRsZXJSZWZPYmplY3QqKV9yZXMpLT5vYl9jYWxsYmFjayA9IGNhbGxiYWNrOwotCVB5X0lOQ1JFRihjYWxsYmFjayk7CisgICAgICAgICgoRXZlbnRIYW5kbGVyUmVmT2JqZWN0KilfcmVzKS0+b2JfY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsKIH0KIHJldHVybiBfcmVzOyIiIgogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZi9jZnNjYW4ucHkgYi9NYWMvTW9kdWxlcy9jZi9jZnNjYW4ucHkKaW5kZXggYWEwZWEzZC4uZDJkZTkyZSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY2YvY2ZzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2NmL2Nmc2Nhbi5weQpAQCAtOCwxMzUgKzgsMTM1IEBACiAKIExPTkcgPSAiQ29yZUZvdW5kYXRpb24iCiBTSE9SVCA9ICJjZiIKLU9CSkVDVFMgPSAoIkNGVHlwZVJlZiIsIAotCQkiQ0ZBcnJheVJlZiIsICJDRk11dGFibGVBcnJheVJlZiIsCi0JCSJDRkRhdGFSZWYiLCAiQ0ZNdXRhYmxlRGF0YVJlZiIsCi0JCSJDRkRpY3Rpb25hcnlSZWYiLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiIsCi0JCSJDRlN0cmluZ1JlZiIsICJDRk11dGFibGVTdHJpbmdSZWYiLAotCQkiQ0ZVUkxSZWYiLAotIyMJCSJDRlByb3BlcnR5TGlzdFJlZiIsCi0JCSkKK09CSkVDVFMgPSAoIkNGVHlwZVJlZiIsCisgICAgICAgICAgICAgICAgIkNGQXJyYXlSZWYiLCAiQ0ZNdXRhYmxlQXJyYXlSZWYiLAorICAgICAgICAgICAgICAgICJDRkRhdGFSZWYiLCAiQ0ZNdXRhYmxlRGF0YVJlZiIsCisgICAgICAgICAgICAgICAgIkNGRGljdGlvbmFyeVJlZiIsICJDRk11dGFibGVEaWN0aW9uYXJ5UmVmIiwKKyAgICAgICAgICAgICAgICAiQ0ZTdHJpbmdSZWYiLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmIiwKKyAgICAgICAgICAgICAgICAiQ0ZVUkxSZWYiLAorIyMgICAgICAgICAgICAgICJDRlByb3BlcnR5TGlzdFJlZiIsCisgICAgICAgICAgICAgICAgKQogIyBBREQgb2JqZWN0IHR5cGVuYW1lcyBoZXJlCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSBbCi0JCSJDRkJhc2UuaCIsCi0JCSJDRkFycmF5LmgiLAotIyMJCSJDRkJhZy5oIiwKLSMjCQkiQ0ZCdW5kbGUuaCIsCi0jIwkJIkNGQ2hhcmFjdGVyU2V0LmgiLAotCQkiQ0ZEYXRhLmgiLAotIyMJCSJDRkRhdGUuaCIsCi0JCSJDRkRpY3Rpb25hcnkuaCIsCi0jIwkJIkNGTnVtYmVyLmgiLAotIyMJCSJDRlBsdWdJbi5oIiwKLQkJIkNGUHJlZmVyZW5jZXMuaCIsCi0JCSJDRlByb3BlcnR5TGlzdC5oIiwKLSMjCQkiQ0ZTZXQuaCIsCi0JCSJDRlN0cmluZy5oIiwKLSMjCQkiQ0ZTdHJpbmdFbmNvZGluZ0V4dC5oIiwKLSMjCQkiQ0ZUaW1lWm9uZS5oIiwKLQkJIkNGVVJMLmgiLAotCQldCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gWworICAgICAgICAgICAgIkNGQmFzZS5oIiwKKyAgICAgICAgICAgICJDRkFycmF5LmgiLAorIyMgICAgICAgICAgICAgICJDRkJhZy5oIiwKKyMjICAgICAgICAgICAgICAiQ0ZCdW5kbGUuaCIsCisjIyAgICAgICAgICAgICAgIkNGQ2hhcmFjdGVyU2V0LmgiLAorICAgICAgICAgICAgIkNGRGF0YS5oIiwKKyMjICAgICAgICAgICAgICAiQ0ZEYXRlLmgiLAorICAgICAgICAgICAgIkNGRGljdGlvbmFyeS5oIiwKKyMjICAgICAgICAgICAgICAiQ0ZOdW1iZXIuaCIsCisjIyAgICAgICAgICAgICAgIkNGUGx1Z0luLmgiLAorICAgICAgICAgICAgIkNGUHJlZmVyZW5jZXMuaCIsCisgICAgICAgICAgICAiQ0ZQcm9wZXJ0eUxpc3QuaCIsCisjIyAgICAgICAgICAgICAgIkNGU2V0LmgiLAorICAgICAgICAgICAgIkNGU3RyaW5nLmgiLAorIyMgICAgICAgICAgICAgICJDRlN0cmluZ0VuY29kaW5nRXh0LmgiLAorIyMgICAgICAgICAgICAgICJDRlRpbWVab25lLmgiLAorICAgICAgICAgICAgIkNGVVJMLmgiLAorICAgICAgICAgICAgXQorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXJfT1NYKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3QgYW5kIG5hbWVbOjEzXSAhPSAnQ0ZQcmVmZXJlbmNlcyc6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCBpbiBPQkpFQ1RTIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSB0ICsgIl9tZXRob2RzIgotCQkJIyBTcGVjaWFsIGNhc2UgZm9yIHRoZSBzaWxseSBmaXJzdCBBbGxvY2F0b3JSZWYgYXJndW1lbnQKLQkJCWlmIHQgPT0gJ0NGQWxsb2NhdG9yUmVmJyBhbmQgbSA9PSAnSW5Nb2RlJyBhbmQgbGVuKGFyZ2xpc3QpID4gMToKLQkJCQl0LCBuLCBtID0gYXJnbGlzdFsxXQotCQkJCWlmIHQgaW4gT0JKRUNUUyBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQkJY2xhc3NuYW1lID0gIk1ldGhvZFNraXBBcmcxIgotCQkJCQlsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdCBhbmQgbmFtZVs6MTNdICE9ICdDRlByZWZlcmVuY2VzJzoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0IGluIE9CSkVDVFMgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCisgICAgICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgdGhlIHNpbGx5IGZpcnN0IEFsbG9jYXRvclJlZiBhcmd1bWVudAorICAgICAgICAgICAgaWYgdCA9PSAnQ0ZBbGxvY2F0b3JSZWYnIGFuZCBtID09ICdJbk1vZGUnIGFuZCBsZW4oYXJnbGlzdCkgPiAxOgorICAgICAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzFdCisgICAgICAgICAgICAgICAgaWYgdCBpbiBPQkpFQ1RTIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kU2tpcEFyZzEiCisgICAgICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gdCArICJfbWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSMgTWVtb3J5IGFsbG9jYXRvciBmdW5jdGlvbnMKLQkJCSJDRkFsbG9jYXRvckdldERlZmF1bHQiLAotCQkJIkNGQWxsb2NhdG9yU2V0RGVmYXVsdCIsCi0JCQkiQ0ZBbGxvY2F0b3JBbGxvY2F0ZSIsCi0JCQkiQ0ZBbGxvY2F0b3JSZWFsbG9jYXRlIiwKLQkJCSJDRkFsbG9jYXRvckRlYWxsb2NhdGUiLAotCQkJIkNGR2V0QWxsb2NhdG9yIiwKLQkJCSMgQXJyYXkgZnVuY3Rpb25zIHdlIHNraXAgZm9yIG5vdy4KLQkJCSJDRkFycmF5R2V0VmFsdWVBdEluZGV4IiwKLQkJCSMgRGF0YSBwb2ludGVyIGZ1bmN0aW9ucy4gU2tpcCBmb3Igbm93LgotCQkJIkNGRGF0YUdldEJ5dGVQdHIiLAotCQkJIkNGRGF0YUdldE11dGFibGVCeXRlUHRyIiwKLQkJCSJDRkRhdGFHZXRCeXRlcyIsICAgIyBYWFhYIFNob3VsZCBzdXBwb3J0IHRoaXMgb25lCi0JCQkjIFN0cmluZyBmdW5jdGlvbnMKLQkJCSJDRlN0cmluZ0dldFBhc2NhbFN0cmluZyIsICMgVXNlIHRoZSBDLXN0cmluZyBtZXRob2RzLgotCQkJIkNGU3RyaW5nR2V0UGFzY2FsU3RyaW5nUHRyIiwgIyBUQkQgYXV0b21hdGljYWxseQotCQkJIkNGU3RyaW5nR2V0Q1N0cmluZ1B0ciIsIAotCQkJIkNGU3RyaW5nR2V0Q2hhcmFjdGVyc1B0ciIsCi0JCQkiQ0ZTdHJpbmdHZXRDU3RyaW5nIiwgCi0JCQkiQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzIiwKLQkJCSJDRlVSTENyZWF0ZVN0cmluZ1dpdGhGaWxlU3lzdGVtUGF0aCIsICMgR29uZSBpbiBsYXRlciByZWxlYXNlcwotCQkJIkNGU3RyaW5nQ3JlYXRlTXV0YWJsZVdpdGhFeHRlcm5hbENoYXJhY3RlcnNOb0NvcHkiLCAjIE5vdCBhIGNsdWUuLi4KLQkJCSJDRlN0cmluZ1NldEV4dGVybmFsQ2hhcmFjdGVyc05vQ29weSIsCi0JCQkiQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJBdEluZGV4IiwgIyBObyBmb3JtYXQgZm9yIHNpbmdsZSB1bmljaGFycyB5ZXQuCi0JCQkia0NGU3RyaW5nRW5jb2RpbmdJbnZhbGlkSWQiLCAjIGluY29tcGF0aWJsZSBjb25zdGFudCBkZWNsYXJhdGlvbgotCQkJIkNGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEiLCAjIE1hbnVhbGx5IGdlbmVyYXRlZAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIyBNZW1vcnkgYWxsb2NhdG9yIGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICJDRkFsbG9jYXRvckdldERlZmF1bHQiLAorICAgICAgICAgICAgICAgICJDRkFsbG9jYXRvclNldERlZmF1bHQiLAorICAgICAgICAgICAgICAgICJDRkFsbG9jYXRvckFsbG9jYXRlIiwKKyAgICAgICAgICAgICAgICAiQ0ZBbGxvY2F0b3JSZWFsbG9jYXRlIiwKKyAgICAgICAgICAgICAgICAiQ0ZBbGxvY2F0b3JEZWFsbG9jYXRlIiwKKyAgICAgICAgICAgICAgICAiQ0ZHZXRBbGxvY2F0b3IiLAorICAgICAgICAgICAgICAgICMgQXJyYXkgZnVuY3Rpb25zIHdlIHNraXAgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICAiQ0ZBcnJheUdldFZhbHVlQXRJbmRleCIsCisgICAgICAgICAgICAgICAgIyBEYXRhIHBvaW50ZXIgZnVuY3Rpb25zLiBTa2lwIGZvciBub3cuCisgICAgICAgICAgICAgICAgIkNGRGF0YUdldEJ5dGVQdHIiLAorICAgICAgICAgICAgICAgICJDRkRhdGFHZXRNdXRhYmxlQnl0ZVB0ciIsCisgICAgICAgICAgICAgICAgIkNGRGF0YUdldEJ5dGVzIiwgICAjIFhYWFggU2hvdWxkIHN1cHBvcnQgdGhpcyBvbmUKKyAgICAgICAgICAgICAgICAjIFN0cmluZyBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgICAiQ0ZTdHJpbmdHZXRQYXNjYWxTdHJpbmciLCAjIFVzZSB0aGUgQy1zdHJpbmcgbWV0aG9kcy4KKyAgICAgICAgICAgICAgICAiQ0ZTdHJpbmdHZXRQYXNjYWxTdHJpbmdQdHIiLCAjIFRCRCBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgICAgIkNGU3RyaW5nR2V0Q1N0cmluZ1B0ciIsCisgICAgICAgICAgICAgICAgIkNGU3RyaW5nR2V0Q2hhcmFjdGVyc1B0ciIsCisgICAgICAgICAgICAgICAgIkNGU3RyaW5nR2V0Q1N0cmluZyIsCisgICAgICAgICAgICAgICAgIkNGU3RyaW5nR2V0Q2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIkNGVVJMQ3JlYXRlU3RyaW5nV2l0aEZpbGVTeXN0ZW1QYXRoIiwgIyBHb25lIGluIGxhdGVyIHJlbGVhc2VzCisgICAgICAgICAgICAgICAgIkNGU3RyaW5nQ3JlYXRlTXV0YWJsZVdpdGhFeHRlcm5hbENoYXJhY3RlcnNOb0NvcHkiLCAjIE5vdCBhIGNsdWUuLi4KKyAgICAgICAgICAgICAgICAiQ0ZTdHJpbmdTZXRFeHRlcm5hbENoYXJhY3RlcnNOb0NvcHkiLAorICAgICAgICAgICAgICAgICJDRlN0cmluZ0dldENoYXJhY3RlckF0SW5kZXgiLCAjIE5vIGZvcm1hdCBmb3Igc2luZ2xlIHVuaWNoYXJzIHlldC4KKyAgICAgICAgICAgICAgICAia0NGU3RyaW5nRW5jb2RpbmdJbnZhbGlkSWQiLCAjIGluY29tcGF0aWJsZSBjb25zdGFudCBkZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgICJDRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhIiwgIyBNYW51YWxseSBnZW5lcmF0ZWQKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWdyZXlsaXN0KHNlbGYpOgotCQlyZXR1cm4gW10KKyAgICBkZWYgbWFrZWdyZXlsaXN0KHNlbGYpOgorICAgICAgICByZXR1cm4gW10KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiQ0ZDb21wYXJhdG9yRnVuY3Rpb24iLCAjIENhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKLQkJCSJDRkFsbG9jYXRvckNvbnRleHQiLCAjIE5vdCBpbnRlcmVzdGVkIGluIHByb3ZpZGluZyBvdXIgb3duIGFsbG9jYXRvcgotCQkJInZvaWRfcHRyX3B0ciIsICAjIFRyaWNreS4gVGhpcyBpcyB0aGUgaW5pdGlhbGl6ZXIgZm9yIGFycmF5cy4uLgotCQkJInZvaWRfcHRyIiwgIyBEaXR0byBmb3IgdmFyaW91cyBhcnJheSBsb29rdXAgbWV0aG9kcwotCQkJIkNGQXJyYXlBcHBsaWVyRnVuY3Rpb24iLCAjIENhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKLQkJCSJDRkRpY3Rpb25hcnlBcHBsaWVyRnVuY3Rpb24iLCAjIENhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKLQkJCSJ2YV9saXN0IiwgIyBGb3IgcHJpbnRmLXRvLWEtY2ZzdHJpbmcuIFVzZSBQeXRob24uCi0JCQkiY29uc3RfQ0ZTdHJpbmdFbmNvZGluZ19wdHIiLCAjIFRvIGJlIGRvbmUsIEkgZ3Vlc3MKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJDRkNvbXBhcmF0b3JGdW5jdGlvbiIsICMgQ2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICAgICAgICAgICAgICAgICJDRkFsbG9jYXRvckNvbnRleHQiLCAjIE5vdCBpbnRlcmVzdGVkIGluIHByb3ZpZGluZyBvdXIgb3duIGFsbG9jYXRvcgorICAgICAgICAgICAgICAgICJ2b2lkX3B0cl9wdHIiLCAgIyBUcmlja3kuIFRoaXMgaXMgdGhlIGluaXRpYWxpemVyIGZvciBhcnJheXMuLi4KKyAgICAgICAgICAgICAgICAidm9pZF9wdHIiLCAjIERpdHRvIGZvciB2YXJpb3VzIGFycmF5IGxvb2t1cCBtZXRob2RzCisgICAgICAgICAgICAgICAgIkNGQXJyYXlBcHBsaWVyRnVuY3Rpb24iLCAjIENhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAiQ0ZEaWN0aW9uYXJ5QXBwbGllckZ1bmN0aW9uIiwgIyBDYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisgICAgICAgICAgICAgICAgInZhX2xpc3QiLCAjIEZvciBwcmludGYtdG8tYS1jZnN0cmluZy4gVXNlIFB5dGhvbi4KKyAgICAgICAgICAgICAgICAiY29uc3RfQ0ZTdHJpbmdFbmNvZGluZ19wdHIiLCAjIFRvIGJlIGRvbmUsIEkgZ3Vlc3MKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSMgQnVmZmVycyBpbiBDRiBzZWVtIHRvIGJlIHBhc3NlZCBhcyBVSW50OCAqIG5vcm1hbGx5LgotCQkJKFsoIlVJbnQ4X3B0ciIsICIqIiwgIkluTW9kZSIpLCAoIkNGSW5kZXgiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiVWNoYXJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAotCQkJIAotCQkJKFsoIlVuaUNoYXJfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgiQ0ZJbmRleCIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJVbmljb2RlSW5CdWZmZXIiLCAiKiIsICIqIildKSwKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAjIEJ1ZmZlcnMgaW4gQ0Ygc2VlbSB0byBiZSBwYXNzZWQgYXMgVUludDggKiBub3JtYWxseS4KKyAgICAgICAgICAgICAgICAoWygiVUludDhfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgiQ0ZJbmRleCIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiVWNoYXJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAogCi0JCQkjIFNvbWUgZnVuY3Rpb25zIHJldHVybiBhIGNvbnN0IGNoYXIgKi4gRG9uJ3Qgd29ycnksIHdlIHdvbid0IG1vZGlmeSBpdC4KLQkJCShbKCJjb25zdF9jaGFyX3B0ciIsICIqIiwgIlJldHVybk1vZGUiKV0sCi0JCQkgWygicmV0dXJuX3N0cmluZ3B0ciIsICIqIiwgIioiKV0pLAotCQkJIAotCQkJIyBiYXNlIFVSTHMgYXJlIG9wdGlvbmFsIChwYXNzIE5vbmUgZm9yIE5VTEwpCi0JCQkoWygiQ0ZVUkxSZWYiLCAiYmFzZVVSTCIsICJJbk1vZGUiKV0sCi0JCQkgWygiT3B0aW9uYWxDRlVSTFJlZiIsICIqIiwgIioiKV0pLAotCQkJIAotCQkJIyBXZSBoYW5kbGUgQ0ZQcm9wZXJ0eUxpc3RSZWYgb2JqZWN0cyBhcyBwbGFpbiBDRlR5cGVSZWYKLQkJCShbKCJDRlByb3BlcnR5TGlzdFJlZiIsICIqIiwgIioiKV0sCi0JCQkgWygiQ0ZUeXBlUmVmIiwgIioiLCAiKiIpXSksCi0JCQldCi0JCQkKKyAgICAgICAgICAgICAgICAoWygiVW5pQ2hhcl9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJDRkluZGV4IiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJVbmljb2RlSW5CdWZmZXIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgICMgU29tZSBmdW5jdGlvbnMgcmV0dXJuIGEgY29uc3QgY2hhciAqLiBEb24ndCB3b3JyeSwgd2Ugd29uJ3QgbW9kaWZ5IGl0LgorICAgICAgICAgICAgICAgIChbKCJjb25zdF9jaGFyX3B0ciIsICIqIiwgIlJldHVybk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoInJldHVybl9zdHJpbmdwdHIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgICMgYmFzZSBVUkxzIGFyZSBvcHRpb25hbCAocGFzcyBOb25lIGZvciBOVUxMKQorICAgICAgICAgICAgICAgIChbKCJDRlVSTFJlZiIsICJiYXNlVVJMIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiT3B0aW9uYWxDRlVSTFJlZiIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgIyBXZSBoYW5kbGUgQ0ZQcm9wZXJ0eUxpc3RSZWYgb2JqZWN0cyBhcyBwbGFpbiBDRlR5cGVSZWYKKyAgICAgICAgICAgICAgICAoWygiQ0ZQcm9wZXJ0eUxpc3RSZWYiLCAiKiIsICIqIildLAorICAgICAgICAgICAgICAgICBbKCJDRlR5cGVSZWYiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICBdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZi9jZnN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9jZi9jZnN1cHBvcnQucHkKaW5kZXggOTVhZWFhNy4uODdiOWE2ZiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY2YvY2ZzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2NmL2Nmc3VwcG9ydC5weQpAQCAtOCwzNSArOCwzNSBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NT0ROQU1FID0gJ19DRicJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitNT0ROQU1FID0gJ19DRicgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdDRicJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitNT0RQUkVGSVggPSAnQ0YnICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIAogIyBTcGVjaWFsIGNhc2UgZ2VuZXJhdG9yIGZvciB0aGUgZnVuY3Rpb25zIHRoYXQgaGF2ZSBhbiBBbGxvY2F0b3JSZWYgZmlyc3QgYXJndW1lbnQsCiAjIHdoaWNoIHdlIHNraXAgYW55d2F5LCBhbmQgdGhlIG9iamVjdCBhcyB0aGUgc2Vjb25kIGFyZy4KIGNsYXNzIE1ldGhvZFNraXBBcmcxKE1ldGhvZEdlbmVyYXRvcik6Ci0JIiIiU2ltaWxhciB0byBNZXRob2RHZW5lcmF0b3IsIGJ1dCBoYXMgc2VsZiBhcyBsYXN0IGFyZ3VtZW50IiIiCisgICAgIiIiU2ltaWxhciB0byBNZXRob2RHZW5lcmF0b3IsIGJ1dCBoYXMgc2VsZiBhcyBsYXN0IGFyZ3VtZW50IiIiCiAKLQlkZWYgcGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncyk6Ci0JCWlmIGxlbihhcmdzKSA8IDI6Ci0JCQlyYWlzZSBWYWx1ZUVycm9yLCAiTWV0aG9kU2tpcEFyZzEgZXhwZWN0cyBhdCBsZWFzdCAyIGFyZ3MiCi0JCWEwLCBhMSwgYXJncyA9IGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMjpdCi0JCXQwLCBuMCwgbTAgPSBhMAotCQlpZiB0MCAhPSAiQ0ZBbGxvY2F0b3JSZWYiIGFuZCBtMCAhPSBJbk1vZGU6Ci0JCQlyYWlzZSBWYWx1ZUVycm9yLCAiTWV0aG9kU2tpcEFyZzEgc2hvdWxkIGhhdmUgZHVtbXkgQWxsb2NhdG9yUmVmIGZpcnN0IGFyZyIKLQkJdDEsIG4xLCBtMSA9IGExCi0JCWlmIG0xICE9IEluTW9kZToKLQkJCXJhaXNlIFZhbHVlRXJyb3IsICJtZXRob2QncyAnc2VsZicgbXVzdCBiZSAnSW5Nb2RlJyIKLQkJZHVtbXkgPSBWYXJpYWJsZSh0MCwgbjAsIG0wKQotCQlzZWxmLmFyZ3VtZW50TGlzdC5hcHBlbmQoZHVtbXkpCi0JCXNlbGYuaXRzZWxmID0gVmFyaWFibGUodDEsICJfc2VsZi0+b2JfaXRzZWxmIiwgU2VsZk1vZGUpCi0JCXNlbGYuYXJndW1lbnRMaXN0LmFwcGVuZChzZWxmLml0c2VsZikKLQkJRnVuY3Rpb25HZW5lcmF0b3IucGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncykKKyAgICBkZWYgcGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncyk6CisgICAgICAgIGlmIGxlbihhcmdzKSA8IDI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiTWV0aG9kU2tpcEFyZzEgZXhwZWN0cyBhdCBsZWFzdCAyIGFyZ3MiCisgICAgICAgIGEwLCBhMSwgYXJncyA9IGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMjpdCisgICAgICAgIHQwLCBuMCwgbTAgPSBhMAorICAgICAgICBpZiB0MCAhPSAiQ0ZBbGxvY2F0b3JSZWYiIGFuZCBtMCAhPSBJbk1vZGU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiTWV0aG9kU2tpcEFyZzEgc2hvdWxkIGhhdmUgZHVtbXkgQWxsb2NhdG9yUmVmIGZpcnN0IGFyZyIKKyAgICAgICAgdDEsIG4xLCBtMSA9IGExCisgICAgICAgIGlmIG0xICE9IEluTW9kZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtZXRob2QncyAnc2VsZicgbXVzdCBiZSAnSW5Nb2RlJyIKKyAgICAgICAgZHVtbXkgPSBWYXJpYWJsZSh0MCwgbjAsIG0wKQorICAgICAgICBzZWxmLmFyZ3VtZW50TGlzdC5hcHBlbmQoZHVtbXkpCisgICAgICAgIHNlbGYuaXRzZWxmID0gVmFyaWFibGUodDEsICJfc2VsZi0+b2JfaXRzZWxmIiwgU2VsZk1vZGUpCisgICAgICAgIHNlbGYuYXJndW1lbnRMaXN0LmFwcGVuZChzZWxmLml0c2VsZikKKyAgICAgICAgRnVuY3Rpb25HZW5lcmF0b3IucGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncykKIAogCiAjIENyZWF0ZSB0aGUgdHlwZSBvYmplY3RzCkBAIC0xMTEsMTkgKzExMSwxOSBAQAogUHlPYmplY3QgKkNGUmFuZ2VfTmV3KENGUmFuZ2UgKml0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIChsb25nKWl0c2VsZi0+bG9jYXRpb24sIChsb25nKWl0c2VsZi0+bGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgKGxvbmcpaXRzZWxmLT5sb2NhdGlvbiwgKGxvbmcpaXRzZWxmLT5sZW5ndGgpOwogfQogCiBpbnQKIENGUmFuZ2VfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZSYW5nZSAqcF9pdHNlbGYpCiB7Ci0JbG9uZyBsb2NhdGlvbiwgbGVuZ3RoOwotCQotCWlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGwiLCAmbG9jYXRpb24sICZsZW5ndGgpICkKLQkJcmV0dXJuIDA7Ci0JcF9pdHNlbGYtPmxvY2F0aW9uID0gKENGSW5kZXgpbG9jYXRpb247Ci0JcF9pdHNlbGYtPmxlbmd0aCA9IChDRkluZGV4KWxlbmd0aDsKLQlyZXR1cm4gMTsKKyAgICAgICAgbG9uZyBsb2NhdGlvbiwgbGVuZ3RoOworCisgICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGwiLCAmbG9jYXRpb24sICZsZW5ndGgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcF9pdHNlbGYtPmxvY2F0aW9uID0gKENGSW5kZXgpbG9jYXRpb247CisgICAgICAgIHBfaXRzZWxmLT5sZW5ndGggPSAoQ0ZJbmRleClsZW5ndGg7CisgICAgICAgIHJldHVybiAxOwogfQogCiAvKiBPcHRpb25hbCBDRlVSTCBhcmd1bWVudCBvciBOb25lIChwYXNzZWQgYXMgTlVMTCkgKi8KQEAgLTEzMSw4ICsxMzEsOCBAQAogT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlVSTFJlZiAqcF9pdHNlbGYpCiB7CiAgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7Ci0gICAgCXBfaXRzZWxmID0gTlVMTDsKLSAgICAJcmV0dXJuIDE7CisgICAgICAgIHBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIHJldHVybiBDRlVSTFJlZk9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKIH0KQEAgLTE0Myw0MiArMTQzLDQyIEBACiAvKiBSb3V0aW5lcyB0byBjb252ZXJ0IGFueSBDRiB0eXBlIHRvL2Zyb20gdGhlIGNvcnJlc3BvbmRpbmcgQ0Z4eHhPYmogKi8KIFB5T2JqZWN0ICpDRk9ial9OZXcoQ0ZUeXBlUmVmIGl0c2VsZikKIHsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZBcnJheUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZBcnJheVJlZk9ial9OZXcoKENGQXJyYXlSZWYpaXRzZWxmKTsKLQlpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkgcmV0dXJuIENGRGljdGlvbmFyeVJlZk9ial9OZXcoKENGRGljdGlvbmFyeVJlZilpdHNlbGYpOwotCWlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGF0YUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEYXRhUmVmT2JqX05ldygoQ0ZEYXRhUmVmKWl0c2VsZik7Ci0JaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldygoQ0ZTdHJpbmdSZWYpaXRzZWxmKTsKLQlpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRlVSTEdldFR5cGVJRCgpKSByZXR1cm4gQ0ZVUkxSZWZPYmpfTmV3KChDRlVSTFJlZilpdHNlbGYpOwotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBQeUNGX0NGMlB5dGhvbiBoZXJlPz8gKi8KLQlyZXR1cm4gQ0ZUeXBlUmVmT2JqX05ldyhpdHNlbGYpOworICAgICAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGQXJyYXlHZXRUeXBlSUQoKSkgcmV0dXJuIENGQXJyYXlSZWZPYmpfTmV3KChDRkFycmF5UmVmKWl0c2VsZik7CisgICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldygoQ0ZEaWN0aW9uYXJ5UmVmKWl0c2VsZik7CisgICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGF0YUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEYXRhUmVmT2JqX05ldygoQ0ZEYXRhUmVmKWl0c2VsZik7CisgICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGU3RyaW5nR2V0VHlwZUlEKCkpIHJldHVybiBDRlN0cmluZ1JlZk9ial9OZXcoKENGU3RyaW5nUmVmKWl0c2VsZik7CisgICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGVVJMR2V0VHlwZUlEKCkpIHJldHVybiBDRlVSTFJlZk9ial9OZXcoKENGVVJMUmVmKWl0c2VsZik7CisgICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBQeUNGX0NGMlB5dGhvbiBoZXJlPz8gKi8KKyAgICAgICAgcmV0dXJuIENGVHlwZVJlZk9ial9OZXcoaXRzZWxmKTsKIH0KIGludCBDRk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlR5cGVSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgICAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCiAKLQlpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSAmJgotCQkhQ0ZBcnJheVJlZk9ial9DaGVjayh2KSAmJgotCQkhQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ2hlY2sodikgJiYKLQkJIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSAmJgotCQkhQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSAmJgotCQkhQ0ZEYXRhUmVmT2JqX0NoZWNrKHYpICYmCi0JCSFDRk11dGFibGVEYXRhUmVmT2JqX0NoZWNrKHYpICYmCi0JCSFDRlN0cmluZ1JlZk9ial9DaGVjayh2KSAmJgotCQkhQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHYpICYmCi0JCSFDRlVSTFJlZk9ial9DaGVjayh2KSApCi0JewotCQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgUHlDRl9QeXRob24yQ0YgaGVyZT8/ICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRiBvYmplY3QgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICAgICAgaWYgKCFDRlR5cGVSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgICAgICAgICAhQ0ZBcnJheVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAgICAgICAgICFDRk11dGFibGVBcnJheVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAgICAgICAgICFDRkRpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgICAgICAgICAhQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAgICAgICAgICFDRkRhdGFSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgICAgICAgICAhQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAgICAgICAgICFDRlN0cmluZ1JlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAgICAgICAgICFDRk11dGFibGVTdHJpbmdSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgICAgICAgICAhQ0ZVUkxSZWZPYmpfQ2hlY2sodikgKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFB5Q0ZfUHl0aG9uMkNGIGhlcmU/PyAqLworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRiBvYmplY3QgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAqcF9pdHNlbGYgPSAoKENGVHlwZVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgIHJldHVybiAxOwogfQogIiIiCiAKQEAgLTIyNSw3ICsyMjUsNyBAQAogQ0ZVUkxQYXRoU3R5bGUgPSBUeXBlKCJDRlVSTFBhdGhTdHlsZSIsICJsIikgIyAgYSBiaXQgZGFuZ2Vyb3VzLCBpdCdzIGFuIGVudW0KIAogY2hhcl9wdHIgPSBzdHJpbmdwdHIKLXJldHVybl9zdHJpbmdwdHIgPSBUeXBlKCJjaGFyICoiLCAicyIpCSMgT05MWSBGT1IgUkVUVVJOIFZBTFVFUyEhCityZXR1cm5fc3RyaW5ncHRyID0gVHlwZSgiY2hhciAqIiwgInMiKSAgIyBPTkxZIEZPUiBSRVRVUk4gVkFMVUVTISEKIAogQ0ZBbGxvY2F0b3JSZWYgPSBGYWtlVHlwZSgiKENGQWxsb2NhdG9yUmVmKU5VTEwiKQogQ0ZBcnJheUNhbGxCYWNrc19wdHIgPSBGYWtlVHlwZSgiJmtDRlR5cGVBcnJheUNhbGxCYWNrcyIpCkBAIC0yNTEsMjMzICsyNTEsMjMzIEBACiAjIE91ciAob3BhcXVlKSBvYmplY3RzCiAKIGNsYXNzIE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoJ2lmIChpdHNlbGYgPT0gTlVMTCknKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoJ1B5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7JykKLQkJT3V0cHV0KCdyZXR1cm4gTlVMTDsnKQotCQlPdXRSYnJhY2UoKQotCWRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJ2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsiKQotCWRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQotIyMJCU91dHB1dCgiaXQtPm9iX2ZyZWVpdCA9IE5VTEw7IikKLQkJT3V0cHV0KCJpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOyIpCi0JZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKLQkJT3V0KCIiIgotCQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KLQkJIiIiKQotCWRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoInNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7IikKLQkJT3V0cHV0KCJzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOyIpCi0JCU91dFJicmFjZSgpCi0JCQotCWRlZiBvdXRwdXRDb21wYXJlKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBpbnQgJXNfY29tcGFyZSglcyAqc2VsZiwgJXMgKm90aGVyKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCIvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovIikKLQkJT3V0cHV0KCJpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsiKQotCQlPdXRwdXQoImlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsiKQotCQlPdXRwdXQoInJldHVybiAwOyIpCi0JCU91dFJicmFjZSgpCi0JCQotCWRlZiBvdXRwdXRIYXNoKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBpbnQgJXNfaGFzaCglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIi8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLyIpCi0JCU91dHB1dCgicmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOyIpCi0JCU91dFJicmFjZSgpCi0JCQotCWRlZiBvdXRwdXRSZXByKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCi0JCU91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRlR5cGVSZWYgdHlwZS0lJWQgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAoaW50KUNGR2V0VHlwZUlEKHNlbGYtPm9iX2l0c2VsZiksICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCdpZiAoaXRzZWxmID09IE5VTEwpJykKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCdQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOycpCisgICAgICAgIE91dHB1dCgncmV0dXJuIE5VTEw7JykKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICBkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgidm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7IikKKyAgICBkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKKyMjICAgICAgICAgICAgICBPdXRwdXQoIml0LT5vYl9mcmVlaXQgPSBOVUxMOyIpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsiKQorICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisgICAgICAgIE91dCgiIiIKKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgICAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgICAgICIiIikKKyAgICBkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOyIpCisgICAgICAgIE91dHB1dCgic2VsZi0+b2JfaXRzZWxmID0gTlVMTDsiKQorICAgICAgICBPdXRSYnJhY2UoKQogCi0JZGVmIG91dHB1dF90cF9uZXdCb2R5KHNlbGYpOgotCQlPdXRwdXQoIlB5T2JqZWN0ICpzZWxmOyIpCi0JCU91dHB1dAotCQlPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQotCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Iiwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRwdXQoInJldHVybiBzZWxmOyIpCi0JCQotCWRlZiBvdXRwdXRfdHBfaW5pdEJvZHkoc2VsZik6Ci0JCU91dHB1dCgiJXMgaXRzZWxmOyIsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJjaGFyICprd1tdID0ge1wiaXRzZWxmXCIsIDB9OyIpCi0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcIk8mXCIsIGt3LCAlc19Db252ZXJ0LCAmaXRzZWxmKSkiLAotCQkJc2VsZi5wcmVmaXgpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Iiwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRwdXQoInJldHVybiAwOyIpCi0JCU91dFJicmFjZSgpCi0JCWlmIHNlbGYucHJlZml4ICE9ICdDRlR5cGVSZWZPYmonOgotCQkJT3V0cHV0KCkKLQkJCU91dHB1dCgiLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovIikKLQkJCU91dHB1dCgiaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcIk8mXCIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpIikKLQkJCU91dExicmFjZSgpCi0JCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOyIsIHNlbGYub2JqZWN0dHlwZSkKLQkJCU91dHB1dCgicmV0dXJuIDA7IikKLQkJCU91dFJicmFjZSgpCi0JCU91dHB1dCgicmV0dXJuIC0xOyIpCisgICAgZGVmIG91dHB1dENvbXBhcmUoc2VsZik6CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgic3RhdGljIGludCAlc19jb21wYXJlKCVzICpzZWxmLCAlcyAqb3RoZXIpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIi8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8iKQorICAgICAgICBPdXRwdXQoImlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOyIpCisgICAgICAgIE91dHB1dCgiaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDA7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKworICAgIGRlZiBvdXRwdXRIYXNoKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBpbnQgJXNfaGFzaCglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIi8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKKyAgICBkZWYgb3V0cHV0UmVwcihzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiY2hhciBidWZbMTAwXTsiKQorICAgICAgICBPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZUeXBlUmVmIHR5cGUtJSVkIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKGludClDRkdldFR5cGVJRChzZWxmLT5vYl9pdHNlbGYpLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQorICAgICAgICBPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKworICAgIGRlZiBvdXRwdXRfdHBfbmV3Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqc2VsZjsiKQorICAgICAgICBPdXRwdXQKKyAgICAgICAgT3V0cHV0KCJpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Iiwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQorCisgICAgZGVmIG91dHB1dF90cF9pbml0Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCIlcyBpdHNlbGY7Iiwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRwdXQoImNoYXIgKmt3W10gPSB7XCJpdHNlbGZcIiwgMH07IikKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIFwiTyZcIiwga3csICVzX0NvbnZlcnQsICZpdHNlbGYpKSIsCisgICAgICAgICAgICAgICAgc2VsZi5wcmVmaXgpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Iiwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIGlmIHNlbGYucHJlZml4ICE9ICdDRlR5cGVSZWZPYmonOgorICAgICAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgICAgIE91dHB1dCgiLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovIikKKyAgICAgICAgICAgIE91dHB1dCgiaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcIk8mXCIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpIikKKyAgICAgICAgICAgIE91dExicmFjZSgpCisgICAgICAgICAgICBPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgICAgIE91dHB1dCgicmV0dXJuIDA7IikKKyAgICAgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCiAKIGNsYXNzIENGVHlwZVJlZk9iamVjdERlZmluaXRpb24oTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlwYXNzCi0JCi1jbGFzcyBDRkFycmF5UmVmT2JqZWN0RGVmaW5pdGlvbihNeUdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWJhc2V0eXBlID0gIkNGVHlwZVJlZl9UeXBlIgotCQotCWRlZiBvdXRwdXRSZXByKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCi0JCU91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRkFycmF5UmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKLQkJT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCi0JCU91dFJicmFjZSgpCi0JCi1jbGFzcyBDRk11dGFibGVBcnJheVJlZk9iamVjdERlZmluaXRpb24oTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQliYXNldHlwZSA9ICJDRkFycmF5UmVmX1R5cGUiCi0JCi0JZGVmIG91dHB1dFJlcHIoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKLQkJT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGTXV0YWJsZUFycmF5UmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKLQkJT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCi0JCU91dFJicmFjZSgpCi0JCi1jbGFzcyBDRkRpY3Rpb25hcnlSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JYmFzZXR5cGUgPSAiQ0ZUeXBlUmVmX1R5cGUiCi0JCi0JZGVmIG91dHB1dFJlcHIoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKLQkJT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGRGljdGlvbmFyeVJlZiBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQotCQotY2xhc3MgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdERlZmluaXRpb24oTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQliYXNldHlwZSA9ICJDRkRpY3Rpb25hcnlSZWZfVHlwZSIKLQkKLQlkZWYgb3V0cHV0UmVwcihzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiY2hhciBidWZbMTAwXTsiKQotCQlPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQotCQotY2xhc3MgQ0ZEYXRhUmVmT2JqZWN0RGVmaW5pdGlvbihNeUdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWJhc2V0eXBlID0gIkNGVHlwZVJlZl9UeXBlIgotCQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCU91dCgiIiIKLQkJaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCQlpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkJICAgIGNoYXIgKmNTdHI7Ci0JCSAgICBpbnQgY0xlbjsKLQkJICAgIGlmKCBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgJmNTdHIsICZjTGVuKSA8IDAgKSByZXR1cm4gMDsKLQkJICAgICpwX2l0c2VsZiA9IENGRGF0YUNyZWF0ZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgKHVuc2lnbmVkIGNoYXIgKiljU3RyLCBjTGVuKTsKLQkJICAgIHJldHVybiAxOwotCQl9Ci0JCSIiIikKKyAgICBwYXNzCiAKLQlkZWYgb3V0cHV0UmVwcihzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiY2hhciBidWZbMTAwXTsiKQotCQlPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZEYXRhUmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKLQkJT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCi0JCU91dFJicmFjZSgpCi0JCitjbGFzcyBDRkFycmF5UmVmT2JqZWN0RGVmaW5pdGlvbihNeUdsb2JhbE9iamVjdERlZmluaXRpb24pOgorICAgIGJhc2V0eXBlID0gIkNGVHlwZVJlZl9UeXBlIgorCisgICAgZGVmIG91dHB1dFJlcHIoc2VsZik6CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKKyAgICAgICAgT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGQXJyYXlSZWYgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQorICAgICAgICBPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKworY2xhc3MgQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6CisgICAgYmFzZXR5cGUgPSAiQ0ZBcnJheVJlZl9UeXBlIgorCisgICAgZGVmIG91dHB1dFJlcHIoc2VsZik6CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKKyAgICAgICAgT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGTXV0YWJsZUFycmF5UmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKK2NsYXNzIENGRGljdGlvbmFyeVJlZk9iamVjdERlZmluaXRpb24oTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKToKKyAgICBiYXNldHlwZSA9ICJDRlR5cGVSZWZfVHlwZSIKKworICAgIGRlZiBvdXRwdXRSZXByKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCisgICAgICAgIE91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRkRpY3Rpb25hcnlSZWYgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQorICAgICAgICBPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKworY2xhc3MgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdERlZmluaXRpb24oTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKToKKyAgICBiYXNldHlwZSA9ICJDRkRpY3Rpb25hcnlSZWZfVHlwZSIKKworICAgIGRlZiBvdXRwdXRSZXByKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCisgICAgICAgIE91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVEaWN0aW9uYXJ5UmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKK2NsYXNzIENGRGF0YVJlZk9iamVjdERlZmluaXRpb24oTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKToKKyAgICBiYXNldHlwZSA9ICJDRlR5cGVSZWZfVHlwZSIKKworICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisgICAgICAgIE91dCgiIiIKKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIGNoYXIgKmNTdHI7CisgICAgICAgICAgICBpbnQgY0xlbjsKKyAgICAgICAgICAgIGlmKCBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgJmNTdHIsICZjTGVuKSA8IDAgKSByZXR1cm4gMDsKKyAgICAgICAgICAgICpwX2l0c2VsZiA9IENGRGF0YUNyZWF0ZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgKHVuc2lnbmVkIGNoYXIgKiljU3RyLCBjTGVuKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgICIiIikKKworICAgIGRlZiBvdXRwdXRSZXByKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCisgICAgICAgIE91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRkRhdGFSZWYgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQorICAgICAgICBPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKwogY2xhc3MgQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdERlZmluaXRpb24oTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQliYXNldHlwZSA9ICJDRkRhdGFSZWZfVHlwZSIKLQkKLQlkZWYgb3V0cHV0UmVwcihzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiY2hhciBidWZbMTAwXTsiKQotCQlPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlRGF0YVJlZiBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQorICAgIGJhc2V0eXBlID0gIkNGRGF0YVJlZl9UeXBlIgorCisgICAgZGVmIG91dHB1dFJlcHIoc2VsZik6CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKKyAgICAgICAgT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGTXV0YWJsZURhdGFSZWYgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQorICAgICAgICBPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKIAogY2xhc3MgQ0ZTdHJpbmdSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JYmFzZXR5cGUgPSAiQ0ZUeXBlUmVmX1R5cGUiCi0JCi0JZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKLQkJT3V0KCIiIgotCQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JCWlmIChQeVN0cmluZ19DaGVjayh2KSkgewotCQkgICAgY2hhciAqY1N0cjsKLQkJICAgIGlmICghUHlBcmdfUGFyc2UodiwgImVzIiwgImFzY2lpIiwgJmNTdHIpKQotCQkgICAgCXJldHVybiBOVUxMOwotCQkJKnBfaXRzZWxmID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgY1N0ciwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JCQkvKiBXZSB1c2UgdGhlIENGIHR5cGVzIGhlcmUsIGlmIFB5dGhvbiB3YXMgY29uZmlndXJlZCBkaWZmZXJlbnRseSB0aGF0IHdpbGwgZ2l2ZSBhbiBlcnJvciAqLwotCQkJQ0ZJbmRleCBzaXplID0gUHlVbmljb2RlX0dldFNpemUodik7Ci0JCQlVbmlDaGFyICp1bmljaGFycyA9IFB5VW5pY29kZV9Bc1VuaWNvZGUodik7Ci0JCQlpZiAoIXVuaWNoYXJzKSByZXR1cm4gMDsKLQkJCSpwX2l0c2VsZiA9IENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoKENGQWxsb2NhdG9yUmVmKU5VTEwsIHVuaWNoYXJzLCBzaXplKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCQkKLQkJIiIiKQorICAgIGJhc2V0eXBlID0gIkNGVHlwZVJlZl9UeXBlIgogCi0JZGVmIG91dHB1dFJlcHIoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKLQkJT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGU3RyaW5nUmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKLQkJT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCi0JCU91dFJicmFjZSgpCisgICAgZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKKyAgICAgICAgT3V0KCIiIgorICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICAgICAgY2hhciAqY1N0cjsKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2UodiwgImVzIiwgImFzY2lpIiwgJmNTdHIpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsIGNTdHIsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAvKiBXZSB1c2UgdGhlIENGIHR5cGVzIGhlcmUsIGlmIFB5dGhvbiB3YXMgY29uZmlndXJlZCBkaWZmZXJlbnRseSB0aGF0IHdpbGwgZ2l2ZSBhbiBlcnJvciAqLworICAgICAgICAgICAgICAgIENGSW5kZXggc2l6ZSA9IFB5VW5pY29kZV9HZXRTaXplKHYpOworICAgICAgICAgICAgICAgIFVuaUNoYXIgKnVuaWNoYXJzID0gUHlVbmljb2RlX0FzVW5pY29kZSh2KTsKKyAgICAgICAgICAgICAgICBpZiAoIXVuaWNoYXJzKSByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLCB1bmljaGFycywgc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICAiIiIpCisKKyAgICBkZWYgb3V0cHV0UmVwcihzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiY2hhciBidWZbMTAwXTsiKQorICAgICAgICBPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQorICAgICAgICBPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKIAogY2xhc3MgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0RGVmaW5pdGlvbihDRlN0cmluZ1JlZk9iamVjdERlZmluaXRpb24pOgotCWJhc2V0eXBlID0gIkNGU3RyaW5nUmVmX1R5cGUiCi0JCi0JZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKLQkJIyBNdXRhYmxlLCBkb24ndCBhbGxvdyBQeXRob24gc3RyaW5ncwotCQlyZXR1cm4gTXlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKQotCQkKLQlkZWYgb3V0cHV0UmVwcihzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiY2hhciBidWZbMTAwXTsiKQotCQlPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlU3RyaW5nUmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKLQkJT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCi0JCU91dFJicmFjZSgpCisgICAgYmFzZXR5cGUgPSAiQ0ZTdHJpbmdSZWZfVHlwZSIKKworICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisgICAgICAgICMgTXV0YWJsZSwgZG9uJ3QgYWxsb3cgUHl0aG9uIHN0cmluZ3MKKyAgICAgICAgcmV0dXJuIE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZikKKworICAgIGRlZiBvdXRwdXRSZXByKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCisgICAgICAgIE91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQorICAgICAgICBPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKIAogY2xhc3MgQ0ZVUkxSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JYmFzZXR5cGUgPSAiQ0ZUeXBlUmVmX1R5cGUiCi0JCi0JZGVmIG91dHB1dFJlcHIoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKLQkJT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGVVJMIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKLQkJT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCi0JCU91dFJicmFjZSgpCisgICAgYmFzZXR5cGUgPSAiQ0ZUeXBlUmVmX1R5cGUiCisKKyAgICBkZWYgb3V0cHV0UmVwcihzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiY2hhciBidWZbMTAwXTsiKQorICAgICAgICBPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZVUkwgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQorICAgICAgICBPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKIAogCiAjIEFERCBvYmplY3QgY2xhc3MgaGVyZQpAQCAtNTU0LDEwICs1NTQsMTAgQEAKIAogaWYoIGRhdGEgPT0gTlVMTCApIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogaWYgKCBDRlN0cmluZ0dldENTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwgZGF0YSwgc2l6ZSwgMCkgKSB7Ci0JX3JlcyA9IChQeU9iamVjdCAqKVB5U3RyaW5nX0Zyb21TdHJpbmcoZGF0YSk7CisgICAgICAgIF9yZXMgPSAoUHlPYmplY3QgKilQeVN0cmluZ19Gcm9tU3RyaW5nKGRhdGEpOwogfSBlbHNlIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ0ZTdHJpbmdHZXRDU3RyaW5nIGNvdWxkIG5vdCBmaXQgdGhlIHN0cmluZyIpOwotCV9yZXMgPSBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ0ZTdHJpbmdHZXRDU3RyaW5nIGNvdWxkIG5vdCBmaXQgdGhlIHN0cmluZyIpOworICAgICAgICBfcmVzID0gTlVMTDsKIH0KIGZyZWUoZGF0YSk7CiByZXR1cm4gX3JlczsKQEAgLTYwNSwxNiArNjA1LDE2IEBACiBDRlN0cmluZ1JlZiBlcnJvclN0cmluZzsKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAogICAgICAgICAgICAgICAgICAgICAgICZtdXRhYmlsaXR5T3B0aW9uKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBfcnYgPSBDRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmlsaXR5T3B0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JTdHJpbmcpOwogaWYgKGVycm9yU3RyaW5nKQotCUNGUmVsZWFzZShlcnJvclN0cmluZyk7CisgICAgICAgIENGUmVsZWFzZShlcnJvclN0cmluZyk7CiBpZiAoX3J2ID09IE5VTEwpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiUGFyc2UgZXJyb3IgaW4gWE1MIGRhdGEiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIlBhcnNlIGVycm9yIGluIFhNTCBkYXRhIik7CisgICAgICAgIHJldHVybiBOVUxMOwogfQogX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7CkBAIC02MzksMTcgKzYzOSwxNyBAQAogQ0ZUeXBlSUQgdHlwZWlkOwogCiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsIFB5Q0ZfUHl0aG9uMkNGLCAmcnYpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIHR5cGVpZCA9IENGR2V0VHlwZUlEKHJ2KTsKIAogaWYgKHR5cGVpZCA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGU3RyaW5nUmVmT2JqX05ldywgcnYpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlN0cmluZ1JlZk9ial9OZXcsIHJ2KTsKIGlmICh0eXBlaWQgPT0gQ0ZBcnJheUdldFR5cGVJRCgpKQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGQXJyYXlSZWZPYmpfTmV3LCBydik7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGQXJyYXlSZWZPYmpfTmV3LCBydik7CiBpZiAodHlwZWlkID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGRGljdGlvbmFyeVJlZk9ial9OZXcsIHJ2KTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldywgcnYpOwogaWYgKHR5cGVpZCA9PSBDRlVSTEdldFR5cGVJRCgpKQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGVVJMUmVmT2JqX05ldywgcnYpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlVSTFJlZk9ial9OZXcsIHJ2KTsKIAogX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZUeXBlUmVmT2JqX05ldywgcnYpOwogcmV0dXJuIF9yZXM7CkBAIC02NjMsNCArNjYzLDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL2Nnc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2NnL2Nnc2Nhbi5weQppbmRleCA1ZDg0NTAwLi5iMmU3OTQ2IDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9jZy9jZ3NjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvY2cvY2dzY2FuLnB5CkBAIC04LDc3ICs4LDc3IEBACiAKIExPTkcgPSAiQ29yZUdyYXBoaWNzIgogU0hPUlQgPSAiY2ciCi1PQkpFQ1RTID0gKCJDR0NvbnRleHRSZWYiLCAKLQkJKQorT0JKRUNUUyA9ICgiQ0dDb250ZXh0UmVmIiwKKyAgICAgICAgICAgICAgICApCiAjIEFERCBvYmplY3QgdHlwZW5hbWVzIGhlcmUKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IFsKLQkJIkNHQ29udGV4dC5oIiwKLQldCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gWworICAgICAgICAgICAgIkNHQ29udGV4dC5oIiwKKyAgICBdCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcl9PU1gpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0IGluIE9CSkVDVFMgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCi0JCQkjIFNwZWNpYWwgY2FzZSBmb3IgdGhlIHNpbGx5IGZpcnN0IEFsbG9jYXRvclJlZiBhcmd1bWVudAotCQkJaWYgdCA9PSAnQ0ZBbGxvY2F0b3JSZWYnIGFuZCBtID09ICdJbk1vZGUnIGFuZCBsZW4oYXJnbGlzdCkgPiAxOgotCQkJCXQsIG4sIG0gPSBhcmdsaXN0WzFdCi0JCQkJaWYgdCBpbiBPQkpFQ1RTIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCQljbGFzc25hbWUgPSAiTWV0aG9kU2tpcEFyZzEiCi0JCQkJCWxpc3RuYW1lID0gdCArICJfbWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgIGlmIHQgaW4gT0JKRUNUUyBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gdCArICJfbWV0aG9kcyIKKyAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciB0aGUgc2lsbHkgZmlyc3QgQWxsb2NhdG9yUmVmIGFyZ3VtZW50CisgICAgICAgICAgICBpZiB0ID09ICdDRkFsbG9jYXRvclJlZicgYW5kIG0gPT0gJ0luTW9kZScgYW5kIGxlbihhcmdsaXN0KSA+IDE6CisgICAgICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMV0KKyAgICAgICAgICAgICAgICBpZiB0IGluIE9CSkVDVFMgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2RTa2lwQXJnMSIKKyAgICAgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSB0ICsgIl9tZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkNHQ29udGV4dFJldGFpbiIsCi0JCQkiQ0dDb250ZXh0UmVsZWFzZSIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiQ0dDb250ZXh0UmV0YWluIiwKKyAgICAgICAgICAgICAgICAiQ0dDb250ZXh0UmVsZWFzZSIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VncmV5bGlzdChzZWxmKToKLQkJcmV0dXJuIFtdCisgICAgZGVmIG1ha2VncmV5bGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIFtdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJImZsb2F0X3B0ciIsCi0JCQkiQ0dSZWN0X3B0ciIsCi0JCQkiQ0dQb2ludF9wdHIiLAotCQkJIkNHQ29sb3JTcGFjZVJlZiIsCi0JCQkiQ0dDb2xvclJlbmRlcmluZ0ludGVudCIsCi0JCQkiQ0dGb250UmVmIiwKLSMJCQkiY2hhcl9wdHIiLAotCQkJIkNHR2x5cGhfcHRyIiwKLQkJCSJDR0ltYWdlUmVmIiwKLQkJCSJDR1BERkRvY3VtZW50UmVmIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJmbG9hdF9wdHIiLAorICAgICAgICAgICAgICAgICJDR1JlY3RfcHRyIiwKKyAgICAgICAgICAgICAgICAiQ0dQb2ludF9wdHIiLAorICAgICAgICAgICAgICAgICJDR0NvbG9yU3BhY2VSZWYiLAorICAgICAgICAgICAgICAgICJDR0NvbG9yUmVuZGVyaW5nSW50ZW50IiwKKyAgICAgICAgICAgICAgICAiQ0dGb250UmVmIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICJjaGFyX3B0ciIsCisgICAgICAgICAgICAgICAgIkNHR2x5cGhfcHRyIiwKKyAgICAgICAgICAgICAgICAiQ0dJbWFnZVJlZiIsCisgICAgICAgICAgICAgICAgIkNHUERGRG9jdW1lbnRSZWYiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoImNoYXJfcHRyIiwgImNzdHJpbmciLCAiSW5Nb2RlIiksICgic2l6ZV90IiwgImxlbmd0aCIsICJJbk1vZGUiKV0sCi0JCQkgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKLSMJCQkoWygiY2hhcl9wdHIiLCAibmFtZSIsICJJbk1vZGUiKSxdLAotIwkJCSBbKCJDQ0NDQyIsICIqIiwgIioiKV0pLAotCQkJXQotCQkJCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgKFsoImNoYXJfcHRyIiwgImNzdHJpbmciLCAiSW5Nb2RlIiksICgic2l6ZV90IiwgImxlbmd0aCIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCisjICAgICAgICAgICAgICAgICAgICAgICAoWygiY2hhcl9wdHIiLCAibmFtZSIsICJJbk1vZGUiKSxdLAorIyAgICAgICAgICAgICAgICAgICAgICAgIFsoIkNDQ0NDIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2cvY2dzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvY2cvY2dzdXBwb3J0LnB5CmluZGV4IDdkYzJkNTQuLjZlZWRmYmUgMTAwNzU1Ci0tLSBhL01hYy9Nb2R1bGVzL2NnL2Nnc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9jZy9jZ3N1cHBvcnQucHkKQEAgLTgsMTIgKzgsMTIgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTU9ETkFNRSA9ICdfQ0cnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorTU9ETkFNRSA9ICdfQ0cnICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnQ0cnCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworTU9EUFJFRklYID0gJ0NHJyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTM0LDc0ICszNCw3NCBAQAogUHlPYmplY3QgKkNHUG9pbnRfTmV3KENHUG9pbnQgKml0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmYpIiwKLQkJCWl0c2VsZi0+eCwKLQkJCWl0c2VsZi0+eSk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+eSk7CiB9CiAKIGludAogQ0dQb2ludF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDR1BvaW50ICpwX2l0c2VsZikKIHsKLQlpZiggIVB5QXJnX1BhcnNlKHYsICIoZmYpIiwKLQkJCSZwX2l0c2VsZi0+eCwKLQkJCSZwX2l0c2VsZi0+eSkgKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICAgICAgaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPngsCisgICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnkpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDE7CiB9CiAKIFB5T2JqZWN0ICpDR1JlY3RfTmV3KENHUmVjdCAqaXRzZWxmKQogewogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZmZmKSIsCi0JCQlpdHNlbGYtPm9yaWdpbi54LAotCQkJaXRzZWxmLT5vcmlnaW4ueSwKLQkJCWl0c2VsZi0+c2l6ZS53aWR0aCwKLQkJCWl0c2VsZi0+c2l6ZS5oZWlnaHQpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+b3JpZ2luLngsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPm9yaWdpbi55LAorICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5zaXplLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5zaXplLmhlaWdodCk7CiB9CiAKIGludAogQ0dSZWN0X0NvbnZlcnQoUHlPYmplY3QgKnYsIENHUmVjdCAqcF9pdHNlbGYpCiB7Ci0JaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmZmYpIiwKLQkJCSZwX2l0c2VsZi0+b3JpZ2luLngsCi0JCQkmcF9pdHNlbGYtPm9yaWdpbi55LAotCQkJJnBfaXRzZWxmLT5zaXplLndpZHRoLAotCQkJJnBfaXRzZWxmLT5zaXplLmhlaWdodCkgKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICAgICAgaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+b3JpZ2luLngsCisgICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi55LAorICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5zaXplLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5zaXplLmhlaWdodCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gMTsKIH0KIAogUHlPYmplY3QgKkNHQWZmaW5lVHJhbnNmb3JtX05ldyhDR0FmZmluZVRyYW5zZm9ybSAqaXRzZWxmKQogewogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZmZmZmYpIiwKLQkJCWl0c2VsZi0+YSwKLQkJCWl0c2VsZi0+YiwKLQkJCWl0c2VsZi0+YywKLQkJCWl0c2VsZi0+ZCwKLQkJCWl0c2VsZi0+dHgsCi0JCQlpdHNlbGYtPnR5KTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZmZmZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+YywKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+dHgsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnR5KTsKIH0KIAogaW50CiBDR0FmZmluZVRyYW5zZm9ybV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDR0FmZmluZVRyYW5zZm9ybSAqcF9pdHNlbGYpCiB7Ci0JaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmZmZmZikiLAotCQkJJnBfaXRzZWxmLT5hLAotCQkJJnBfaXRzZWxmLT5iLAotCQkJJnBfaXRzZWxmLT5jLAotCQkJJnBfaXRzZWxmLT5kLAotCQkJJnBfaXRzZWxmLT50eCwKLQkJCSZwX2l0c2VsZi0+dHkpICkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgIihmZmZmZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+YywKKyAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+dHgsCisgICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnR5KSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAxOwogfQogIiIiCiAKIGNsYXNzIE15T3BhcXVlQnlWYWx1ZVR5cGUoT3BhcXVlQnlWYWx1ZVR5cGUpOgotCSIiIlNvcnQgb2YgYSBtaXggYmV0d2VlbiBPcGFxdWVCeVZhbHVlVHlwZSBhbmQgT3BhcXVlVHlwZS4iIiIKLQlkZWYgbWt2YWx1ZUFyZ3Moc2VsZiwgbmFtZSk6Ci0JCXJldHVybiAiJXMsICYlcyIgJSAoc2VsZi5uZXcsIG5hbWUpCisgICAgIiIiU29ydCBvZiBhIG1peCBiZXR3ZWVuIE9wYXF1ZUJ5VmFsdWVUeXBlIGFuZCBPcGFxdWVUeXBlLiIiIgorICAgIGRlZiBta3ZhbHVlQXJncyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuICIlcywgJiVzIiAlIChzZWxmLm5ldywgbmFtZSkKIAogQ0dQb2ludCA9IE15T3BhcXVlQnlWYWx1ZVR5cGUoJ0NHUG9pbnQnLCAnQ0dQb2ludCcpCiBDR1JlY3QgPSBNeU9wYXF1ZUJ5VmFsdWVUeXBlKCdDR1JlY3QnLCAnQ0dSZWN0JykKQEAgLTEyMSwxMCArMTIxLDEwIEBACiAKIAogY2xhc3MgTXlPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPdXRwdXQoIkNHQ29udGV4dFJlbGVhc2Uoc2VsZi0+b2JfaXRzZWxmKTsiKQorICAgIGRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICBkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE91dHB1dCgiQ0dDb250ZXh0UmVsZWFzZShzZWxmLT5vYl9pdHNlbGYpOyIpCiAKIAogIyBDcmVhdGUgdGhlIGdlbmVyYXRvciBncm91cHMgYW5kIGxpbmsgdGhlbQpAQCAtMTY5LDExICsxNjksMTEgQEAKIE9TU3RhdHVzIF9lcnI7CiAKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiBfZXJyID0gQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydChwb3J0LCAmY3R4KTsKIGlmIChfZXJyICE9IG5vRXJyKQotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDR0NvbnRleHRSZWZPYmpfTmV3LCBjdHgpOwogcmV0dXJuIF9yZXM7CiAiIiIKQEAgLTE4NSw5ICsxODUsOCBAQAogCiAjIEFERCBhZGQgZm9ybG9vcCBoZXJlCiBmb3IgZiBpbiBDR0NvbnRleHRSZWZfbWV0aG9kczoKLQlDR0NvbnRleHRSZWZfb2JqZWN0LmFkZChmKQorICAgIENHQ29udGV4dFJlZl9vYmplY3QuYWRkKGYpCiAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NtL2Ntc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2NtL2Ntc2Nhbi5weQppbmRleCA2ZTU2Y2IyLi4wODdmMjM5IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jbS9jbXNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvY20vY21zY2FuLnB5CkBAIC0xMCw4MCArMTAsODAgQEAKIFNIT1JUID0gImNtIgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gIkNvbXBvbmVudHMuaCIKLQlvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9ICJDb21wb25lbnRzLmgiCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJIwotCQkJIyBGaW5kTmV4dENvbXBvbmVudCBpcyBhIHNwZWNpYWwgY2FzZSwgc2luY2UgaXQgY2FsbCBhbHNvIGJlIGNhbGxlZAotCQkJIyB3aXRoIE5vbmUgYXMgdGhlIGFyZ3VtZW50LiBIZW5jZSwgd2UgbWFrZSBpdCBhIGZ1bmN0aW9uCi0JCQkjCi0JCQlpZiB0ID09ICJDb21wb25lbnQiIGFuZCBtID09ICJJbk1vZGUiIGFuZCBuYW1lICE9ICJGaW5kTmV4dENvbXBvbmVudCI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJjX21ldGhvZHMiCi0JCQllbGlmIHQgPT0gIkNvbXBvbmVudEluc3RhbmNlIiBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gImNpX21ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIEZpbmROZXh0Q29tcG9uZW50IGlzIGEgc3BlY2lhbCBjYXNlLCBzaW5jZSBpdCBjYWxsIGFsc28gYmUgY2FsbGVkCisgICAgICAgICAgICAjIHdpdGggTm9uZSBhcyB0aGUgYXJndW1lbnQuIEhlbmNlLCB3ZSBtYWtlIGl0IGEgZnVuY3Rpb24KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIGlmIHQgPT0gIkNvbXBvbmVudCIgYW5kIG0gPT0gIkluTW9kZSIgYW5kIG5hbWUgIT0gIkZpbmROZXh0Q29tcG9uZW50IjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gImNfbWV0aG9kcyIKKyAgICAgICAgICAgIGVsaWYgdCA9PSAiQ29tcG9uZW50SW5zdGFuY2UiIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAiY2lfbWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJPcGVuQURlZmF1bHRDb21wb25lbnQiLAotCQkJIkdldENvbXBvbmVudFR5cGVNb2RTZWVkIiwKLQkJCSJPcGVuQUNvbXBvbmVudFJlc0ZpbGUiLAotCQkJIkNhbGxDb21wb25lbnRVbnJlZ2lzdGVyIiwKLQkJCSJDYWxsQ29tcG9uZW50VGFyZ2V0IiwKLQkJCSJDYWxsQ29tcG9uZW50UmVnaXN0ZXIiLAotCQkJIkNhbGxDb21wb25lbnRWZXJzaW9uIiwKLQkJCSJDYWxsQ29tcG9uZW50Q2FuRG8iLAotCQkJIkNhbGxDb21wb25lbnRDbG9zZSIsCi0JCQkiQ2FsbENvbXBvbmVudE9wZW4iLAotCQkJIk9wZW5BQ29tcG9uZW50IiwKLQkJCSJHZXRDb21wb25lbnRQdWJsaWNSZXNvdXJjZSIsICMgTWlzc2luZyBpbiBDVyBQcm8gNgotCQkJIkNhbGxDb21wb25lbnRHZXRQdWJsaWNSZXNvdXJjZSIsICMgTWlzc2luZyBpbiBDVyBQcm8gNgotCQkJJ1NldENvbXBvbmVudEluc3RhbmNlQTUnLAotCQkJJ0dldENvbXBvbmVudEluc3RhbmNlQTUnLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIk9wZW5BRGVmYXVsdENvbXBvbmVudCIsCisgICAgICAgICAgICAgICAgIkdldENvbXBvbmVudFR5cGVNb2RTZWVkIiwKKyAgICAgICAgICAgICAgICAiT3BlbkFDb21wb25lbnRSZXNGaWxlIiwKKyAgICAgICAgICAgICAgICAiQ2FsbENvbXBvbmVudFVucmVnaXN0ZXIiLAorICAgICAgICAgICAgICAgICJDYWxsQ29tcG9uZW50VGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAiQ2FsbENvbXBvbmVudFJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAiQ2FsbENvbXBvbmVudFZlcnNpb24iLAorICAgICAgICAgICAgICAgICJDYWxsQ29tcG9uZW50Q2FuRG8iLAorICAgICAgICAgICAgICAgICJDYWxsQ29tcG9uZW50Q2xvc2UiLAorICAgICAgICAgICAgICAgICJDYWxsQ29tcG9uZW50T3BlbiIsCisgICAgICAgICAgICAgICAgIk9wZW5BQ29tcG9uZW50IiwKKyAgICAgICAgICAgICAgICAiR2V0Q29tcG9uZW50UHVibGljUmVzb3VyY2UiLCAjIE1pc3NpbmcgaW4gQ1cgUHJvIDYKKyAgICAgICAgICAgICAgICAiQ2FsbENvbXBvbmVudEdldFB1YmxpY1Jlc291cmNlIiwgIyBNaXNzaW5nIGluIENXIFBybyA2CisgICAgICAgICAgICAgICAgJ1NldENvbXBvbmVudEluc3RhbmNlQTUnLAorICAgICAgICAgICAgICAgICdHZXRDb21wb25lbnRJbnN0YW5jZUE1JywKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIlJlc291cmNlU3BlYyIsCi0JCQkiQ29tcG9uZW50UmVzb3VyY2UiLAotCQkJIkNvbXBvbmVudFBsYXRmb3JtSW5mbyIsCi0JCQkiQ29tcG9uZW50UmVzb3VyY2VFeHRlbnNpb24iLAotCQkJIkNvbXBvbmVudFBsYXRmb3JtSW5mb0FycmF5IiwKLQkJCSJFeHRDb21wb25lbnRSZXNvdXJjZSIsCi0JCQkiQ29tcG9uZW50UGFyYW1ldGVycyIsCi0JCQkKLQkJCSJDb21wb25lbnRSb3V0aW5lVVBQIiwKLQkJCSJDb21wb25lbnRNUFdvcmtGdW5jdGlvblVQUCIsCi0JCQkiQ29tcG9uZW50RnVuY3Rpb25VUFAiLAotCQkJIkdldE1pc3NpbmdDb21wb25lbnRSZXNvdXJjZVVQUCIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiUmVzb3VyY2VTcGVjIiwKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50UmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICJDb21wb25lbnRQbGF0Zm9ybUluZm8iLAorICAgICAgICAgICAgICAgICJDb21wb25lbnRSZXNvdXJjZUV4dGVuc2lvbiIsCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudFBsYXRmb3JtSW5mb0FycmF5IiwKKyAgICAgICAgICAgICAgICAiRXh0Q29tcG9uZW50UmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICJDb21wb25lbnRQYXJhbWV0ZXJzIiwKIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoJ0NvbXBvbmVudERlc2NyaXB0aW9uJywgJ2xvb2tpbmcnLCAnT3V0TW9kZScpXSwKLQkJCSBbKCdDb21wb25lbnREZXNjcmlwdGlvbicsICcqJywgJ0luTW9kZScpXSksCi0JCQldCi0JCQkKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50Um91dGluZVVQUCIsCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudE1QV29ya0Z1bmN0aW9uVVBQIiwKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50RnVuY3Rpb25VUFAiLAorICAgICAgICAgICAgICAgICJHZXRNaXNzaW5nQ29tcG9uZW50UmVzb3VyY2VVUFAiLAorICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCdDb21wb25lbnREZXNjcmlwdGlvbicsICdsb29raW5nJywgJ091dE1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ0NvbXBvbmVudERlc2NyaXB0aW9uJywgJyonLCAnSW5Nb2RlJyldKSwKKyAgICAgICAgICAgICAgICBdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jbS9jbXN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9jbS9jbXN1cHBvcnQucHkKaW5kZXggOTgwMThjNC4uNDEwOWRiYSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY20vY21zdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2NtL2Ntc3VwcG9ydC5weQpAQCAtNiwxNSArNiwxNSBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ0NvbXBvbmVudHMuaCcJCSMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCi1NT0ROQU1FID0gJ19DbScJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitNQUNIRUFERVJGSUxFID0gJ0NvbXBvbmVudHMuaCcgICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnX0NtJyAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0NtJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLUNfT0JKRUNUUFJFRklYID0gJ0NtcE9iaicJIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcworTU9EUFJFRklYID0gJ0NtJyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK0NfT0JKRUNUUFJFRklYID0gJ0NtcE9iaicgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogQ0lfT0JKRUNUUFJFRklYID0gJ0NtcEluc3RPYmonCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC00MiwzMCArNDIsMzAgQEAKIENtcERlc2NfTmV3KENvbXBvbmVudERlc2NyaXB0aW9uICppdHNlbGYpCiB7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZPJk8mbGwiLCAKLQkJUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50VHlwZSwKLQkJUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKLQkJUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50TWFudWZhY3R1cmVyLAotCQlpdHNlbGYtPmNvbXBvbmVudEZsYWdzLCBpdHNlbGYtPmNvbXBvbmVudEZsYWdzTWFzayk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJk8mTyZsbCIsCisgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50VHlwZSwKKyAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5jb21wb25lbnRTdWJUeXBlLAorICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudE1hbnVmYWN0dXJlciwKKyAgICAgICAgICAgICAgICBpdHNlbGYtPmNvbXBvbmVudEZsYWdzLCBpdHNlbGYtPmNvbXBvbmVudEZsYWdzTWFzayk7CiB9CiAKIHN0YXRpYyBpbnQKIENtcERlc2NfQ29udmVydChQeU9iamVjdCAqdiwgQ29tcG9uZW50RGVzY3JpcHRpb24gKnBfaXRzZWxmKQogewotCXJldHVybiBQeUFyZ19QYXJzZVR1cGxlKHYsICJPJk8mTyZsbCIsCi0JCVB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRUeXBlLAotCQlQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKLQkJUHlNYWNfR2V0T1NUeXBlLCAmcF9pdHNlbGYtPmNvbXBvbmVudE1hbnVmYWN0dXJlciwKLQkJJnBfaXRzZWxmLT5jb21wb25lbnRGbGFncywgJnBfaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOworICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRUeXBlLAorICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRTdWJUeXBlLAorICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRNYW51ZmFjdHVyZXIsCisgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5jb21wb25lbnRGbGFncywgJnBfaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOwogfQogCiAiIiIKIAogaW5pdHN0dWZmID0gaW5pdHN0dWZmICsgIiIiCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50LCBDbXBPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50LCBDbXBPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudCwgQ21wT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnQsIENtcE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudEluc3RhbmNlLCBDbXBJbnN0T2JqX0NvbnZlcnQpOwogIiIiCiAKIENvbXBvbmVudERlc2NyaXB0aW9uID0gT3BhcXVlVHlwZSgnQ29tcG9uZW50RGVzY3JpcHRpb24nLCAnQ21wRGVzYycpCkBAIC03NiwzMCArNzYsMzAgQEAKIENvbXBvbmVudFJlc291cmNlSGFuZGxlID0gT3BhcXVlQnlWYWx1ZVR5cGUoIkNvbXBvbmVudFJlc291cmNlSGFuZGxlIiwgIlJlc09iaiIpCiAKIGNsYXNzIE15Q0lPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiIiJpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKENtX0Vycm9yLCJOVUxMIENvbXBvbmVudEluc3RhbmNlIik7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0iIiIpCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbV9FcnJvciwiTlVMTCBDb21wb25lbnRJbnN0YW5jZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0iIiIpCiAKIGNsYXNzIE15Q09iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgewotCQkJCQkvKiBYWFhYIE9yIHNob3VsZCB3ZSByZXR1cm4gTm9uZT8gKi8KLQkJCQkJUHlFcnJfU2V0U3RyaW5nKENtX0Vycm9yLCJObyBzdWNoIGNvbXBvbmVudCIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9IiIiKQotCQkJCQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCU91dHB1dCgiIiJpZiAoIHYgPT0gUHlfTm9uZSApIHsKLQkJCQkJKnBfaXRzZWxmID0gMDsKLQkJCQkJcmV0dXJuIDE7Ci0JCX0iIiIpCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHJldHVybiBOb25lPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5vIHN1Y2ggY29tcG9uZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSIiIikKKworICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiIiJpZiAoIHYgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0iIiIpCiAKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgZ3JvdXBzIGFuZCBsaW5rIHRoZW0KIG1vZHVsZSA9IE1hY01vZHVsZShNT0ROQU1FLCBNT0RQUkVGSVgsIGluY2x1ZGVzdHVmZiwgZmluYWxzdHVmZiwgaW5pdHN0dWZmKQogY2lfb2JqZWN0ID0gTXlDSU9iamVjdERlZmluaXRpb24oJ0NvbXBvbmVudEluc3RhbmNlJywgQ0lfT0JKRUNUUFJFRklYLAotCQknQ29tcG9uZW50SW5zdGFuY2UnKQorICAgICAgICAgICAgICAgICdDb21wb25lbnRJbnN0YW5jZScpCiBjX29iamVjdCA9IE15Q09iamVjdERlZmluaXRpb24oJ0NvbXBvbmVudCcsIENfT0JKRUNUUFJFRklYLCAnQ29tcG9uZW50JykKIG1vZHVsZS5hZGRvYmplY3QoY2lfb2JqZWN0KQogbW9kdWxlLmFkZG9iamVjdChjX29iamVjdCkKQEAgLTEyMyw0ICsxMjMsMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY3RsL2N0bGVkaXQucHkgYi9NYWMvTW9kdWxlcy9jdGwvY3RsZWRpdC5weQppbmRleCA2YmEwMjRiLi5mZGQ5NzEyIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jdGwvY3RsZWRpdC5weQorKysgYi9NYWMvTW9kdWxlcy9jdGwvY3RsZWRpdC5weQpAQCAtOCw3ICs4LDcgQEAKIGZ1bmN0aW9ucy5hcHBlbmQoZikKIAogZiA9IEZ1bmN0aW9uKENvbnRyb2xIYW5kbGUsICdhc19Db250cm9sJywKLQkoSGFuZGxlLCAnaCcsIEluTW9kZSkpCisgICAgICAgIChIYW5kbGUsICdoJywgSW5Nb2RlKSkKIGZ1bmN0aW9ucy5hcHBlbmQoZikKIAogZiA9IE1ldGhvZChIYW5kbGUsICdhc19SZXNvdXJjZScsIChDb250cm9sSGFuZGxlLCAnY3RsJywgSW5Nb2RlKSkKQEAgLTE4LDE2ICsxOCwxNiBAQAogbWV0aG9kcy5hcHBlbmQoZikKIAogRGlzcG9zZUNvbnRyb2xfYm9keSA9ICIiIgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIF9zZWxmLT5vYl9pdHNlbGYgKSB7Ci0JCVNldENvbnRyb2xSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwgKGxvbmcpMCk7IC8qIE1ha2UgaXQgZm9yZ2V0IGFib3V0IHVzICovCi0JCURpc3Bvc2VDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOwotCQlfc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCBfc2VsZi0+b2JfaXRzZWxmICkgeworICAgICAgICAgICAgICAgIFNldENvbnRyb2xSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwgKGxvbmcpMCk7IC8qIE1ha2UgaXQgZm9yZ2V0IGFib3V0IHVzICovCisgICAgICAgICAgICAgICAgRGlzcG9zZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAiIiIKIAogZiA9IE1hbnVhbEdlbmVyYXRvcigiRGlzcG9zZUNvbnRyb2wiLCBEaXNwb3NlQ29udHJvbF9ib2R5KQpAQCAtMzksNyArMzksNyBAQAogIyBwYXJhbWV0ZXI7IHRoZXNlIHNob3VsZCBob3dldmVyIGJlIG1hbmFnZWQgYnkgdXMgKHdlJ3JlIGNyZWF0aW5nIHRoZW0KICMgYWZ0ZXIgYWxsKSwgc28gc2V0IHRoZSB0eXBlIHRvIENvbnRyb2xSZWYuCiBmb3IgZiBpbiBmdW5jdGlvbnM6Ci0JaWYgZi5uYW1lLnN0YXJ0c3dpdGgoIkNyZWF0ZSIpOgotCQl2ID0gZi5hcmd1bWVudExpc3RbLTFdCi0JCWlmIHYudHlwZSA9PSBFeGlzdGluZ0NvbnRyb2xIYW5kbGU6Ci0JCQl2LnR5cGUgPSBDb250cm9sUmVmCisgICAgaWYgZi5uYW1lLnN0YXJ0c3dpdGgoIkNyZWF0ZSIpOgorICAgICAgICB2ID0gZi5hcmd1bWVudExpc3RbLTFdCisgICAgICAgIGlmIHYudHlwZSA9PSBFeGlzdGluZ0NvbnRyb2xIYW5kbGU6CisgICAgICAgICAgICB2LnR5cGUgPSBDb250cm9sUmVmCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jdGwvY3Rsc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2N0bC9jdGxzY2FuLnB5CmluZGV4IDgxODU0MWUuLjI1MzMzZjEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2N0bC9jdGxzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2N0bC9jdGxzY2FuLnB5CkBAIC03LDE2NiArNywxNjYgQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyCiAKIGRlZiBtYWluKCk6Ci0jCWlucHV0ID0gIkNvbnRyb2xzLmgiICMgVW5pdmVyc2FsIEhlYWRlcnMgPCAzLjMKLQlpbnB1dCA9IFsiQ29udHJvbHMuaCIsICJDb250cm9sRGVmaW5pdGlvbnMuaCJdICMgVW5pdmVyc2FsIEhlYWRlcnMgPj0gMy4zCi0Jb3V0cHV0ID0gImN0bGdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJDb250cm9scy5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBkb2luZyAnaW1wb3J0IGN0bHN1cHBvcnQnID09PSIKLQlpbXBvcnQgY3Rsc3VwcG9ydAotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgQ3RsbW9kdWxlLmMgPT09IgorIyAgICAgICBpbnB1dCA9ICJDb250cm9scy5oIiAjIFVuaXZlcnNhbCBIZWFkZXJzIDwgMy4zCisgICAgaW5wdXQgPSBbIkNvbnRyb2xzLmgiLCAiQ29udHJvbERlZmluaXRpb25zLmgiXSAjIFVuaXZlcnNhbCBIZWFkZXJzID49IDMuMworICAgIG91dHB1dCA9ICJjdGxnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiQ29udHJvbHMucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgZG9pbmcgJ2ltcG9ydCBjdGxzdXBwb3J0JyA9PT0iCisgICAgaW1wb3J0IGN0bHN1cHBvcnQKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIEN0bG1vZHVsZS5jID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0IGluICgiQ29udHJvbEhhbmRsZSIsICJDb250cm9sUmVmIikgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCBpbiAoIkNvbnRyb2xIYW5kbGUiLCAiQ29udHJvbFJlZiIpIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAibWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJmcm9tIENhcmJvbi5UZXh0RWRpdCBpbXBvcnQgKlxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uUXVpY2tEcmF3IGltcG9ydCAqXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJmcm9tIENhcmJvbi5EcmFnY29uc3QgaW1wb3J0ICpcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLkNhcmJvbkV2ZW50cyBpbXBvcnQgKlxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uQXBwZWFyYW5jZSBpbXBvcnQgKlxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgia0RhdGFCcm93c2VySXRlbUFueVN0YXRlID0gLTFcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtDb250cm9sQmV2ZWxCdXR0b25DZW50ZXJQb3B1cEdseXBoVGFnID0gLTFcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtEYXRhQnJvd3NlckNsaWVudFByb3BlcnR5RmxhZ3NNYXNrID0gMHhGRjAwMDAwMFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiXG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJmcm9tIENhcmJvbi5UZXh0RWRpdCBpbXBvcnQgKlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uUXVpY2tEcmF3IGltcG9ydCAqXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJmcm9tIENhcmJvbi5EcmFnY29uc3QgaW1wb3J0ICpcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLkNhcmJvbkV2ZW50cyBpbXBvcnQgKlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uQXBwZWFyYW5jZSBpbXBvcnQgKlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgia0RhdGFCcm93c2VySXRlbUFueVN0YXRlID0gLTFcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImtDb250cm9sQmV2ZWxCdXR0b25DZW50ZXJQb3B1cEdseXBoVGFnID0gLTFcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImtEYXRhQnJvd3NlckNsaWVudFByb3BlcnR5RmxhZ3NNYXNrID0gMHhGRjAwMDAwMFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiXG4iKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSdGaW5kQ29udHJvbFVuZGVyTW91c2UnLCAjIEdlbmVyYXRlZCBtYW51YWxseSwgcmV0dXJucyBhbiBleGlzdGluZyBjb250cm9sLCBub3QgYSBuZXcgb25lLgotCQkJJ0Rpc3Bvc2VDb250cm9sJywgIyBHZW5lcmF0ZWQgbWFudWFsbHkKLQkJCSdLaWxsQ29udHJvbHMnLCAjIEltcGxpZWQgYnkgY2xvc2Ugb2YgZGlhbG9nCi0JCQknU2V0Q3RsQWN0aW9uJywKLQkJCSdUcmFja0NvbnRyb2wnLAkjIEdlbmVyYXRlZCBtYW51YWxseQotCQkJJ0hhbmRsZUNvbnRyb2xDbGljaycsCSMgR2VuZXJhdGVkIG1hbnVhbGx5Ci0JCQknU2V0Q29udHJvbERhdGEnLAkjIEdlbmVyYXRlZCBtYW51YWxseQotCQkJJ0dldENvbnRyb2xEYXRhJywJIyBHZW5lcmF0ZWQgbWFudWFsbHkKLQkJCSdrQ29udHJvbEJldmVsQnV0dG9uQ2VudGVyUG9wdXBHbHlwaFRhZycsICMgQ29uc3RhbnQgd2l0aCBmdW5ueSBkZWZpbml0aW9uCi0JCQkna0RhdGFCcm93c2VyQ2xpZW50UHJvcGVydHlGbGFnc01hc2snLCAgIyBkaXR0bwotCQkJJ2tEYXRhQnJvd3Nlckl0ZW1BbnlTdGF0ZScsICAgIyBhbmQgZGl0dG8KLQkJCSMgVGhlIGZvbGxvd2luZyBhcmUgdW5hdmFpbGFibGUgZm9yIHN0YXRpYyA2OGsgKGFwcGVhcmFuY2UgbWFuYWdlcikKLSMjCQkJJ0dldEJldmVsQnV0dG9uTWVudVZhbHVlJywKLSMjCQkJJ1NldEJldmVsQnV0dG9uTWVudVZhbHVlJywKLSMjCQkJJ0dldEJldmVsQnV0dG9uTWVudUhhbmRsZScsCi0jIwkJCSdTZXRCZXZlbEJ1dHRvblRyYW5zZm9ybScsCi0JCQknU2V0QmV2ZWxCdXR0b25HcmFwaGljQWxpZ25tZW50JywKLQkJCSdTZXRCZXZlbEJ1dHRvblRleHRBbGlnbm1lbnQnLAotCQkJJ1NldEJldmVsQnV0dG9uVGV4dFBsYWNlbWVudCcsCi0jIwkJCSdTZXRJbWFnZVdlbGxUcmFuc2Zvcm0nLAotIyMJCQknR2V0VGFiQ29udGVudFJlY3QnLAotIyMJCQknU2V0VGFiRW5hYmxlZCcsCi0jIwkJCSdTZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUnLAotIyMgCQkJIyBVbmF2YWlsYWJsZSBpbiBDVyBQcm8gMyBsaWJyYXJpZXMKLSMjIAkJCSdTZXRVcENvbnRyb2xUZXh0Q29sb3InLAotIyMgCQkJIyBVbmF2YWlsYWJsZSBpbiBKYWNrJ3MgQ1cgUHJvIDUuMSBsaWJyYXJpZXMKLSMjIAkJCSdHZXRDb250cm9sUmVnaW9uJywKLSMjIAkJCSdSZW1vdmVDb250cm9sUHJvcGVydHknLAotIyMgCQkJJ0lzVmFsaWRDb250cm9sSGFuZGxlJywKLSMjIAkJCSdTZXRDb250cm9sMzJCaXRNaW5pbXVtJywKLSMjIAkJCSdHZXRDb250cm9sMzJCaXRNaW5pbXVtJywKLSMjIAkJCSdTZXRDb250cm9sMzJCaXRNYXhpbXVtJywKLSMjIAkJCSdHZXRDb250cm9sMzJCaXRNYXhpbXVtJywKLSMjIAkJCSdTZXRDb250cm9sMzJCaXRWYWx1ZScsCi0jIyAJCQknR2V0Q29udHJvbDMyQml0VmFsdWUnLAotIyMgCQkJJ1NldENvbnRyb2xWaWV3U2l6ZScsCi0jIyAJCQknR2V0Q29udHJvbFZpZXdTaXplJywKLQkJCSMgR2VuZXJhbGx5IEJhZCBOZXdzCi0JCQknR2V0Q29udHJvbFByb3BlcnR5JywKLQkJCSdTZXRDb250cm9sUHJvcGVydHknLAotCQkJJ0dldENvbnRyb2xQcm9wZXJ0eVNpemUnLAotCQkJJ1NlbmRDb250cm9sTWVzc2FnZScsICMgUGFyYW1ldGVyIGNoYW5nZWQgZnJvbSBsb25nIHRvIHZvaWQqIGZyb20gVUgzLjMgdG8gVUgzLjQKLQkJCSdDcmVhdGVUYWJzQ29udHJvbCcsICAjIHdyb3RlIG1hbnVhbGx5Ci0JCQknR2V0Q29udHJvbEFjdGlvbicsICAjIHRvbyBtdWNoIGVmZm9ydCBmb3IgdG9vIGxpdHRsZSB1c2VmdWxuZXNzCi0JCQkKLQkJCSMgdG9vIGxhenkgZm9yIG5vdwotCQkJJ0dldEltYWdlV2VsbENvbnRlbnRJbmZvJywKLQkJCSdHZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvJywKLQkJCSMgT1M4IG9ubHkKLQkJCSdHZXRBdXhpbGlhcnlDb250cm9sUmVjb3JkJywKLQkJCSdTZXRDb250cm9sQ29sb3InLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgJ0ZpbmRDb250cm9sVW5kZXJNb3VzZScsICMgR2VuZXJhdGVkIG1hbnVhbGx5LCByZXR1cm5zIGFuIGV4aXN0aW5nIGNvbnRyb2wsIG5vdCBhIG5ldyBvbmUuCisgICAgICAgICAgICAgICAgJ0Rpc3Bvc2VDb250cm9sJywgIyBHZW5lcmF0ZWQgbWFudWFsbHkKKyAgICAgICAgICAgICAgICAnS2lsbENvbnRyb2xzJywgIyBJbXBsaWVkIGJ5IGNsb3NlIG9mIGRpYWxvZworICAgICAgICAgICAgICAgICdTZXRDdGxBY3Rpb24nLAorICAgICAgICAgICAgICAgICdUcmFja0NvbnRyb2wnLCAjIEdlbmVyYXRlZCBtYW51YWxseQorICAgICAgICAgICAgICAgICdIYW5kbGVDb250cm9sQ2xpY2snLCAgICMgR2VuZXJhdGVkIG1hbnVhbGx5CisgICAgICAgICAgICAgICAgJ1NldENvbnRyb2xEYXRhJywgICAgICAgIyBHZW5lcmF0ZWQgbWFudWFsbHkKKyAgICAgICAgICAgICAgICAnR2V0Q29udHJvbERhdGEnLCAgICAgICAjIEdlbmVyYXRlZCBtYW51YWxseQorICAgICAgICAgICAgICAgICdrQ29udHJvbEJldmVsQnV0dG9uQ2VudGVyUG9wdXBHbHlwaFRhZycsICMgQ29uc3RhbnQgd2l0aCBmdW5ueSBkZWZpbml0aW9uCisgICAgICAgICAgICAgICAgJ2tEYXRhQnJvd3NlckNsaWVudFByb3BlcnR5RmxhZ3NNYXNrJywgICMgZGl0dG8KKyAgICAgICAgICAgICAgICAna0RhdGFCcm93c2VySXRlbUFueVN0YXRlJywgICAjIGFuZCBkaXR0bworICAgICAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBhcmUgdW5hdmFpbGFibGUgZm9yIHN0YXRpYyA2OGsgKGFwcGVhcmFuY2UgbWFuYWdlcikKKyMjICAgICAgICAgICAgICAgICAgICAgICdHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZScsCisjIyAgICAgICAgICAgICAgICAgICAgICAnU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUnLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ0dldEJldmVsQnV0dG9uTWVudUhhbmRsZScsCisjIyAgICAgICAgICAgICAgICAgICAgICAnU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0nLAorICAgICAgICAgICAgICAgICdTZXRCZXZlbEJ1dHRvbkdyYXBoaWNBbGlnbm1lbnQnLAorICAgICAgICAgICAgICAgICdTZXRCZXZlbEJ1dHRvblRleHRBbGlnbm1lbnQnLAorICAgICAgICAgICAgICAgICdTZXRCZXZlbEJ1dHRvblRleHRQbGFjZW1lbnQnLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ1NldEltYWdlV2VsbFRyYW5zZm9ybScsCisjIyAgICAgICAgICAgICAgICAgICAgICAnR2V0VGFiQ29udGVudFJlY3QnLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ1NldFRhYkVuYWJsZWQnLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ1NldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZScsCisjIyAgICAgICAgICAgICAgICAgICAgICAjIFVuYXZhaWxhYmxlIGluIENXIFBybyAzIGxpYnJhcmllcworIyMgICAgICAgICAgICAgICAgICAgICAgJ1NldFVwQ29udHJvbFRleHRDb2xvcicsCisjIyAgICAgICAgICAgICAgICAgICAgICAjIFVuYXZhaWxhYmxlIGluIEphY2sncyBDVyBQcm8gNS4xIGxpYnJhcmllcworIyMgICAgICAgICAgICAgICAgICAgICAgJ0dldENvbnRyb2xSZWdpb24nLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ1JlbW92ZUNvbnRyb2xQcm9wZXJ0eScsCisjIyAgICAgICAgICAgICAgICAgICAgICAnSXNWYWxpZENvbnRyb2xIYW5kbGUnLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ1NldENvbnRyb2wzMkJpdE1pbmltdW0nLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ0dldENvbnRyb2wzMkJpdE1pbmltdW0nLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ1NldENvbnRyb2wzMkJpdE1heGltdW0nLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ0dldENvbnRyb2wzMkJpdE1heGltdW0nLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ1NldENvbnRyb2wzMkJpdFZhbHVlJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdHZXRDb250cm9sMzJCaXRWYWx1ZScsCisjIyAgICAgICAgICAgICAgICAgICAgICAnU2V0Q29udHJvbFZpZXdTaXplJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdHZXRDb250cm9sVmlld1NpemUnLAorICAgICAgICAgICAgICAgICMgR2VuZXJhbGx5IEJhZCBOZXdzCisgICAgICAgICAgICAgICAgJ0dldENvbnRyb2xQcm9wZXJ0eScsCisgICAgICAgICAgICAgICAgJ1NldENvbnRyb2xQcm9wZXJ0eScsCisgICAgICAgICAgICAgICAgJ0dldENvbnRyb2xQcm9wZXJ0eVNpemUnLAorICAgICAgICAgICAgICAgICdTZW5kQ29udHJvbE1lc3NhZ2UnLCAjIFBhcmFtZXRlciBjaGFuZ2VkIGZyb20gbG9uZyB0byB2b2lkKiBmcm9tIFVIMy4zIHRvIFVIMy40CisgICAgICAgICAgICAgICAgJ0NyZWF0ZVRhYnNDb250cm9sJywgICMgd3JvdGUgbWFudWFsbHkKKyAgICAgICAgICAgICAgICAnR2V0Q29udHJvbEFjdGlvbicsICAjIHRvbyBtdWNoIGVmZm9ydCBmb3IgdG9vIGxpdHRsZSB1c2VmdWxuZXNzCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJJ1Byb2NQdHInLAotIwkJCSdDb250cm9sQWN0aW9uVVBQJywKLQkJCSdQdHInLAotCQkJJ0NvbnRyb2xEZWZTcGVjJywgIyBEb24ndCBrbm93IGhvdyB0byBkbyB0aGlzIHlldAotCQkJJ0NvbnRyb2xEZWZTcGVjX3B0cicsICMgZGl0dG8KLQkJCSdDb2xsZWN0aW9uJywgIyBEaXR0bwotCQkJIyBub3QteWV0LXN1cHBvcnRlZCBzdHVmZiBpbiBVbml2ZXJzYWwgSGVhZGVycyAzLjQ6Ci0JCQknQ29udHJvbENvbG9yVVBQJywKLQkJCSdDb250cm9sS2luZCcsICAjIFhYWCBlYXN5OiAyLXR1cGxlIGNvbnRhaW5pbmcgMiBPU1R5cGUncwotIwkJCSdDb250cm9sVGFiRW50cnlfcHRyJywgIyBYWFggbmVlZGVkIGZvciB0YWJzCi0jCQkJJ0NvbnRyb2xCdXR0b25Db250ZW50SW5mb1B0cicsCi0jCQkJJ0NvbnRyb2xCdXR0b25Db250ZW50SW5mbycsICAjIFhYWCB1Z2g6IGEgdW5pb24KLSMJCQknQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX3B0cicsICAjIFhYWCB1Z2g6IGEgdW5pb24KLQkJCSdMaXN0RGVmU3BlY19wdHInLCAgIyBYWFggc2VlIF9MaXN0bW9kdWxlLmMsIHRyaWNreSBidXQgcG9zc2libGUKLQkJCSdEYXRhQnJvd3Nlckl0ZW1JRF9wdHInLCAgIyBYWFggYXJyYXkgb2YgVUludDMyLCBmb3IgQnJvd3NlclZpZXcKLQkJCSdEYXRhQnJvd3Nlckl0ZW1VUFAnLAotCQkJJ0RhdGFCcm93c2VySXRlbURhdGFSZWYnLCAjIFhYWCB2b2lkICoKLQkJCSdEYXRhQnJvd3NlckNhbGxiYWNrcycsICMgZGlmZmljdWx0IHN0cnVjdAotCQkJJ0RhdGFCcm93c2VyQ2FsbGJhY2tzX3B0cicsCi0JCQknRGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3MnLAotCQkJJ0RhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzX3B0cicsCi0jIwkJCSdEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2MnLAotIyMJCQknRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MnLAotCQkJJ0NGRGF0YVJlZicsCi0JCQknRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2MnLCAjIGRpZmZpY3VsdCBzdHJ1Y3QKLQkJCV0KKyAgICAgICAgICAgICAgICAjIHRvbyBsYXp5IGZvciBub3cKKyAgICAgICAgICAgICAgICAnR2V0SW1hZ2VXZWxsQ29udGVudEluZm8nLAorICAgICAgICAgICAgICAgICdHZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvJywKKyAgICAgICAgICAgICAgICAjIE9TOCBvbmx5CisgICAgICAgICAgICAgICAgJ0dldEF1eGlsaWFyeUNvbnRyb2xSZWNvcmQnLAorICAgICAgICAgICAgICAgICdTZXRDb250cm9sQ29sb3InLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgJ1Byb2NQdHInLAorIyAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRyb2xBY3Rpb25VUFAnLAorICAgICAgICAgICAgICAgICdQdHInLAorICAgICAgICAgICAgICAgICdDb250cm9sRGVmU3BlYycsICMgRG9uJ3Qga25vdyBob3cgdG8gZG8gdGhpcyB5ZXQKKyAgICAgICAgICAgICAgICAnQ29udHJvbERlZlNwZWNfcHRyJywgIyBkaXR0bworICAgICAgICAgICAgICAgICdDb2xsZWN0aW9uJywgIyBEaXR0bworICAgICAgICAgICAgICAgICMgbm90LXlldC1zdXBwb3J0ZWQgc3R1ZmYgaW4gVW5pdmVyc2FsIEhlYWRlcnMgMy40OgorICAgICAgICAgICAgICAgICdDb250cm9sQ29sb3JVUFAnLAorICAgICAgICAgICAgICAgICdDb250cm9sS2luZCcsICAjIFhYWCBlYXN5OiAyLXR1cGxlIGNvbnRhaW5pbmcgMiBPU1R5cGUncworIyAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRyb2xUYWJFbnRyeV9wdHInLCAjIFhYWCBuZWVkZWQgZm9yIHRhYnMKKyMgICAgICAgICAgICAgICAgICAgICAgICdDb250cm9sQnV0dG9uQ29udGVudEluZm9QdHInLAorIyAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRyb2xCdXR0b25Db250ZW50SW5mbycsICAjIFhYWCB1Z2g6IGEgdW5pb24KKyMgICAgICAgICAgICAgICAgICAgICAgICdDb250cm9sQnV0dG9uQ29udGVudEluZm9fcHRyJywgICMgWFhYIHVnaDogYSB1bmlvbgorICAgICAgICAgICAgICAgICdMaXN0RGVmU3BlY19wdHInLCAgIyBYWFggc2VlIF9MaXN0bW9kdWxlLmMsIHRyaWNreSBidXQgcG9zc2libGUKKyAgICAgICAgICAgICAgICAnRGF0YUJyb3dzZXJJdGVtSURfcHRyJywgICMgWFhYIGFycmF5IG9mIFVJbnQzMiwgZm9yIEJyb3dzZXJWaWV3CisgICAgICAgICAgICAgICAgJ0RhdGFCcm93c2VySXRlbVVQUCcsCisgICAgICAgICAgICAgICAgJ0RhdGFCcm93c2VySXRlbURhdGFSZWYnLCAjIFhYWCB2b2lkICoKKyAgICAgICAgICAgICAgICAnRGF0YUJyb3dzZXJDYWxsYmFja3MnLCAjIGRpZmZpY3VsdCBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAnRGF0YUJyb3dzZXJDYWxsYmFja3NfcHRyJywKKyAgICAgICAgICAgICAgICAnRGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3MnLAorICAgICAgICAgICAgICAgICdEYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc19wdHInLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ0RhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uRGVzYycsCisjIyAgICAgICAgICAgICAgICAgICAgICAnRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MnLAorICAgICAgICAgICAgICAgICdDRkRhdGFSZWYnLAorICAgICAgICAgICAgICAgICdEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYycsICMgZGlmZmljdWx0IHN0cnVjdAorICAgICAgICAgICAgICAgIF0KIAotCQkJKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibG9uZyIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiVmFyVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAogCi0jIwkJCSMgRm9yIFRyYWNrQ29udHJvbAotIyMJCQkoWygiUHJvY1B0ciIsICJhY3Rpb25Qcm9jIiwgIkluTW9kZSIpXSwKLSMjCQkJIFsoIkZha2VUeXBlKCcoQ29udHJvbEFjdGlvblVQUCkwJykiLCAiKiIsICIqIildKSwKLSMjCQkJKFsoIkNvbnRyb2xBY3Rpb25VUFAiLCAiYWN0aW9uUHJvYyIsICJJbk1vZGUiKV0sCi0jIwkJCSBbKCJGYWtlVHlwZSgnKENvbnRyb2xBY3Rpb25VUFApMCcpIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJWYXJWYXJPdXRCdWZmZXIiLCAiKiIsICJJbk91dE1vZGUiKV0pLAogCi0JCQkjIEZvciBHZXRDb250cm9sVGl0bGUKLQkJCShbKCdTdHIyNTUnLCAndGl0bGUnLCAnSW5Nb2RlJyldLAotCQkJIFsoJ1N0cjI1NScsICd0aXRsZScsICdPdXRNb2RlJyldKSwKKyMjICAgICAgICAgICAgICAgICAgICAgICMgRm9yIFRyYWNrQ29udHJvbAorIyMgICAgICAgICAgICAgICAgICAgICAgKFsoIlByb2NQdHIiLCAiYWN0aW9uUHJvYyIsICJJbk1vZGUiKV0sCisjIyAgICAgICAgICAgICAgICAgICAgICAgWygiRmFrZVR5cGUoJyhDb250cm9sQWN0aW9uVVBQKTAnKSIsICIqIiwgIioiKV0pLAorIyMgICAgICAgICAgICAgICAgICAgICAgKFsoIkNvbnRyb2xBY3Rpb25VUFAiLCAiYWN0aW9uUHJvYyIsICJJbk1vZGUiKV0sCisjIyAgICAgICAgICAgICAgICAgICAgICAgWygiRmFrZVR5cGUoJyhDb250cm9sQWN0aW9uVVBQKTAnKSIsICIqIiwgIioiKV0pLAogCi0JCQkoWygiQ29udHJvbEhhbmRsZSIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiRXhpc3RpbmdDb250cm9sSGFuZGxlIiwgIioiLCAiKiIpXSksCi0JCQkoWygiQ29udHJvbFJlZiIsICIqIiwgIk91dE1vZGUiKV0sCSMgRGl0dG8sIGZvciBVbml2ZXJzYWwgSGVhZGVycwotCQkJIFsoIkV4aXN0aW5nQ29udHJvbEhhbmRsZSIsICIqIiwgIioiKV0pLAotCQkJIAotCQkJKFsoIlJlY3RfcHRyIiwgIioiLCAiUmV0dXJuTW9kZSIpXSwgIyBHZXRDb250cm9sQm91bmRzCi0JCQkgWygidm9pZCIsICIqIiwgIlJldHVybk1vZGUiKV0pLAorICAgICAgICAgICAgICAgICMgRm9yIEdldENvbnRyb2xUaXRsZQorICAgICAgICAgICAgICAgIChbKCdTdHIyNTUnLCAndGl0bGUnLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdTdHIyNTUnLCAndGl0bGUnLCAnT3V0TW9kZScpXSksCiAKLQkJCShbKCJEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJIAotCQkJKFsoIkNvbnRyb2xCdXR0b25Db250ZW50SW5mb1B0ciIsICdvdXRDb250ZW50JywgIkluTW9kZSIpXSwKLQkJCSBbKCJDb250cm9sQnV0dG9uQ29udGVudEluZm9QdHIiLCAnKicsICJPdXRNb2RlIildKSwKLQkJCSAKLQkJCShbKCJDb250cm9sQnV0dG9uQ29udGVudEluZm8iLCAnKicsICJPdXRNb2RlIildLAotCQkJIFsoIkNvbnRyb2xCdXR0b25Db250ZW50SW5mbyIsICcqJywgIkluTW9kZSIpXSksCi0JCQkKLQkJCShbKCJDb250cm9sQWN0aW9uVVBQIiwgJ2xpdmVUcmFja2luZ1Byb2MnLCAiSW5Nb2RlIildLAotCQkJIFsoIkNvbnRyb2xBY3Rpb25VUFBOZXdDb250cm9sIiwgJ2xpdmVUcmFja2luZ1Byb2MnLCAiSW5Nb2RlIildKSwKLQkJCV0KKyAgICAgICAgICAgICAgICAoWygiQ29udHJvbEhhbmRsZSIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nQ29udHJvbEhhbmRsZSIsICIqIiwgIioiKV0pLAorICAgICAgICAgICAgICAgIChbKCJDb250cm9sUmVmIiwgIioiLCAiT3V0TW9kZSIpXSwgICAgICAjIERpdHRvLCBmb3IgVW5pdmVyc2FsIEhlYWRlcnMKKyAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdDb250cm9sSGFuZGxlIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygiUmVjdF9wdHIiLCAiKiIsICJSZXR1cm5Nb2RlIildLCAjIEdldENvbnRyb2xCb3VuZHMKKyAgICAgICAgICAgICAgICAgWygidm9pZCIsICIqIiwgIlJldHVybk1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIkRhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MiLCAiKiIsICJJbk1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIkNvbnRyb2xCdXR0b25Db250ZW50SW5mb1B0ciIsICdvdXRDb250ZW50JywgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvUHRyIiwgJyonLCAiT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAoWygiQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIiwgJyonLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIiwgJyonLCAiSW5Nb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJDb250cm9sQWN0aW9uVVBQIiwgJ2xpdmVUcmFja2luZ1Byb2MnLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJDb250cm9sQWN0aW9uVVBQTmV3Q29udHJvbCIsICdsaXZlVHJhY2tpbmdQcm9jJywgIkluTW9kZSIpXSksCisgICAgICAgICAgICAgICAgXQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY3RsL2N0bHN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9jdGwvY3Rsc3VwcG9ydC5weQppbmRleCBiMmQ5YWQ1Li5kMzU0ZDk0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jdGwvY3Rsc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9jdGwvY3Rsc3VwcG9ydC5weQpAQCAtNiwxNiArNiwxNiBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ0NvbnRyb2xzLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfQ3RsJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnQ29udHJvbCcJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQorTUFDSEVBREVSRklMRSA9ICdDb250cm9scy5oJyAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19DdGwnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK09CSkVDVE5BTUUgPSAnQ29udHJvbCcgICAgICAgICAgICAgICAgICAjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnQ3RsJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgJ0hhbmRsZScJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdDdGwnICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArICdIYW5kbGUnICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC03OSwxMSArNzksMTEgQEAKIENvbnRyb2xEaXNjbG9zdXJlVHJpYW5nbGVPcmllbnRhdGlvbiA9IFVJbnQxNgogCiBEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2MgPSBPcGFxdWVUeXBlKCJEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2MiLAotCQkiRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjIikKKyAgICAgICAgICAgICAgICAiRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjIikKIERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjID0gT3BhcXVlVHlwZSgiRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MiLAotCQkiRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MiKQorICAgICAgICAgICAgICAgICJEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyIpCiBDb250cm9sQnV0dG9uQ29udGVudEluZm8gPSBPcGFxdWVUeXBlKCJDb250cm9sQnV0dG9uQ29udGVudEluZm8iLAotCQkiQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIikKKyAgICAgICAgICAgICAgICAiQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIikKIENvbnRyb2xCdXR0b25Db250ZW50SW5mb1B0ciA9IENvbnRyb2xCdXR0b25Db250ZW50SW5mb19wdHIgPSBDb250cm9sQnV0dG9uQ29udGVudEluZm8KIAogQ29udHJvbFRhYkVudHJ5X3B0ciA9IE9wYXF1ZVR5cGUoIkNvbnRyb2xUYWJFbnRyeSIsICJDb250cm9sVGFiRW50cnkiKQpAQCAtOTUsMTcgKzk1LDE3IEBACiBDb250cm9sUHVzaEJ1dHRvbkljb25BbGlnbm1lbnQgPSBVSW50MTYKIAogY2xhc3MgQ29udHJvbEFjdGlvbkRlZmluaXRpb24oVHlwZSk6Ci0JZGVmIGRlY2xhcmUoc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgiJXMgJXM7Iiwgc2VsZi50eXBlTmFtZSwgbmFtZSkKLQkJT3V0cHV0KCJVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7IikKLQlkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIm15YWN0aW9ucHJvY191cHAiCi0JZGVmIGNsZWFudXAoc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgic2V0Y2FsbGJhY2soKFB5T2JqZWN0Kilfc2VsZiwga015Q29udHJvbEFjdGlvblByb2NUYWcsIGFjdGlvblByb2MsICZjX2NhbGxiYWNrKTsiKQorICAgIGRlZiBkZWNsYXJlKHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoIiVzICVzOyIsIHNlbGYudHlwZU5hbWUsIG5hbWUpCisgICAgICAgIE91dHB1dCgiVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOyIpCisgICAgZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuICJteWFjdGlvbnByb2NfdXBwIgorICAgIGRlZiBjbGVhbnVwKHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoInNldGNhbGxiYWNrKChQeU9iamVjdCopX3NlbGYsIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBhY3Rpb25Qcm9jLCAmY19jYWxsYmFjayk7IikKIAogY2xhc3MgQ29udHJvbEFjdGlvbkRlZmluaXRpb25OZXdDb250cm9sKENvbnRyb2xBY3Rpb25EZWZpbml0aW9uKToKLQlkZWYgY2xlYW51cChzZWxmLCBuYW1lKToKLQkJT3V0cHV0KCJzZXRjYWxsYmFjayhfcmVzLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgbGl2ZVRyYWNraW5nUHJvYywgJmNfY2FsbGJhY2spOyIpCisgICAgZGVmIGNsZWFudXAoc2VsZiwgbmFtZSk6CisgICAgICAgIE91dHB1dCgic2V0Y2FsbGJhY2soX3Jlcywga015Q29udHJvbEFjdGlvblByb2NUYWcsIGxpdmVUcmFja2luZ1Byb2MsICZjX2NhbGxiYWNrKTsiKQogCiBDb250cm9sQWN0aW9uVVBQID0gQ29udHJvbEFjdGlvbkRlZmluaXRpb24oIlB5T2JqZWN0KiIsICJPIikKIENvbnRyb2xBY3Rpb25VUFBOZXdDb250cm9sID0gQ29udHJvbEFjdGlvbkRlZmluaXRpb25OZXdDb250cm9sKCJQeU9iamVjdCoiLCAiTyIpCkBAIC0xMzgsMTkgKzEzOCwxOSBAQAogQ29udHJvbEZvbnRTdHlsZV9OZXcoQ29udHJvbEZvbnRTdHlsZVJlYyAqaXRzZWxmKQogewogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhoaGhoaE8mTyYiLCBpdHNlbGYtPmZsYWdzLCBpdHNlbGYtPmZvbnQsCi0JCWl0c2VsZi0+c2l6ZSwgaXRzZWxmLT5zdHlsZSwgaXRzZWxmLT5tb2RlLCBpdHNlbGYtPmp1c3QsCi0JCVFkUkdCX05ldywgJml0c2VsZi0+Zm9yZUNvbG9yLCBRZFJHQl9OZXcsICZpdHNlbGYtPmJhY2tDb2xvcik7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoaGhoaGhPJk8mIiwgaXRzZWxmLT5mbGFncywgaXRzZWxmLT5mb250LAorICAgICAgICAgICAgICAgIGl0c2VsZi0+c2l6ZSwgaXRzZWxmLT5zdHlsZSwgaXRzZWxmLT5tb2RlLCBpdHNlbGYtPmp1c3QsCisgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmaXRzZWxmLT5mb3JlQ29sb3IsIFFkUkdCX05ldywgJml0c2VsZi0+YmFja0NvbG9yKTsKIH0KICNlbmRpZgogCiBzdGF0aWMgaW50CiBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbnRyb2xGb250U3R5bGVSZWMgKml0c2VsZikKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoaGhoaGhPJk8mKSIsICZpdHNlbGYtPmZsYWdzLAotCQkmaXRzZWxmLT5mb250LCAmaXRzZWxmLT5zaXplLCAmaXRzZWxmLT5zdHlsZSwgJml0c2VsZi0+bW9kZSwKLQkJJml0c2VsZi0+anVzdCwgUWRSR0JfQ29udmVydCwgJml0c2VsZi0+Zm9yZUNvbG9yLAotCQlRZFJHQl9Db252ZXJ0LCAmaXRzZWxmLT5iYWNrQ29sb3IpOworICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoaGhoaGhPJk8mKSIsICZpdHNlbGYtPmZsYWdzLAorICAgICAgICAgICAgICAgICZpdHNlbGYtPmZvbnQsICZpdHNlbGYtPnNpemUsICZpdHNlbGYtPnN0eWxlLCAmaXRzZWxmLT5tb2RlLAorICAgICAgICAgICAgICAgICZpdHNlbGYtPmp1c3QsIFFkUkdCX0NvbnZlcnQsICZpdHNlbGYtPmZvcmVDb2xvciwKKyAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmaXRzZWxmLT5iYWNrQ29sb3IpOwogfQogCiAvKgpAQCAtMTYwLDEzICsxNjAsMTMgQEAKIFB5Q29udHJvbElEX05ldyhDb250cm9sSUQgKml0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5zaWduYXR1cmUsIGl0c2VsZi0+aWQpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZsIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+c2lnbmF0dXJlLCBpdHNlbGYtPmlkKTsKIH0KIAogc3RhdGljIGludAogUHlDb250cm9sSURfQ29udmVydChQeU9iamVjdCAqdiwgQ29udHJvbElEICppdHNlbGYpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+c2lnbmF0dXJlLCAmaXRzZWxmLT5pZCk7CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKE8mbCkiLCBQeU1hY19HZXRPU1R5cGUsICZpdHNlbGYtPnNpZ25hdHVyZSwgJml0c2VsZi0+aWQpOwogfQogCiAvKgpAQCAtMTc1LDQwICsxNzUsNDAgQEAKIHN0YXRpYyBpbnQKIERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uRGVzY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2MgKml0c2VsZikKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihsTyZsKSIsCi0JICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnByb3BlcnR5SUQsCi0JICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+cHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5wcm9wZXJ0eUZsYWdzKTsKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIobE8mbCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+cHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlGbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gKml0c2VsZikKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoTyYpIiwKLQkgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+Y29udGVudFR5cGUsCi0JICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaXRzZWxmLT51Lmljb25TdWl0ZSk7CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGhPJikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+Y29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJml0c2VsZi0+dS5pY29uU3VpdGUpOwogfQogCiBzdGF0aWMgaW50CiBEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYyAqaXRzZWxmKQogewotCWl0c2VsZi0+dmVyc2lvbiA9IGtEYXRhQnJvd3Nlckxpc3RWaWV3TGF0ZXN0SGVhZGVyRGVzYzsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihISGhPJkhPJk8mKSIsCi0JICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1pbmltdW1XaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+bWF4aW11bVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT50aXRsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZi0+dGl0bGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPmluaXRpYWxPcmRlciwKLQkgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmaXRzZWxmLT5idG5Gb250U3R5bGUsCi0JICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaXRzZWxmLT5idG5Db250ZW50SW5mbyk7CisgICAgICAgIGl0c2VsZi0+dmVyc2lvbiA9IGtEYXRhQnJvd3Nlckxpc3RWaWV3TGF0ZXN0SGVhZGVyRGVzYzsKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSEhoTyZITyZPJikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+bWluaW11bVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+bWF4aW11bVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+dGl0bGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaXRzZWxmLT50aXRsZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPmluaXRpYWxPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJml0c2VsZi0+YnRuRm9udFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkNvbnRlbnRJbmZvKTsKIH0KIAogc3RhdGljIGludAogRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfQ29udmVydChQeU9iamVjdCAqdiwgRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgKml0c2VsZikKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihPJk8mKSIsCi0JICAgICAgICAgICAgICAgICAgIERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uRGVzY19Db252ZXJ0LCAmaXRzZWxmLT5wcm9wZXJ0eURlc2MsCi0JICAgICAgICAgICAgICAgICAgIERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX0NvbnZlcnQsICZpdHNlbGYtPmhlYWRlckJ0bkRlc2MpOworICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihPJk8mKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2NfQ29udmVydCwgJml0c2VsZi0+cHJvcGVydHlEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfQ29udmVydCwgJml0c2VsZi0+aGVhZGVyQnRuRGVzYyk7CiB9CiAKIC8qIFRyYWNrQ29udHJvbCBhbmQgSGFuZGxlQ29udHJvbENsaWNrIGNhbGxiYWNrIHN1cHBvcnQgKi8KQEAgLTIyMyw4ICsyMjMsOCBAQAogc3RhdGljIENvbnRyb2xVc2VyUGFuZUhpdFRlc3RVUFAgbXloaXR0ZXN0cHJvY191cHA7CiBzdGF0aWMgQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdVUFAgbXl0cmFja2luZ3Byb2NfdXBwOwogCi1zdGF0aWMgaW50IHNldHRyYWNrZnVuYyhQeU9iamVjdCAqKTsgCS8qIGZvcndhcmQgKi8KLXN0YXRpYyB2b2lkIGNscnRyYWNrZnVuYyh2b2lkKTsJLyogZm9yd2FyZCAqLworc3RhdGljIGludCBzZXR0cmFja2Z1bmMoUHlPYmplY3QgKik7ICAgIC8qIGZvcndhcmQgKi8KK3N0YXRpYyB2b2lkIGNscnRyYWNrZnVuYyh2b2lkKTsgLyogZm9yd2FyZCAqLwogc3RhdGljIGludCBzZXRjYWxsYmFjayhQeU9iamVjdCAqLCBPU1R5cGUsIFB5T2JqZWN0ICosIFVuaXZlcnNhbFByb2NQdHIgKik7CiAiIiIKIApAQCAtMjMyLDIzOSArMjMyLDIzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEN0bE9ial9OZXdVbm1hbmFnZWQoQ29udHJvbEhhbmRsZSBpdHNlbGYpCiB7Ci0JQ29udHJvbE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICAgICAgQ29udHJvbE9iamVjdCAqaXQ7CisgICAgICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9ORVcoQ29udHJvbE9iamVjdCwgJkNvbnRyb2xfVHlwZSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgaXQtPm9iX2NhbGxiYWNrZGljdCA9IE5VTEw7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEN0bE9ial9XaGljaENvbnRyb2woQ29udHJvbEhhbmRsZSBjKQogewotCVB5T2JqZWN0ICppdDsKKyAgICAgICAgUHlPYmplY3QgKml0OwogCi0JaWYgKGMgPT0gTlVMTCkKLQkJaXQgPSBQeV9Ob25lOwotCWVsc2UgewotCQlpdCA9IChQeU9iamVjdCAqKSBHZXRDb250cm9sUmVmZXJlbmNlKGMpOwotCQkvKgotCQkqKiBJZiB0aGUgcmVmY29uIGlzIHplcm8gb3IgZG9lc24ndCBwb2ludCBiYWNrIHRvIHRoZSBQeXRob24gb2JqZWN0Ci0JCSoqIHRoZSBjb250cm9sIGlzIG5vdCBvdXJzLiBSZXR1cm4gYSB0ZW1wb3Jhcnkgb2JqZWN0LgotCQkqLwotCQlpZiAoaXQgPT0gTlVMTCB8fCAoKENvbnRyb2xPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSBjKQotCQkJcmV0dXJuIEN0bE9ial9OZXdVbm1hbmFnZWQoYyk7Ci0JfQotCVB5X0lOQ1JFRihpdCk7Ci0JcmV0dXJuIGl0OworICAgICAgICBpZiAoYyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGl0ID0gUHlfTm9uZTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaXQgPSAoUHlPYmplY3QgKikgR2V0Q29udHJvbFJlZmVyZW5jZShjKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICoqIElmIHRoZSByZWZjb24gaXMgemVybyBvciBkb2Vzbid0IHBvaW50IGJhY2sgdG8gdGhlIFB5dGhvbiBvYmplY3QKKyAgICAgICAgICAgICAgICAqKiB0aGUgY29udHJvbCBpcyBub3Qgb3Vycy4gUmV0dXJuIGEgdGVtcG9yYXJ5IG9iamVjdC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChpdCA9PSBOVUxMIHx8ICgoQ29udHJvbE9iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IGMpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3RsT2JqX05ld1VubWFuYWdlZChjKTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgICAgICByZXR1cm4gaXQ7CiB9CiAKIHN0YXRpYyBpbnQKIHNldHRyYWNrZnVuYyhQeU9iamVjdCAqb2JqKQogewotCWlmICh0cmFja2VyKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJUcmFja2VyIGZ1bmN0aW9uIGluIHVzZSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JdHJhY2tlciA9IG9iajsKLQlQeV9JTkNSRUYodHJhY2tlcik7Ci0JcmV0dXJuIDE7CisgICAgICAgIGlmICh0cmFja2VyKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIlRyYWNrZXIgZnVuY3Rpb24gaW4gdXNlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2tlciA9IG9iajsKKyAgICAgICAgUHlfSU5DUkVGKHRyYWNrZXIpOworICAgICAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQKIGNscnRyYWNrZnVuYyh2b2lkKQogewotCVB5X1hERUNSRUYodHJhY2tlcik7Ci0JdHJhY2tlciA9IDA7CisgICAgICAgIFB5X1hERUNSRUYodHJhY2tlcik7CisgICAgICAgIHRyYWNrZXIgPSAwOwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIG15dHJhY2tlcihDb250cm9sSGFuZGxlIGN0bCwgc2hvcnQgcGFydCkKIHsKLQlQeU9iamVjdCAqYXJncywgKnJ2PTA7CisgICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcnY9MDsKIAotCWFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTyZpKSIsIEN0bE9ial9XaGljaENvbnRyb2wsIGN0bCwgKGludClwYXJ0KTsKLQlpZiAoYXJncyAmJiB0cmFja2VyKSB7Ci0JCXJ2ID0gUHlFdmFsX0NhbGxPYmplY3QodHJhY2tlciwgYXJncyk7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQl9Ci0JaWYgKHJ2KQotCQlQeV9ERUNSRUYocnYpOwotCWVsc2UgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiVHJhY2tDb250cm9sIG9yIEhhbmRsZUNvbnRyb2xDbGljazogZXhjZXB0aW9uIGluIHRyYWNrZXIgZnVuY3Rpb25cXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQl9CisgICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTyZpKSIsIEN0bE9ial9XaGljaENvbnRyb2wsIGN0bCwgKGludClwYXJ0KTsKKyAgICAgICAgaWYgKGFyZ3MgJiYgdHJhY2tlcikgeworICAgICAgICAgICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QodHJhY2tlciwgYXJncyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChydikKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiVHJhY2tDb250cm9sIG9yIEhhbmRsZUNvbnRyb2xDbGljazogZXhjZXB0aW9uIGluIHRyYWNrZXIgZnVuY3Rpb25cXG4iKTsKKyAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIHNldGNhbGxiYWNrKFB5T2JqZWN0ICpteXNlbGYsIE9TVHlwZSB3aGljaCwgUHlPYmplY3QgKmNhbGxiYWNrLCBVbml2ZXJzYWxQcm9jUHRyICp1cHBwKQogewotCUNvbnRyb2xPYmplY3QgKnNlbGYgPSAoQ29udHJvbE9iamVjdCAqKW15c2VsZjsKLQljaGFyIGtleWJ1Zls5XTsKLQkKLQlpZiAoIHdoaWNoID09IGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnICkKLQkJKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWFjdGlvbnByb2NfdXBwOwotCWVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lS2V5RG93blByb2NUYWcgKQotCQkqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15a2V5ZG93bnByb2NfdXBwOwotCWVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lRm9jdXNQcm9jVGFnICkKLQkJKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWZvY3VzcHJvY191cHA7Ci0JZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVEcmF3UHJvY1RhZyApCi0JCSp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlkcmF3cHJvY191cHA7Ci0JZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZyApCi0JCSp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlpZGxlcHJvY191cHA7Ci0JZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVIaXRUZXN0UHJvY1RhZyApCi0JCSp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXloaXR0ZXN0cHJvY191cHA7Ci0JZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVUcmFja2luZ1Byb2NUYWcgKQotCQkqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15dHJhY2tpbmdwcm9jX3VwcDsKLQllbHNlCi0JCXJldHVybiAtMTsKLQkvKiBPbmx5IG5vdyBkbyB3ZSB0ZXN0IGZvciBjbGVhcmluZyBvZiB0aGUgY2FsbGJhY2s6ICovCi0JaWYgKCBjYWxsYmFjayA9PSBQeV9Ob25lICkKLQkJKnVwcHAgPSBOVUxMOwotCS8qIENyZWF0ZSB0aGUgZGljdCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldCAoc28gd2UgZG9uJ3QgZ2V0IHN1Y2ggYSBkaWN0IGZvciBldmVyeSBjb250cm9sKSAqLwotCWlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgKQotCQlpZiAoIChzZWxmLT5vYl9jYWxsYmFja2RpY3QgPSBQeURpY3RfTmV3KCkpID09IE5VTEwgKQotCQkJcmV0dXJuIC0xOwotCS8qIEFuZCBzdG9yZSB0aGUgUHl0aG9uIGNhbGxiYWNrICovCi0Jc3ByaW50ZihrZXlidWYsICIleCIsICh1bnNpZ25lZCl3aGljaCk7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHNlbGYtPm9iX2NhbGxiYWNrZGljdCwga2V5YnVmLCBjYWxsYmFjaykgPCAwKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgICAgIENvbnRyb2xPYmplY3QgKnNlbGYgPSAoQ29udHJvbE9iamVjdCAqKW15c2VsZjsKKyAgICAgICAgY2hhciBrZXlidWZbOV07CisKKyAgICAgICAgaWYgKCB3aGljaCA9PSBrTXlDb250cm9sQWN0aW9uUHJvY1RhZyApCisgICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWFjdGlvbnByb2NfdXBwOworICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUtleURvd25Qcm9jVGFnICkKKyAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15a2V5ZG93bnByb2NfdXBwOworICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUZvY3VzUHJvY1RhZyApCisgICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWZvY3VzcHJvY191cHA7CisgICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcgKQorICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlkcmF3cHJvY191cHA7CisgICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lSWRsZVByb2NUYWcgKQorICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlpZGxlcHJvY191cHA7CisgICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lSGl0VGVzdFByb2NUYWcgKQorICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXloaXR0ZXN0cHJvY191cHA7CisgICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdQcm9jVGFnICkKKyAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15dHJhY2tpbmdwcm9jX3VwcDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgLyogT25seSBub3cgZG8gd2UgdGVzdCBmb3IgY2xlYXJpbmcgb2YgdGhlIGNhbGxiYWNrOiAqLworICAgICAgICBpZiAoIGNhbGxiYWNrID09IFB5X05vbmUgKQorICAgICAgICAgICAgICAgICp1cHBwID0gTlVMTDsKKyAgICAgICAgLyogQ3JlYXRlIHRoZSBkaWN0IGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0IChzbyB3ZSBkb24ndCBnZXQgc3VjaCBhIGRpY3QgZm9yIGV2ZXJ5IGNvbnRyb2wpICovCisgICAgICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgKQorICAgICAgICAgICAgICAgIGlmICggKHNlbGYtPm9iX2NhbGxiYWNrZGljdCA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIC8qIEFuZCBzdG9yZSB0aGUgUHl0aG9uIGNhbGxiYWNrICovCisgICAgICAgIHNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoc2VsZi0+b2JfY2FsbGJhY2tkaWN0LCBrZXlidWYsIGNhbGxiYWNrKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxjYWxsYmFjayhDb250cm9sT2JqZWN0ICpzZWxmLCBPU1R5cGUgd2hpY2gsIFB5T2JqZWN0ICphcmdsaXN0KQogewotCWNoYXIga2V5YnVmWzldOwotCVB5T2JqZWN0ICpmdW5jLCAqcnY7Ci0JCi0Jc3ByaW50ZihrZXlidWYsICIleCIsICh1bnNpZ25lZCl3aGljaCk7Ci0JaWYgKCBzZWxmLT5vYl9jYWxsYmFja2RpY3QgPT0gTlVMTCB8fAotCQkJKGZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5vYl9jYWxsYmFja2RpY3QsIGtleWJ1ZikpID09IE5VTEwgKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJDb250cm9sIGNhbGxiYWNrICV4IHdpdGhvdXQgY2FsbGJhY2sgb2JqZWN0XFxuIiwgKHVuc2lnbmVkKXdoaWNoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJ2ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnbGlzdCk7Ci0JaWYgKCBydiA9PSBOVUxMICkgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIGNvbnRyb2wgY2FsbGJhY2sgJXggaGFuZGxlclxcbiIsICh1bnNpZ25lZCl3aGljaCk7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQotCXJldHVybiBydjsKKyAgICAgICAgY2hhciBrZXlidWZbOV07CisgICAgICAgIFB5T2JqZWN0ICpmdW5jLCAqcnY7CisKKyAgICAgICAgc3ByaW50ZihrZXlidWYsICIleCIsICh1bnNpZ25lZCl3aGljaCk7CisgICAgICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+b2JfY2FsbGJhY2tkaWN0LCBrZXlidWYpKSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJDb250cm9sIGNhbGxiYWNrICV4IHdpdGhvdXQgY2FsbGJhY2sgb2JqZWN0XFxuIiwgKHVuc2lnbmVkKXdoaWNoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ2xpc3QpOworICAgICAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBjb250cm9sIGNhbGxiYWNrICV4IGhhbmRsZXJcXG4iLCAodW5zaWduZWQpd2hpY2gpOworICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIG15YWN0aW9ucHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIFNJbnQxNiBwYXJ0KQogewotCUNvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0JUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLQkKLQljdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOwotCWFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaCIsIGN0bF9vYmosIHBhcnQpOwotCXJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBhcmdsaXN0KTsKLQlQeV9YREVDUkVGKGFyZ2xpc3QpOwotCVB5X1hERUNSRUYocnYpOworICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworCisgICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaCIsIGN0bF9vYmosIHBhcnQpOworICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYXJnbGlzdCk7CisgICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgICAgIFB5X1hERUNSRUYocnYpOwogfQogCiBzdGF0aWMgcGFzY2FsIENvbnRyb2xQYXJ0Q29kZQogbXlrZXlkb3ducHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIFNJbnQxNiBrZXlDb2RlLCBTSW50MTYgY2hhckNvZGUsIFNJbnQxNiBtb2RpZmllcnMpCiB7Ci0JQ29udHJvbE9iamVjdCAqY3RsX29iajsKLQlQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwotCXNob3J0IGNfcnYgPSAwOwotCQotCWN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0JYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oaGgiLCBjdGxfb2JqLCBrZXlDb2RlLCBjaGFyQ29kZSwgbW9kaWZpZXJzKTsKLQlydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lS2V5RG93blByb2NUYWcsIGFyZ2xpc3QpOwotCVB5X1hERUNSRUYoYXJnbGlzdCk7Ci0JaWYgKCBydiApCi0JCWlmICghUHlBcmdfUGFyc2UocnYsICJoIiwgJmNfcnYpKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQlQeV9YREVDUkVGKHJ2KTsKLQlyZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OworICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworICAgICAgICBzaG9ydCBjX3J2ID0gMDsKKworICAgICAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgICAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2hoaCIsIGN0bF9vYmosIGtleUNvZGUsIGNoYXJDb2RlLCBtb2RpZmllcnMpOworICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lS2V5RG93blByb2NUYWcsIGFyZ2xpc3QpOworICAgICAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgICAgICBpZiAoIHJ2ICkKKyAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X1hERUNSRUYocnYpOworICAgICAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OwogfQogCiBzdGF0aWMgcGFzY2FsIENvbnRyb2xQYXJ0Q29kZQogbXlmb2N1c3Byb2MoQ29udHJvbEhhbmRsZSBjb250cm9sLCBDb250cm9sUGFydENvZGUgcGFydCkKIHsKLQlDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotCVB5T2JqZWN0ICphcmdsaXN0LCAqcnY7Ci0Jc2hvcnQgY19ydiA9IGtDb250cm9sRm9jdXNOb1BhcnQ7Ci0JCi0JY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLQlhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKLQlydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lRm9jdXNQcm9jVGFnLCBhcmdsaXN0KTsKLQlQeV9YREVDUkVGKGFyZ2xpc3QpOwotCWlmICggcnYgKQotCQlpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JUHlfWERFQ1JFRihydik7Ci0JcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKyAgICAgICAgc2hvcnQgY19ydiA9IGtDb250cm9sRm9jdXNOb1BhcnQ7CisKKyAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7CisgICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVGb2N1c1Byb2NUYWcsIGFyZ2xpc3QpOworICAgICAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgICAgICBpZiAoIHJ2ICkKKyAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X1hERUNSRUYocnYpOworICAgICAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIG15ZHJhd3Byb2MoQ29udHJvbEhhbmRsZSBjb250cm9sLCBTSW50MTYgcGFydCkKIHsKLQlDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotCVB5T2JqZWN0ICphcmdsaXN0LCAqcnY7Ci0JCi0JY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLQlhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKLQlydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcsIGFyZ2xpc3QpOwotCVB5X1hERUNSRUYoYXJnbGlzdCk7Ci0JUHlfWERFQ1JFRihydik7CisgICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisKKyAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7CisgICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVEcmF3UHJvY1RhZywgYXJnbGlzdCk7CisgICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgICAgIFB5X1hERUNSRUYocnYpOwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIG15aWRsZXByb2MoQ29udHJvbEhhbmRsZSBjb250cm9sKQogewotCUNvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0JUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLQkKLQljdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOwotCWFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPIiwgY3RsX29iaik7Ci0JcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUlkbGVQcm9jVGFnLCBhcmdsaXN0KTsKLQlQeV9YREVDUkVGKGFyZ2xpc3QpOwotCVB5X1hERUNSRUYocnYpOworICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworCisgICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPIiwgY3RsX29iaik7CisgICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZywgYXJnbGlzdCk7CisgICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgICAgIFB5X1hERUNSRUYocnYpOwogfQogCiBzdGF0aWMgcGFzY2FsIENvbnRyb2xQYXJ0Q29kZQogbXloaXR0ZXN0cHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIFBvaW50IHdoZXJlKQogewotCUNvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0JUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLQlzaG9ydCBjX3J2ID0gLTE7CisgICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgICAgIHNob3J0IGNfcnYgPSAtMTsKIAotCWN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0JYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHdoZXJlKTsKLQlydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lSGl0VGVzdFByb2NUYWcsIGFyZ2xpc3QpOwotCVB5X1hERUNSRUYoYXJnbGlzdCk7Ci0JLyogSWdub3JlIGVycm9ycywgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhlbSAqLwotCWlmICggcnYgKQotCQlpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JUHlfWERFQ1JFRihydik7Ci0JcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHdoZXJlKTsKKyAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RQcm9jVGFnLCBhcmdsaXN0KTsKKyAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICAgICAgLyogSWdub3JlIGVycm9ycywgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhlbSAqLworICAgICAgICBpZiAoIHJ2ICkKKyAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X1hERUNSRUYocnYpOworICAgICAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OwogfQogCiBzdGF0aWMgcGFzY2FsIENvbnRyb2xQYXJ0Q29kZQogbXl0cmFja2luZ3Byb2MoQ29udHJvbEhhbmRsZSBjb250cm9sLCBQb2ludCBzdGFydFB0LCBDb250cm9sQWN0aW9uVVBQIGFjdGlvblByb2MpCiB7Ci0JQ29udHJvbE9iamVjdCAqY3RsX29iajsKLQlQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwotCXNob3J0IGNfcnYgPSAtMTsKKyAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKyAgICAgICAgc2hvcnQgY19ydiA9IC0xOwogCi0JY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLQkvKiBXZSBjYW5ub3QgcGFzcyB0aGUgYWN0aW9uUHJvYyB3aXRob3V0IGxvdHMgb2Ygd29yayAqLwotCWFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPTyYiLCBjdGxfb2JqLCBQeU1hY19CdWlsZFBvaW50LCBzdGFydFB0KTsKLQlydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdQcm9jVGFnLCBhcmdsaXN0KTsKLQlQeV9YREVDUkVGKGFyZ2xpc3QpOwotCWlmICggcnYgKQotCQlpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JUHlfWERFQ1JFRihydik7Ci0JcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICAgICAgLyogV2UgY2Fubm90IHBhc3MgdGhlIGFjdGlvblByb2Mgd2l0aG91dCBsb3RzIG9mIHdvcmsgKi8KKyAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHN0YXJ0UHQpOworICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdQcm9jVGFnLCBhcmdsaXN0KTsKKyAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICAgICAgaWYgKCBydiApCisgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9YREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKIH0KICIiIgogCkBAIC00ODIsMTggKzQ4MiwxOCBAQAogIiIiCiAKIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgT2JqZWN0SWRlbnRpdHlNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCUdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoIlB5T2JqZWN0ICpvYl9jYWxsYmFja2RpY3Q7IikKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCi0JZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiU2V0Q29udHJvbFJlZmVyZW5jZShpdHNlbGYsIChsb25nKWl0KTsiKQotCQlPdXRwdXQoIml0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOyIpCi0JZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+b2JfY2FsbGJhY2tkaWN0KTsiKQotCQlPdXRwdXQoImlmIChzZWxmLT5vYl9pdHNlbGYpU2V0Q29udHJvbFJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLyIpCisgICAgZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpvYl9jYWxsYmFja2RpY3Q7IikKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiU2V0Q29udHJvbFJlZmVyZW5jZShpdHNlbGYsIChsb25nKWl0KTsiKQorICAgICAgICBPdXRwdXQoIml0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOyIpCisgICAgZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+b2JfY2FsbGJhY2tkaWN0KTsiKQorICAgICAgICBPdXRwdXQoImlmIChzZWxmLT5vYl9pdHNlbGYpU2V0Q29udHJvbFJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLyIpCiAKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgZ3JvdXBzIGFuZCBsaW5rIHRoZW0KIG1vZHVsZSA9IE1hY01vZHVsZShNT0ROQU1FLCBNT0RQUkVGSVgsIGluY2x1ZGVzdHVmZiwgZmluYWxzdHVmZiwgaW5pdHN0dWZmKQpAQCAtNTIzLDE0ICs1MjMsMTQgQEAKIAogaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZ8TyIsCiAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFBvaW50LCAmY2FsbGJhY2spKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIGlmIChjYWxsYmFjayAmJiBjYWxsYmFjayAhPSBQeV9Ob25lKSB7Ci0JaWYgKFB5SW50X0NoZWNrKGNhbGxiYWNrKSAmJiBQeUludF9BU19MT05HKGNhbGxiYWNrKSA9PSAtMSkKLQkJdXBwID0gKENvbnRyb2xBY3Rpb25VUFApLTE7Ci0JZWxzZSB7Ci0JCXNldHRyYWNrZnVuYyhjYWxsYmFjayk7Ci0JCXVwcCA9IG15dHJhY2tlcl91cHA7Ci0JfQorICAgICAgICBpZiAoUHlJbnRfQ2hlY2soY2FsbGJhY2spICYmIFB5SW50X0FTX0xPTkcoY2FsbGJhY2spID09IC0xKQorICAgICAgICAgICAgICAgIHVwcCA9IChDb250cm9sQWN0aW9uVVBQKS0xOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXR0cmFja2Z1bmMoY2FsbGJhY2spOworICAgICAgICAgICAgICAgIHVwcCA9IG15dHJhY2tlcl91cHA7CisgICAgICAgIH0KIH0KIF9ydiA9IFRyYWNrQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQsCkBAIC01NTgsMTQgKzU1OCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAogICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFjaykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogaWYgKGNhbGxiYWNrICYmIGNhbGxiYWNrICE9IFB5X05vbmUpIHsKLQlpZiAoUHlJbnRfQ2hlY2soY2FsbGJhY2spICYmIFB5SW50X0FTX0xPTkcoY2FsbGJhY2spID09IC0xKQotCQl1cHAgPSAoQ29udHJvbEFjdGlvblVQUCktMTsKLQllbHNlIHsKLQkJc2V0dHJhY2tmdW5jKGNhbGxiYWNrKTsKLQkJdXBwID0gbXl0cmFja2VyX3VwcDsKLQl9CisgICAgICAgIGlmIChQeUludF9DaGVjayhjYWxsYmFjaykgJiYgUHlJbnRfQVNfTE9ORyhjYWxsYmFjaykgPT0gLTEpCisgICAgICAgICAgICAgICAgdXBwID0gKENvbnRyb2xBY3Rpb25VUFApLTE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHNldHRyYWNrZnVuYyhjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgdXBwID0gbXl0cmFja2VyX3VwcDsKKyAgICAgICAgfQogfQogX3J2ID0gSGFuZGxlQ29udHJvbENsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCiAgICAgICAgICAgICAgICAgICAgc3RhcnRQb2ludCwKQEAgLTU5MywxNiArNTkzLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwgJmJ1ZmZlclNpemUpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwogCiBpZiAoX2VyciAhPSBub0VycikKLQlyZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIF9yZXMgPSBQeV9Ob25lOwogcmV0dXJuIF9yZXM7CiAiIiIKQEAgLTYyMywyOSArNjIzLDI5IEBACiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAogICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKIC8qIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgZGF0YSAqLwogX2VyciA9IEdldENvbnRyb2xEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyU2l6ZSk7CiBpZiAoX2VyciAhPSBub0VycikKLQlyZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIGJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBidWZmZXJTaXplKTsKIGlmIChidWZmZXIgPT0gTlVMTCkKLQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKIF9lcnIgPSBHZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKIAogaWYgKF9lcnIgIT0gbm9FcnIpIHsKLQlQeU1lbV9ERUwoYnVmZmVyKTsKLQlyZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIFB5TWVtX0RFTChidWZmZXIpOworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiB9CiBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIG91dFNpemUpOwogUHlNZW1fREVMKGJ1ZmZlcik7CkBAIC02NjcsMTYgKzY2NywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAogICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmYnVmZmVyKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKIF9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnVmZmVyKSwKICAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZidWZmZXIpOwogCiBpZiAoX2VyciAhPSBub0VycikKLQlyZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIF9yZXMgPSBQeV9Ob25lOwogcmV0dXJuIF9yZXM7CiAiIiIKQEAgLTY5NiwyOSArNjk2LDI5IEBACiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAogICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKIC8qIENoZWNrIGl0IGlzIGhhbmRsZS1zaXplZCAqLwogX2VyciA9IEdldENvbnRyb2xEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyU2l6ZSk7CiBpZiAoX2VyciAhPSBub0VycikKLQlyZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIGlmIChidWZmZXJTaXplICE9IHNpemVvZihIYW5kbGUpKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIkdldENvbnRyb2xEYXRhU2l6ZSgpICE9IHNpemVvZihIYW5kbGUpIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJHZXRDb250cm9sRGF0YVNpemUoKSAhPSBzaXplb2YoSGFuZGxlKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKIH0KIAogX2VyciA9IEdldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICBzaXplb2YoSGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIYW5kbGUpLAogICAgICAgICAgICAgICAgICAgICAgIChQdHIpJmhkbCwKICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyU2l6ZSk7CiAKIGlmIChfZXJyICE9IG5vRXJyKSB7Ci0JcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiB9CiBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBPcHRSZXNPYmpfTmV3LCBoZGwpOwogcmV0dXJuIF9yZXM7CkBAIC03NDAsMTggKzc0MCwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFjaykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiBpZiAoIHNldGNhbGxiYWNrKChQeU9iamVjdCAqKV9zZWxmLCBpblRhZ05hbWUsIGNhbGxiYWNrLCAmY19jYWxsYmFjaykgPCAwICkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBfZXJyID0gU2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgIHNpemVvZihjX2NhbGxiYWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX2NhbGxiYWNrKSwKICAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZjX2NhbGxiYWNrKTsKIAogaWYgKF9lcnIgIT0gbm9FcnIpCi0JcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiBfcmVzID0gUHlfTm9uZTsKIHJldHVybiBfcmVzOwogIiIiCkBAIC03ODMsMjYgKzc4MywyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICZzaXplLAogICAgICAgICAgICAgICAgICAgICAgICZkaXJlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgJnRhYkFycmF5T2JqKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKIGkgPSBQeVNlcXVlbmNlX0xlbmd0aCh0YWJBcnJheU9iaik7CiBpZiAoaSA9PSAtMSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBpZiAoaSA+IE1BWFRBQlMpIHsKLQlQeUVycl9TZXRTdHJpbmcoQ3RsX0Vycm9yLCAiVG9vIG1hbnkgdGFicyIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ3RsX0Vycm9yLCAiVG9vIG1hbnkgdGFicyIpOworICAgICAgICByZXR1cm4gTlVMTDsKIH0KIG51bVRhYnMgPSBpOwogZm9yIChpPTA7IGk8bnVtVGFiczsgaSsrKSB7Ci0JdGFiRW50cnkgPSBQeVNlcXVlbmNlX0dldEl0ZW0odGFiQXJyYXlPYmosIGkpOwotCWlmICh0YWJFbnRyeSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlKHRhYkVudHJ5LCAiKE8mTyZCKSIsCi0JICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJnRhYkFycmF5W2ldLmljb24sCi0JICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGFiQXJyYXlbaV0ubmFtZSwKLQkgICAgICAgICAgICAgICAgICZ0YWJBcnJheVtpXS5lbmFibGVkCi0JICAgICAgICAgICAgICAgICApKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgdGFiRW50cnkgPSBQeVNlcXVlbmNlX0dldEl0ZW0odGFiQXJyYXlPYmosIGkpOworICAgICAgICBpZiAodGFiRW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh0YWJFbnRyeSwgIihPJk8mQikiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmdGFiQXJyYXlbaV0uaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGFiQXJyYXlbaV0ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdGFiQXJyYXlbaV0uZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiAKIF9lcnIgPSBDcmVhdGVUYWJzQ29udHJvbCh3aW5kb3csCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9kbGcvZGxnc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2RsZy9kbGdzY2FuLnB5CmluZGV4IDM3MTBkNWQuLjdmYjY4ZjcgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2RsZy9kbGdzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2RsZy9kbGdzY2FuLnB5CkBAIC0xMiwxMDUgKzEyLDEwNSBAQAogT0JKRUNUID0gIkRpYWxvZ1B0ciIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IExPTkcgKyAiLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBMT05HICsgIi5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgaW4gKCJEaWFsb2dQdHIiLCAiRGlhbG9nUmVmIikgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCBpbiAoIkRpYWxvZ1B0ciIsICJEaWFsb2dSZWYiKSBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJJ0luaXREaWFsb2dzJywKLQkJCSdFcnJvclNvdW5kJywKLQkJCSMgRGlhbG9ncyBhcmUgZGlzcG9zZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQKLQkJCSdDbG9zZURpYWxvZycsCi0JCQknRGlzcG9zRGlhbG9nJywKLQkJCSdEaXNwb3NlRGlhbG9nJywKLQkJCSdVcGR0RGlhbG9nJywKLQkJCSdDb3VsZEFsZXJ0JywKLQkJCSdGcmVlQWxlcnQnLAotCQkJJ0NvdWxkRGlhbG9nJywKLQkJCSdGcmVlRGlhbG9nJywKLQkJCSdHZXRTdGRGaWx0ZXJQcm9jJywKLQkJCSdHZXREaWFsb2dQYXJlbnQnLAotIyMJCQkjIENhbid0IGZpbmQgdGhlc2UgaW4gdGhlIENXIFBybyAzIGxpYnJhcmllcwotCQkJJ1NldERpYWxvZ01vdmFibGVNb2RhbCcsCi0JCQknR2V0RGlhbG9nQ29udHJvbE5vdGlmaWNhdGlvblByb2MnLAotCQkJJ1NldEdyYWZQb3J0T2ZEaWFsb2cnLCAjIEZ1bm55LCBhbmQgcHJvYmFibHkgbm90IHVzZWZ1bAotCQkJIyBDYW4ndCBmaW5kIHRoZXNlOgotCQkJJ0Nsb3NlU3RhbmRhcmRTaGVldCcsCi0JCQknUnVuU3RhbmRhcmRBbGVydCcsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAnSW5pdERpYWxvZ3MnLAorICAgICAgICAgICAgICAgICdFcnJvclNvdW5kJywKKyAgICAgICAgICAgICAgICAjIERpYWxvZ3MgYXJlIGRpc3Bvc2VkIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkCisgICAgICAgICAgICAgICAgJ0Nsb3NlRGlhbG9nJywKKyAgICAgICAgICAgICAgICAnRGlzcG9zRGlhbG9nJywKKyAgICAgICAgICAgICAgICAnRGlzcG9zZURpYWxvZycsCisgICAgICAgICAgICAgICAgJ1VwZHREaWFsb2cnLAorICAgICAgICAgICAgICAgICdDb3VsZEFsZXJ0JywKKyAgICAgICAgICAgICAgICAnRnJlZUFsZXJ0JywKKyAgICAgICAgICAgICAgICAnQ291bGREaWFsb2cnLAorICAgICAgICAgICAgICAgICdGcmVlRGlhbG9nJywKKyAgICAgICAgICAgICAgICAnR2V0U3RkRmlsdGVyUHJvYycsCisgICAgICAgICAgICAgICAgJ0dldERpYWxvZ1BhcmVudCcsCisjIyAgICAgICAgICAgICAgICAgICAgICAjIENhbid0IGZpbmQgdGhlc2UgaW4gdGhlIENXIFBybyAzIGxpYnJhcmllcworICAgICAgICAgICAgICAgICdTZXREaWFsb2dNb3ZhYmxlTW9kYWwnLAorICAgICAgICAgICAgICAgICdHZXREaWFsb2dDb250cm9sTm90aWZpY2F0aW9uUHJvYycsCisgICAgICAgICAgICAgICAgJ1NldEdyYWZQb3J0T2ZEaWFsb2cnLCAjIEZ1bm55LCBhbmQgcHJvYmFibHkgbm90IHVzZWZ1bAorICAgICAgICAgICAgICAgICMgQ2FuJ3QgZmluZCB0aGVzZToKKyAgICAgICAgICAgICAgICAnQ2xvc2VTdGFuZGFyZFNoZWV0JywKKyAgICAgICAgICAgICAgICAnUnVuU3RhbmRhcmRBbGVydCcsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJBbGVydFN0ZEFsZXJ0UGFyYW1QdHIiLAkjIFRvbyBtdWNoIHdvcmssIGZvciBub3cKLQkJCSJBbGVydFN0ZEFsZXJ0UGFyYW1SZWMiLAkjIGRpdHRvCi0JCQkiQWxlcnRTdGRBbGVydFBhcmFtUmVjX3B0ciIsCSMgZGl0dG8KLQkJCSJBbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVB0ciIsCSMgZGl0dG8KLQkJCSJBbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlYyIsCi0JCQkiQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfcHRyIiwKLQkJCSJRVE1vZGVsZXNzQ2FsbGJhY2tQcm9jUHRyIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJBbGVydFN0ZEFsZXJ0UGFyYW1QdHIiLCAgICAgICAgIyBUb28gbXVjaCB3b3JrLCBmb3Igbm93CisgICAgICAgICAgICAgICAgIkFsZXJ0U3RkQWxlcnRQYXJhbVJlYyIsICAgICAgICAjIGRpdHRvCisgICAgICAgICAgICAgICAgIkFsZXJ0U3RkQWxlcnRQYXJhbVJlY19wdHIiLCAgICAjIGRpdHRvCisgICAgICAgICAgICAgICAgIkFsZXJ0U3RkQ0ZTdHJpbmdBbGVydFBhcmFtUHRyIiwgICAgICAgICMgZGl0dG8KKyAgICAgICAgICAgICAgICAiQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWMiLAorICAgICAgICAgICAgICAgICJBbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVJlY19wdHIiLAorICAgICAgICAgICAgICAgICJRVE1vZGVsZXNzQ2FsbGJhY2tQcm9jUHRyIiwKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCJTdHIyNTUiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiKiIsICIqIiwgIk91dE1vZGUiKV0pLAotCQkJCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIlZhclZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCi0JCQkgCi0JCQkjIEdldERpYWxvZ0l0ZW0gcmV0dXJuIGhhbmRsZSBpcyBvcHRpb25hbAotCQkJKFsoIkhhbmRsZSIsICJpdGVtIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiT3B0SGFuZGxlIiwgIml0ZW0iLCAiT3V0TW9kZSIpXSksCi0JCQkKLQkJCSMgTmV3RGlhbG9nIEVUQy4KLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJOdWxsU3RvcmFnZSIsICIqIiwgIkluTW9kZSIpXSksCi0JCQkKLQkJCShbKCJEaWFsb2dQdHIiLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIkV4aXN0aW5nRGlhbG9nUHRyIiwgIioiLCAiKiIpXSksCi0JCQkoWygiRGlhbG9nUmVmIiwgIioiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJFeGlzdGluZ0RpYWxvZ1B0ciIsICIqIiwgIioiKV0pLAotCQkJKFsoIldpbmRvd1B0ciIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKLQkJCShbKCJXaW5kb3dQdHIiLCAiKiIsICJSZXR1cm5Nb2RlIildLAotCQkJIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCi0JCQkgCi0JCQkjIFN0ZEZpbHRlclByb2MKLQkJCShbKCdFdmVudFJlY29yZCcsICdldmVudCcsICdPdXRNb2RlJyksIAotCQkJICAoJ0RpYWxvZ0l0ZW1JbmRleCcsICdpdGVtSGl0JywgJ091dE1vZGUnKV0sCi0JCQkgWygnRXZlbnRSZWNvcmQnLCAnZXZlbnQnLCAnSW5PdXRNb2RlJyksIAotCQkJICAoJ0RpYWxvZ0l0ZW1JbmRleCcsICdpdGVtSGl0JywgJ0luT3V0TW9kZScpXSkKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygiU3RyMjU1IiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCIqIiwgIioiLCAiT3V0TW9kZSIpXSksCiAKLQkJCV0KKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJWYXJWYXJPdXRCdWZmZXIiLCAiKiIsICJJbk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgIyBHZXREaWFsb2dJdGVtIHJldHVybiBoYW5kbGUgaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgICAoWygiSGFuZGxlIiwgIml0ZW0iLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiT3B0SGFuZGxlIiwgIml0ZW0iLCAiT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAjIE5ld0RpYWxvZyBFVEMuCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJOdWxsU3RvcmFnZSIsICIqIiwgIkluTW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAoWygiRGlhbG9nUHRyIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdEaWFsb2dQdHIiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICAoWygiRGlhbG9nUmVmIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdEaWFsb2dQdHIiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICAoWygiV2luZG93UHRyIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICAoWygiV2luZG93UHRyIiwgIioiLCAiUmV0dXJuTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgICMgU3RkRmlsdGVyUHJvYworICAgICAgICAgICAgICAgIChbKCdFdmVudFJlY29yZCcsICdldmVudCcsICdPdXRNb2RlJyksCisgICAgICAgICAgICAgICAgICAoJ0RpYWxvZ0l0ZW1JbmRleCcsICdpdGVtSGl0JywgJ091dE1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ0V2ZW50UmVjb3JkJywgJ2V2ZW50JywgJ0luT3V0TW9kZScpLAorICAgICAgICAgICAgICAgICAgKCdEaWFsb2dJdGVtSW5kZXgnLCAnaXRlbUhpdCcsICdJbk91dE1vZGUnKV0pCisKKyAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZGxnL2RsZ3N1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9kbGcvZGxnc3VwcG9ydC5weQppbmRleCA4NWJjNjA3Li4xYzBjYzZhIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9kbGcvZGxnc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9kbGcvZGxnc3VwcG9ydC5weQpAQCAtNTAsNTUgKzUwLDU1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVjb3JkICpldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKml0ZW1IaXQpCiB7Ci0JQm9vbGVhbiBydjsKLQlQeU9iamVjdCAqYXJncywgKnJlczsKLQlQeU9iamVjdCAqY2FsbGJhY2sgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKLQlpZiAoY2FsbGJhY2sgPT0gTlVMTCkKLQkJcmV0dXJuIDA7IC8qIERlZmF1bHQgYmVoYXZpb3IgKi8KLQlEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IE5VTEw7IC8qIFdlJ2xsIHJlc3RvcmUgaXQgd2hlbiBjYWxsIHN1Y2Nlc3NmdWwgKi8KLQlhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsIERsZ09ial9XaGljaERpYWxvZywgZGlhbG9nLCBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCBldmVudCk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmVzID0gTlVMTDsKLQllbHNlIHsKLQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoY2FsbGJhY2ssIGFyZ3MpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JfQotCWlmIChyZXMgPT0gTlVMTCkgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIERpYWxvZyBGaWx0ZXJcXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJKml0ZW1IaXQgPSAtMTsgLyogRmFrZSByZXR1cm4gaXRlbSAqLwotCQlyZXR1cm4gMTsgLyogV2UgaGFuZGxlZCBpdCAqLwotCX0KLQllbHNlIHsKLQkJRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBjYWxsYmFjazsKLQkJaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKLQkJCSppdGVtSGl0ID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0JCQlydiA9IDE7Ci0JCX0KLQkJZWxzZQotCQkJcnYgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKLQl9Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIHJ2OworICAgICAgICBCb29sZWFuIHJ2OworICAgICAgICBQeU9iamVjdCAqYXJncywgKnJlczsKKyAgICAgICAgUHlPYmplY3QgKmNhbGxiYWNrID0gRGxnX0ZpbHRlclByb2NfY2FsbGJhY2s7CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAwOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCisgICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsgLyogV2UnbGwgcmVzdG9yZSBpdCB3aGVuIGNhbGwgc3VjY2Vzc2Z1bCAqLworICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsIERsZ09ial9XaGljaERpYWxvZywgZGlhbG9nLCBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCBldmVudCk7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmVzID0gTlVMTDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoY2FsbGJhY2ssIGFyZ3MpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIERpYWxvZyBGaWx0ZXJcXG4iKTsKKyAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgICAgICppdGVtSGl0ID0gLTE7IC8qIEZha2UgcmV0dXJuIGl0ZW0gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogV2UgaGFuZGxlZCBpdCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICppdGVtSGl0ID0gUHlJbnRfQXNMb25nKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBydiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIE1vZGFsRmlsdGVyVVBQCiBEbGdfUGFzc0ZpbHRlclByb2MoUHlPYmplY3QgKmNhbGxiYWNrKQogewotCVB5T2JqZWN0ICp0bXAgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKLQlzdGF0aWMgTW9kYWxGaWx0ZXJVUFAgVW5pdkZpbHRlclVwcCA9IE5VTEw7Ci0JCi0JRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOwotCWlmIChjYWxsYmFjayA9PSBQeV9Ob25lKSB7Ci0JCVB5X1hERUNSRUYodG1wKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihjYWxsYmFjayk7Ci0JRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBjYWxsYmFjazsKLQlQeV9YREVDUkVGKHRtcCk7Ci0JaWYgKCBVbml2RmlsdGVyVXBwID09IE5VTEwgKQotCQlVbml2RmlsdGVyVXBwID0gTmV3TW9kYWxGaWx0ZXJVUFAoJkRsZ19Vbml2RmlsdGVyUHJvYyk7Ci0JcmV0dXJuIFVuaXZGaWx0ZXJVcHA7CisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKKyAgICAgICAgc3RhdGljIE1vZGFsRmlsdGVyVVBQIFVuaXZGaWx0ZXJVcHAgPSBOVUxMOworCisgICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsKKyAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgICAgICBpZiAoIFVuaXZGaWx0ZXJVcHAgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgVW5pdkZpbHRlclVwcCA9IE5ld01vZGFsRmlsdGVyVVBQKCZEbGdfVW5pdkZpbHRlclByb2MpOworICAgICAgICByZXR1cm4gVW5pdkZpbHRlclVwcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID0gTlVMTDsKQEAgLTEwNiwyNCArMTA2LDI0IEBACiBzdGF0aWMgcGFzY2FsIHZvaWQgRGxnX1VuaXZVc2VySXRlbVByb2MoRGlhbG9nUHRyIGRpYWxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgaXRlbSkKIHsKLQlQeU9iamVjdCAqYXJncywgKnJlczsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CiAKLQlpZiAoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayA9PSBOVUxMKQotCQlyZXR1cm47IC8qIERlZmF1bHQgYmVoYXZpb3IgKi8KLQlEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IE5VTEw7IC8qIFdlJ2xsIHJlc3RvcmUgaXQgd2hlbiBjYWxsIHN1Y2Nlc3NmdWwgKi8KLQlhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwgRGxnT2JqX1doaWNoRGlhbG9nLCBkaWFsb2csIGl0ZW0pOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJlcyA9IE5VTEw7Ci0JZWxzZSB7Ci0JCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2ssIGFyZ3MpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JfQotCWlmIChyZXMgPT0gTlVMTCkgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIERpYWxvZyBVc2VySXRlbSBwcm9jXFxuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQotCVB5X1hERUNSRUYocmVzKTsKLQlyZXR1cm47CisgICAgICAgIGlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCisgICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsgLyogV2UnbGwgcmVzdG9yZSBpdCB3aGVuIGNhbGwgc3VjY2Vzc2Z1bCAqLworICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwgRGxnT2JqX1doaWNoRGlhbG9nLCBkaWFsb2csIGl0ZW0pOworICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2ssIGFyZ3MpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIERpYWxvZyBVc2VySXRlbSBwcm9jXFxuIik7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybjsKIH0KIAogI2lmIDAKQEAgLTE0Niw5ICsxNDYsOSBAQAogV2luZG93UHRyCiBEbGdPYmpfQ29udmVydFRvV2luZG93KFB5T2JqZWN0ICpzZWxmKQogewotCWlmICggRGxnT2JqX0NoZWNrKHNlbGYpICkKLQkJcmV0dXJuIEdldERpYWxvZ1dpbmRvdygoKERpYWxvZ09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYpOwotCXJldHVybiBOVUxMOworICAgICAgICBpZiAoIERsZ09ial9DaGVjayhzZWxmKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIEdldERpYWxvZ1dpbmRvdygoKERpYWxvZ09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYpOworICAgICAgICByZXR1cm4gTlVMTDsKIH0KICNlbmRpZgogLyogUmV0dXJuIHRoZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZGlhbG9nLCBvciBOb25lICovCkBAIC0xNTYsNzcgKzE1Niw3NyBAQAogUHlPYmplY3QgKgogRGxnT2JqX1doaWNoRGlhbG9nKERpYWxvZ1B0ciBkKQogewotCVB5T2JqZWN0ICppdDsKLQkKLQlpZiAoZCA9PSBOVUxMKSB7Ci0JCWl0ID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKGl0KTsKLQl9IGVsc2UgewotCQlXaW5kb3dQdHIgdyA9IEdldERpYWxvZ1dpbmRvdyhkKTsKLQkJCi0JCWl0ID0gKFB5T2JqZWN0ICopIEdldFdSZWZDb24odyk7Ci0JCWlmIChpdCA9PSBOVUxMIHx8ICgoRGlhbG9nT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gZCB8fCAhRGxnT2JqX0NoZWNrKGl0KSkgeworICAgICAgICBQeU9iamVjdCAqaXQ7CisKKyAgICAgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGl0ID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFdpbmRvd1B0ciB3ID0gR2V0RGlhbG9nV2luZG93KGQpOworCisgICAgICAgICAgICAgICAgaXQgPSAoUHlPYmplY3QgKikgR2V0V1JlZkNvbih3KTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCB8fCAoKERpYWxvZ09iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IGQgfHwgIURsZ09ial9DaGVjayhpdCkpIHsKICNpZiAwCi0JCQkvKiBTaG91bGQgZG8gdGhpcywgYnV0IHdlIGRvbid0IGhhdmUgYW4gb2JfZnJlZWl0IGZvciBkaWFsb2dzIHlldC4gKi8KLQkJCWl0ID0gV2luT2JqX05ldyh3KTsKLQkJCSgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9mcmVlaXQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvdWxkIGRvIHRoaXMsIGJ1dCB3ZSBkb24ndCBoYXZlIGFuIG9iX2ZyZWVpdCBmb3IgZGlhbG9ncyB5ZXQuICovCisgICAgICAgICAgICAgICAgICAgICAgICBpdCA9IFdpbk9ial9OZXcodyk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfZnJlZWl0ID0gTlVMTDsKICNlbHNlCi0JCQlpdCA9IFB5X05vbmU7Ci0JCQlQeV9JTkNSRUYoaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKICNlbmRpZgotCQl9IGVsc2UgewotCQkJUHlfSU5DUkVGKGl0KTsKLQkJfQotCX0KLQlyZXR1cm4gaXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpdDsKIH0KICIiIgogCiBpbml0c3R1ZmYgPSBpbml0c3R1ZmYgKyAiIiIKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEaWFsb2dQdHIsIERsZ09ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX1doaWNoRGlhbG9nKTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRGlhbG9nUHRyLCBEbGdPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX1doaWNoRGlhbG9nKTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKERpYWxvZ1B0ciwgRGxnT2JqX0NvbnZlcnQpOwogIiIiCiAKIAogIyBEZWZpbmUgYSBjbGFzcyB3aGljaCBzcGVjaWFsaXplcyBvdXIgb2JqZWN0IGRlZmluaXRpb24KIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCA9IE5vbmUsIGl0c2VsZnR5cGUgPSBOb25lKToKLQkJR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCA9IE5vbmUsIGl0c2VsZnR5cGUgPSBOb25lKToKKyAgICAgICAgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpCiAjIyBUaGlzIHdvbid0IHdvcmsgaW4gQ2FyYm9uLCBzbyB3ZSBkaXNhYmxlIGl0IGZvciBhbGwgTWFjUHl0aG9uczotKAogIyMgQnV0IHNlZSB0aGUgY29tbWVudCBhYm92ZTotKCgKLSMjCQlzZWxmLmJhc2VjaGFpbiA9ICImV2luT2JqX2NoYWluIgorIyMgICAgICAgICAgICAgIHNlbGYuYmFzZWNoYWluID0gIiZXaW5PYmpfY2hhaW4iCiAKLQlkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCUdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJTZXRXUmVmQ29uKEdldERpYWxvZ1dpbmRvdyhpdHNlbGYpLCAobG9uZylpdCk7IikKKyAgICBkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICAgICAgT3V0cHV0KCJTZXRXUmVmQ29uKEdldERpYWxvZ1dpbmRvdyhpdHNlbGYpLCAobG9uZylpdCk7IikKIAotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeV9Ob25lOyIpCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5X05vbmU7IikKIAotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCU91dHB1dCgiaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfSIpCi0JCU91dHB1dCgiaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChEaWFsb2dQdHIpUHlJbnRfQXNMb25nKHYpOyIpCi0JCU91dHB1dCgiICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOyB9IikKKyAgICBkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0iKQorICAgICAgICBPdXRwdXQoImlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoRGlhbG9nUHRyKVB5SW50X0FzTG9uZyh2KTsiKQorICAgICAgICBPdXRwdXQoIiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsgfSIpCiAKLQlkZWYgb3V0cHV0Q29tcGFyZShzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgaW50ICVzX2NvbXBhcmUoJXMgKnNlbGYsICVzICpvdGhlcikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7IikKLQkJT3V0cHV0KCJpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7IikKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQotCQlPdXRSYnJhY2UoKQotCQkKLQlkZWYgb3V0cHV0SGFzaChzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgaW50ICVzX2hhc2goJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7IikKLQkJT3V0UmJyYWNlKCkKLQkJCi0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKLQkJT3V0cHV0KCJEaXNwb3NlRGlhbG9nKCVzKTsiLCBpdHNlbGZuYW1lKQorICAgIGRlZiBvdXRwdXRDb21wYXJlKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBpbnQgJXNfY29tcGFyZSglcyAqc2VsZiwgJXMgKm90aGVyKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsiKQorICAgICAgICBPdXRwdXQoImlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKKyAgICBkZWYgb3V0cHV0SGFzaChzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgaW50ICVzX2hhc2goJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKworICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisgICAgICAgIE91dHB1dCgiRGlzcG9zZURpYWxvZyglcyk7IiwgaXRzZWxmbmFtZSkKIAogIyBDcmVhdGUgdGhlIGdlbmVyYXRvciBncm91cHMgYW5kIGxpbmsgdGhlbQogbW9kdWxlID0gTWFjTW9kdWxlKCdfRGxnJywgJ0RsZycsIGluY2x1ZGVzdHVmZiwgZmluYWxzdHVmZiwgaW5pdHN0dWZmKQpAQCAtMjQ3LDI4ICsyNDcsMjggQEAKIGZvciBmIGluIG1ldGhvZHM6IG9iamVjdC5hZGQoZikKIAogc2V0dXNlcml0ZW1ib2R5ID0gIiIiCi0JUHlPYmplY3QgKm5ldyA9IE5VTEw7Ci0JCi0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAifE8iLCAmbmV3KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICpuZXcgPSBOVUxMOwogCi0JaWYgKERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2sgJiYgbmV3ICYmIG5ldyAhPSBQeV9Ob25lKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhEbGdfRXJyb3IsICJBbm90aGVyIFVzZXJJdGVtUHJvYyBpcyBhbHJlYWR5IGluc3RhbGxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKG5ldyA9PSBOVUxMIHx8IG5ldyA9PSBQeV9Ob25lKSB7Ci0JCW5ldyA9IE5VTEw7Ci0JCV9yZXMgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JfSBlbHNlIHsKLQkJUHlfSU5DUkVGKG5ldyk7Ci0JCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIFJlc09ial9OZXcsIChIYW5kbGUpTmV3VXNlckl0ZW1VUFAoRGxnX1VuaXZVc2VySXRlbVByb2MpKTsKLQl9Ci0JCi0JRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayA9IG5ldzsKLQlyZXR1cm4gX3JlczsKKworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyIsICZuZXcpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIGlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrICYmIG5ldyAmJiBuZXcgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEbGdfRXJyb3IsICJBbm90aGVyIFVzZXJJdGVtUHJvYyBpcyBhbHJlYWR5IGluc3RhbGxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ldyA9PSBOVUxMIHx8IG5ldyA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgbmV3ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKG5ldyk7CisgICAgICAgICAgICAgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlOZXdVc2VySXRlbVVQUChEbGdfVW5pdlVzZXJJdGVtUHJvYykpOworICAgICAgICB9CisKKyAgICAgICAgRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayA9IG5ldzsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAiIiIKIGYgPSBNYW51YWxHZW5lcmF0b3IoIlNldFVzZXJJdGVtSGFuZGxlciIsIHNldHVzZXJpdGVtYm9keSkKIG1vZHVsZS5hZGQoZikKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2RyYWcvZHJhZ3NjYW4ucHkgYi9NYWMvTW9kdWxlcy9kcmFnL2RyYWdzY2FuLnB5CmluZGV4IDI4MjcyOGUuLjkyM2E1NmIgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2RyYWcvZHJhZ3NjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvZHJhZy9kcmFnc2Nhbi5weQpAQCAtNyw3NCArNyw3NCBAQAogZnJvbSBzY2FudG9vbHMgaW1wb3J0IFNjYW5uZXIKIAogTUlTU0lOR19ERUZJTkVTPSIiIgota0RyYWdIYXNMZWZ0U2VuZGVyV2luZG93CT0gKDEgPDwgMCkKK2tEcmFnSGFzTGVmdFNlbmRlcldpbmRvdyAgICAgICAgPSAoMSA8PCAwKQoga0RyYWdJbnNpZGVTZW5kZXJBcHBsaWNhdGlvbiA9ICgxIDw8IDEpCi1rRHJhZ0luc2lkZVNlbmRlcldpbmRvdwkJPSAoMSA8PCAyKQota0RyYWdSZWdpb25BbmRJbWFnZQkJCT0gKDEgPDwgNCkKLWZsYXZvclNlbmRlck9ubHkJCQk9ICgxIDw8IDApCi1mbGF2b3JTZW5kZXJUcmFuc2xhdGVkCQk9ICgxIDw8IDEpCi1mbGF2b3JOb3RTYXZlZAkJCQk9ICgxIDw8IDIpCi1mbGF2b3JTeXN0ZW1UcmFuc2xhdGVkCQk9ICgxIDw8IDgpCitrRHJhZ0luc2lkZVNlbmRlcldpbmRvdyAgICAgICAgID0gKDEgPDwgMikKK2tEcmFnUmVnaW9uQW5kSW1hZ2UgICAgICAgICAgICAgICAgICAgICA9ICgxIDw8IDQpCitmbGF2b3JTZW5kZXJPbmx5ICAgICAgICAgICAgICAgICAgICAgICAgPSAoMSA8PCAwKQorZmxhdm9yU2VuZGVyVHJhbnNsYXRlZCAgICAgICAgICA9ICgxIDw8IDEpCitmbGF2b3JOb3RTYXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoMSA8PCAyKQorZmxhdm9yU3lzdGVtVHJhbnNsYXRlZCAgICAgICAgICA9ICgxIDw8IDgpCiAiIiIKIAogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gSU5DTFVERURJUiArICJEcmFnLmgiCi0Jb3V0cHV0ID0gImRyYWdnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiRHJhZ2NvbnN0LnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGRvaW5nICdpbXBvcnQgZHJhZ3N1cHBvcnQnID09PSIKLQlpbXBvcnQgZHJhZ3N1cHBvcnQKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIERyYWdtb2R1bGUuYyA9PT0iCisgICAgaW5wdXQgPSBJTkNMVURFRElSICsgIkRyYWcuaCIKKyAgICBvdXRwdXQgPSAiZHJhZ2dlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJEcmFnY29uc3QucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgZG9pbmcgJ2ltcG9ydCBkcmFnc3VwcG9ydCcgPT09IgorICAgIGltcG9ydCBkcmFnc3VwcG9ydAorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgRHJhZ21vZHVsZS5jID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0IGluICgnRHJhZ1JlZmVyZW5jZScsICdEcmFnUmVmJykgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCBpbiAoJ0RyYWdSZWZlcmVuY2UnLCAnRHJhZ1JlZicpIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAibWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJmcm9tIENhcmJvbi5UZXh0RWRpdCBpbXBvcnQgKlxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uUXVpY2tEcmF3IGltcG9ydCAqXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJma0RyYWdBY3Rpb25BbGwgPSAtMVxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiXG4iKQotCQkjIERlZmluZXMgdW5wYXJzZWFibGUgaW4gRHJhZy5oCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoTUlTU0lOR19ERUZJTkVTKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJmcm9tIENhcmJvbi5UZXh0RWRpdCBpbXBvcnQgKlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uUXVpY2tEcmF3IGltcG9ydCAqXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJma0RyYWdBY3Rpb25BbGwgPSAtMVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiXG4iKQorICAgICAgICAjIERlZmluZXMgdW5wYXJzZWFibGUgaW4gRHJhZy5oCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoTUlTU0lOR19ERUZJTkVTKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJrRHJhZ0FjdGlvbkFsbCIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAia0RyYWdBY3Rpb25BbGwiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiRHJhZ1RyYWNraW5nSGFuZGxlclVQUCIsCi0JCQkiRHJhZ1JlY2VpdmVIYW5kbGVyVVBQIiwKLQkJCSJEcmFnU2VuZERhdGFVUFAiLAotCQkJIkRyYWdJbnB1dFVQUCIsCi0JCQkiRHJhZ0RyYXdpbmdVUFAiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkRyYWdUcmFja2luZ0hhbmRsZXJVUFAiLAorICAgICAgICAgICAgICAgICJEcmFnUmVjZWl2ZUhhbmRsZXJVUFAiLAorICAgICAgICAgICAgICAgICJEcmFnU2VuZERhdGFVUFAiLAorICAgICAgICAgICAgICAgICJEcmFnSW5wdXRVUFAiLAorICAgICAgICAgICAgICAgICJEcmFnRHJhd2luZ1VQUCIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJTaXplIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIk9wdGlvbmFsSW5CdWZmZXIiLCAiKiIsICIqIildKSwKLQkJCQotCQkJKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgiU2l6ZSIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKLQkJCQotCQkJXQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoIlNpemUiLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIk9wdGlvbmFsSW5CdWZmZXIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoIlNpemUiLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJWYXJPdXRCdWZmZXIiLCAiKiIsICJJbk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgXQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZHJhZy9kcmFnc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL2RyYWcvZHJhZ3N1cHBvcnQucHkKaW5kZXggYzIwMDk1MC4uNDU4MzhlZiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZHJhZy9kcmFnc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9kcmFnL2RyYWdzdXBwb3J0LnB5CkBAIC02LDE2ICs2LDE2IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1BQ0hFQURFUkZJTEUgPSAnRHJhZy5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX0RyYWcnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICdEcmFnT2JqJwkJCSMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitNQUNIRUFERVJGSUxFID0gJ0RyYWcuaCcgICAgICAgICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnX0RyYWcnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdEcmFnT2JqJyAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdEcmFnJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSAnRHJhZ1JlZicJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdEcmFnJyAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gJ0RyYWdSZWYnICAjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQorT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicgICAgICAgICMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTY5LDgxICs2OSw4MSBAQAogZHJhZ2dsdWVfVHJhY2tpbmdIYW5kbGVyKERyYWdUcmFja2luZ01lc3NhZ2UgdGhlTWVzc2FnZSwgV2luZG93UHRyIHRoZVdpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpoYW5kbGVyUmVmQ29uLCBEcmFnUmVmZXJlbmNlIHRoZURyYWcpCiB7Ci0JUHlPYmplY3QgKmFyZ3MsICpydjsKLQlpbnQgaTsKLQkKLQlhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLCB0aGVNZXNzYWdlLCBEcmFnT2JqX05ldywgdGhlRHJhZywgV2luT2JqX1doaWNoV2luZG93LCB0aGVXaW5kb3cpOwotCWlmICggYXJncyA9PSBOVUxMICkKLQkJcmV0dXJuIC0xOwotCXJ2ID0gUHlFdmFsX0NhbGxPYmplY3QoKFB5T2JqZWN0ICopaGFuZGxlclJlZkNvbiwgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCWlmICggcnYgPT0gTlVMTCApIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBUcmFja2luZ0hhbmRsZXJcXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpID0gLTE7Ci0JaWYgKCBydiA9PSBQeV9Ob25lICkKLQkJaSA9IDA7Ci0JZWxzZQotCQlQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7Ci0JUHlfREVDUkVGKHJ2KTsKLQlyZXR1cm4gaTsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpydjsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoImhPJk8mIiwgdGhlTWVzc2FnZSwgRHJhZ09ial9OZXcsIHRoZURyYWcsIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKKyAgICAgICAgaWYgKCBhcmdzID09IE5VTEwgKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCgoUHlPYmplY3QgKiloYW5kbGVyUmVmQ29uLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBUcmFja2luZ0hhbmRsZXJcXG4iKTsKKyAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpID0gLTE7CisgICAgICAgIGlmICggcnYgPT0gUHlfTm9uZSApCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJldHVybiBpOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TRXJyCiBkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlcihXaW5kb3dQdHIgdGhlV2luZG93LCB2b2lkICpoYW5kbGVyUmVmQ29uLAogICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKQogewotCVB5T2JqZWN0ICphcmdzLCAqcnY7Ci0JaW50IGk7Ci0JCi0JYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBEcmFnT2JqX05ldywgdGhlRHJhZywgV2luT2JqX1doaWNoV2luZG93LCB0aGVXaW5kb3cpOwotCWlmICggYXJncyA9PSBOVUxMICkKLQkJcmV0dXJuIC0xOwotCXJ2ID0gUHlFdmFsX0NhbGxPYmplY3QoKFB5T2JqZWN0ICopaGFuZGxlclJlZkNvbiwgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCWlmICggcnYgPT0gTlVMTCApIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBSZWNlaXZlSGFuZGxlclxcbiIpOwotCQlQeUVycl9QcmludCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWkgPSAtMTsKLQlpZiAoIHJ2ID09IFB5X05vbmUgKQotCQlpID0gMDsKLQllbHNlCi0JCVB5QXJnX1BhcnNlKHJ2LCAibCIsICZpKTsKLQlQeV9ERUNSRUYocnYpOwotCXJldHVybiBpOworICAgICAgICBQeU9iamVjdCAqYXJncywgKnJ2OworICAgICAgICBpbnQgaTsKKworICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsIERyYWdPYmpfTmV3LCB0aGVEcmFnLCBXaW5PYmpfV2hpY2hXaW5kb3csIHRoZVdpbmRvdyk7CisgICAgICAgIGlmICggYXJncyA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QoKFB5T2JqZWN0ICopaGFuZGxlclJlZkNvbiwgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJEcmFnOiBFeGNlcHRpb24gaW4gUmVjZWl2ZUhhbmRsZXJcXG4iKTsKKyAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpID0gLTE7CisgICAgICAgIGlmICggcnYgPT0gUHlfTm9uZSApCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJldHVybiBpOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TRXJyCiBkcmFnZ2x1ZV9TZW5kRGF0YShGbGF2b3JUeXBlIHRoZVR5cGUsIHZvaWQgKmRyYWdTZW5kUmVmQ29uLAogICAgICAgICAgICAgICAgICAgICAgIEl0ZW1SZWZlcmVuY2UgdGhlSXRlbSwgRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKQogewotCURyYWdPYmpPYmplY3QgKnNlbGYgPSAoRHJhZ09iak9iamVjdCAqKWRyYWdTZW5kUmVmQ29uOwotCVB5T2JqZWN0ICphcmdzLCAqcnY7Ci0JaW50IGk7Ci0JCi0JaWYgKCBzZWxmLT5zZW5kcHJvYyA9PSBOVUxMICkKLQkJcmV0dXJuIC0xOwotCWFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSwgdGhlSXRlbSk7Ci0JaWYgKCBhcmdzID09IE5VTEwgKQotCQlyZXR1cm4gLTE7Ci0JcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChzZWxmLT5zZW5kcHJvYywgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCWlmICggcnYgPT0gTlVMTCApIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBTZW5kRGF0YUhhbmRsZXJcXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpID0gLTE7Ci0JaWYgKCBydiA9PSBQeV9Ob25lICkKLQkJaSA9IDA7Ci0JZWxzZQotCQlQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7Ci0JUHlfREVDUkVGKHJ2KTsKLQlyZXR1cm4gaTsKKyAgICAgICAgRHJhZ09iak9iamVjdCAqc2VsZiA9IChEcmFnT2JqT2JqZWN0ICopZHJhZ1NlbmRSZWZDb247CisgICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcnY7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmICggc2VsZi0+c2VuZHByb2MgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZVR5cGUsIHRoZUl0ZW0pOworICAgICAgICBpZiAoIGFyZ3MgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KHNlbGYtPnNlbmRwcm9jLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBTZW5kRGF0YUhhbmRsZXJcXG4iKTsKKyAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpID0gLTE7CisgICAgICAgIGlmICggcnYgPT0gUHlfTm9uZSApCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJldHVybiBpOwogfQogCiAjaWYgMApAQCAtMTY1LDggKzE2NSw4IEBACiAiIiIKIAogaW5pdHN0dWZmID0gaW5pdHN0dWZmICsgIiIiCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRHJhZ1JlZiwgRHJhZ09ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChEcmFnUmVmLCBEcmFnT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEcmFnUmVmLCBEcmFnT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChEcmFnUmVmLCBEcmFnT2JqX0NvbnZlcnQpOwogIiIiCiAKIHZhcmlhYmxlc3R1ZmYgPSAiIiIKQEAgLTE3NywzMyArMTc3LDMzIEBACiBkcmFnZ2x1ZV9JbnB1dFVQUCA9IE5ld0RyYWdJbnB1dFVQUChkcmFnZ2x1ZV9JbnB1dCk7CiBkcmFnZ2x1ZV9EcmF3aW5nVVBQID0gTmV3RHJhZ0RyYXdpbmdVUFAoZHJhZ2dsdWVfRHJhd2luZyk7CiAjZW5kaWYKLSIiIiAgICAKKyIiIgogCiBjbGFzcyBNeU9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoRHJhZ19FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIERyYWciKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfSIiIikKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotCQkjIyBPdXRwdXQoIkRpc3Bvc2VEcmFnKCVzKTsiLCBpdHNlbGZuYW1lKQotCQlPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+c2VuZHByb2MpOyIpCi0JCSMjIE91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5pbnB1dHByb2MpOyIpCi0JCSMjIE91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5kcmF3aW5ncHJvYyk7IikKLQkJCi0JZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCUdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoIlB5T2JqZWN0ICpzZW5kcHJvYzsiKQotCQkjIyBPdXRwdXQoIlB5T2JqZWN0ICppbnB1dHByb2M7IikKLQkJIyMgT3V0cHV0KCJQeU9iamVjdCAqZHJhd2luZ3Byb2M7IikKLQkJCi0JZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiaXQtPnNlbmRwcm9jID0gTlVMTDsiKQotCQkjIyBPdXRwdXQoIml0LT5pbnB1dHByb2MgPSBOVUxMOyIpCi0JCSMjIE91dHB1dCgiaXQtPmRyYXdpbmdwcm9jID0gTlVMTDsiKQotCQkKLQkJCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEcmFnX0Vycm9yLCJDYW5ub3QgY3JlYXRlIG51bGwgRHJhZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0iIiIpCisgICAgZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKKyAgICAgICAgIyMgT3V0cHV0KCJEaXNwb3NlRHJhZyglcyk7IiwgaXRzZWxmbmFtZSkKKyAgICAgICAgT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPnNlbmRwcm9jKTsiKQorICAgICAgICAjIyBPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+aW5wdXRwcm9jKTsiKQorICAgICAgICAjIyBPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+ZHJhd2luZ3Byb2MpOyIpCisKKyAgICBkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKnNlbmRwcm9jOyIpCisgICAgICAgICMjIE91dHB1dCgiUHlPYmplY3QgKmlucHV0cHJvYzsiKQorICAgICAgICAjIyBPdXRwdXQoIlB5T2JqZWN0ICpkcmF3aW5ncHJvYzsiKQorCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiaXQtPnNlbmRwcm9jID0gTlVMTDsiKQorICAgICAgICAjIyBPdXRwdXQoIml0LT5pbnB1dHByb2MgPSBOVUxMOyIpCisgICAgICAgICMjIE91dHB1dCgiaXQtPmRyYXdpbmdwcm9jID0gTlVMTDsiKQorCisKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgZ3JvdXBzIGFuZCBsaW5rIHRoZW0KIG1vZHVsZSA9IE1hY01vZHVsZShNT0ROQU1FLCBNT0RQUkVGSVgsIGluY2x1ZGVzdHVmZiwgZmluYWxzdHVmZiwgaW5pdHN0dWZmLCB2YXJpYWJsZXN0dWZmKQogb2JqZWN0ID0gTXlPYmplY3REZWZpbml0aW9uKE9CSkVDVE5BTUUsIE9CSkVDVFBSRUZJWCwgT0JKRUNUVFlQRSkKQEAgLTIyOCwxNSArMjI4LDE1IEBACiAgICAgUHlPYmplY3QgKmNhbGxiYWNrOwogICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOwogICAgIE9TRXJyIF9lcnI7Ci0gICAgCisKICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiT3xPJiIsICZjYWxsYmFjaywgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKLSAgICAJcmV0dXJuIE5VTEw7Ci0gICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsJLyogQ2Fubm90IGRlY3JlZiBsYXRlciwgdG9vIGJhZCAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoY2FsbGJhY2spOyAgICAgICAgLyogQ2Fubm90IGRlY3JlZiBsYXRlciwgdG9vIGJhZCAqLwogICAgIF9lcnIgPSBJbnN0YWxsVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAiIiIKIGluc3RhbGx0cmFja2luZyA9IE1hbnVhbEdlbmVyYXRvcigiSW5zdGFsbFRyYWNraW5nSGFuZGxlciIsIGluc3RhbGx0cmFja2luZ19ib2R5KQogbW9kdWxlLmFkZChpbnN0YWxsdHJhY2tpbmcpCkBAIC0yNDUsMTUgKzI0NSwxNSBAQAogICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKICAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKICAgICBPU0VyciBfZXJyOwotICAgIAorCiAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk98TyYiLCAmY2FsbGJhY2ssIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0gICAgCXJldHVybiBOVUxMOwotICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7CS8qIENhbm5vdCBkZWNyZWYgbGF0ZXIsIHRvbyBiYWQgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsgICAgICAgIC8qIENhbm5vdCBkZWNyZWYgbGF0ZXIsIHRvbyBiYWQgKi8KICAgICBfZXJyID0gSW5zdGFsbFJlY2VpdmVIYW5kbGVyKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQLCB0aGVXaW5kb3csICh2b2lkICopY2FsbGJhY2spOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIF9yZXMgPSBQeV9Ob25lOworICAgICAgICByZXR1cm4gX3JlczsKICIiIgogaW5zdGFsbHJlY2VpdmUgPSBNYW51YWxHZW5lcmF0b3IoIkluc3RhbGxSZWNlaXZlSGFuZGxlciIsIGluc3RhbGxyZWNlaXZlX2JvZHkpCiBtb2R1bGUuYWRkKGluc3RhbGxyZWNlaXZlKQpAQCAtMjYxLDE0ICsyNjEsMTQgQEAKIHJlbW92ZXRyYWNraW5nX2JvZHkgPSAiIiIKICAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKICAgICBPU0VyciBfZXJyOwotICAgIAorCiAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPJiIsIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0gICAgCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICBfZXJyID0gUmVtb3ZlVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAiIiIKIHJlbW92ZXRyYWNraW5nID0gTWFudWFsR2VuZXJhdG9yKCJSZW1vdmVUcmFja2luZ0hhbmRsZXIiLCByZW1vdmV0cmFja2luZ19ib2R5KQogbW9kdWxlLmFkZChyZW1vdmV0cmFja2luZykKQEAgLTI3NiwxNCArMjc2LDE0IEBACiByZW1vdmVyZWNlaXZlX2JvZHkgPSAiIiIKICAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKICAgICBPU0VyciBfZXJyOwotICAgIAorCiAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPJiIsIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0gICAgCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICBfZXJyID0gUmVtb3ZlUmVjZWl2ZUhhbmRsZXIoZHJhZ2dsdWVfUmVjZWl2ZUhhbmRsZXJVUFAsIHRoZVdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgX3JlcyA9IFB5X05vbmU7CisgICAgICAgIHJldHVybiBfcmVzOwogIiIiCiByZW1vdmVyZWNlaXZlID0gTWFudWFsR2VuZXJhdG9yKCJSZW1vdmVSZWNlaXZlSGFuZGxlciIsIHJlbW92ZXJlY2VpdmVfYm9keSkKIG1vZHVsZS5hZGQocmVtb3ZlcmVjZWl2ZSkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2V2dC9ldnRlZGl0LnB5IGIvTWFjL01vZHVsZXMvZXZ0L2V2dGVkaXQucHkKaW5kZXggMzQyNmI3MC4uMDIwODdlMSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZXZ0L2V2dGVkaXQucHkKKysrIGIvTWFjL01vZHVsZXMvZXZ0L2V2dGVkaXQucHkKQEAgLTcsNCArNywzIEBACiBmID0gRnVuY3Rpb24oVUludDMyLCAnVGlja0NvdW50JywKICkKIGZ1bmN0aW9ucy5hcHBlbmQoZikKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZXZ0L2V2dHNjYW4ucHkgYi9NYWMvTW9kdWxlcy9ldnQvZXZ0c2Nhbi5weQppbmRleCBlNTc2MmQ5Li4wZDBjOWVjIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9ldnQvZXZ0c2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9ldnQvZXZ0c2Nhbi5weQpAQCAtMTEsNzEgKzExLDcxIEBACiBPQkpFQ1QgPSAiTk9UVVNFRCIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IExPTkcgKyAiLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBMT05HICsgIi5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCSMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQotCQkJaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgIyBUaGlzIGlzIG5vbi1mdW5jdGlvbmFsIHRvZGF5CisgICAgICAgICAgICBpZiB0ID09IE9CSkVDVCBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIktleVRyYW5zbGF0ZSIsCi0JCQkiR2V0RXZlbnRNYXNrIiwJCSMgSSBjYW5ub3Qgc2VlbSB0byBmaW5kIHRoaXMgcm91dGluZS4uLgotCQkJIldhaXROZXh0RXZlbnQiLAkjIE1hbnVhbGx5IGdlbmVyYXRlZCBiZWNhdXNlIG9mIG9wdGlvbmFsIHJlZ2lvbgotCQkJIyBDb25zdGFudHMgd2l0aCBmdW5ueSBkZWZpbml0aW9ucwotCQkJIm9zRXZ0TWVzc2FnZU1hc2siLAotCQkJIyBPUzggY2FsbHMKLQkJCSdTeXN0ZW1FdmVudCcsCi0JCQknU3lzdGVtVGFzaycsCi0JCQknU3lzdGVtQ2xpY2snLAotCQkJJ0dldE9TRXZlbnQnLAotCQkJJ09TRXZlbnRBdmFpbCcsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiS2V5VHJhbnNsYXRlIiwKKyAgICAgICAgICAgICAgICAiR2V0RXZlbnRNYXNrIiwgICAgICAgICAjIEkgY2Fubm90IHNlZW0gdG8gZmluZCB0aGlzIHJvdXRpbmUuLi4KKyAgICAgICAgICAgICAgICAiV2FpdE5leHRFdmVudCIsICAgICAgICAjIE1hbnVhbGx5IGdlbmVyYXRlZCBiZWNhdXNlIG9mIG9wdGlvbmFsIHJlZ2lvbgorICAgICAgICAgICAgICAgICMgQ29uc3RhbnRzIHdpdGggZnVubnkgZGVmaW5pdGlvbnMKKyAgICAgICAgICAgICAgICAib3NFdnRNZXNzYWdlTWFzayIsCisgICAgICAgICAgICAgICAgIyBPUzggY2FsbHMKKyAgICAgICAgICAgICAgICAnU3lzdGVtRXZlbnQnLAorICAgICAgICAgICAgICAgICdTeXN0ZW1UYXNrJywKKyAgICAgICAgICAgICAgICAnU3lzdGVtQ2xpY2snLAorICAgICAgICAgICAgICAgICdHZXRPU0V2ZW50JywKKyAgICAgICAgICAgICAgICAnT1NFdmVudEF2YWlsJywKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkV2UUVsUHRyIiwgIlFIZHJQdHIiCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiRXZRRWxQdHIiLCAiUUhkclB0ciIKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKLQkJCQotCQkJKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibG9uZyIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiVmFyVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKLQkJCQotCQkJKFsoInZvaWQiLCAid1N0b3JhZ2UiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJOdWxsU3RvcmFnZSIsICIqIiwgIkluTW9kZSIpXSksCi0JCQkKLQkJCSMgR2V0S2V5cwotCQkJKFsoJ0tleU1hcCcsICd0aGVLZXlzJywgJ0luTW9kZScpXSwKLQkJCSBbKCcqJywgJyonLCAnT3V0TW9kZScpXSksCi0JCQkgCi0JCQkjIEdldFRpY2tlcgotCQkJKFsoJ3Vuc2lnbmVkIGxvbmcnLCAnKicsICcqJyldLAotCQkJIFsoJ3Vuc2lnbmVkX2xvbmcnLCAnKicsICcqJyldKSwKLQkJCV0KLQkJCQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibG9uZyIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlZhclZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAoWygidm9pZCIsICJ3U3RvcmFnZSIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJOdWxsU3RvcmFnZSIsICIqIiwgIkluTW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAjIEdldEtleXMKKyAgICAgICAgICAgICAgICAoWygnS2V5TWFwJywgJ3RoZUtleXMnLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCcqJywgJyonLCAnT3V0TW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIEdldFRpY2tlcgorICAgICAgICAgICAgICAgIChbKCd1bnNpZ25lZCBsb25nJywgJyonLCAnKicpXSwKKyAgICAgICAgICAgICAgICAgWygndW5zaWduZWRfbG9uZycsICcqJywgJyonKV0pLAorICAgICAgICAgICAgICAgIF0KKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2V2dC9ldnRzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvZXZ0L2V2dHN1cHBvcnQucHkKaW5kZXggY2NkYzFjNS4uZjU4ZGExNCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZXZ0L2V2dHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvZXZ0L2V2dHN1cHBvcnQucHkKQEAgLTYsMTcgKzYsMTcgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdFdmVudHMuaCcJCSMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCi1NT0ROQU1FID0gJ19FdnQnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICdFdmVudCcJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQotS0lORCA9ICdSZWNvcmQnCQkJCSMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJworTUFDSEVBREVSRklMRSA9ICdFdmVudHMuaCcgICAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19FdnQnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK09CSkVDVE5BTUUgPSAnRXZlbnQnICAgICAgICAgICAgICAgICAgICAjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQorS0lORCA9ICdSZWNvcmQnICAgICAgICAgICAgICAgICAgICAgICAgICMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJwogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnRXZ0JwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgS0lORAkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdFdnQnICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArIEtJTkQgICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TWFzaywKICAgICAgICAgICAgICAgICAgICAgICAmc2xlZXAsCiAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtb3VzZXJlZ2lvbikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogX3J2ID0gV2FpdE5leHRFdmVudChldmVudE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICZ0aGVFdmVudCwKICAgICAgICAgICAgICAgICAgICAgc2xlZXAsCkBAIC05MCw0ICs5MCwzIEBACiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9maWxlL2ZpbGVzY2FuLnB5IGIvTWFjL01vZHVsZXMvZmlsZS9maWxlc2Nhbi5weQppbmRleCBmOGI1YmEyLi44ZWJjNjlmIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9maWxlL2ZpbGVzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2ZpbGUvZmlsZXNjYW4ucHkKQEAgLTEwLDE5MCArMTAsMTkwIEBACiBTSE9SVCA9ICJmaWxlIgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gWyJGaWxlcy5oIiwgIkFsaWFzZXMuaCIsICJGaW5kZXIuaCJdCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0Jc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gWyJGaWxlcy5oIiwgIkFsaWFzZXMuaCIsICJGaW5kZXIuaCJdCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcl9PU1gpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCSMgRnVubnkgc3BlY2lhbCBjYXNlCi0JCQlpZiBsZW4oYXJnbGlzdCkgPiAyOgotCQkJCXQsIG4sIG0gPSBhcmdsaXN0WzFdCi0JCQkJaWYgdCA9PSAiQWxpYXNIYW5kbGUiIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCQljbGFzc25hbWUgPSAiQXJnMk1ldGhvZEdlbmVyYXRvciIKLQkJCQkJbGlzdG5hbWUgPSAiYWxpYXNfbWV0aG9kcyIKLQkJCQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKLQkJCSMgTm9ybWFsIGNhc2VzCi0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCA9PSAiQWxpYXNIYW5kbGUiIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAiYWxpYXNfbWV0aG9kcyIKLQkJCWlmIHQgPT0gIkZTU3BlY19wdHIiIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAiZnNzcGVjX21ldGhvZHMiCi0JCQlpZiB0ID09ICJGU1JlZl9wdHIiIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAiZnNyZWZfbWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgIyBGdW5ueSBzcGVjaWFsIGNhc2UKKyAgICAgICAgICAgIGlmIGxlbihhcmdsaXN0KSA+IDI6CisgICAgICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMV0KKyAgICAgICAgICAgICAgICBpZiB0ID09ICJBbGlhc0hhbmRsZSIgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJBcmcyTWV0aG9kR2VuZXJhdG9yIgorICAgICAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJhbGlhc19tZXRob2RzIgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgICAgICAgICAgIyBOb3JtYWwgY2FzZXMKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0ID09ICJBbGlhc0hhbmRsZSIgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJhbGlhc19tZXRob2RzIgorICAgICAgICAgICAgaWYgdCA9PSAiRlNTcGVjX3B0ciIgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJmc3NwZWNfbWV0aG9kcyIKKyAgICAgICAgICAgIGlmIHQgPT0gIkZTUmVmX3B0ciIgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJmc3JlZl9tZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSMgQ29uc3RhbnRzIHdpdGggaW5jb21wYXRpYmxlIGRlZmluaXRpb25zCi0JCQkia2lvQUNBY2Nlc3NPd25lck1hc2siLAotCQkJImtGU0NhdEluZm9SZXNlcnZlZCIsCi0JCQkia0ZTSXRlcmF0ZVJlc2VydmVkIiwKLQkJCSJrU3lzdGVtRm9sZGVyVHlwZSIsCi0JCQkKLQkJCSJGU1JlZk1ha2VQYXRoIiwgIyBEbyB0aGlzIG1hbnVhbGx5Ci0jCQkJIlJlc29sdmVBbGlhcyIsICMgRG8gdGhpcyBtYW51YWxseQotIwkJCSJSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncyIsICMgRG8gdGhpcyBtYW51YWxseQotIwkJCSJGb2xsb3dGaW5kZXJBbGlhcyIsICMgRG8gdGhpcyBtYW51YWxseQotCQkJCi0JCQkiRlNSZWFkIiwgIyBDb3VsZG4ndCBiZSBib3RoZXJlZAotCQkJIkZTV3JpdGUiLCAjIGRpdHRvCi0JCQkiRlNSZWFkRm9yayIsICMgZGl0dG8KLQkJCSJGU1dyaXRlRm9yayIsICMgZGl0dG8KLQkJCQotCQkJIyBPbGQgcm91dGluZXM6Ci0JCQkiR2V0V0RJbmZvIiwKLQkJCSJPcGVuV0QiLAotCQkJIkNsb3NlV0QiLAotCQkJIkZJbml0UXVldWUiLAotCQkJInJzdGZsb2NrIiwKLQkJCSJzZXRmbG9jayIsCi0JCQkic2V0ZmluZm8iLAotCQkJImZzcmVuYW1lIiwKLQkJCSJmc2RlbGV0ZSIsCi0JCQkiY3JlYXRlIiwKLQkJCSJmbHVzaHZvbCIsCi0JCQkiZWplY3QiLAotCQkJInVtb3VudHZvbCIsCi0JCQkic2V0dm9sIiwKLQkJCSJnZXR2b2wiLAotCQkJImdldGZpbmZvIiwKLQkJCSJnZXR2aW5mbyIsCi0JCQkiZnNvcGVuIiwKLQkJCSJSc3RGTG9jayIsCi0JCQkiU2V0RkxvY2siLAotCQkJIlNldEZJbmZvIiwKLQkJCSJSZW5hbWUiLAotCQkJIk9wZW5SRiIsCi0JCQkiRlNEZWxldGUiLAotCQkJIkNyZWF0ZSIsCi0JCQkiR2V0Vm9sIiwKLQkJCSJHZXRGSW5mbyIsCi0JCQkiR2V0VkluZm8iLAotCQkJIkZTT3BlbiIsCi0JCQkiRWplY3QiLAotCQkJIlNldFZvbCIsCi0JCQkib3BlbnJmIiwKLQkJCSJ1bm1vdW50dm9sIiwKLQkJCSJPcGVuREYiLAotCQkJCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAjIENvbnN0YW50cyB3aXRoIGluY29tcGF0aWJsZSBkZWZpbml0aW9ucworICAgICAgICAgICAgICAgICJraW9BQ0FjY2Vzc093bmVyTWFzayIsCisgICAgICAgICAgICAgICAgImtGU0NhdEluZm9SZXNlcnZlZCIsCisgICAgICAgICAgICAgICAgImtGU0l0ZXJhdGVSZXNlcnZlZCIsCisgICAgICAgICAgICAgICAgImtTeXN0ZW1Gb2xkZXJUeXBlIiwKIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiQ0luZm9QQlB0ciIsICMgT2xkIHN0dWZmCi0JCQkiQ01vdmVQQlB0ciIsICMgT2xkIHN0dWZmCi0JCQkiUGFybUJsa1B0ciIsICMgT2xkIHN0dWZmCi0JCQkiSFBhcm1CbGtQdHIiLCAjIE9sZCBzdHVmZgotCQkJIkRUUEJQdHIiLCAjIE9sZCBzdHVmZgotCQkJIkZDQlBCUHRyIiwgIyBPbGQgc3R1ZmYKLQkJCSJRSGRyUHRyIiwgIyBPbGQgc3R1ZmYKLQkJCSJDU1BhcmFtUHRyIiwgIyBPbGQgc3R1ZmYKLQkJCSJGU0NhdGFsb2dCdWxrUGFyYW0iLCAjIG9sZCBzdHVmZgotCQkJIkZTRm9ya0NCSW5mb1BhcmFtIiwgIyBvbGQgc3R1ZmYKLQkJCSJGU0ZvcmtJT1BhcmFtIiwgIyBvbGQgc3R1ZmYKLQkJCSJGU1JlZlBhcmFtIiwgICMgb2xkIHN0dWZmCi0JCQkiRlNWb2x1bWVJbmZvUGFyYW0iLCAjIG9sZCBzdHVmZgotCQkJIldEUEJQdHIiLCAjIG9sZCBzdHVmZgotCQkJIlhDSW5mb1BCUHRyIiwgIyBvbGQgc3R1ZmYKLQkJCSJYVm9sdW1lUGFyYW1QdHIiLCAjIG9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJGU1JlZk1ha2VQYXRoIiwgIyBEbyB0aGlzIG1hbnVhbGx5CisjICAgICAgICAgICAgICAgICAgICAgICAiUmVzb2x2ZUFsaWFzIiwgIyBEbyB0aGlzIG1hbnVhbGx5CisjICAgICAgICAgICAgICAgICAgICAgICAiUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAjIERvIHRoaXMgbWFudWFsbHkKKyMgICAgICAgICAgICAgICAgICAgICAgICJGb2xsb3dGaW5kZXJBbGlhcyIsICMgRG8gdGhpcyBtYW51YWxseQogCi0JCQkKLQkJCSJDYXRQb3NpdGlvblJlYyIsICMgU3RhdGUgdmFyaWFibGUsIG5vdCB0b28gZGlmZmljdWx0Ci0JCQkiRlNJdGVyYXRvciIsICMgU2hvdWxkIGJlY29tZSBhbiBvYmplY3QKLQkJCSJGU0ZvcmtJbmZvIiwgIyBMb3RzIG9mIGZpZWxkcywgZGlmZmljdWx0IHN0cnVjdAotCQkJIkZTU2VhcmNoUGFyYW1zIiwgIyBBbHNvIGNhdHNlYXJjaCBzdHVmZgotCQkJIkZTVm9sdW1lSW5mbyIsICMgYmlnIHN0cnVjdAotCQkJIkZTVm9sdW1lSW5mb19wdHIiLCAjIGJpZyBzdHJ1Y3QKLQkJCQotCQkJIklPQ29tcGxldGlvblByb2NQdHIiLCAjIHByb2MgcG9pbnRlcgotCQkJIklPQ29tcGxldGlvblVQUCIsICMgUHJvYyBwb2ludGVyCi0JCQkiQWxpYXNGaWx0ZXJQcm9jUHRyIiwKLQkJCSJBbGlhc0ZpbHRlclVQUCIsCi0JCQkiRk5TdWJzY3JpcHRpb25VUFAiLAotCQkJCi0JCQkiRk5TdWJzY3JpcHRpb25SZWYiLCAjIExhenksIGZvciBub3cuCi0JCQldCisgICAgICAgICAgICAgICAgIkZTUmVhZCIsICMgQ291bGRuJ3QgYmUgYm90aGVyZWQKKyAgICAgICAgICAgICAgICAiRlNXcml0ZSIsICMgZGl0dG8KKyAgICAgICAgICAgICAgICAiRlNSZWFkRm9yayIsICMgZGl0dG8KKyAgICAgICAgICAgICAgICAiRlNXcml0ZUZvcmsiLCAjIGRpdHRvCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSMgVmFyaW91cyB3YXlzIHRvIGdpdmUgcGF0aG5hbWVzCi0JCQkoWygnY2hhcl9wdHInLCAnKicsICdJbk1vZGUnKV0sCi0JCQkgWygnc3RyaW5ncHRyJywgJyonLCAnSW5Nb2RlJyldCi0JCQkpLAotCQkJIAotCQkJIyBVbmljb2RlIGZpbGVuYW1lcyBwYXNzZWQgYXMgbGVuZ3RoLCBidWZmZXIKLQkJCShbKCdVbmlDaGFyQ291bnQnLCAnKicsICdJbk1vZGUnKSwKLQkJCSAgKCdVbmlDaGFyX3B0cicsICcqJywgJ0luTW9kZScpXSwKLQkJCSBbKCdVbmljb2RlUmV2ZXJzZUluQnVmZmVyJywgJyonLCAnSW5Nb2RlJyldCi0JCQkpLAotCQkJIyBXcm9uZyBndWVzcwotCQkJKFsoJ1N0cjYzJywgJ3RoZVN0cmluZycsICdJbk1vZGUnKV0sCi0JCQkgWygnU3RyNjMnLCAndGhlU3RyaW5nJywgJ091dE1vZGUnKV0pLAotCQkJIAotCQkJIyBZZXQgYW5vdGhlciB3YXkgdG8gZ2l2ZSBhIHBhdGhuYW1lOi0pCi0JCQkoWygnc2hvcnQnLCAnZnVsbFBhdGhMZW5ndGgnLCAnSW5Nb2RlJyksCi0JCQkgICgndm9pZF9wdHInLCAnZnVsbFBhdGgnLCAnSW5Nb2RlJyldLAotCQkJIFsoJ0Z1bGxQYXRoTmFtZScsICdmdWxsUGF0aCcsICdJbk1vZGUnKV0pLAotCQotCQkJIyBWYXJpb3VzIFJlc29sdmVBbGlhc0ZpbGVYWFhYIGZ1bmN0aW9ucwotCQkJKFsoJ0ZTU3BlYycsICd0aGVTcGVjJywgJ091dE1vZGUnKV0sCi0JCQkgWygnRlNTcGVjX3B0cicsICd0aGVTcGVjJywgJ0luT3V0TW9kZScpXSksCi0JCQkgCi0JCQkoWygnRlNSZWYnLCAndGhlUmVmJywgJ091dE1vZGUnKV0sCi0JCQkgWygnRlNSZWZfcHRyJywgJ3RoZVJlZicsICdJbk91dE1vZGUnKV0pLAotCQkJIAotCQkJIyBUaGUgb3B0aW9uYWwgRlNTcGVjIHRvIGFsbCBSZXNvbHZlQWxpYXMgYW5kIE5ld0FsaWFzIG1ldGhvZHMKLQkJCShbKCdGU1NwZWNfcHRyJywgJ2Zyb21GaWxlJywgJ0luTW9kZScpXSwKLSAgICAJCSBbKCdPcHRGU1NwZWNQdHInLCAnZnJvbUZpbGUnLCAnSW5Nb2RlJyldKSwKKyAgICAgICAgICAgICAgICAjIE9sZCByb3V0aW5lczoKKyAgICAgICAgICAgICAgICAiR2V0V0RJbmZvIiwKKyAgICAgICAgICAgICAgICAiT3BlbldEIiwKKyAgICAgICAgICAgICAgICAiQ2xvc2VXRCIsCisgICAgICAgICAgICAgICAgIkZJbml0UXVldWUiLAorICAgICAgICAgICAgICAgICJyc3RmbG9jayIsCisgICAgICAgICAgICAgICAgInNldGZsb2NrIiwKKyAgICAgICAgICAgICAgICAic2V0ZmluZm8iLAorICAgICAgICAgICAgICAgICJmc3JlbmFtZSIsCisgICAgICAgICAgICAgICAgImZzZGVsZXRlIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRlIiwKKyAgICAgICAgICAgICAgICAiZmx1c2h2b2wiLAorICAgICAgICAgICAgICAgICJlamVjdCIsCisgICAgICAgICAgICAgICAgInVtb3VudHZvbCIsCisgICAgICAgICAgICAgICAgInNldHZvbCIsCisgICAgICAgICAgICAgICAgImdldHZvbCIsCisgICAgICAgICAgICAgICAgImdldGZpbmZvIiwKKyAgICAgICAgICAgICAgICAiZ2V0dmluZm8iLAorICAgICAgICAgICAgICAgICJmc29wZW4iLAorICAgICAgICAgICAgICAgICJSc3RGTG9jayIsCisgICAgICAgICAgICAgICAgIlNldEZMb2NrIiwKKyAgICAgICAgICAgICAgICAiU2V0RkluZm8iLAorICAgICAgICAgICAgICAgICJSZW5hbWUiLAorICAgICAgICAgICAgICAgICJPcGVuUkYiLAorICAgICAgICAgICAgICAgICJGU0RlbGV0ZSIsCisgICAgICAgICAgICAgICAgIkNyZWF0ZSIsCisgICAgICAgICAgICAgICAgIkdldFZvbCIsCisgICAgICAgICAgICAgICAgIkdldEZJbmZvIiwKKyAgICAgICAgICAgICAgICAiR2V0VkluZm8iLAorICAgICAgICAgICAgICAgICJGU09wZW4iLAorICAgICAgICAgICAgICAgICJFamVjdCIsCisgICAgICAgICAgICAgICAgIlNldFZvbCIsCisgICAgICAgICAgICAgICAgIm9wZW5yZiIsCisgICAgICAgICAgICAgICAgInVubW91bnR2b2wiLAorICAgICAgICAgICAgICAgICJPcGVuREYiLAogCi0JCQkoWygnRlNSZWZfcHRyJywgJ2Zyb21GaWxlJywgJ0luTW9kZScpXSwKLSAgICAJCSBbKCdPcHRGU1JlZlB0cicsICdmcm9tRmlsZScsICdJbk1vZGUnKV0pLAotICAgIAkJIAotIyMgICAgCQkjIEZTQ2F0YWxvZ0luZm8gaW5wdXQgaGFuZGxpbmcKLSMjCQkJKFsoJ0ZTQ2F0YWxvZ0luZm9CaXRtYXAnLCAnd2hpY2hJbmZvJywgJ0luTW9kZScpLAotIyMgICAgCQkgICgnRlNDYXRhbG9nSW5mb19wdHInLCAnY2F0YWxvZ0luZm8nLCAnSW5Nb2RlJyldLAotIyMgICAgCQkgWygnRlNDYXRhbG9nSW5mb0FuZEJpdG1hcF9pbicsICdjYXRhbG9nSW5mbycsICdJbk1vZGUnKV0pLAotIyMgICAgCQkKLSMjICAgIAkJIyBGU0NhdGFsb2dJbmZvIG91dHB1dCBoYW5kbGluZwotIyMJCQkoWygnRlNDYXRhbG9nSW5mb0JpdG1hcCcsICd3aGljaEluZm8nLCAnSW5Nb2RlJyksCi0jIyAgICAJCSAgKCdGU0NhdGFsb2dJbmZvJywgJ2NhdGFsb2dJbmZvJywgJ091dE1vZGUnKV0sCi0jIyAgICAJCSBbKCdGU0NhdGFsb2dJbmZvQW5kQml0bWFwX291dCcsICdjYXRhbG9nSW5mbycsICdJbk91dE1vZGUnKV0pLAotIyMgICAgCQkKKyAgICAgICAgICAgICAgICBdCiAKLQkJXQotCQkKLSAgIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJ0cnVlID0gVHJ1ZVxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZmFsc2UgPSBGYWxzZVxuIikKLQkJCQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkNJbmZvUEJQdHIiLCAjIE9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJDTW92ZVBCUHRyIiwgIyBPbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAiUGFybUJsa1B0ciIsICMgT2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIkhQYXJtQmxrUHRyIiwgIyBPbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAiRFRQQlB0ciIsICMgT2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIkZDQlBCUHRyIiwgIyBPbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAiUUhkclB0ciIsICMgT2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIkNTUGFyYW1QdHIiLCAjIE9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJGU0NhdGFsb2dCdWxrUGFyYW0iLCAjIG9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJGU0ZvcmtDQkluZm9QYXJhbSIsICMgb2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIkZTRm9ya0lPUGFyYW0iLCAjIG9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJGU1JlZlBhcmFtIiwgICMgb2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIkZTVm9sdW1lSW5mb1BhcmFtIiwgIyBvbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAiV0RQQlB0ciIsICMgb2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIlhDSW5mb1BCUHRyIiwgIyBvbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAiWFZvbHVtZVBhcmFtUHRyIiwgIyBvbGQgc3R1ZmYKKworCisgICAgICAgICAgICAgICAgIkNhdFBvc2l0aW9uUmVjIiwgIyBTdGF0ZSB2YXJpYWJsZSwgbm90IHRvbyBkaWZmaWN1bHQKKyAgICAgICAgICAgICAgICAiRlNJdGVyYXRvciIsICMgU2hvdWxkIGJlY29tZSBhbiBvYmplY3QKKyAgICAgICAgICAgICAgICAiRlNGb3JrSW5mbyIsICMgTG90cyBvZiBmaWVsZHMsIGRpZmZpY3VsdCBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAiRlNTZWFyY2hQYXJhbXMiLCAjIEFsc28gY2F0c2VhcmNoIHN0dWZmCisgICAgICAgICAgICAgICAgIkZTVm9sdW1lSW5mbyIsICMgYmlnIHN0cnVjdAorICAgICAgICAgICAgICAgICJGU1ZvbHVtZUluZm9fcHRyIiwgIyBiaWcgc3RydWN0CisKKyAgICAgICAgICAgICAgICAiSU9Db21wbGV0aW9uUHJvY1B0ciIsICMgcHJvYyBwb2ludGVyCisgICAgICAgICAgICAgICAgIklPQ29tcGxldGlvblVQUCIsICMgUHJvYyBwb2ludGVyCisgICAgICAgICAgICAgICAgIkFsaWFzRmlsdGVyUHJvY1B0ciIsCisgICAgICAgICAgICAgICAgIkFsaWFzRmlsdGVyVVBQIiwKKyAgICAgICAgICAgICAgICAiRk5TdWJzY3JpcHRpb25VUFAiLAorCisgICAgICAgICAgICAgICAgIkZOU3Vic2NyaXB0aW9uUmVmIiwgIyBMYXp5LCBmb3Igbm93LgorICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICMgVmFyaW91cyB3YXlzIHRvIGdpdmUgcGF0aG5hbWVzCisgICAgICAgICAgICAgICAgKFsoJ2NoYXJfcHRyJywgJyonLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdzdHJpbmdwdHInLCAnKicsICdJbk1vZGUnKV0KKyAgICAgICAgICAgICAgICApLAorCisgICAgICAgICAgICAgICAgIyBVbmljb2RlIGZpbGVuYW1lcyBwYXNzZWQgYXMgbGVuZ3RoLCBidWZmZXIKKyAgICAgICAgICAgICAgICAoWygnVW5pQ2hhckNvdW50JywgJyonLCAnSW5Nb2RlJyksCisgICAgICAgICAgICAgICAgICAoJ1VuaUNoYXJfcHRyJywgJyonLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdVbmljb2RlUmV2ZXJzZUluQnVmZmVyJywgJyonLCAnSW5Nb2RlJyldCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAjIFdyb25nIGd1ZXNzCisgICAgICAgICAgICAgICAgKFsoJ1N0cjYzJywgJ3RoZVN0cmluZycsICdJbk1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ1N0cjYzJywgJ3RoZVN0cmluZycsICdPdXRNb2RlJyldKSwKKworICAgICAgICAgICAgICAgICMgWWV0IGFub3RoZXIgd2F5IHRvIGdpdmUgYSBwYXRobmFtZTotKQorICAgICAgICAgICAgICAgIChbKCdzaG9ydCcsICdmdWxsUGF0aExlbmd0aCcsICdJbk1vZGUnKSwKKyAgICAgICAgICAgICAgICAgICgndm9pZF9wdHInLCAnZnVsbFBhdGgnLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdGdWxsUGF0aE5hbWUnLCAnZnVsbFBhdGgnLCAnSW5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICMgVmFyaW91cyBSZXNvbHZlQWxpYXNGaWxlWFhYWCBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgICAoWygnRlNTcGVjJywgJ3RoZVNwZWMnLCAnT3V0TW9kZScpXSwKKyAgICAgICAgICAgICAgICAgWygnRlNTcGVjX3B0cicsICd0aGVTcGVjJywgJ0luT3V0TW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAoWygnRlNSZWYnLCAndGhlUmVmJywgJ091dE1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ0ZTUmVmX3B0cicsICd0aGVSZWYnLCAnSW5PdXRNb2RlJyldKSwKKworICAgICAgICAgICAgICAgICMgVGhlIG9wdGlvbmFsIEZTU3BlYyB0byBhbGwgUmVzb2x2ZUFsaWFzIGFuZCBOZXdBbGlhcyBtZXRob2RzCisgICAgICAgICAgICAgICAgKFsoJ0ZTU3BlY19wdHInLCAnZnJvbUZpbGUnLCAnSW5Nb2RlJyldLAorICAgICAgICAgWygnT3B0RlNTcGVjUHRyJywgJ2Zyb21GaWxlJywgJ0luTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAoWygnRlNSZWZfcHRyJywgJ2Zyb21GaWxlJywgJ0luTW9kZScpXSwKKyAgICAgICAgIFsoJ09wdEZTUmVmUHRyJywgJ2Zyb21GaWxlJywgJ0luTW9kZScpXSksCisKKyMjICAgICAgICAgICAgICAjIEZTQ2F0YWxvZ0luZm8gaW5wdXQgaGFuZGxpbmcKKyMjICAgICAgICAgICAgICAgICAgICAgIChbKCdGU0NhdGFsb2dJbmZvQml0bWFwJywgJ3doaWNoSW5mbycsICdJbk1vZGUnKSwKKyMjICAgICAgICAgICAgICAgICgnRlNDYXRhbG9nSW5mb19wdHInLCAnY2F0YWxvZ0luZm8nLCAnSW5Nb2RlJyldLAorIyMgICAgICAgICAgICAgICBbKCdGU0NhdGFsb2dJbmZvQW5kQml0bWFwX2luJywgJ2NhdGFsb2dJbmZvJywgJ0luTW9kZScpXSksCisjIworIyMgICAgICAgICAgICAgICMgRlNDYXRhbG9nSW5mbyBvdXRwdXQgaGFuZGxpbmcKKyMjICAgICAgICAgICAgICAgICAgICAgIChbKCdGU0NhdGFsb2dJbmZvQml0bWFwJywgJ3doaWNoSW5mbycsICdJbk1vZGUnKSwKKyMjICAgICAgICAgICAgICAgICgnRlNDYXRhbG9nSW5mbycsICdjYXRhbG9nSW5mbycsICdPdXRNb2RlJyldLAorIyMgICAgICAgICAgICAgICBbKCdGU0NhdGFsb2dJbmZvQW5kQml0bWFwX291dCcsICdjYXRhbG9nSW5mbycsICdJbk91dE1vZGUnKV0pLAorIyMKKworICAgICAgICBdCisKKworICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJ0cnVlID0gVHJ1ZVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZmFsc2UgPSBGYWxzZVxuIikKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2ZpbGUvZmlsZXN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9maWxlL2ZpbGVzdXBwb3J0LnB5CmluZGV4IGYwNmJiYjguLmRhYzcwNmQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2ZpbGUvZmlsZXN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvZmlsZS9maWxlc3VwcG9ydC5weQpAQCAtMTAsMTQgKzEwLDE0IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLSNNQUNIRUFERVJGSUxFID0gJ0ZpbGVzLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfRmlsZScJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCi1MT05HTU9ETkFNRSA9ICdDYXJib24uRmlsZScJCSMgVGhlICJub3JtYWwiIGV4dGVybmFsIG5hbWUgb2YgdGhlIG1vZHVsZQorI01BQ0hFQURFUkZJTEUgPSAnRmlsZXMuaCcgICAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19GaWxlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK0xPTkdNT0ROQU1FID0gJ0NhcmJvbi5GaWxlJyAgICAgICAgICAgICAjIFRoZSAibm9ybWFsIiBleHRlcm5hbCBuYW1lIG9mIHRoZSBtb2R1bGUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0ZpbGUnCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworTU9EUFJFRklYID0gJ0ZpbGUnICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTMzLDkgKzMzLDkgQEAKIAogIyBWYXJpb3VzIHR5cGVzIG9mIHN0cmluZ3M6CiAjY2xhc3MgVW5pQ2hhckNvdW50QnVmZmVyKElucHV0T25seVR5cGUpOgotIwlwYXNzCisjICAgICAgIHBhc3MKIGNsYXNzIFZhclJldmVyc2VJbnB1dEJ1ZmZlclR5cGUoUmV2ZXJzZUlucHV0QnVmZmVyTWl4aW4sIFZhcklucHV0QnVmZmVyVHlwZSk6Ci0JcGFzcworICAgIHBhc3MKIEZ1bGxQYXRoTmFtZSA9IFZhclJldmVyc2VJbnB1dEJ1ZmZlclR5cGUoKQogQ29uc3RTdHIzMVBhcmFtID0gT3BhcXVlQXJyYXlUeXBlKCJTdHIzMSIsICJQeU1hY19CdWlsZFN0cjI1NSIsICJQeU1hY19HZXRTdHIyNTUiKQogQ29uc3RTdHIzMlBhcmFtID0gT3BhcXVlQXJyYXlUeXBlKCJTdHIzMiIsICJQeU1hY19CdWlsZFN0cjI1NSIsICJQeU1hY19HZXRTdHIyNTUiKQpAQCAtNDcsNjAgKzQ3LDYwIEBACiAKICMgT3RoZXIgdHlwZXM6CiBjbGFzcyBPcHRpb25hbEZTeHh4VHlwZShPcGFxdWVCeVZhbHVlVHlwZSk6Ci0JZGVmIGRlY2xhcmUoc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgiJXMgJXNfX2J1Zl9fOyIsIHNlbGYudHlwZU5hbWUsIG5hbWUpCi0JCU91dHB1dCgiJXMgKiVzID0gJiVzX19idWZfXzsiLCBzZWxmLnR5cGVOYW1lLCBuYW1lLCBuYW1lKQorICAgIGRlZiBkZWNsYXJlKHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoIiVzICVzX19idWZfXzsiLCBzZWxmLnR5cGVOYW1lLCBuYW1lKQorICAgICAgICBPdXRwdXQoIiVzIColcyA9ICYlc19fYnVmX187Iiwgc2VsZi50eXBlTmFtZSwgbmFtZSwgbmFtZSkKIAogY2xhc3MgRlNDYXRhbG9nSW5mb0FuZEJpdG1hcFR5cGUoSW5wdXRPbmx5VHlwZSk6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlJbnB1dE9ubHlUeXBlLl9faW5pdF9fKHNlbGYsICJCVUciLCAiQlVHIikKLQkJCi0JZGVmIGRlY2xhcmUoc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgiUHlPYmplY3QgKiVzX19vYmplY3QgPSBOVUxMOyIsIG5hbWUpCi0JCU91dHB1dCgiRlNDYXRhbG9nSW5mb0JpdG1hcCAlc19fYml0bWFwID0gMDsiLCBuYW1lKQotCQlPdXRwdXQoIkZTQ2F0YWxvZ0luZm8gJXM7IiwgbmFtZSkKLQkJCi0JZGVmIGdldGFyZ3NGb3JtYXQoc2VsZik6Ci0JCXJldHVybiAibE8iCi0JCQotCWRlZiBnZXRhcmdzQXJncyhzZWxmLCBuYW1lKToKLQkJcmV0dXJuICIlc19fYml0bWFwLCAlc19fb2JqZWN0IiUobmFtZSwgbmFtZSkKLQkJCi0JZGVmIGdldGFyZ3NDaGVjayhzZWxmLCBuYW1lKToKLQkJT3V0cHV0KCJpZiAoIWNvbnZlcnRfRlNDYXRhbG9nSW5mbyglc19fb2JqZWN0LCAlc19fYml0bWFwLCAmJXMpKSByZXR1cm4gTlVMTDsiLCBuYW1lLCBuYW1lLCBuYW1lKQotCQkKLQlkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIiVzX19iaXRtYXAsICYlcyIlIChuYW1lLCBuYW1lKQogCi0JZGVmIHBhc3NPdXRwdXQoc2VsZiwgbmFtZSk6Ci0JCXJldHVybiAiJXNfX2JpdG1hcCwgJiVzIiUgKG5hbWUsIG5hbWUpCi0JCQotCWRlZiBta3ZhbHVlRm9ybWF0KHNlbGYpOgotCQlyZXR1cm4gIk8iCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBJbnB1dE9ubHlUeXBlLl9faW5pdF9fKHNlbGYsICJCVUciLCAiQlVHIikKIAotCWRlZiBta3ZhbHVlQXJncyhzZWxmLCBuYW1lKToKLQkJcmV0dXJuICIlc19fb2JqZWN0IiAlIChuYW1lKQotCQkKLQlkZWYgeHh4eG1rdmFsdWVDaGVjayhzZWxmLCBuYW1lKToKLQkJT3V0cHV0KCJpZiAoKCVzX19vYmplY3QgPSBuZXdfRlNDYXRhbG9nSW5mbyglc19fYml0bWFwLCAmJXMpKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiLCBuYW1lLCBuYW1lKQotCQorICAgIGRlZiBkZWNsYXJlKHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0IColc19fb2JqZWN0ID0gTlVMTDsiLCBuYW1lKQorICAgICAgICBPdXRwdXQoIkZTQ2F0YWxvZ0luZm9CaXRtYXAgJXNfX2JpdG1hcCA9IDA7IiwgbmFtZSkKKyAgICAgICAgT3V0cHV0KCJGU0NhdGFsb2dJbmZvICVzOyIsIG5hbWUpCisKKyAgICBkZWYgZ2V0YXJnc0Zvcm1hdChzZWxmKToKKyAgICAgICAgcmV0dXJuICJsTyIKKworICAgIGRlZiBnZXRhcmdzQXJncyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuICIlc19fYml0bWFwLCAlc19fb2JqZWN0IiUobmFtZSwgbmFtZSkKKworICAgIGRlZiBnZXRhcmdzQ2hlY2soc2VsZiwgbmFtZSk6CisgICAgICAgIE91dHB1dCgiaWYgKCFjb252ZXJ0X0ZTQ2F0YWxvZ0luZm8oJXNfX29iamVjdCwgJXNfX2JpdG1hcCwgJiVzKSkgcmV0dXJuIE5VTEw7IiwgbmFtZSwgbmFtZSwgbmFtZSkKKworICAgIGRlZiBwYXNzSW5wdXQoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAiJXNfX2JpdG1hcCwgJiVzIiUgKG5hbWUsIG5hbWUpCisKKyAgICBkZWYgcGFzc091dHB1dChzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuICIlc19fYml0bWFwLCAmJXMiJSAobmFtZSwgbmFtZSkKKworICAgIGRlZiBta3ZhbHVlRm9ybWF0KHNlbGYpOgorICAgICAgICByZXR1cm4gIk8iCisKKyAgICBkZWYgbWt2YWx1ZUFyZ3Moc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAiJXNfX29iamVjdCIgJSAobmFtZSkKKworICAgIGRlZiB4eHh4bWt2YWx1ZUNoZWNrKHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoImlmICgoJXNfX29iamVjdCA9IG5ld19GU0NhdGFsb2dJbmZvKCVzX19iaXRtYXAsICYlcykpID09IE5VTEwpIHJldHVybiBOVUxMOyIsIG5hbWUsIG5hbWUpCisKIGNsYXNzIEZTQ2F0YWxvZ0luZm9BbmRCaXRtYXBfaW5UeXBlKEZTQ2F0YWxvZ0luZm9BbmRCaXRtYXBUeXBlLCBJbnB1dE9ubHlNaXhJbik6Ci0JCi0JZGVmIHh4eHhta3ZhbHVlQ2hlY2soc2VsZiwgbmFtZSk6Ci0JCXBhc3MKLQkKKworICAgIGRlZiB4eHh4bWt2YWx1ZUNoZWNrKHNlbGYsIG5hbWUpOgorICAgICAgICBwYXNzCisKIGNsYXNzIEZTQ2F0YWxvZ0luZm9BbmRCaXRtYXBfb3V0VHlwZShGU0NhdGFsb2dJbmZvQW5kQml0bWFwVHlwZSk6CiAKLQlkZWYgZ2V0YXJnc0Zvcm1hdChzZWxmKToKLQkJcmV0dXJuICJsIgotCQkKLQlkZWYgZ2V0YXJnc0FyZ3Moc2VsZiwgbmFtZSk6Ci0JCXJldHVybiAiJXNfX2JpdG1hcCIgJSBuYW1lCi0JCQotCWRlZiBnZXRhcmdzQ2hlY2soc2VsZiwgbmFtZSk6Ci0JCXBhc3MKLQkKKyAgICBkZWYgZ2V0YXJnc0Zvcm1hdChzZWxmKToKKyAgICAgICAgcmV0dXJuICJsIgorCisgICAgZGVmIGdldGFyZ3NBcmdzKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gIiVzX19iaXRtYXAiICUgbmFtZQorCisgICAgZGVmIGdldGFyZ3NDaGVjayhzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcworCiBGSW5mbyA9IE9wYXF1ZVR5cGUoIkZJbmZvIiwgIkZJbmZvIikKIEZJbmZvX3B0ciA9IE9wYXF1ZVR5cGUoIkZJbmZvIiwgIkZJbmZvIikKIEFsaWFzSGFuZGxlID0gT3BhcXVlQnlWYWx1ZVR5cGUoIkFsaWFzSGFuZGxlIiwgIkFsaWFzIikKQEAgLTE1NywxMyArMTU3LDEzIEBACiBzdGF0aWMgaW50CiBVVENEYXRlVGltZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBVVENEYXRlVGltZSAqcHRyKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiKEhsSCkiLCAmcHRyLT5oaWdoU2Vjb25kcywgJnB0ci0+bG93U2Vjb25kcywgJnB0ci0+ZnJhY3Rpb24pOworICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihIbEgpIiwgJnB0ci0+aGlnaFNlY29uZHMsICZwdHItPmxvd1NlY29uZHMsICZwdHItPmZyYWN0aW9uKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFVUQ0RhdGVUaW1lX05ldyhVVENEYXRlVGltZSAqcHRyKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoSGxIKSIsIHB0ci0+aGlnaFNlY29uZHMsIHB0ci0+bG93U2Vjb25kcywgcHRyLT5mcmFjdGlvbik7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoSGxIKSIsIHB0ci0+aGlnaFNlY29uZHMsIHB0ci0+bG93U2Vjb25kcywgcHRyLT5mcmFjdGlvbik7CiB9CiAKIC8qCkBAIC0xNzIsMjEgKzE3MiwyMSBAQAogc3RhdGljIGludAogbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIoUHlPYmplY3QgKnYsIEZTU3BlYyAqKnNwZWMpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkgewotCQkqc3BlYyA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gUHlNYWNfR2V0RlNTcGVjKHYsICpzcGVjKTsKKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgICpzcGVjID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlNYWNfR2V0RlNTcGVjKHYsICpzcGVjKTsKIH0KIAogc3RhdGljIGludAogbXlQeU1hY19HZXRPcHRGU1JlZlB0cihQeU9iamVjdCAqdiwgRlNSZWYgKipyZWYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkgewotCQkqcmVmID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiBQeU1hY19HZXRGU1JlZih2LCAqcmVmKTsKKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgICpyZWYgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeU1hY19HZXRGU1JlZih2LCAqcmVmKTsKIH0KIAogLyoKQEAgLTE5Niw3ICsxOTYsNyBAQAogUHlNYWNfQnVpbGRIRlNVbmlTdHIyNTUoSEZTVW5pU3RyMjU1ICppdHNlbGYpCiB7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgidSMiLCBpdHNlbGYtPnVuaWNvZGUsIGl0c2VsZi0+bGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInUjIiwgaXRzZWxmLT51bmljb2RlLCBpdHNlbGYtPmxlbmd0aCk7CiB9CiAiIiIKIApAQCAtMjA0LDg2ICsyMDQsODYgQEAKIGludAogUHlNYWNfR2V0RlNTcGVjKFB5T2JqZWN0ICp2LCBGU1NwZWMgKnNwZWMpCiB7Ci0JU3RyMjU1IHBhdGg7Ci0Jc2hvcnQgcmVmbnVtOwotCWxvbmcgcGFyaWQ7Ci0JT1NFcnIgZXJyOwotCUZTUmVmIGZzcjsKKyAgICAgICAgU3RyMjU1IHBhdGg7CisgICAgICAgIHNob3J0IHJlZm51bTsKKyAgICAgICAgbG9uZyBwYXJpZDsKKyAgICAgICAgT1NFcnIgZXJyOworICAgICAgICBGU1JlZiBmc3I7CiAKLQlpZiAoRlNTcGVjX0NoZWNrKHYpKSB7Ci0JCSpzcGVjID0gKChGU1NwZWNPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCQlyZXR1cm4gMTsKLQl9CisgICAgICAgIGlmIChGU1NwZWNfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAqc3BlYyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQogCi0JaWYgKFB5QXJnX1BhcnNlKHYsICIoaGxPJikiLAotCQkJCQkJJnJlZm51bSwgJnBhcmlkLCBQeU1hY19HZXRTdHIyNTUsICZwYXRoKSkgewotCQllcnIgPSBGU01ha2VGU1NwZWMocmVmbnVtLCBwYXJpZCwgcGF0aCwgc3BlYyk7Ci0JCWlmICggZXJyICYmIGVyciAhPSBmbmZFcnIgKSB7Ci0JCQlQeU1hY19FcnJvcihlcnIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCVB5RXJyX0NsZWFyKCk7Ci0JLyogT3RoZXJ3aXNlIHdlIHRyeSB0byBnbyB2aWEgYW4gRlNSZWYuIE9uIE9TWCB3ZSBnbyBhbGwgdGhlIHdheSwKLQkqKiBvbiBPUzkgd2UgYWNjZXB0IG9ubHkgYSByZWFsIEZTUmVmIG9iamVjdAotCSovCi0JaWYgKCBQeU1hY19HZXRGU1JlZih2LCAmZnNyKSApIHsKLQkJZXJyID0gRlNHZXRDYXRhbG9nSW5mbygmZnNyLCBrRlNDYXRJbmZvTm9uZSwgTlVMTCwgTlVMTCwgc3BlYywgTlVMTCk7Ci0JCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJCVB5TWFjX0Vycm9yKGVycik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGlmIChQeUFyZ19QYXJzZSh2LCAiKGhsTyYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZudW0sICZwYXJpZCwgUHlNYWNfR2V0U3RyMjU1LCAmcGF0aCkpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBGU01ha2VGU1NwZWMocmVmbnVtLCBwYXJpZCwgcGF0aCwgc3BlYyk7CisgICAgICAgICAgICAgICAgaWYgKCBlcnIgJiYgZXJyICE9IGZuZkVyciApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgLyogT3RoZXJ3aXNlIHdlIHRyeSB0byBnbyB2aWEgYW4gRlNSZWYuIE9uIE9TWCB3ZSBnbyBhbGwgdGhlIHdheSwKKyAgICAgICAgKiogb24gT1M5IHdlIGFjY2VwdCBvbmx5IGEgcmVhbCBGU1JlZiBvYmplY3QKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCBQeU1hY19HZXRGU1JlZih2LCAmZnNyKSApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBGU0dldENhdGFsb2dJbmZvKCZmc3IsIGtGU0NhdEluZm9Ob25lLCBOVUxMLCBOVUxMLCBzcGVjLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5TWFjX0dldEZTUmVmKFB5T2JqZWN0ICp2LCBGU1JlZiAqZnNyKQogewotCU9TU3RhdHVzIGVycjsKLQlGU1NwZWMgZnNzOwotCQotCWlmIChGU1JlZl9DaGVjayh2KSkgewotCQkqZnNyID0gKChGU1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JCXJldHVybiAxOwotCX0KKyAgICAgICAgT1NTdGF0dXMgZXJyOworICAgICAgICBGU1NwZWMgZnNzOwogCi0JLyogT24gT1NYIHdlIG5vdyB0cnkgYSBwYXRobmFtZSAqLwotCWlmICggUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JCWNoYXIgKnBhdGggPSBOVUxMOwotCQlpZiAoIVB5QXJnX1BhcnNlKHYsICJldCIsIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoIChlcnI9RlNQYXRoTWFrZVJlZihwYXRoLCBmc3IsIE5VTEwpKSApIHsKLQkJCVB5TWFjX0Vycm9yKGVycik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JLyogWFhYWCBTaG91bGQgdHJ5IHVuaWNvZGUgaGVyZSB0b28gKi8KLQkvKiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGdvIHZpYSBhbiBGU1NwZWMgKi8KLQlpZiAoRlNTcGVjX0NoZWNrKHYpKSB7Ci0JCWZzcyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQkJaWYgKChlcnI9RlNwTWFrZUZTUmVmKCZmc3MsIGZzcikpID09IDApCi0JCQlyZXR1cm4gMTsKLQkJUHlNYWNfRXJyb3IoZXJyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU1JlZiwgRlNTcGVjIG9yIHBhdGhuYW1lIHJlcXVpcmVkIik7Ci0JcmV0dXJuIDA7CisgICAgICAgIGlmIChGU1JlZl9DaGVjayh2KSkgeworICAgICAgICAgICAgICAgICpmc3IgPSAoKEZTUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE9uIE9TWCB3ZSBub3cgdHJ5IGEgcGF0aG5hbWUgKi8KKyAgICAgICAgaWYgKCBQeVN0cmluZ19DaGVjayh2KSB8fCBQeVVuaWNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpwYXRoID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJldCIsIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGlmICggKGVycj1GU1BhdGhNYWtlUmVmKHBhdGgsIGZzciwgTlVMTCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICAvKiBYWFhYIFNob3VsZCB0cnkgdW5pY29kZSBoZXJlIHRvbyAqLworICAgICAgICAvKiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGdvIHZpYSBhbiBGU1NwZWMgKi8KKyAgICAgICAgaWYgKEZTU3BlY19DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIGZzcyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgICAgICAgICBpZiAoKGVycj1GU3BNYWtlRlNSZWYoJmZzcywgZnNyKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmLCBGU1NwZWMgb3IgcGF0aG5hbWUgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIGV4dGVybiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZEZTU3BlYyhGU1NwZWMgKnNwZWMpCiB7Ci0JcmV0dXJuIEZTU3BlY19OZXcoc3BlYyk7CisgICAgICAgIHJldHVybiBGU1NwZWNfTmV3KHNwZWMpOwogfQogCiBleHRlcm4gUHlPYmplY3QgKgogUHlNYWNfQnVpbGRGU1JlZihGU1JlZiAqc3BlYykKIHsKLQlyZXR1cm4gRlNSZWZfTmV3KHNwZWMpOworICAgICAgICByZXR1cm4gRlNSZWZfTmV3KHNwZWMpOwogfQogIiIiCiAKQEAgLTI5OCw0NDYgKzI5OCw0NDYgQEAKIAogIyBPdXIgb2JqZWN0IHR5cGVzOgogY2xhc3MgRlNDYXRhbG9nSW5mb0RlZmluaXRpb24oUEVQMjUzTWl4aW4sIE9iamVjdERlZmluaXRpb24pOgotCWdldHNldGxpc3QgPSBbCi0JCSgibm9kZUZsYWdzIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIkhcIiwgc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJIXCIsICZzZWxmLT5vYl9pdHNlbGYubm9kZUZsYWdzKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgidm9sdW1lIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImhcIiwgc2VsZi0+b2JfaXRzZWxmLnZvbHVtZSk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJoXCIsICZzZWxmLT5vYl9pdHNlbGYudm9sdW1lKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgicGFyZW50RGlySUQiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwibFwiLCBzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwibFwiLCAmc2VsZi0+b2JfaXRzZWxmLnBhcmVudERpcklEKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgibm9kZUlEIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJsXCIsICZzZWxmLT5vYl9pdHNlbGYubm9kZUlEKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgiY3JlYXRlRGF0ZSIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJKCJjb250ZW50TW9kRGF0ZSIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuY29udGVudE1vZERhdGUpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSktMTsiLAotCQkgTm9uZQotCQkpLAotCQkoImF0dHJpYnV0ZU1vZERhdGUiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5hdHRyaWJ1dGVNb2REYXRlKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgiYWNjZXNzRGF0ZSIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJKCJiYWNrdXBEYXRlIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIk8mXCIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5iYWNrdXBEYXRlKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIk8mXCIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSktMTsiLAotCQkgTm9uZQotCQkpLAotCQkoInBlcm1pc3Npb25zIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIihsbGxsKVwiLCBzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbMF0sIHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9uc1sxXSwgc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzJdLCBzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbM10pOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiKGxsbGwpXCIsICZzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbMF0sICZzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbMV0sICZzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbMl0sICZzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbM10pLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJIyBYWFhYIEZpbmRlckluZm8gVEJECi0JCSMgWFhYWCBGaW5kZXJYSW5mbyBUQkQKLQkJKCJ2YWxlbmNlIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLnZhbGVuY2UpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwibFwiLCAmc2VsZi0+b2JfaXRzZWxmLnZhbGVuY2UpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJKCJkYXRhTG9naWNhbFNpemUiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwibFwiLCBzZWxmLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJKCJkYXRhUGh5c2ljYWxTaXplIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwibFwiLCAmc2VsZi0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJKCJyc3JjTG9naWNhbFNpemUiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwibFwiLCBzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJKCJyc3JjUGh5c2ljYWxTaXplIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwibFwiLCAmc2VsZi0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJKCJzaGFyaW5nRmxhZ3MiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwibFwiLCBzZWxmLT5vYl9pdHNlbGYuc2hhcmluZ0ZsYWdzKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJKCJ1c2VyUHJpdmlsZWdlcyIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJiXCIsIHNlbGYtPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJiXCIsICZzZWxmLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQldCi0JIyBUaGUgc2FtZSBpbmZvLCBidXQgaW4gYSBkaWZmZXJlbnQgZm9ybQotCUlOSVRGT1JNQVQgPSAiSGhsbE8mTyZPJk8mTyZsbGxsbGxiIgotCUlOSVRBUkdTID0gIiIiJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYubm9kZUZsYWdzLAotCQkmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi52b2x1bWUsCi0JCSYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLnBhcmVudERpcklELAotCQkmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5ub2RlSUQsCi0JCVVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLmNyZWF0ZURhdGUsCi0JCVVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlLAotCQlVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5hdHRyaWJ1dGVNb2REYXRlLAotCQlVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5hY2Nlc3NEYXRlLAotCQlVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5iYWNrdXBEYXRlLAotCQkmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi52YWxlbmNlLAotCQkmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUsCi0JCSYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUsCi0JCSYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLnJzcmNMb2dpY2FsU2l6ZSwKLQkJJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYucnNyY1BoeXNpY2FsU2l6ZSwKLQkJJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuc2hhcmluZ0ZsYWdzLAotCQkmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyIiIgotCUlOSVROQU1FUyA9ICIiIgotCQkibm9kZUZsYWdzIiwKLQkJInZvbHVtZSIsCi0JCSJwYXJlbnREaXJJRCIsCi0JCSJub2RlSUQiLAotCQkiY3JlYXRlRGF0ZSIsCi0JCSJjb250ZW50TW9kRGF0ZSIsCi0JCSJhdHJpYnV0ZU1vZERhdGUiLAotCQkiYWNjZXNzRGF0ZSIsCi0JCSJiYWNrdXBEYXRlIiwKLQkJInZhbGVuY2UiLAotCQkiZGF0YUxvZ2ljYWxTaXplIiwKLQkJImRhdGFQaHlzaWNhbFNpemUiLAotCQkicnNyY0xvZ2ljYWxTaXplIiwKLQkJInJzcmNQaHlzaWNhbFNpemUiLAotCQkic2hhcmluZ0ZsYWdzIiwKLQkJInVzZXJQcml2aWxlZ2VzIgotCQkiIiIKLQkJCi0JZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSk6Ci0JCU9iamVjdERlZmluaXRpb24uX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKQotCQlzZWxmLmFyZ3JlZiA9ICIqIgkjIFN0b3JlIEZTU3BlY3MsIGJ1dCBwYXNzIHRoZW0gYnkgYWRkcmVzcworICAgIGdldHNldGxpc3QgPSBbCisgICAgICAgICAgICAoIm5vZGVGbGFncyIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiSFwiLCBzZWxmLT5vYl9pdHNlbGYubm9kZUZsYWdzKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJIXCIsICZzZWxmLT5vYl9pdHNlbGYubm9kZUZsYWdzKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgidm9sdW1lIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJoXCIsIHNlbGYtPm9iX2l0c2VsZi52b2x1bWUpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImhcIiwgJnNlbGYtPm9iX2l0c2VsZi52b2x1bWUpLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJwYXJlbnREaXJJRCIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwibFwiLCBzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi5wYXJlbnREaXJJRCktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoIm5vZGVJRCIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwibFwiLCBzZWxmLT5vYl9pdHNlbGYubm9kZUlEKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJsXCIsICZzZWxmLT5vYl9pdHNlbGYubm9kZUlEKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgiY3JlYXRlRGF0ZSIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIk8mXCIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoImNvbnRlbnRNb2REYXRlIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuY29udGVudE1vZERhdGUpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIk8mXCIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuY29udGVudE1vZERhdGUpLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJhdHRyaWJ1dGVNb2REYXRlIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5hdHRyaWJ1dGVNb2REYXRlKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgiYWNjZXNzRGF0ZSIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIk8mXCIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoImJhY2t1cERhdGUiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIk8mXCIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5iYWNrdXBEYXRlKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmJhY2t1cERhdGUpLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJwZXJtaXNzaW9ucyIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiKGxsbGwpXCIsIHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9uc1swXSwgc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzFdLCBzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbMl0sIHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9uc1szXSk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiKGxsbGwpXCIsICZzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbMF0sICZzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbMV0sICZzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbMl0sICZzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbM10pLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgIyBYWFhYIEZpbmRlckluZm8gVEJECisgICAgICAgICAgICAjIFhYWFggRmluZGVyWEluZm8gVEJECisgICAgICAgICAgICAoInZhbGVuY2UiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLnZhbGVuY2UpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi52YWxlbmNlKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgiZGF0YUxvZ2ljYWxTaXplIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJsXCIsIHNlbGYtPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUpLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJkYXRhUGh5c2ljYWxTaXplIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJsXCIsIHNlbGYtPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJsXCIsICZzZWxmLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoInJzcmNMb2dpY2FsU2l6ZSIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwibFwiLCBzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJsXCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgicnNyY1BoeXNpY2FsU2l6ZSIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwibFwiLCBzZWxmLT5vYl9pdHNlbGYucnNyY1BoeXNpY2FsU2l6ZSk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwibFwiLCAmc2VsZi0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUpLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJzaGFyaW5nRmxhZ3MiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncyk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwibFwiLCAmc2VsZi0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncyktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoInVzZXJQcml2aWxlZ2VzIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJiXCIsIHNlbGYtPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiYlwiLCAmc2VsZi0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICBdCisgICAgIyBUaGUgc2FtZSBpbmZvLCBidXQgaW4gYSBkaWZmZXJlbnQgZm9ybQorICAgIElOSVRGT1JNQVQgPSAiSGhsbE8mTyZPJk8mTyZsbGxsbGxiIgorICAgIElOSVRBUkdTID0gIiIiJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYubm9kZUZsYWdzLAorICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYudm9sdW1lLAorICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYucGFyZW50RGlySUQsCisgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5ub2RlSUQsCisgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5jcmVhdGVEYXRlLAorICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuY29udGVudE1vZERhdGUsCisgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5hdHRyaWJ1dGVNb2REYXRlLAorICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSwKKyAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLmJhY2t1cERhdGUsCisgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi52YWxlbmNlLAorICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplLAorICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSwKKyAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLnJzcmNMb2dpY2FsU2l6ZSwKKyAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUsCisgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MsCisgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyIiIgorICAgIElOSVROQU1FUyA9ICIiIgorICAgICAgICAgICAgIm5vZGVGbGFncyIsCisgICAgICAgICAgICAidm9sdW1lIiwKKyAgICAgICAgICAgICJwYXJlbnREaXJJRCIsCisgICAgICAgICAgICAibm9kZUlEIiwKKyAgICAgICAgICAgICJjcmVhdGVEYXRlIiwKKyAgICAgICAgICAgICJjb250ZW50TW9kRGF0ZSIsCisgICAgICAgICAgICAiYXRyaWJ1dGVNb2REYXRlIiwKKyAgICAgICAgICAgICJhY2Nlc3NEYXRlIiwKKyAgICAgICAgICAgICJiYWNrdXBEYXRlIiwKKyAgICAgICAgICAgICJ2YWxlbmNlIiwKKyAgICAgICAgICAgICJkYXRhTG9naWNhbFNpemUiLAorICAgICAgICAgICAgImRhdGFQaHlzaWNhbFNpemUiLAorICAgICAgICAgICAgInJzcmNMb2dpY2FsU2l6ZSIsCisgICAgICAgICAgICAicnNyY1BoeXNpY2FsU2l6ZSIsCisgICAgICAgICAgICAic2hhcmluZ0ZsYWdzIiwKKyAgICAgICAgICAgICJ1c2VyUHJpdmlsZWdlcyIKKyAgICAgICAgICAgICIiIgogCi0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5X05vbmU7IikKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKToKKyAgICAgICAgT2JqZWN0RGVmaW5pdGlvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpCisgICAgICAgIHNlbGYuYXJncmVmID0gIioiICAgICAgICMgU3RvcmUgRlNTcGVjcywgYnV0IHBhc3MgdGhlbSBieSBhZGRyZXNzCiAKLQlkZWYgb3V0cHV0X3RwX25ld0JvZHkoc2VsZik6Ci0JCU91dHB1dCgiUHlPYmplY3QgKnNlbGY7Iik7Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOyIpCi0JCU91dHB1dCgibWVtc2V0KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKCVzKSk7IiwgCi0JCQlzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeV9Ob25lOyIpCiAKLQlkZWYgb3V0cHV0X3RwX2luaXRCb2R5KHNlbGYpOgotCQlPdXRwdXQoInN0YXRpYyBjaGFyICprd1tdID0geyVzLCAwfTsiLCBzZWxmLklOSVROQU1FUykKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcInwlc1wiLCBrdywgJXMpKSIsIAotCQkJc2VsZi5JTklURk9STUFULCBzZWxmLklOSVRBUkdTKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoInJldHVybiAwOyIpCi0JCisgICAgZGVmIG91dHB1dF90cF9uZXdCb2R5KHNlbGYpOgorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpzZWxmOyIpOworICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIm1lbXNldCgmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZiglcykpOyIsCisgICAgICAgICAgICAgICAgc2VsZi5vYmplY3R0eXBlLCBzZWxmLml0c2VsZnR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIHNlbGY7IikKKworICAgIGRlZiBvdXRwdXRfdHBfaW5pdEJvZHkoc2VsZik6CisgICAgICAgIE91dHB1dCgic3RhdGljIGNoYXIgKmt3W10gPSB7JXMsIDB9OyIsIHNlbGYuSU5JVE5BTUVTKQorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoImlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIFwifCVzXCIsIGt3LCAlcykpIiwKKyAgICAgICAgICAgICAgICBzZWxmLklOSVRGT1JNQVQsIHNlbGYuSU5JVEFSR1MpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDA7IikKKwogY2xhc3MgRkluZm9EZWZpbml0aW9uKFBFUDI1M01peGluLCBPYmplY3REZWZpbml0aW9uKToKLQlnZXRzZXRsaXN0ID0gWwotCQkoIlR5cGUiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZi0+b2JfaXRzZWxmLmZkVHlwZSktMTsiLAotCQkgIjQtY2hhciBmaWxlIHR5cGUiCi0JCSksCi0JCSgiQ3JlYXRvciIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBQeU1hY19CdWlsZE9TVHlwZSwgc2VsZi0+b2JfaXRzZWxmLmZkQ3JlYXRvcik7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBQeU1hY19HZXRPU1R5cGUsICZzZWxmLT5vYl9pdHNlbGYuZmRDcmVhdG9yKS0xOyIsCi0JCSAiNC1jaGFyIGZpbGUgY3JlYXRvciIKLQkJKSwKLQkJKCJGbGFncyIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJIXCIsIHNlbGYtPm9iX2l0c2VsZi5mZEZsYWdzKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIkhcIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsYWdzKS0xOyIsCi0JCSAiRmluZGVyIGZsYWcgYml0cyIKLQkJKSwKLQkJKCJMb2NhdGlvbiIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBQeU1hY19CdWlsZFBvaW50LCBzZWxmLT5vYl9pdHNlbGYuZmRMb2NhdGlvbik7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBQeU1hY19HZXRQb2ludCwgJnNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKS0xOyIsCi0JCSAiKHgsIHkpIGxvY2F0aW9uIG9mIHRoZSBmaWxlJ3MgaWNvbiBpbiBpdHMgcGFyZW50IGZpbmRlciB3aW5kb3ciCi0JCSksCi0JCSgiRmxkciIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJoXCIsIHNlbGYtPm9iX2l0c2VsZi5mZEZsZHIpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiaFwiLCAmc2VsZi0+b2JfaXRzZWxmLmZkRmxkciktMTsiLAotCQkgIk9yaWdpbmFsIGZvbGRlciwgZm9yICdwdXQgYXdheSciCi0JCSksCi0JCQotCV0KLQkJIAotCWRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpOgotCQlPYmplY3REZWZpbml0aW9uLl9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSkKLQkJc2VsZi5hcmdyZWYgPSAiKiIJIyBTdG9yZSBGU1NwZWNzLCBidXQgcGFzcyB0aGVtIGJ5IGFkZHJlc3MKKyAgICBnZXRzZXRsaXN0ID0gWworICAgICAgICAgICAgKCJUeXBlIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBQeU1hY19CdWlsZE9TVHlwZSwgc2VsZi0+b2JfaXRzZWxmLmZkVHlwZSk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZi0+b2JfaXRzZWxmLmZkVHlwZSktMTsiLAorICAgICAgICAgICAgICI0LWNoYXIgZmlsZSB0eXBlIgorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgiQ3JlYXRvciIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIk8mXCIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpLTE7IiwKKyAgICAgICAgICAgICAiNC1jaGFyIGZpbGUgY3JlYXRvciIKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoIkZsYWdzIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJIXCIsIHNlbGYtPm9iX2l0c2VsZi5mZEZsYWdzKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJIXCIsICZzZWxmLT5vYl9pdHNlbGYuZmRGbGFncyktMTsiLAorICAgICAgICAgICAgICJGaW5kZXIgZmxhZyBiaXRzIgorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgiTG9jYXRpb24iLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIk8mXCIsIFB5TWFjX0J1aWxkUG9pbnQsIHNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBQeU1hY19HZXRQb2ludCwgJnNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKS0xOyIsCisgICAgICAgICAgICAgIih4LCB5KSBsb2NhdGlvbiBvZiB0aGUgZmlsZSdzIGljb24gaW4gaXRzIHBhcmVudCBmaW5kZXIgd2luZG93IgorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgiRmxkciIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiaFwiLCBzZWxmLT5vYl9pdHNlbGYuZmRGbGRyKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJoXCIsICZzZWxmLT5vYl9pdHNlbGYuZmRGbGRyKS0xOyIsCisgICAgICAgICAgICAgIk9yaWdpbmFsIGZvbGRlciwgZm9yICdwdXQgYXdheSciCisgICAgICAgICAgICApLAogCi0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorICAgIF0KIAotCWRlZiBvdXRwdXRfdHBfbmV3Qm9keShzZWxmKToKLQkJT3V0cHV0KCJQeU9iamVjdCAqc2VsZjsiKTsKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IikKLQkJT3V0cHV0KCJtZW1zZXQoJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmLCAwLCBzaXplb2YoJXMpKTsiLCAKLQkJCXNlbGYub2JqZWN0dHlwZSwgc2VsZi5pdHNlbGZ0eXBlKQotCQlPdXRwdXQoInJldHVybiBzZWxmOyIpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSk6CisgICAgICAgIE9iamVjdERlZmluaXRpb24uX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKQorICAgICAgICBzZWxmLmFyZ3JlZiA9ICIqIiAgICAgICAjIFN0b3JlIEZTU3BlY3MsIGJ1dCBwYXNzIHRoZW0gYnkgYWRkcmVzcwogCi0JZGVmIG91dHB1dF90cF9pbml0Qm9keShzZWxmKToKLQkJT3V0cHV0KCIlcyAqaXRzZWxmID0gTlVMTDsiLCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dHB1dCgic3RhdGljIGNoYXIgKmt3W10gPSB7XCJpdHNlbGZcIiwgMH07IikKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIFwifE8mXCIsIGt3LCBGSW5mb19Db252ZXJ0LCAmaXRzZWxmKSkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImlmIChpdHNlbGYpIG1lbWNweSgmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYsIGl0c2VsZiwgc2l6ZW9mKCVzKSk7IiwgCi0JCQlzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKKworICAgIGRlZiBvdXRwdXRfdHBfbmV3Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqc2VsZjsiKTsKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJtZW1zZXQoJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmLCAwLCBzaXplb2YoJXMpKTsiLAorICAgICAgICAgICAgICAgIHNlbGYub2JqZWN0dHlwZSwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiBzZWxmOyIpCisKKyAgICBkZWYgb3V0cHV0X3RwX2luaXRCb2R5KHNlbGYpOgorICAgICAgICBPdXRwdXQoIiVzICppdHNlbGYgPSBOVUxMOyIsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgY2hhciAqa3dbXSA9IHtcIml0c2VsZlwiLCAwfTsiKQorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoImlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJ8TyZcIiwga3csIEZJbmZvX0NvbnZlcnQsICZpdHNlbGYpKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZikgbWVtY3B5KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgaXRzZWxmLCBzaXplb2YoJXMpKTsiLAorICAgICAgICAgICAgICAgIHNlbGYub2JqZWN0dHlwZSwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCiAKIGNsYXNzIEZTU3BlY0RlZmluaXRpb24oUEVQMjUzTWl4aW4sIE9iamVjdERlZmluaXRpb24pOgotCWdldHNldGxpc3QgPSBbCi0JCSgiZGF0YSIsCi0JCSAicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKHNlbGYtPm9iX2l0c2VsZikpOyIsCi0JCSBOb25lLAotCQkgIlJhdyBkYXRhIG9mIHRoZSBGU1NwZWMgb2JqZWN0IgotCQkpCi0JXQotCQkgCi0JZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSk6Ci0JCU9iamVjdERlZmluaXRpb24uX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKQotCQlzZWxmLmFyZ3JlZiA9ICIqIgkjIFN0b3JlIEZTU3BlY3MsIGJ1dCBwYXNzIHRoZW0gYnkgYWRkcmVzcworICAgIGdldHNldGxpc3QgPSBbCisgICAgICAgICAgICAoImRhdGEiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7IiwKKyAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICJSYXcgZGF0YSBvZiB0aGUgRlNTcGVjIG9iamVjdCIKKyAgICAgICAgICAgICkKKyAgICBdCiAKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCi0JCQotCSMgV2UgZG8gQ29udmVydCBvdXJzZWx2ZXMgKHdpdGggUHlNYWNfR2V0RlN4eHgpCi0JZGVmIG91dHB1dENvbnZlcnQoc2VsZik6Ci0JCXBhc3MKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKToKKyAgICAgICAgT2JqZWN0RGVmaW5pdGlvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpCisgICAgICAgIHNlbGYuYXJncmVmID0gIioiICAgICAgICMgU3RvcmUgRlNTcGVjcywgYnV0IHBhc3MgdGhlbSBieSBhZGRyZXNzCiAKLQlkZWYgb3V0cHV0X3RwX25ld0JvZHkoc2VsZik6Ci0JCU91dHB1dCgiUHlPYmplY3QgKnNlbGY7Iik7Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOyIpCi0JCU91dHB1dCgibWVtc2V0KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKCVzKSk7IiwgCi0JCQlzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKIAotCWRlZiBvdXRwdXRfdHBfaW5pdEJvZHkoc2VsZik6Ci0JCU91dHB1dCgiUHlPYmplY3QgKnYgPSBOVUxMOyIpCi0JCU91dHB1dCgiY2hhciAqcmF3ZGF0YSA9IE5VTEw7IikKLQkJT3V0cHV0KCJpbnQgcmF3ZGF0YWxlbiA9IDA7IikKLQkJT3V0cHV0KCJzdGF0aWMgY2hhciAqa3dbXSA9IHtcIml0c2VsZlwiLCBcInJhd2RhdGFcIiwgMH07IikKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcInxPcyNcIiwga3csICZ2LCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKSIpCi0JCU91dHB1dCgicmV0dXJuIC0xOyIpCi0JCU91dHB1dCgiaWYgKHYgJiYgcmF3ZGF0YSkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZFwiKTsiKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoImlmICghdiAmJiAhcmF3ZGF0YSkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiT25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG11c3QgYmUgc3BlY2lmaWVkXCIpOyIpCi0JCU91dHB1dCgicmV0dXJuIC0xOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiaWYgKHJhd2RhdGEpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJpZiAocmF3ZGF0YWxlbiAhPSBzaXplb2YoJXMpKSIsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIiVzIHJhd2RhdGEgaW5jb3JyZWN0IHNpemVcIik7IiwKLQkJCXNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJtZW1jcHkoJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmLCByYXdkYXRhLCByYXdkYXRhbGVuKTsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dHB1dCgicmV0dXJuIDA7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJpZiAoUHlNYWNfR2V0RlNTcGVjKHYsICYoKCVzICopc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOyIsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkKLQlkZWYgb3V0cHV0UmVwcihzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiY2hhciBidWZbNTEyXTsiKQotCQlPdXRwdXQoIiIiUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcIiUlcygoJSVkLCAlJWxkLCAnJSUuKnMnKSlcIiwKLQkJc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSwKLQkJc2VsZi0+b2JfaXRzZWxmLnZSZWZOdW0sIAotCQlzZWxmLT5vYl9pdHNlbGYucGFySUQsCi0JCXNlbGYtPm9iX2l0c2VsZi5uYW1lWzBdLCBzZWxmLT5vYl9pdHNlbGYubmFtZSsxKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQotCQkKKyAgICAjIFdlIGRvIENvbnZlcnQgb3Vyc2VsdmVzICh3aXRoIFB5TWFjX0dldEZTeHh4KQorICAgIGRlZiBvdXRwdXRDb252ZXJ0KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgb3V0cHV0X3RwX25ld0JvZHkoc2VsZik6CisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKnNlbGY7Iik7CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgiaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOyIpCisgICAgICAgIE91dHB1dCgibWVtc2V0KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKCVzKSk7IiwKKyAgICAgICAgICAgICAgICBzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQorCisgICAgZGVmIG91dHB1dF90cF9pbml0Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqdiA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJjaGFyICpyYXdkYXRhID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoImludCByYXdkYXRhbGVuID0gMDsiKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBjaGFyICprd1tdID0ge1wiaXRzZWxmXCIsIFwicmF3ZGF0YVwiLCAwfTsiKQorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoImlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIFwifE9zI1wiLCBrdywgJnYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0cHV0KCJpZiAodiAmJiByYXdkYXRhKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgXCJPbmx5IG9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtYXkgYmUgc3BlY2lmaWVkXCIpOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiaWYgKCF2ICYmICFyYXdkYXRhKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgXCJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWRcIik7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAocmF3ZGF0YSkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoImlmIChyYXdkYXRhbGVuICE9IHNpemVvZiglcykpIiwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiJXMgcmF3ZGF0YSBpbmNvcnJlY3Qgc2l6ZVwiKTsiLAorICAgICAgICAgICAgICAgIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJtZW1jcHkoJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmLCByYXdkYXRhLCByYXdkYXRhbGVuKTsiLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDA7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAoUHlNYWNfR2V0RlNTcGVjKHYsICYoKCVzICopc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKworICAgIGRlZiBvdXRwdXRSZXByKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJjaGFyIGJ1Zls1MTJdOyIpCisgICAgICAgIE91dHB1dCgiIiJQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJSVzKCglJWQsICUlbGQsICclJS4qcycpKVwiLAorICAgICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICBzZWxmLT5vYl9pdHNlbGYudlJlZk51bSwKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmLnBhcklELAorICAgICAgICBzZWxmLT5vYl9pdHNlbGYubmFtZVswXSwgc2VsZi0+b2JfaXRzZWxmLm5hbWUrMSk7IiIiKQorICAgICAgICBPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKwogY2xhc3MgRlNSZWZEZWZpbml0aW9uKFBFUDI1M01peGluLCBPYmplY3REZWZpbml0aW9uKToKLQlnZXRzZXRsaXN0ID0gWwotCQkoImRhdGEiLAotCQkgInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihzZWxmLT5vYl9pdHNlbGYpKTsiLAotCQkgTm9uZSwKLQkJICJSYXcgZGF0YSBvZiB0aGUgRlNSZWYgb2JqZWN0IgotCQkpCi0JXQotCQkgCi0JZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSk6Ci0JCU9iamVjdERlZmluaXRpb24uX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKQotCQlzZWxmLmFyZ3JlZiA9ICIqIgkjIFN0b3JlIEZTUmVmcywgYnV0IHBhc3MgdGhlbSBieSBhZGRyZXNzCisgICAgZ2V0c2V0bGlzdCA9IFsKKyAgICAgICAgICAgICgiZGF0YSIsCisgICAgICAgICAgICAgInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihzZWxmLT5vYl9pdHNlbGYpKTsiLAorICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgIlJhdyBkYXRhIG9mIHRoZSBGU1JlZiBvYmplY3QiCisgICAgICAgICAgICApCisgICAgXQogCi0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQotCQkKLQkjIFdlIGRvIENvbnZlcnQgb3Vyc2VsdmVzICh3aXRoIFB5TWFjX0dldEZTeHh4KQotCWRlZiBvdXRwdXRDb252ZXJ0KHNlbGYpOgotCQlwYXNzCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSk6CisgICAgICAgIE9iamVjdERlZmluaXRpb24uX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKQorICAgICAgICBzZWxmLmFyZ3JlZiA9ICIqIiAgICAgICAjIFN0b3JlIEZTUmVmcywgYnV0IHBhc3MgdGhlbSBieSBhZGRyZXNzCiAKLQlkZWYgb3V0cHV0X3RwX25ld0JvZHkoc2VsZik6Ci0JCU91dHB1dCgiUHlPYmplY3QgKnNlbGY7Iik7Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOyIpCi0JCU91dHB1dCgibWVtc2V0KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKCVzKSk7IiwgCi0JCQlzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQotCQotCWRlZiBvdXRwdXRfdHBfaW5pdEJvZHkoc2VsZik6Ci0JCU91dHB1dCgiUHlPYmplY3QgKnYgPSBOVUxMOyIpCi0JCU91dHB1dCgiY2hhciAqcmF3ZGF0YSA9IE5VTEw7IikKLQkJT3V0cHV0KCJpbnQgcmF3ZGF0YWxlbiA9IDA7IikKLQkJT3V0cHV0KCJzdGF0aWMgY2hhciAqa3dbXSA9IHtcIml0c2VsZlwiLCBcInJhd2RhdGFcIiwgMH07IikKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcInxPcyNcIiwga3csICZ2LCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKSIpCi0JCU91dHB1dCgicmV0dXJuIC0xOyIpCi0JCU91dHB1dCgiaWYgKHYgJiYgcmF3ZGF0YSkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZFwiKTsiKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoImlmICghdiAmJiAhcmF3ZGF0YSkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiT25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG11c3QgYmUgc3BlY2lmaWVkXCIpOyIpCi0JCU91dHB1dCgicmV0dXJuIC0xOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiaWYgKHJhd2RhdGEpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJpZiAocmF3ZGF0YWxlbiAhPSBzaXplb2YoJXMpKSIsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIiVzIHJhd2RhdGEgaW5jb3JyZWN0IHNpemVcIik7IiwKLQkJCXNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJtZW1jcHkoJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmLCByYXdkYXRhLCByYXdkYXRhbGVuKTsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dHB1dCgicmV0dXJuIDA7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJpZiAoUHlNYWNfR2V0RlNSZWYodiwgJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmKSkgcmV0dXJuIDA7Iiwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQotCQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKKworICAgICMgV2UgZG8gQ29udmVydCBvdXJzZWx2ZXMgKHdpdGggUHlNYWNfR2V0RlN4eHgpCisgICAgZGVmIG91dHB1dENvbnZlcnQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBvdXRwdXRfdHBfbmV3Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqc2VsZjsiKTsKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJtZW1zZXQoJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmLCAwLCBzaXplb2YoJXMpKTsiLAorICAgICAgICAgICAgICAgIHNlbGYub2JqZWN0dHlwZSwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiBzZWxmOyIpCisKKyAgICBkZWYgb3V0cHV0X3RwX2luaXRCb2R5KHNlbGYpOgorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICp2ID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoImNoYXIgKnJhd2RhdGEgPSBOVUxMOyIpCisgICAgICAgIE91dHB1dCgiaW50IHJhd2RhdGFsZW4gPSAwOyIpCisgICAgICAgIE91dHB1dCgic3RhdGljIGNoYXIgKmt3W10gPSB7XCJpdHNlbGZcIiwgXCJyYXdkYXRhXCIsIDB9OyIpCisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgiaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJ8T3MjXCIsIGt3LCAmdiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkiKQorICAgICAgICBPdXRwdXQoInJldHVybiAtMTsiKQorICAgICAgICBPdXRwdXQoImlmICh2ICYmIHJhd2RhdGEpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWRcIik7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAoIXYgJiYgIXJhd2RhdGEpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZFwiKTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAtMTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoImlmIChyYXdkYXRhKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiaWYgKHJhd2RhdGFsZW4gIT0gc2l6ZW9mKCVzKSkiLCBzZWxmLml0c2VsZnR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgXCIlcyByYXdkYXRhIGluY29ycmVjdCBzaXplXCIpOyIsCisgICAgICAgICAgICAgICAgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiAtMTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoIm1lbWNweSgmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMDsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoImlmIChQeU1hY19HZXRGU1JlZih2LCAmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYpKSByZXR1cm4gMDsiLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCisKIGNsYXNzIEFsaWFzRGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgT2JqZWN0RGVmaW5pdGlvbik6Ci0JIyBYWFhYIFNob3VsZCBpbmhlcml0IGZyb20gcmVzb3VyY2U/Ci0JZ2V0c2V0bGlzdCA9IFsKLQkJKCJkYXRhIiwKLQkJICIiImludCBzaXplOwotCQkJUHlPYmplY3QgKnJ2OwotCQkJCi0JCQlzaXplID0gR2V0SGFuZGxlU2l6ZSgoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7Ci0JCQlITG9jaygoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7Ci0JCQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCooSGFuZGxlKXNlbGYtPm9iX2l0c2VsZiwgc2l6ZSk7Ci0JCQlIVW5sb2NrKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKLQkJCXJldHVybiBydjsKLQkJIiIiLAotCQkgTm9uZSwKLQkJICJSYXcgZGF0YSBvZiB0aGUgYWxpYXMgb2JqZWN0IgotCQkpCi0JXQotCQkgCi0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQotCQkKLQlkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgidm9pZCAoKm9iX2ZyZWVpdCkoJXMgcHRyKTsiLCBzZWxmLml0c2VsZnR5cGUpCi0JCQotCWRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoIml0LT5vYl9mcmVlaXQgPSBOVUxMOyIpCi0JCQotCWRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoInNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgic2VsZi0+b2JfaXRzZWxmID0gTlVMTDsiKQorICAgICMgWFhYWCBTaG91bGQgaW5oZXJpdCBmcm9tIHJlc291cmNlPworICAgIGdldHNldGxpc3QgPSBbCisgICAgICAgICAgICAoImRhdGEiLAorICAgICAgICAgICAgICIiImludCBzaXplOworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcnY7CiAKLQlkZWYgb3V0cHV0X3RwX25ld0JvZHkoc2VsZik6Ci0JCU91dHB1dCgiUHlPYmplY3QgKnNlbGY7Iik7Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOyIpCi0JCU91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOyIsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQotCQotCWRlZiBvdXRwdXRfdHBfaW5pdEJvZHkoc2VsZik6Ci0JCU91dHB1dCgiJXMgaXRzZWxmID0gTlVMTDsiLCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dHB1dCgiY2hhciAqcmF3ZGF0YSA9IE5VTEw7IikKLQkJT3V0cHV0KCJpbnQgcmF3ZGF0YWxlbiA9IDA7IikKLQkJT3V0cHV0KCJIYW5kbGUgaDsiKQotCQlPdXRwdXQoInN0YXRpYyBjaGFyICprd1tdID0ge1wiaXRzZWxmXCIsIFwicmF3ZGF0YVwiLCAwfTsiKQotCQlPdXRwdXQoKQotCQlPdXRwdXQoImlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIFwifE8mcyNcIiwga3csICVzX0NvbnZlcnQsICZpdHNlbGYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpIiwKLQkJCXNlbGYucHJlZml4KQotCQlPdXRwdXQoInJldHVybiAtMTsiKQotCQlPdXRwdXQoImlmIChpdHNlbGYgJiYgcmF3ZGF0YSkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZFwiKTsiKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoImlmICghaXRzZWxmICYmICFyYXdkYXRhKSIpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgXCJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWRcIik7IikKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJpZiAocmF3ZGF0YSkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImlmICgoaCA9IE5ld0hhbmRsZShyYXdkYXRhbGVuKSkgPT0gTlVMTCkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX05vTWVtb3J5KCk7IikKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJITG9jayhoKTsiKQotCQlPdXRwdXQoIm1lbWNweSgoY2hhciAqKSpoLCByYXdkYXRhLCByYXdkYXRhbGVuKTsiKQotCQlPdXRwdXQoIkhVbmxvY2soaCk7IikKLQkJT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2l0c2VsZiA9ICglcyloOyIsIHNlbGYub2JqZWN0dHlwZSwgc2VsZi5pdHNlbGZ0eXBlKQotCQlPdXRwdXQoInJldHVybiAwOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Iiwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRwdXQoInJldHVybiAwOyIpCi0JCisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBHZXRIYW5kbGVTaXplKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgSExvY2soKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCooSGFuZGxlKXNlbGYtPm9iX2l0c2VsZiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEhVbmxvY2soKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnY7CisgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAiUmF3IGRhdGEgb2YgdGhlIGFsaWFzIG9iamVjdCIKKyAgICAgICAgICAgICkKKyAgICBdCisKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisKKyAgICBkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgidm9pZCAoKm9iX2ZyZWVpdCkoJXMgcHRyKTsiLCBzZWxmLml0c2VsZnR5cGUpCisKKyAgICBkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfZnJlZWl0ID0gTlVMTDsiKQorCisgICAgZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgic2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOyIpCisKKyAgICBkZWYgb3V0cHV0X3RwX25ld0JvZHkoc2VsZik6CisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKnNlbGY7Iik7CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgiaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOyIpCisgICAgICAgIE91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQorCisgICAgZGVmIG91dHB1dF90cF9pbml0Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCIlcyBpdHNlbGYgPSBOVUxMOyIsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJjaGFyICpyYXdkYXRhID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoImludCByYXdkYXRhbGVuID0gMDsiKQorICAgICAgICBPdXRwdXQoIkhhbmRsZSBoOyIpCisgICAgICAgIE91dHB1dCgic3RhdGljIGNoYXIgKmt3W10gPSB7XCJpdHNlbGZcIiwgXCJyYXdkYXRhXCIsIDB9OyIpCisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgiaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJ8TyZzI1wiLCBrdywgJXNfQ29udmVydCwgJml0c2VsZiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkiLAorICAgICAgICAgICAgICAgIHNlbGYucHJlZml4KQorICAgICAgICBPdXRwdXQoInJldHVybiAtMTsiKQorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgJiYgcmF3ZGF0YSkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZFwiKTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAtMTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoImlmICghaXRzZWxmICYmICFyYXdkYXRhKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgXCJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWRcIik7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAocmF3ZGF0YSkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoImlmICgoaCA9IE5ld0hhbmRsZShyYXdkYXRhbGVuKSkgPT0gTlVMTCkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5RXJyX05vTWVtb3J5KCk7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJITG9jayhoKTsiKQorICAgICAgICBPdXRwdXQoIm1lbWNweSgoY2hhciAqKSpoLCByYXdkYXRhLCByYXdkYXRhbGVuKTsiKQorICAgICAgICBPdXRwdXQoIkhVbmxvY2soaCk7IikKKyAgICAgICAgT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2l0c2VsZiA9ICglcyloOyIsIHNlbGYub2JqZWN0dHlwZSwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Iiwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisKICMgQWxpYXMgbWV0aG9kcyBjb21lIGluIHR3byBmbGF2b3JzOiB0aG9zZSB3aXRoIHRoZSBhbGlhcyBhcyBhcmcxIGFuZAogIyB0aG9zZSB3aXRoIHRoZSBhbGlhcyBhcyBhcmcgMi4KIGNsYXNzIEFyZzJNZXRob2RHZW5lcmF0b3IoT1NFcnJNZXRob2RHZW5lcmF0b3IpOgotCSIiIlNpbWlsYXIgdG8gTWV0aG9kR2VuZXJhdG9yLCBidXQgaGFzIHNlbGYgYXMgc2Vjb25kIGFyZ3VtZW50IiIiCisgICAgIiIiU2ltaWxhciB0byBNZXRob2RHZW5lcmF0b3IsIGJ1dCBoYXMgc2VsZiBhcyBzZWNvbmQgYXJndW1lbnQiIiIKIAotCWRlZiBwYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKToKLQkJYXJnczAsIGFyZzEsIGFyZ3NyZXN0ID0gYXJnc1s6MV0sIGFyZ3NbMV0sIGFyZ3NbMjpdCi0JCXQwLCBuMCwgbTAgPSBhcmcxCi0JCWFyZ3MgPSBhcmdzMCArIGFyZ3NyZXN0Ci0JCWlmIG0wICE9IEluTW9kZToKLQkJCXJhaXNlIFZhbHVlRXJyb3IsICJtZXRob2QncyAnc2VsZicgbXVzdCBiZSAnSW5Nb2RlJyIKLQkJc2VsZi5pdHNlbGYgPSBWYXJpYWJsZSh0MCwgIl9zZWxmLT5vYl9pdHNlbGYiLCBTZWxmTW9kZSkKLQkJRnVuY3Rpb25HZW5lcmF0b3IucGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncykKLQkJc2VsZi5hcmd1bWVudExpc3QuaW5zZXJ0KDIsIHNlbGYuaXRzZWxmKQorICAgIGRlZiBwYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKToKKyAgICAgICAgYXJnczAsIGFyZzEsIGFyZ3NyZXN0ID0gYXJnc1s6MV0sIGFyZ3NbMV0sIGFyZ3NbMjpdCisgICAgICAgIHQwLCBuMCwgbTAgPSBhcmcxCisgICAgICAgIGFyZ3MgPSBhcmdzMCArIGFyZ3NyZXN0CisgICAgICAgIGlmIG0wICE9IEluTW9kZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtZXRob2QncyAnc2VsZicgbXVzdCBiZSAnSW5Nb2RlJyIKKyAgICAgICAgc2VsZi5pdHNlbGYgPSBWYXJpYWJsZSh0MCwgIl9zZWxmLT5vYl9pdHNlbGYiLCBTZWxmTW9kZSkKKyAgICAgICAgRnVuY3Rpb25HZW5lcmF0b3IucGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncykKKyAgICAgICAgc2VsZi5hcmd1bWVudExpc3QuaW5zZXJ0KDIsIHNlbGYuaXRzZWxmKQogCiAjIEZyb20gaGVyZSBvbiBpdCdzIGJhc2ljYWxseSBhbGwgYm9pbGVyIHBsYXRlLi4uCiAKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgZ3JvdXBzIGFuZCBsaW5rIHRoZW0KIG1vZHVsZSA9IE1hY01vZHVsZShNT0ROQU1FLCBNT0RQUkVGSVgsIGluY2x1ZGVzdHVmZiwgZmluYWxzdHVmZiwgaW5pdHN0dWZmLAotCWxvbmduYW1lPUxPTkdNT0ROQU1FKQorICAgICAgICBsb25nbmFtZT1MT05HTU9ETkFNRSkKIAogZnNjYXRhbG9naW5mb29iamVjdCA9IEZTQ2F0YWxvZ0luZm9EZWZpbml0aW9uKCdGU0NhdGFsb2dJbmZvJywgJ0ZTQ2F0YWxvZ0luZm8nLCAnRlNDYXRhbG9nSW5mbycpCiBmaW5mb29iamVjdCA9IEZJbmZvRGVmaW5pdGlvbignRkluZm8nLCAnRkluZm8nLCAnRkluZm8nKQpAQCAtNzcwLDEwICs3NzAsMTAgQEAKIFVJbnQzMiBtYXhQYXRoU2l6ZSA9IE1BWFBBVEhOQU1FOwogCiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBfZXJyID0gRlNSZWZNYWtlUGF0aCgmX3NlbGYtPm9iX2l0c2VsZiwKLQkJCQkJIHBhdGgsCi0JCQkJCSBtYXhQYXRoU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhdGhTaXplKTsKIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyIsIHBhdGgpOwogcmV0dXJuIF9yZXM7CkBAIC03ODQsNyArNzg0LDcgQEAKIAogRlNSZWZfYXNfcGF0aG5hbWVfYm9keSA9ICIiIgogaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogX3JlcyA9IEZTUmVmX0ZTUmVmTWFrZVBhdGgoX3NlbGYsIF9hcmdzKTsKIHJldHVybiBfcmVzOwogIiIiCkBAIC03OTcsMTEgKzc5NywxMSBAQAogT1NFcnIgZXJyOwogCiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBlcnIgPSBQeU1hY19HZXRGdWxsUGF0aG5hbWUoJl9zZWxmLT5vYl9pdHNlbGYsIHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZikpOwogaWYgKCBlcnIgKSB7Ci0JUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiBfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHJidWYpOwogcmV0dXJuIF9yZXM7CkBAIC04MTIsOSArODEyLDkgQEAKIAogRlNTcGVjX2FzX3R1cGxlX2JvZHkgPSAiIiIKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCXJldHVybiBOVUxMOwotX3JlcyA9IFB5X0J1aWxkVmFsdWUoIihpaXMjKSIsIF9zZWxmLT5vYl9pdHNlbGYudlJlZk51bSwgX3NlbGYtPm9iX2l0c2VsZi5wYXJJRCwgCi0JCQkJCSZfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMV0sIF9zZWxmLT5vYl9pdHNlbGYubmFtZVswXSk7CisgICAgICAgIHJldHVybiBOVUxMOworX3JlcyA9IFB5X0J1aWxkVmFsdWUoIihpaXMjKSIsIF9zZWxmLT5vYl9pdHNlbGYudlJlZk51bSwgX3NlbGYtPm9iX2l0c2VsZi5wYXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX3NlbGYtPm9iX2l0c2VsZi5uYW1lWzFdLCBfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0pOwogcmV0dXJuIF9yZXM7CiAiIiIKIGYgPSBNYW51YWxHZW5lcmF0b3IoImFzX3R1cGxlIiwgRlNTcGVjX2FzX3R1cGxlX2JvZHkpCkBAIC04MjUsMTMgKzgyNSwxMyBAQAogUHlPYmplY3QgKm9iajsKIAogaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyIsICZvYmopKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIGlmIChQeVN0cmluZ19DaGVjayhvYmopKSB7Ci0JUHlfSU5DUkVGKG9iaik7Ci0JcmV0dXJuIG9iajsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIHJldHVybiBvYmo7CiB9CiBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpCi0JcmV0dXJuIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob2JqLCAidXRmOCIsICJzdHJpY3QiKTsKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob2JqLCAidXRmOCIsICJzdHJpY3QiKTsKIF9yZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG9iaiwgImFzX3BhdGhuYW1lIiwgTlVMTCk7CiByZXR1cm4gX3JlczsKICIiIgpAQCAtODQ5LDQgKzg0OSwzIEBACiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9mbS9mbXNjYW4ucHkgYi9NYWMvTW9kdWxlcy9mbS9mbXNjYW4ucHkKaW5kZXggNzNhYWQzZS4uMzM0ZDVlYyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZm0vZm1zY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2ZtL2Ztc2Nhbi5weQpAQCAtMTAsNjMgKzEwLDYzIEBACiBTSE9SVCA9ICJmbSIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9ICJGb250cy5oIgotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gIkZvbnRzLmgiCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiT3V0bGluZU1ldHJpY3MiLAkjIFRvbyBjb21wbGljYXRlZAotCQkJIkFudGlUZXh0SXNBbnRpQWxpYXNlZCIsCSMgWFhYWCBNaXNzaW5nIGZyb20gbGlicmFyeS4uLgotCQkJIkFudGlUZXh0R2V0RW5hYmxlZCIsCi0JCQkiQW50aVRleHRTZXRFbmFibGVkIiwKLQkJCSJBbnRpVGV4dEdldEFwcGxpY2F0aW9uQXdhcmUiLAotCQkJIkFudGlUZXh0U2V0QXBwbGljYXRpb25Bd2FyZSIsCi0JCQkjIFRoZXNlIGFyZSB0cmlja3k6IHRoZXkncmUgbm90IENhcmJvbiBkZXBlbmRlbnQgb3IgYW55dGhpbmcsIGJ1dCB0aGV5Ci0JCQkjIGV4aXN0IG9ubHkgb24gOC42IG9yIGxhdGVyIChib3RoIGluIENhcmJvbiBhbmQgQ2xhc3NpYykuCi0JCQkjIERpc2FibGluZyB0aGVtIGlzIHRoZSBlYXNpZXN0IHBhdGguCi0JCQknU2V0QW50aUFsaWFzZWRUZXh0RW5hYmxlZCcsCi0JCQknSXNBbnRpQWxpYXNlZFRleHRFbmFibGVkJywKLQkJCSMgT1M4LW9ubHkKLQkJCSdJbml0Rm9udHMnLAotCQkJJ1NldEZvbnRMb2NrJywKLQkJCSdGbHVzaEZvbnRzJywKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJPdXRsaW5lTWV0cmljcyIsICAgICAgICMgVG9vIGNvbXBsaWNhdGVkCisgICAgICAgICAgICAgICAgIkFudGlUZXh0SXNBbnRpQWxpYXNlZCIsICAgICAgICAjIFhYWFggTWlzc2luZyBmcm9tIGxpYnJhcnkuLi4KKyAgICAgICAgICAgICAgICAiQW50aVRleHRHZXRFbmFibGVkIiwKKyAgICAgICAgICAgICAgICAiQW50aVRleHRTZXRFbmFibGVkIiwKKyAgICAgICAgICAgICAgICAiQW50aVRleHRHZXRBcHBsaWNhdGlvbkF3YXJlIiwKKyAgICAgICAgICAgICAgICAiQW50aVRleHRTZXRBcHBsaWNhdGlvbkF3YXJlIiwKKyAgICAgICAgICAgICAgICAjIFRoZXNlIGFyZSB0cmlja3k6IHRoZXkncmUgbm90IENhcmJvbiBkZXBlbmRlbnQgb3IgYW55dGhpbmcsIGJ1dCB0aGV5CisgICAgICAgICAgICAgICAgIyBleGlzdCBvbmx5IG9uIDguNiBvciBsYXRlciAoYm90aCBpbiBDYXJib24gYW5kIENsYXNzaWMpLgorICAgICAgICAgICAgICAgICMgRGlzYWJsaW5nIHRoZW0gaXMgdGhlIGVhc2llc3QgcGF0aC4KKyAgICAgICAgICAgICAgICAnU2V0QW50aUFsaWFzZWRUZXh0RW5hYmxlZCcsCisgICAgICAgICAgICAgICAgJ0lzQW50aUFsaWFzZWRUZXh0RW5hYmxlZCcsCisgICAgICAgICAgICAgICAgIyBPUzgtb25seQorICAgICAgICAgICAgICAgICdJbml0Rm9udHMnLAorICAgICAgICAgICAgICAgICdTZXRGb250TG9jaycsCisgICAgICAgICAgICAgICAgJ0ZsdXNoRm9udHMnLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiRk1JbnB1dF9wdHIiLAkjIE5vdCBuZWVkZWQgZm9yIG5vdwotCQkJIkZNT3V0UHRyIiwJCSMgRGl0dG8KLSMjCQkJInZvaWRfcHRyIiwJCSMgRG9uJ3Qga25vdyBob3cgdG8gZG8gdGhpcyByaWdodCBub3cKLQkJCSJGb250SW5mbyIsCQkjIERpdHRvCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiRk1JbnB1dF9wdHIiLCAgIyBOb3QgbmVlZGVkIGZvciBub3cKKyAgICAgICAgICAgICAgICAiRk1PdXRQdHIiLCAgICAgICAgICAgICAjIERpdHRvCisjIyAgICAgICAgICAgICAgICAgICAgICAidm9pZF9wdHIiLCAgICAgICAgICAgICAjIERvbid0IGtub3cgaG93IHRvIGRvIHRoaXMgcmlnaHQgbm93CisgICAgICAgICAgICAgICAgIkZvbnRJbmZvIiwgICAgICAgICAgICAgIyBEaXR0bworICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoJ1N0cjI1NScsICcqJywgJ0luTW9kZScpXSwgWygnU3RyMjU1JywgJyonLCAnT3V0TW9kZScpXSksCi0JCQkoWygnRk1ldHJpY1JlY1B0cicsICd0aGVNZXRyaWNzJywgJ0luTW9kZScpXSwgWygnRk1ldHJpY1JlY1B0cicsICd0aGVNZXRyaWNzJywgJ091dE1vZGUnKV0pLAotCQkJKFsoJ3Nob3J0JywgJ2J5dGVDb3VudCcsICdJbk1vZGUnKSwgKCd2b2lkX3B0cicsICd0ZXh0QWRkcicsICdJbk1vZGUnKSxdLAotCQkJIFsoJ1RleHRCdWZmZXInLCAnaW5UZXh0JywgJ0luTW9kZScpXSksCi0JCQldCi0JCQkKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgia05pbE9wdGlvbnMgPSAwXG4iKQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCdTdHIyNTUnLCAnKicsICdJbk1vZGUnKV0sIFsoJ1N0cjI1NScsICcqJywgJ091dE1vZGUnKV0pLAorICAgICAgICAgICAgICAgIChbKCdGTWV0cmljUmVjUHRyJywgJ3RoZU1ldHJpY3MnLCAnSW5Nb2RlJyldLCBbKCdGTWV0cmljUmVjUHRyJywgJ3RoZU1ldHJpY3MnLCAnT3V0TW9kZScpXSksCisgICAgICAgICAgICAgICAgKFsoJ3Nob3J0JywgJ2J5dGVDb3VudCcsICdJbk1vZGUnKSwgKCd2b2lkX3B0cicsICd0ZXh0QWRkcicsICdJbk1vZGUnKSxdLAorICAgICAgICAgICAgICAgICBbKCdUZXh0QnVmZmVyJywgJ2luVGV4dCcsICdJbk1vZGUnKV0pLAorICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJrTmlsT3B0aW9ucyA9IDBcbiIpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9mbS9mbXN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9mbS9mbXN1cHBvcnQucHkKaW5kZXggMDdiOTQ0ZS4uZTY5MjA1MyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZm0vZm1zdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2ZtL2Ztc3VwcG9ydC5weQpAQCAtNiwyMSArNiwyMSBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ0ZvbnRzLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfRm0nCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorTUFDSEVBREVSRklMRSA9ICdGb250cy5oJyAgICAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19GbScgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdGbScJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitNT0RQUkVGSVggPSAnRm0nICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIAogIyBDcmVhdGUgdGhlIHR5cGUgb2JqZWN0cwogCiBjbGFzcyBSZXZWYXJJbnB1dEJ1ZmZlclR5cGUoVmFySW5wdXRCdWZmZXJUeXBlKToKLQlkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIiVzX19sZW5fXywgJXNfX2luX18iICUgKG5hbWUsIG5hbWUpCisgICAgZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuICIlc19fbGVuX18sICVzX19pbl9fIiAlIChuYW1lLCBuYW1lKQogCiBUZXh0QnVmZmVyID0gUmV2VmFySW5wdXRCdWZmZXJUeXBlKCkKIApAQCAtMzYsMTIgKzM2LDEyIEBACiBGTVJlY19OZXcoRk1ldHJpY1JlYyAqaXRzZWxmKQogewogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mTyZPJk8mTyYiLCAKLQkJUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT5hc2NlbnQsCi0JCVB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+ZGVzY2VudCwKLQkJUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT5sZWFkaW5nLAotCQlQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPndpZE1heCwKLQkJUmVzT2JqX05ldywgaXRzZWxmLT53VGFiSGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+YXNjZW50LAorICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+ZGVzY2VudCwKKyAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPmxlYWRpbmcsCisgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT53aWRNYXgsCisgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaXRzZWxmLT53VGFiSGFuZGxlKTsKIH0KIAogI2lmIDAKQEAgLTQ5LDEyICs0OSwxMiBAQAogc3RhdGljIGludAogRk1SZWNfQ29udmVydChQeU9iamVjdCAqdiwgRk1ldHJpY1JlYyAqcF9pdHNlbGYpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIk8mTyZPJk8mTyYiLAotCQlQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+YXNjZW50LAotCQlQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+ZGVzY2VudCwKLQkJUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPmxlYWRpbmcsCi0JCVB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT53aWRNYXgsCi0JCVJlc09ial9Db252ZXJ0LCAmaXRzZWxmLT53VGFiSGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIk8mTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5hc2NlbnQsCisgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPmRlc2NlbnQsCisgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPmxlYWRpbmcsCisgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPndpZE1heCwKKyAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0c2VsZi0+d1RhYkhhbmRsZSk7CiB9CiAjZW5kaWYKIApAQCAtNzksNCArNzksMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZm9sZGVyL2ZvbGRlcnNjYW4ucHkgYi9NYWMvTW9kdWxlcy9mb2xkZXIvZm9sZGVyc2Nhbi5weQppbmRleCAzOWI1YTA1Li44Yzk0ODkzIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9mb2xkZXIvZm9sZGVyc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9mb2xkZXIvZm9sZGVyc2Nhbi5weQpAQCAtMTEsNTggKzExLDU4IEBACiBPQkpFQ1QgPSAiTk9UVVNFRCIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IExPTkcgKyAiLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0Jc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gTE9ORyArICIuaCIKKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBzY2FubmVyLmdlbnR5cGV0ZXN0KFNIT1JUKyJ0eXBldGVzdC5weSIpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyX09TWCk6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCSMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQotCQkJaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgIyBUaGlzIGlzIG5vbi1mdW5jdGlvbmFsIHRvZGF5CisgICAgICAgICAgICBpZiB0ID09IE9CSkVDVCBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkZpbmRGb2xkZXJFeHRlbmRlZCIsICMgSGFzIGZ1bm55IHZvaWQqIGFyZ3VtZW50Ci0JCQkiRlNGaW5kRm9sZGVyRXh0ZW5kZWQiLCAjIGRpdHRvCi0JCQkiRm9sZGVyTWFuYWdlclJlZ2lzdGVyQ2FsbE5vdGlmaWNhdGlvblByb2NzIiwgIyBkaXR0bwotCQkJCi0JCQkiRmluZEZvbGRlckV4IiwgIyBOb24tTWFjT1Mgcm91dGluZQotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkZpbmRGb2xkZXJFeHRlbmRlZCIsICMgSGFzIGZ1bm55IHZvaWQqIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgIkZTRmluZEZvbGRlckV4dGVuZGVkIiwgIyBkaXR0bworICAgICAgICAgICAgICAgICJGb2xkZXJNYW5hZ2VyUmVnaXN0ZXJDYWxsTm90aWZpY2F0aW9uUHJvY3MiLCAjIGRpdHRvCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkZvbGRlck1hbmFnZXJOb3RpZmljYXRpb25Qcm9jUHRyIiwKLQkJCSJGb2xkZXJNYW5hZ2VyTm90aWZpY2F0aW9uVVBQIiwKLQkJCSJGb2xkZXJSb3V0aW5nIiwgIyBUbyBiZSBkb25lLCBub3QgZGlmZmljdWx0Ci0JCQkiRm9sZGVyRGVzYyIsICMgVG8gYmUgZG9uZSwgbm90IGRpZmZpY3VsdAotCQkJCi0JCQldCisgICAgICAgICAgICAgICAgIkZpbmRGb2xkZXJFeCIsICMgTm9uLU1hY09TIHJvdXRpbmUKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCV0KLSAgIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJ0cnVlID0gVHJ1ZVxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZmFsc2UgPSBGYWxzZVxuIikKLQkJCQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkZvbGRlck1hbmFnZXJOb3RpZmljYXRpb25Qcm9jUHRyIiwKKyAgICAgICAgICAgICAgICAiRm9sZGVyTWFuYWdlck5vdGlmaWNhdGlvblVQUCIsCisgICAgICAgICAgICAgICAgIkZvbGRlclJvdXRpbmciLCAjIFRvIGJlIGRvbmUsIG5vdCBkaWZmaWN1bHQKKyAgICAgICAgICAgICAgICAiRm9sZGVyRGVzYyIsICMgVG8gYmUgZG9uZSwgbm90IGRpZmZpY3VsdAorCisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoInRydWUgPSBUcnVlXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJmYWxzZSA9IEZhbHNlXG4iKQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZm9sZGVyL2ZvbGRlcnN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9mb2xkZXIvZm9sZGVyc3VwcG9ydC5weQppbmRleCBiOTI0NjE1Li5iOWI2NGJmIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9mb2xkZXIvZm9sZGVyc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9mb2xkZXIvZm9sZGVyc3VwcG9ydC5weQpAQCAtNiwxMyArNiwxMyBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ0ZvbGRlcnMuaCcJCSMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCi1NT0ROQU1FID0gJ19Gb2xkZXInCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorTUFDSEVBREVSRklMRSA9ICdGb2xkZXJzLmgnICAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19Gb2xkZXInICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0ZvbGRlcicJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitNT0RQUkVGSVggPSAnRm9sZGVyJyAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNTQsNCArNTQsMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaGVscC9oZWxwc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2hlbHAvaGVscHNjYW4ucHkKaW5kZXggMzJhNzU5YS4uNTBlMDkxOSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvaGVscC9oZWxwc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9oZWxwL2hlbHBzY2FuLnB5CkBAIC0xMSw1NyArMTEsNTcgQEAKIE9CSkVDVCA9ICJOT1RVU0VEIgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gTE9ORyArICIuaCIKLQlvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9IExPTkcgKyAiLmgiCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJIyBUaGlzIGlzIG5vbi1mdW5jdGlvbmFsIHRvZGF5Ci0JCQlpZiB0ID09IE9CSkVDVCBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gIm1ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICAjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKKyAgICAgICAgICAgIGlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAibWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0jIwkJCSJUaXBGdW5jdGlvblVQUCIsCi0jIwkJCSJITU1lc3NhZ2VSZWNvcmQiLAotIyMJCQkiSE1NZXNzYWdlUmVjb3JkX3B0ciIsCi0JCQkiSE1XaW5kb3dDb250ZW50VVBQIiwKLQkJCSJITU1lbnVUaXRsZUNvbnRlbnRVUFAiLAotCQkJIkhNQ29udHJvbENvbnRlbnRVUFAiLAotCQkJIkhNTWVudUl0ZW1Db250ZW50VVBQIiwKLQkJCSMgRm9yIHRoZSBtb21lbnQKLQkJCSJITUhlbHBDb250ZW50UmVjIiwKLQkJCSJITUhlbHBDb250ZW50UmVjX3B0ciIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyMjICAgICAgICAgICAgICAgICAgICAgICJUaXBGdW5jdGlvblVQUCIsCisjIyAgICAgICAgICAgICAgICAgICAgICAiSE1NZXNzYWdlUmVjb3JkIiwKKyMjICAgICAgICAgICAgICAgICAgICAgICJITU1lc3NhZ2VSZWNvcmRfcHRyIiwKKyAgICAgICAgICAgICAgICAiSE1XaW5kb3dDb250ZW50VVBQIiwKKyAgICAgICAgICAgICAgICAiSE1NZW51VGl0bGVDb250ZW50VVBQIiwKKyAgICAgICAgICAgICAgICAiSE1Db250cm9sQ29udGVudFVQUCIsCisgICAgICAgICAgICAgICAgIkhNTWVudUl0ZW1Db250ZW50VVBQIiwKKyAgICAgICAgICAgICAgICAjIEZvciB0aGUgbW9tZW50CisgICAgICAgICAgICAgICAgIkhNSGVscENvbnRlbnRSZWMiLAorICAgICAgICAgICAgICAgICJITUhlbHBDb250ZW50UmVjX3B0ciIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0jIwkJCShbKCJXaW5kb3dQdHIiLCAiKiIsICJPdXRNb2RlIildLAotIyMJCQkgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKLQkJCV0KLQkJCQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworIyMgICAgICAgICAgICAgICAgICAgICAgKFsoIldpbmRvd1B0ciIsICIqIiwgIk91dE1vZGUiKV0sCisjIyAgICAgICAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICBdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9oZWxwL2hlbHBzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvaGVscC9oZWxwc3VwcG9ydC5weQppbmRleCBhNjMwNjAzLi43N2Y1YzJlIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9oZWxwL2hlbHBzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2hlbHAvaGVscHN1cHBvcnQucHkKQEAgLTYsMTYgKzYsMTYgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTU9ETkFNRSA9ICdfSGVscCcJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCi1PQkpFQ1ROQU1FID0gJ1VOVVNFRCcJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQotS0lORCA9ICdSZWNvcmQnCQkJCSMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJworTU9ETkFNRSA9ICdfSGVscCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ1VOVVNFRCcgICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK0tJTkQgPSAnUmVjb3JkJyAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0hlbHAnCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwotT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyBLSU5ECQkjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQotT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicJIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcworTU9EUFJFRklYID0gJ0hlbHAnICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK09CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgS0lORCAgICAgICAgICAjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQorT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicgICAgICAgICMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTQwLDE3ICs0MCwxNyBAQAogIiIiCiAKIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCU91dExicmFjZSgiaWYgKERsZ09ial9DaGVjayh2KSkiKQotCQlPdXRwdXQoIipwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsiKQotCQlPdXRwdXQoInJldHVybiAxOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dCgiIiIKLQkJaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCQlpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKFdpbmRvd1B0cilQeUludF9Bc0xvbmcodik7IHJldHVybiAxOyB9Ci0JCSIiIikKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisgICAgZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKKyAgICAgICAgT3V0TGJyYWNlKCJpZiAoRGxnT2JqX0NoZWNrKHYpKSIpCisgICAgICAgIE91dHB1dCgiKnBfaXRzZWxmID0gKChXaW5kb3dPYmplY3QgKil2KS0+b2JfaXRzZWxmOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0KCIiIgorICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgICAgIGlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoV2luZG93UHRyKVB5SW50X0FzTG9uZyh2KTsgcmV0dXJuIDE7IH0KKyAgICAgICAgIiIiKQogCiAjIEZyb20gaGVyZSBvbiBpdCdzIGJhc2ljYWxseSBhbGwgYm9pbGVyIHBsYXRlLi4uCiAKQEAgLTc2LDQgKzc2LDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2liY2FyYm9uL0lCQ2FyYm9uc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2liY2FyYm9uL0lCQ2FyYm9uc2Nhbi5weQppbmRleCAxZjA1MjE3Li44NGU0ZjFlIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9pYmNhcmJvbi9JQkNhcmJvbnNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvaWJjYXJib24vSUJDYXJib25zY2FuLnB5CkBAIC0xMCw0MCArMTAsNDAgQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyX09TWAogCiBkZWYgbWFpbigpOgotCXByaW50ICItLS1TY2FubmluZyBJQkNhcmJvblJ1bnRpbWUuaC0tLSIKLQlpbnB1dCA9IFsiSUJDYXJib25SdW50aW1lLmgiXQotCW91dHB1dCA9ICJJQkNhcmJvbmdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJJQkNhcmJvblJ1bnRpbWUucHkiCi0Jc2Nhbm5lciA9IElCQ2FyYm9uX1NjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICItLWRvbmUgc2Nhbm5pbmcsIGltcG9ydGluZy0tIgotCWltcG9ydCBJQkNhcmJvbnN1cHBvcnQKLQlwcmludCAiZG9uZSIKKyAgICBwcmludCAiLS0tU2Nhbm5pbmcgSUJDYXJib25SdW50aW1lLmgtLS0iCisgICAgaW5wdXQgPSBbIklCQ2FyYm9uUnVudGltZS5oIl0KKyAgICBvdXRwdXQgPSAiSUJDYXJib25nZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiSUJDYXJib25SdW50aW1lLnB5IgorICAgIHNjYW5uZXIgPSBJQkNhcmJvbl9TY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiLS1kb25lIHNjYW5uaW5nLCBpbXBvcnRpbmctLSIKKyAgICBpbXBvcnQgSUJDYXJib25zdXBwb3J0CisgICAgcHJpbnQgImRvbmUiCiAKIGNsYXNzIElCQ2FyYm9uX1NjYW5uZXIoU2Nhbm5lcl9PU1gpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiSUJDYXJib25GdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgPT0gIklCTmliUmVmIiBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiSUJDYXJib25NZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJJQkNhcmJvbkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCA9PSAiSUJOaWJSZWYiIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJJQkNhcmJvbk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJEaXNwb3NlTmliUmVmZXJlbmNlIiwJCQkJIyB0YWtlbiBjYXJlIG9mIGJ5IGRlc3RydWN0b3IKLQkJCSJDcmVhdGVOaWJSZWZlcmVuY2VXaXRoQ0ZCdW5kbGUiLCAgIyMgbmVlZCB0byB3cmFwIENGQnVuZGxlLmggcHJvcGVybHkgZmlyc3QKLQkJCV0KLQkJCQotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gW10KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJEaXNwb3NlTmliUmVmZXJlbmNlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFrZW4gY2FyZSBvZiBieSBkZXN0cnVjdG9yCisgICAgICAgICAgICAgICAgIkNyZWF0ZU5pYlJlZmVyZW5jZVdpdGhDRkJ1bmRsZSIsICAjIyBuZWVkIHRvIHdyYXAgQ0ZCdW5kbGUuaCBwcm9wZXJseSBmaXJzdAorICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gW10KIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaWJjYXJib24vSUJDYXJib25zdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvaWJjYXJib24vSUJDYXJib25zdXBwb3J0LnB5CmluZGV4IDVkMDdiZTEuLjVmNDEzMjggMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2liY2FyYm9uL0lCQ2FyYm9uc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9pYmNhcmJvbi9JQkNhcmJvbnN1cHBvcnQucHkKQEAgLTI1LDEyICsyNSwxMiBAQAogbW9kdWxlID0gTWFjTW9kdWxlKCdfSUJDYXJib24nLCAnSUJDYXJib24nLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZikKIAogY2xhc3MgQ0ZSZWxlYXNlck9iamVjdChQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBuYW1lKToKLQkJT3V0cHV0KCJDRlJlbGVhc2UoJXMpOyIgJSBuYW1lKQorICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgbmFtZSk6CisgICAgICAgIE91dHB1dCgiQ0ZSZWxlYXNlKCVzKTsiICUgbmFtZSkKIAogY2xhc3MgQ0ZOaWJEZXNjKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIG5hbWUpOgotCQlPdXRwdXQoIkRpc3Bvc2VOaWJSZWZlcmVuY2UoJXMpOyIgJSBuYW1lKQorICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgbmFtZSk6CisgICAgICAgIE91dHB1dCgiRGlzcG9zZU5pYlJlZmVyZW5jZSglcyk7IiAlIG5hbWUpCiAKICNjZnN0cmluZ29iamVjdCA9IENGUmVsZWFzZXJPYmplY3QoIkNGU3RyaW5nUmVmIikKICNtb2R1bGUuYWRkb2JqZWN0KGNmc3RyaW5nb2JqZWN0KQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaWNuL2ljbnNjYW4ucHkgYi9NYWMvTW9kdWxlcy9pY24vaWNuc2Nhbi5weQppbmRleCBjNmEzOWYzLi5iZGMzYjg0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9pY24vaWNuc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9pY24vaWNuc2Nhbi5weQpAQCAtMTEsNjIgKzExLDYyIEBACiBPQkpFQ1QgPSAiTk9UVVNFRCIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IExPTkcgKyAiLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBMT05HICsgIi5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCSMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQotCQkJaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgIyBUaGlzIGlzIG5vbi1mdW5jdGlvbmFsIHRvZGF5CisgICAgICAgICAgICBpZiB0ID09IE9CSkVDVCBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkdldEljb25DYWNoZURhdGEiLAotCQkJIlNldEljb25DYWNoZURhdGEiLAotCQkJIyBDb25zdGFudHMgd2l0aCBmdW5ueSBkZWZpbml0aW9ucwotCQkJImtTZWxlY3RvckFsbEh1Z2VEYXRhIiwKLQkJCSJrU2VsZWN0b3JBbGxBdmFpbGFibGVEYXRhIiwKLQkJCSJzdkFsbEF2YWlsYWJsZURhdGEiLAotCQkJIyBTb21ldGhpbmcgaW4gYSBjb21tZW50IGFjY2lkZW50YWxseSBzZWVuIGFzIGEgY29uc3QgZGVmaW5pdGlvbgotCQkJImVyciIsCi0JCQkjIE9TOCBvbmx5Ci0JCQknSWNvblNlcnZpY2VzVGVybWluYXRlJywKLQkJCSMgTGF6eSwgcmlnaHQgbm93LgotCQkJIkdldEljb25SZWZGcm9tRmlsZUluZm8iCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiR2V0SWNvbkNhY2hlRGF0YSIsCisgICAgICAgICAgICAgICAgIlNldEljb25DYWNoZURhdGEiLAorICAgICAgICAgICAgICAgICMgQ29uc3RhbnRzIHdpdGggZnVubnkgZGVmaW5pdGlvbnMKKyAgICAgICAgICAgICAgICAia1NlbGVjdG9yQWxsSHVnZURhdGEiLAorICAgICAgICAgICAgICAgICJrU2VsZWN0b3JBbGxBdmFpbGFibGVEYXRhIiwKKyAgICAgICAgICAgICAgICAic3ZBbGxBdmFpbGFibGVEYXRhIiwKKyAgICAgICAgICAgICAgICAjIFNvbWV0aGluZyBpbiBhIGNvbW1lbnQgYWNjaWRlbnRhbGx5IHNlZW4gYXMgYSBjb25zdCBkZWZpbml0aW9uCisgICAgICAgICAgICAgICAgImVyciIsCisgICAgICAgICAgICAgICAgIyBPUzggb25seQorICAgICAgICAgICAgICAgICdJY29uU2VydmljZXNUZXJtaW5hdGUnLAorICAgICAgICAgICAgICAgICMgTGF6eSwgcmlnaHQgbm93LgorICAgICAgICAgICAgICAgICJHZXRJY29uUmVmRnJvbUZpbGVJbmZvIgorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiSWNvbkFjdGlvblVQUCIsCi0JCQkiSWNvbkdldHRlclVQUCIsCi0JCQkiQ0ZyYWdJbml0QmxvY2tQdHIiLAotCQkJIkNHUmVjdF9wdHIiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkljb25BY3Rpb25VUFAiLAorICAgICAgICAgICAgICAgICJJY29uR2V0dGVyVVBQIiwKKyAgICAgICAgICAgICAgICAiQ0ZyYWdJbml0QmxvY2tQdHIiLAorICAgICAgICAgICAgICAgICJDR1JlY3RfcHRyIiwKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCV0KKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uRmlsZXMgaW1wb3J0ICpcbiIpCi0JCQkKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uRmlsZXMgaW1wb3J0ICpcbiIpCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9pY24vaWNuc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL2ljbi9pY25zdXBwb3J0LnB5CmluZGV4IGVmMWRiZjMuLjFiMTUzODUgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2ljbi9pY25zdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2ljbi9pY25zdXBwb3J0LnB5CkBAIC02LDE3ICs2LDE3IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1BQ0hFQURFUkZJTEUgPSAnSWNvbnMuaCcJCSMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCi1NT0ROQU1FID0gJ19JY24nCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICdJY29uJwkJCSMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCi1LSU5EID0gJ0hhbmRsZScJCQkJIyBVc3VhbGx5ICdQdHInIG9yICdIYW5kbGUnCitNQUNIRUFERVJGSUxFID0gJ0ljb25zLmgnICAgICAgICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnX0ljbicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdJY29uJyAgICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitLSU5EID0gJ0hhbmRsZScgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc3VhbGx5ICdQdHInIG9yICdIYW5kbGUnCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdJY24nCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwotT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyBLSU5ECQkjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQotT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicJIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcworTU9EUFJFRklYID0gJ0ljbicgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK09CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgS0lORCAgICAgICAgICAjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQorT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicgICAgICAgICMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTUyLDE3ICs1MiwxNyBAQAogIiIiCiAKIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCU91dExicmFjZSgiaWYgKERsZ09ial9DaGVjayh2KSkiKQotCQlPdXRwdXQoIipwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsiKQotCQlPdXRwdXQoInJldHVybiAxOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dCgiIiIKLQkJaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCQlpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKFdpbmRvd1B0cilQeUludF9Bc0xvbmcodik7IHJldHVybiAxOyB9Ci0JCSIiIikKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisgICAgZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKKyAgICAgICAgT3V0TGJyYWNlKCJpZiAoRGxnT2JqX0NoZWNrKHYpKSIpCisgICAgICAgIE91dHB1dCgiKnBfaXRzZWxmID0gKChXaW5kb3dPYmplY3QgKil2KS0+b2JfaXRzZWxmOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0KCIiIgorICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgICAgIGlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoV2luZG93UHRyKVB5SW50X0FzTG9uZyh2KTsgcmV0dXJuIDE7IH0KKyAgICAgICAgIiIiKQogCiAjIEZyb20gaGVyZSBvbiBpdCdzIGJhc2ljYWxseSBhbGwgYm9pbGVyIHBsYXRlLi4uCiAKQEAgLTg4LDQgKzg4LDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2xhdW5jaC9sYXVuY2hzY2FuLnB5IGIvTWFjL01vZHVsZXMvbGF1bmNoL2xhdW5jaHNjYW4ucHkKaW5kZXggYmRkYTFkZS4uNjIxMDMzYiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbGF1bmNoL2xhdW5jaHNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvbGF1bmNoL2xhdW5jaHNjYW4ucHkKQEAgLTExLDc2ICsxMSw3NiBAQAogT0JKRUNUID0gIk5PVFVTRUQiCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSBMT05HICsgIi5oIgotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9IExPTkcgKyAiLmgiCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCSMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQotCQkJaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgIyBUaGlzIGlzIG5vbi1mdW5jdGlvbmFsIHRvZGF5CisgICAgICAgICAgICBpZiB0ID09IE9CSkVDVCBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uRmlsZXMgaW1wb3J0ICpcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtMU1JlcXVlc3RBbGxJbmZvID0gLTFcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtMU1JvbGVzQWxsID0gLTFcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtMU1Vua25vd25UeXBlID0gRk9VUl9DSEFSX0NPREUoJ1xcMFxcMFxcMFxcMCcpXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrTFNVbmtub3duQ3JlYXRvciA9IEZPVVJfQ0hBUl9DT0RFKCdcXDBcXDBcXDBcXDAnKVxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgia0xTSW52YWxpZEV4dGVuc2lvbkluZGV4ID0gLTFcbiIpCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLkZpbGVzIGltcG9ydCAqXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJrTFNSZXF1ZXN0QWxsSW5mbyA9IC0xXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJrTFNSb2xlc0FsbCA9IC0xXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJrTFNVbmtub3duVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdcXDBcXDBcXDBcXDAnKVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgia0xTVW5rbm93bkNyZWF0b3IgPSBGT1VSX0NIQVJfQ09ERSgnXFwwXFwwXFwwXFwwJylcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImtMU0ludmFsaWRFeHRlbnNpb25JbmRleCA9IC0xXG4iKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJMU0luaXQiLAotCQkJIkxTVGVybSIsCi0JCQkia0xTUmVxdWVzdEFsbEluZm8iLAotCQkJImtMU1JvbGVzQWxsIiwKLQkJCSJrTFNJbnZhbGlkRXh0ZW5zaW9uSW5kZXgiLAotCQkJImtMU1Vua25vd25UeXBlIiwKLQkJCSJrTFNVbmtub3duQ3JlYXRvciIKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJMU0luaXQiLAorICAgICAgICAgICAgICAgICJMU1Rlcm0iLAorICAgICAgICAgICAgICAgICJrTFNSZXF1ZXN0QWxsSW5mbyIsCisgICAgICAgICAgICAgICAgImtMU1JvbGVzQWxsIiwKKyAgICAgICAgICAgICAgICAia0xTSW52YWxpZEV4dGVuc2lvbkluZGV4IiwKKyAgICAgICAgICAgICAgICAia0xTVW5rbm93blR5cGUiLAorICAgICAgICAgICAgICAgICJrTFNVbmtub3duQ3JlYXRvciIKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkxTTGF1bmNoRlNSZWZTcGVjX3B0ciIsCi0JCQkiTFNMYXVuY2hVUkxTcGVjX3B0ciIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiTFNMYXVuY2hGU1JlZlNwZWNfcHRyIiwKKyAgICAgICAgICAgICAgICAiTFNMYXVuY2hVUkxTcGVjX3B0ciIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkjIExTR2V0QXBwbGljYXRpb25Gb3JJbmZvCi0JCQkoWygnQ0ZTdHJpbmdSZWYnLCAnaW5FeHRlbnNpb24nLCAnSW5Nb2RlJyldLAotICAgIAkJIFsoJ09wdENGU3RyaW5nUmVmJywgJ2luRXh0ZW5zaW9uJywgJ0luTW9kZScpXSksCi0gICAgCQkgCi0JCQkjIExTRmluZEFwcGxpY2F0aW9uRm9ySW5mbwotCQkJKFsoJ0NGU3RyaW5nUmVmJywgJ2luQnVuZGxlSUQnLCAnSW5Nb2RlJyldLAotICAgIAkJIFsoJ09wdENGU3RyaW5nUmVmJywgJ2luQnVuZGxlSUQnLCAnSW5Nb2RlJyldKSwKLQkJCShbKCdDRlN0cmluZ1JlZicsICdpbk5hbWUnLCAnSW5Nb2RlJyldLAotICAgIAkJIFsoJ09wdENGU3RyaW5nUmVmJywgJ2luTmFtZScsICdJbk1vZGUnKV0pLAorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICMgTFNHZXRBcHBsaWNhdGlvbkZvckluZm8KKyAgICAgICAgICAgICAgICAoWygnQ0ZTdHJpbmdSZWYnLCAnaW5FeHRlbnNpb24nLCAnSW5Nb2RlJyldLAorICAgICAgICAgWygnT3B0Q0ZTdHJpbmdSZWYnLCAnaW5FeHRlbnNpb24nLCAnSW5Nb2RlJyldKSwKIAotCQkJIyBVbmljb2RlIGZpbGVuYW1lcyBwYXNzZWQgYXMgbGVuZ3RoLCBidWZmZXIuIExTR2V0RXh0ZW5zaW9uSW5mbwotCQkJKFsoJ1VuaUNoYXJDb3VudCcsICcqJywgJ0luTW9kZScpLAotCQkJICAoJ1VuaUNoYXJfcHRyJywgJyonLCAnSW5Nb2RlJyldLAotCQkJIFsoJ1VuaWNvZGVSZXZlcnNlSW5CdWZmZXInLCAnKicsICdJbk1vZGUnKV0KLQkJCSksCi0JCQldCi0JCQkKKyAgICAgICAgICAgICAgICAjIExTRmluZEFwcGxpY2F0aW9uRm9ySW5mbworICAgICAgICAgICAgICAgIChbKCdDRlN0cmluZ1JlZicsICdpbkJ1bmRsZUlEJywgJ0luTW9kZScpXSwKKyAgICAgICAgIFsoJ09wdENGU3RyaW5nUmVmJywgJ2luQnVuZGxlSUQnLCAnSW5Nb2RlJyldKSwKKyAgICAgICAgICAgICAgICAoWygnQ0ZTdHJpbmdSZWYnLCAnaW5OYW1lJywgJ0luTW9kZScpXSwKKyAgICAgICAgIFsoJ09wdENGU3RyaW5nUmVmJywgJ2luTmFtZScsICdJbk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIyBVbmljb2RlIGZpbGVuYW1lcyBwYXNzZWQgYXMgbGVuZ3RoLCBidWZmZXIuIExTR2V0RXh0ZW5zaW9uSW5mbworICAgICAgICAgICAgICAgIChbKCdVbmlDaGFyQ291bnQnLCAnKicsICdJbk1vZGUnKSwKKyAgICAgICAgICAgICAgICAgICgnVW5pQ2hhcl9wdHInLCAnKicsICdJbk1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ1VuaWNvZGVSZXZlcnNlSW5CdWZmZXInLCAnKicsICdJbk1vZGUnKV0KKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIF0KKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2xhdW5jaC9sYXVuY2hzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvbGF1bmNoL2xhdW5jaHN1cHBvcnQucHkKaW5kZXggMTIyMjc4Yy4uMzRjMmVmYiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbGF1bmNoL2xhdW5jaHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvbGF1bmNoL2xhdW5jaHN1cHBvcnQucHkKQEAgLTYsMTYgKzYsMTYgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTU9ETkFNRSA9ICdfTGF1bmNoJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnVU5VU0VEJwkJCSMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCi1LSU5EID0gJ1JlY29yZCcJCQkJIyBVc3VhbGx5ICdQdHInIG9yICdIYW5kbGUnCitNT0ROQU1FID0gJ19MYXVuY2gnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK09CSkVDVE5BTUUgPSAnVU5VU0VEJyAgICAgICAgICAgICAgICAgICAjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQorS0lORCA9ICdSZWNvcmQnICAgICAgICAgICAgICAgICAgICAgICAgICMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJwogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnTGF1bmNoJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgS0lORAkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdMYXVuY2gnICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArIEtJTkQgICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC00MSwyMSArNDEsMjEgQEAKIHN0YXRpYyBpbnQKIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGU3RyaW5nUmVmICpzcGVjKQogewotCWlmICh2ID09IFB5X05vbmUpIHsKLQkJKnNwZWMgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQodiwgc3BlYyk7CisgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICAqc3BlYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQodiwgc3BlYyk7CiB9CiAKIFB5T2JqZWN0ICoKIE9wdENGU3RyaW5nUmVmT2JqX05ldyhDRlN0cmluZ1JlZiBpdCkKIHsKLQlpZiAoaXQgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gQ0ZTdHJpbmdSZWZPYmpfTmV3KGl0KTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldyhpdCk7CiB9CiAKIC8qCkBAIC02NCwxMyArNjQsMTMgQEAKIFB5T2JqZWN0ICoKIExTSXRlbUluZm9SZWNvcmRfTmV3KExTSXRlbUluZm9SZWNvcmQgKml0KQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJ7czppczpPJnM6TyZzOk8mczpPJnM6aX0iLCAKLQkJImZsYWdzIiwgaXQtPmZsYWdzLAotCQkiZmlsZXR5cGUiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmZpbGV0eXBlLAotCQkiY3JlYXRvciIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+Y3JlYXRvciwKLQkJImV4dGVuc2lvbiIsIE9wdENGU3RyaW5nUmVmT2JqX05ldywgaXQtPmV4dGVuc2lvbiwKLQkJImljb25GaWxlTmFtZSIsIE9wdENGU3RyaW5nUmVmT2JqX05ldywgaXQtPmljb25GaWxlTmFtZSwKLQkJImtpbmRJRCIsIGl0LT5raW5kSUQpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgie3M6aXM6TyZzOk8mczpPJnM6TyZzOml9IiwKKyAgICAgICAgICAgICAgICAiZmxhZ3MiLCBpdC0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgImZpbGV0eXBlIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5maWxldHlwZSwKKyAgICAgICAgICAgICAgICAiY3JlYXRvciIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+Y3JlYXRvciwKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+ZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICJpY29uRmlsZU5hbWUiLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5pY29uRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgImtpbmRJRCIsIGl0LT5raW5kSUQpOwogfQogIiIiCiAKQEAgLTk5LDQgKzk5LDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2xhdW5jaC9zZXR1cC5weSBiL01hYy9Nb2R1bGVzL2xhdW5jaC9zZXR1cC5weQppbmRleCBjY2Y4ZWU3Li4yMDU0MTk1IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9sYXVuY2gvc2V0dXAucHkKKysrIGIvTWFjL01vZHVsZXMvbGF1bmNoL3NldHVwLnB5CkBAIC00LDEwICs0LDEwIEBACiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBFeHRlbnNpb24sIHNldHVwCiAKIHNldHVwKG5hbWU9IkxhdW5jaFNlcnZpY2VzIiwgdmVyc2lvbj0iMC4yIiwKLQlleHRfbW9kdWxlcz1bCi0JCUV4dGVuc2lvbignX0xhdW5jaCcsIFsnX0xhdW5jaG1vZHVsZS5jJ10sCi0JCWV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQXBwbGljYXRpb25TZXJ2aWNlcyddKQotCV0sCi0JcHlfbW9kdWxlcz1bJ0xhdW5jaFNlcnZpY2VzLkxhdW5jaCcsICdMYXVuY2hTZXJ2aWNlcy5MYXVuY2hTZXJ2aWNlcyddLAotCXBhY2thZ2VfZGlyPXsnTGF1bmNoU2VydmljZXMnOicuLi8uLi8uLi9MaWIvcGxhdC1tYWMvQ2FyYm9uJ30KLQkpCisgICAgICAgIGV4dF9tb2R1bGVzPVsKKyAgICAgICAgICAgICAgICBFeHRlbnNpb24oJ19MYXVuY2gnLCBbJ19MYXVuY2htb2R1bGUuYyddLAorICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQXBwbGljYXRpb25TZXJ2aWNlcyddKQorICAgICAgICBdLAorICAgICAgICBweV9tb2R1bGVzPVsnTGF1bmNoU2VydmljZXMuTGF1bmNoJywgJ0xhdW5jaFNlcnZpY2VzLkxhdW5jaFNlcnZpY2VzJ10sCisgICAgICAgIHBhY2thZ2VfZGlyPXsnTGF1bmNoU2VydmljZXMnOicuLi8uLi8uLi9MaWIvcGxhdC1tYWMvQ2FyYm9uJ30KKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvbGlzdC9saXN0c2Nhbi5weSBiL01hYy9Nb2R1bGVzL2xpc3QvbGlzdHNjYW4ucHkKaW5kZXggNjZjYjJhZC4uODc3ZjZjYiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbGlzdC9saXN0c2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9saXN0L2xpc3RzY2FuLnB5CkBAIC0xMSw3OCArMTEsNzggQEAKIE9CSkVDVCA9ICJMaXN0SGFuZGxlIgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gTE9ORyArICIuaCIKLQlvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9IExPTkcgKyAiLmgiCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFstMV0KLQkJCSMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQotCQkJaWYgdCBpbiAoJ0xpc3RIYW5kbGUnLCAnTGlzdFJlZicpIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbLTFdCisgICAgICAgICAgICAjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKKyAgICAgICAgICAgIGlmIHQgaW4gKCdMaXN0SGFuZGxlJywgJ0xpc3RSZWYnKSBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkxEaXNwb3NlIiwJCSMgRG9uZSBieSByZW1vdmluZyB0aGUgb2JqZWN0Ci0JCQkiTFNlYXJjaCIsCQkjIFdlIGRvbid0IHdhbnQgdG8gaGFuZGxlIHByb2NzIGp1c3QgeWV0Ci0JCQkiQ3JlYXRlQ3VzdG9tTGlzdCIsICAjIGRvbmUgbWFudWFsbHkKLQkJCSJTZXRMaXN0RGVmaW5pdGlvblByb2MiLAotCQkJCi0JCQkjIFRoZXNlIGhhdmUgZnVubnkgYXJndW1lbnQvcmV0dXJuIHZhbHVlcwotCQkJIkdldExpc3RWaWV3Qm91bmRzIiwKLQkJCSJHZXRMaXN0Q2VsbEluZGVudCIsCi0JCQkiR2V0TGlzdENlbGxTaXplIiwKLQkJCSJHZXRMaXN0VmlzaWJsZUNlbGxzIiwKLQkJCSJHZXRMaXN0Q2xpY2tMb2NhdGlvbiIsCi0JCQkiR2V0TGlzdE1vdXNlTG9jYXRpb24iLAotCQkJIkdldExpc3REYXRhQm91bmRzIiwKLQkJCSJTZXRMaXN0TGFzdENsaWNrIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJMRGlzcG9zZSIsICAgICAgICAgICAgICMgRG9uZSBieSByZW1vdmluZyB0aGUgb2JqZWN0CisgICAgICAgICAgICAgICAgIkxTZWFyY2giLCAgICAgICAgICAgICAgIyBXZSBkb24ndCB3YW50IHRvIGhhbmRsZSBwcm9jcyBqdXN0IHlldAorICAgICAgICAgICAgICAgICJDcmVhdGVDdXN0b21MaXN0IiwgICMgZG9uZSBtYW51YWxseQorICAgICAgICAgICAgICAgICJTZXRMaXN0RGVmaW5pdGlvblByb2MiLAogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJMaXN0Q2xpY2tMb29wVVBQIiwgICMgVG9vIGRpZmZpY3VsdCBmb3Igbm93Ci0JCQkiTGlzdERlZlNwZWNQdHIiLCAjIGxhdGVyCi0JCQldCisgICAgICAgICAgICAgICAgIyBUaGVzZSBoYXZlIGZ1bm55IGFyZ3VtZW50L3JldHVybiB2YWx1ZXMKKyAgICAgICAgICAgICAgICAiR2V0TGlzdFZpZXdCb3VuZHMiLAorICAgICAgICAgICAgICAgICJHZXRMaXN0Q2VsbEluZGVudCIsCisgICAgICAgICAgICAgICAgIkdldExpc3RDZWxsU2l6ZSIsCisgICAgICAgICAgICAgICAgIkdldExpc3RWaXNpYmxlQ2VsbHMiLAorICAgICAgICAgICAgICAgICJHZXRMaXN0Q2xpY2tMb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgIkdldExpc3RNb3VzZUxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAiR2V0TGlzdERhdGFCb3VuZHMiLAorICAgICAgICAgICAgICAgICJTZXRMaXN0TGFzdENsaWNrIiwKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCdMaXN0Qm91bmRzX3B0cicsICcqJywgJ0luTW9kZScpXSwKLQkJCSBbKCdSZWN0X3B0cicsICcqJywgJ0luTW9kZScpXSksCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiTGlzdENsaWNrTG9vcFVQUCIsICAjIFRvbyBkaWZmaWN1bHQgZm9yIG5vdworICAgICAgICAgICAgICAgICJMaXN0RGVmU3BlY1B0ciIsICMgbGF0ZXIKKyAgICAgICAgICAgICAgICBdCiAKLQkJCShbKCJDZWxsIiwgInRoZUNlbGwiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJDZWxsIiwgInRoZUNlbGwiLCAiSW5PdXRNb2RlIildKSwKLQkJCSAKLQkJCShbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoInNob3J0IiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluQnVmZmVyU2hvcnRzaXplIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoInNob3J0IiwgIioiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJWYXJPdXRCdWZmZXJTaG9ydHNpemUiLCAiKiIsICJJbk91dE1vZGUiKV0pLAotCQkJCi0JCQkjIFNldExpc3RDZWxsSW5kZW50IGRvZXNuJ3QgaGF2ZSBjb25zdAotCQkJKFsoIlBvaW50IiwgImluZGVudCIsICJPdXRNb2RlIildLAotCQkJIFsoIlBvaW50X3B0ciIsICJpbmRlbnQiLCAiSW5Nb2RlIildKSwKLQkJCQotCQkJXQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCdMaXN0Qm91bmRzX3B0cicsICcqJywgJ0luTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgWygnUmVjdF9wdHInLCAnKicsICdJbk1vZGUnKV0pLAogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgICAgICAgICAgKFsoIkNlbGwiLCAidGhlQ2VsbCIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJDZWxsIiwgInRoZUNlbGwiLCAiSW5PdXRNb2RlIildKSwKIAotCQkJCisgICAgICAgICAgICAgICAgKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgic2hvcnQiLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkluQnVmZmVyU2hvcnRzaXplIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJzaG9ydCIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlZhck91dEJ1ZmZlclNob3J0c2l6ZSIsICIqIiwgIkluT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAjIFNldExpc3RDZWxsSW5kZW50IGRvZXNuJ3QgaGF2ZSBjb25zdAorICAgICAgICAgICAgICAgIChbKCJQb2ludCIsICJpbmRlbnQiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiUG9pbnRfcHRyIiwgImluZGVudCIsICJJbk1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2xpc3QvbGlzdHN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9saXN0L2xpc3RzdXBwb3J0LnB5CmluZGV4IGU0NDMxN2EuLjkzYmFlZGUgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2xpc3QvbGlzdHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvbGlzdC9saXN0c3VwcG9ydC5weQpAQCAtNiwxNyArNiwxNyBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ0xpc3RzLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfTGlzdCcJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCi1PQkpFQ1ROQU1FID0gJ0xpc3QnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKLUtJTkQgPSAnSGFuZGxlJwkJCQkjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKK01BQ0hFQURFUkZJTEUgPSAnTGlzdHMuaCcgICAgICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfTGlzdCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ0xpc3QnICAgICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK0tJTkQgPSAnSGFuZGxlJyAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0xpc3QnCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwotT0JKRUNUVFlQRSA9ICJMaXN0SGFuZGxlIgkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdMaXN0JyAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gIkxpc3RIYW5kbGUiICAgICAgICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC0yOSw4ICsyOSw4IEBACiAKIExpc3REZWZTcGVjID0gTGlzdERlZlNwZWNfcHRyID0gT3BhcXVlVHlwZSgiTGlzdERlZlNwZWMiLCAiUHlNYWNfQnVpbGRMaXN0RGVmU3BlYyIsICJQeU1hY19HZXRMaXN0RGVmU3BlYyIpCiAKLVZhck91dEJ1ZmZlclNob3J0c2l6ZSA9IFZhckhlYXBPdXRwdXRCdWZmZXJUeXBlKCdjaGFyJywgJ3Nob3J0JywgJ3MnKQkjIChidWYsICZsZW4pCi1JbkJ1ZmZlclNob3J0c2l6ZSA9IFZhcklucHV0QnVmZmVyVHlwZSgnY2hhcicsICdzaG9ydCcsICdzJykJCSMgKGJ1ZiwgbGVuKQorVmFyT3V0QnVmZmVyU2hvcnRzaXplID0gVmFySGVhcE91dHB1dEJ1ZmZlclR5cGUoJ2NoYXInLCAnc2hvcnQnLCAncycpICAgIyAoYnVmLCAmbGVuKQorSW5CdWZmZXJTaG9ydHNpemUgPSBWYXJJbnB1dEJ1ZmZlclR5cGUoJ2NoYXInLCAnc2hvcnQnLCAncycpICAgICAgICAgICAgIyAoYnVmLCBsZW4pCiAKIFJnbkhhbmRsZSA9IE9wYXF1ZUJ5VmFsdWVUeXBlKCJSZ25IYW5kbGUiLCAiUmVzT2JqIikKIERhdGFIYW5kbGUgPSBPcGFxdWVCeVZhbHVlVHlwZSgiRGF0YUhhbmRsZSIsICJSZXNPYmoiKQpAQCAtNjQsNTkgKzY0LDU5IEBACiAiIiIKIAogY2xhc3MgTGlzdE1ldGhvZEdlbmVyYXRvcihNZXRob2RHZW5lcmF0b3IpOgotCSIiIlNpbWlsYXIgdG8gTWV0aG9kR2VuZXJhdG9yLCBidXQgaGFzIHNlbGYgYXMgbGFzdCBhcmd1bWVudCIiIgorICAgICIiIlNpbWlsYXIgdG8gTWV0aG9kR2VuZXJhdG9yLCBidXQgaGFzIHNlbGYgYXMgbGFzdCBhcmd1bWVudCIiIgogCi0JZGVmIHBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpOgotCQlhcmdzLCBhMCA9IGFyZ3NbOi0xXSwgYXJnc1stMV0KLQkJdDAsIG4wLCBtMCA9IGEwCi0JCWlmIG0wICE9IEluTW9kZToKLQkJCXJhaXNlIFZhbHVlRXJyb3IsICJtZXRob2QncyAnc2VsZicgbXVzdCBiZSAnSW5Nb2RlJyIKLQkJc2VsZi5pdHNlbGYgPSBWYXJpYWJsZSh0MCwgIl9zZWxmLT5vYl9pdHNlbGYiLCBTZWxmTW9kZSkKLQkJRnVuY3Rpb25HZW5lcmF0b3IucGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncykKLQkJc2VsZi5hcmd1bWVudExpc3QuYXBwZW5kKHNlbGYuaXRzZWxmKQorICAgIGRlZiBwYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKToKKyAgICAgICAgYXJncywgYTAgPSBhcmdzWzotMV0sIGFyZ3NbLTFdCisgICAgICAgIHQwLCBuMCwgbTAgPSBhMAorICAgICAgICBpZiBtMCAhPSBJbk1vZGU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibWV0aG9kJ3MgJ3NlbGYnIG11c3QgYmUgJ0luTW9kZSciCisgICAgICAgIHNlbGYuaXRzZWxmID0gVmFyaWFibGUodDAsICJfc2VsZi0+b2JfaXRzZWxmIiwgU2VsZk1vZGUpCisgICAgICAgIEZ1bmN0aW9uR2VuZXJhdG9yLnBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpCisgICAgICAgIHNlbGYuYXJndW1lbnRMaXN0LmFwcGVuZChzZWxmLml0c2VsZikKIAogY2xhc3MgTXlPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQkjIFhYWFggU2hvdWxkIGluaGVyaXQgZnJvbSBSZXNvdXJjZQotCWdldHNldGxpc3QgPSBbKAotCQknbGlzdEZsYWdzJywKLQkJJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpR2V0TGlzdEZsYWdzKHNlbGYtPm9iX2l0c2VsZikgJiAweGZmKTsnLAotCQknaWYgKCFQeUFyZ19QYXJzZSh2LCAiQiIsICYoKnNlbGYtPm9iX2l0c2VsZiktPmxpc3RGbGFncykpIHJldHVybiAtMTsnLAotCQlOb25lLAotCQkpLCAoCi0JCSdzZWxGbGFncycsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RTZWxlY3Rpb25GbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7JywKLQkJJ2lmICghUHlBcmdfUGFyc2UodiwgIkIiLCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxGbGFncykpIHJldHVybiAtMTsnLAotCQlOb25lLAotCQkpLCAoCi0JCSdjZWxsU2l6ZScsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKTsnLAotCQknaWYgKCFQeUFyZ19QYXJzZSh2LCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+Y2VsbFNpemUpKSByZXR1cm4gLTE7JywKLQkJTm9uZQotCQkpXQorICAgICMgWFhYWCBTaG91bGQgaW5oZXJpdCBmcm9tIFJlc291cmNlCisgICAgZ2V0c2V0bGlzdCA9IFsoCisgICAgICAgICAgICAnbGlzdEZsYWdzJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RGbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7JywKKyAgICAgICAgICAgICdpZiAoIVB5QXJnX1BhcnNlKHYsICJCIiwgJigqc2VsZi0+b2JfaXRzZWxmKS0+bGlzdEZsYWdzKSkgcmV0dXJuIC0xOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ3NlbEZsYWdzJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RTZWxlY3Rpb25GbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7JywKKyAgICAgICAgICAgICdpZiAoIVB5QXJnX1BhcnNlKHYsICJCIiwgJigqc2VsZi0+b2JfaXRzZWxmKS0+c2VsRmxhZ3MpKSByZXR1cm4gLTE7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnY2VsbFNpemUnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsICgqc2VsZi0+b2JfaXRzZWxmKS0+Y2VsbFNpemUpOycsCisgICAgICAgICAgICAnaWYgKCFQeUFyZ19QYXJzZSh2LCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+Y2VsbFNpemUpKSByZXR1cm4gLTE7JywKKyAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICldCiAKLQlkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiUHlPYmplY3QgKm9iX2xkZWZfZnVuYzsiKQotCQlPdXRwdXQoImludCBvYl9tdXN0X2JlX2Rpc3Bvc2VkOyIpCisgICAgZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpvYl9sZGVmX2Z1bmM7IikKKyAgICAgICAgT3V0cHV0KCJpbnQgb2JfbXVzdF9iZV9kaXNwb3NlZDsiKQogCi0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhMaXN0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIG51bGwgTGlzdCIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9IiIiKQotCQkJCQotCWRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoIml0LT5vYl9sZGVmX2Z1bmMgPSBOVUxMOyIpCi0JCU91dHB1dCgiaXQtPm9iX211c3RfYmVfZGlzcG9zZWQgPSAxOyIpCi0JCU91dHB1dCgiU2V0TGlzdFJlZkNvbihpdHNlbGYsIChsb25nKWl0KTsiKQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTGlzdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIExpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IiIiKQogCi0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKLQkJT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPm9iX2xkZWZfZnVuYyk7IikKLQkJT3V0cHV0KCJzZWxmLT5vYl9sZGVmX2Z1bmMgPSBOVUxMOyIpCi0JCU91dHB1dCgiU2V0TGlzdFJlZkNvbihzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyIpCi0JCU91dHB1dCgiaWYgKHNlbGYtPm9iX211c3RfYmVfZGlzcG9zZWQgJiYgJXMpIExEaXNwb3NlKCVzKTsiLCBpdHNlbGZuYW1lLCBpdHNlbGZuYW1lKQotCQkKKyAgICBkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfbGRlZl9mdW5jID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIml0LT5vYl9tdXN0X2JlX2Rpc3Bvc2VkID0gMTsiKQorICAgICAgICBPdXRwdXQoIlNldExpc3RSZWZDb24oaXRzZWxmLCAobG9uZylpdCk7IikKKworICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisgICAgICAgIE91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5vYl9sZGVmX2Z1bmMpOyIpCisgICAgICAgIE91dHB1dCgic2VsZi0+b2JfbGRlZl9mdW5jID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIlNldExpc3RSZWZDb24oc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsiKQorICAgICAgICBPdXRwdXQoImlmIChzZWxmLT5vYl9tdXN0X2JlX2Rpc3Bvc2VkICYmICVzKSBMRGlzcG9zZSglcyk7IiwgaXRzZWxmbmFtZSwgaXRzZWxmbmFtZSkKKwogIyBGcm9tIGhlcmUgb24gaXQncyBiYXNpY2FsbHkgYWxsIGJvaWxlciBwbGF0ZS4uLgogCiBmaW5hbHN0dWZmID0gZmluYWxzdHVmZiArICIiIgpAQCAtMTI2LDM0ICsxMjYsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbCB0aGVDZWxsLAogICAgICAgICAgICAgICAgICAgICAgICBTSW50MTYgZGF0YU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgU0ludDE2IGRhdGFMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIExpc3RIYW5kbGUgdGhlTGlzdCkgIAorICAgICAgICAgICAgICAgICAgICAgICBMaXN0SGFuZGxlIHRoZUxpc3QpCiB7Ci0JUHlPYmplY3QgKmxpc3REZWZGdW5jLCAqYXJncywgKnJ2PU5VTEw7Ci0JTGlzdE9iamVjdCAqc2VsZjsKLQkKLQlzZWxmID0gKExpc3RPYmplY3QqKUdldExpc3RSZWZDb24odGhlTGlzdCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5vYl9pdHNlbGYgIT0gdGhlTGlzdCkKLQkJcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KLQlsaXN0RGVmRnVuYyA9IHNlbGYtPm9iX2xkZWZfZnVuYzsKLQlpZiAobGlzdERlZkZ1bmMgPT0gTlVMTCkKLQkJcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KLQlhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaGJPJk8maGhPIiwgbWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgY2VsbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOwotCWlmIChhcmdzICE9IE5VTEwpIHsKLQkJcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChsaXN0RGVmRnVuYywgYXJncyk7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQl9Ci0JaWYgKHJ2ID09IE5VTEwpIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImVycm9yIGluIGxpc3QgZGVmaW5pdGlvbiBjYWxsYmFjazpcXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQl9IGVsc2UgewotCQlQeV9ERUNSRUYocnYpOwotCX0KKyAgICAgICAgUHlPYmplY3QgKmxpc3REZWZGdW5jLCAqYXJncywgKnJ2PU5VTEw7CisgICAgICAgIExpc3RPYmplY3QgKnNlbGY7CisKKyAgICAgICAgc2VsZiA9IChMaXN0T2JqZWN0KilHZXRMaXN0UmVmQ29uKHRoZUxpc3QpOworICAgICAgICBpZiAoc2VsZiA9PSBOVUxMIHx8IHNlbGYtPm9iX2l0c2VsZiAhPSB0aGVMaXN0KQorICAgICAgICAgICAgICAgIHJldHVybjsgIC8qIG5vdGhpbmcgd2UgY2FuIGRvICovCisgICAgICAgIGxpc3REZWZGdW5jID0gc2VsZi0+b2JfbGRlZl9mdW5jOworICAgICAgICBpZiAobGlzdERlZkZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm47ICAvKiBub3RoaW5nIHdlIGNhbiBkbyAqLworICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaGJPJk8maGhPIiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCBjZWxsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOworICAgICAgICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChsaXN0RGVmRnVuYywgYXJncyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChydiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImVycm9yIGluIGxpc3QgZGVmaW5pdGlvbiBjYWxsYmFjazpcXG4iKTsKKyAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIH0KIH0KICIiIgogCkBAIC0xNzcsNyArMTc3LDcgQEAKIEhhbmRsZSBoOwogTGlzdE9iamVjdCAqbDsKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBsID0gKExpc3RPYmplY3QgKilMaXN0T2JqX05ldyhhc19MaXN0KGgpKTsKIGwtPm9iX211c3RfYmVfZGlzcG9zZWQgPSAwOwogX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLCBsKTsKQEAgLTIxNSwxMCArMjE1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgJmhhc0dyb3csCiAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbEhvcml6LAogICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxWZXJ0KSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKIAotLyogQ2FyYm9uIGFwcGxpY2F0aW9ucyB1c2UgdGhlIENyZWF0ZUN1c3RvbUxpc3QgQVBJICovIAorLyogQ2FyYm9uIGFwcGxpY2F0aW9ucyB1c2UgdGhlIENyZWF0ZUN1c3RvbUxpc3QgQVBJICovCiB0aGVTcGVjLnUudXNlclByb2MgPSBteUxpc3REZWZGdW5jdGlvblVQUDsKIENyZWF0ZUN1c3RvbUxpc3QoJnJWaWV3LAogICAgICAgICAgICAgICAgICAmZGF0YUJvdW5kcywKQEAgLTIzNCw3ICsyMzQsNyBAQAogCiBfcmVzID0gTGlzdE9ial9OZXcob3V0TGlzdCk7CiBpZiAoX3JlcyA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIFB5X0lOQ1JFRihsaXN0RGVmRnVuYyk7CiAoKExpc3RPYmplY3QqKV9yZXMpLT5vYl9sZGVmX2Z1bmMgPSBsaXN0RGVmRnVuYzsKIHJldHVybiBfcmVzO1wKQEAgLTI1Myw0ICsyNTMsMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvbWVudS9tZW51ZWRpdC5weSBiL01hYy9Nb2R1bGVzL21lbnUvbWVudWVkaXQucHkKaW5kZXggZjYxM2Q4Yi4uYjc0MzAxZCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbWVudS9tZW51ZWRpdC5weQorKysgYi9NYWMvTW9kdWxlcy9tZW51L21lbnVlZGl0LnB5CkBAIC0xMjEsNCArMTIxLDMgQEAKICAgICAoT1NUeXBlLCAnaW5Qcm9wZXJ0eVRhZycsIEluTW9kZSksCiApCiBmdW5jdGlvbnMuYXBwZW5kKGYpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL21lbnUvbWVudXNjYW4ucHkgYi9NYWMvTW9kdWxlcy9tZW51L21lbnVzY2FuLnB5CmluZGV4IDI4MWNjODYuLmFlOTQ2NWUgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21lbnUvbWVudXNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvbWVudS9tZW51c2Nhbi5weQpAQCAtNyw5MSArNyw5MSBAQAogZnJvbSBzY2FudG9vbHMgaW1wb3J0IFNjYW5uZXIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9ICJNZW51cy5oIgotCW91dHB1dCA9ICJtZW51Z2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIk1lbnVzLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGRvaW5nICdpbXBvcnQgbWVudXN1cHBvcnQnID09PSIKLQlpbXBvcnQgbWVudXN1cHBvcnQKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIE1lbnVtb2R1bGUuYyA9PT0iCisgICAgaW5wdXQgPSAiTWVudXMuaCIKKyAgICBvdXRwdXQgPSAibWVudWdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJNZW51cy5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBkb2luZyAnaW1wb3J0IG1lbnVzdXBwb3J0JyA9PT0iCisgICAgaW1wb3J0IG1lbnVzdXBwb3J0CisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBNZW51bW9kdWxlLmMgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgaW4gKCJNZW51SGFuZGxlIiwgIk1lbnVSZWYiKSBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gIm1ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0IGluICgiTWVudUhhbmRsZSIsICJNZW51UmVmIikgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLSMjCQkJIklzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2siLCAjIENhbid0IGZpbmQgaXQgaW4gdGhlIGxpYnJhcnkKLSMjCQkJIkluaXRDb250ZXh0dWFsTWVudXMiLCAjIGRpdHRvCi0JCQkiR2V0TWVudUl0ZW1Qcm9wZXJ0eSIsCSMgZGlmZmljdWx0IGZvciB0aGUgbW9tZW50Ci0JCQkiR2V0TWVudUl0ZW1Qcm9wZXJ0eVNpemUiLAotCQkJIlNldE1lbnVJdGVtUHJvcGVydHkiLAotCQkJIlJlbW92ZU1lbnVJdGVtUHJvcGVydHkiLAotCQkJIlNldE1lbnVDb21tYW5kUHJvcGVydHkiLAotCQkJIkdldE1lbnVDb21tYW5kUHJvcGVydHkiLAotCQkJIkdldE1lbnVUaXRsZSIsICMgRnVubnkgYXJnL3JldHVybnZhbHVlCi0JCQkiU2V0TWVudVRpdGxlIiwKLQkJCSJTZXRNZW51VGl0bGVJY29uIiwgIyB2b2lkKgotCQkJIyBPUzggY2FsbHM6Ci0JCQknR2V0TWVudUl0ZW1SZWZDb24yJywKLQkJCSdTZXRNZW51SXRlbVJlZkNvbjInLAotCQkJJ0VuYWJsZUl0ZW0nLAotCQkJJ0Rpc2FibGVJdGVtJywKLQkJCSdDaGVja0l0ZW0nLAotCQkJJ0NvdW50TUl0ZW1zJywKLQkJCSdPcGVuRGVza0FjYycsCi0JCQknU3lzdGVtRWRpdCcsCi0JCQknU3lzdGVtTWVudScsCi0JCQknU2V0TWVudUZsYXNoJywKLQkJCSdJbml0TWVudXMnLAotCQkJJ0luaXRQcm9jTWVudScsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyMjICAgICAgICAgICAgICAgICAgICAgICJJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrIiwgIyBDYW4ndCBmaW5kIGl0IGluIHRoZSBsaWJyYXJ5CisjIyAgICAgICAgICAgICAgICAgICAgICAiSW5pdENvbnRleHR1YWxNZW51cyIsICMgZGl0dG8KKyAgICAgICAgICAgICAgICAiR2V0TWVudUl0ZW1Qcm9wZXJ0eSIsICAjIGRpZmZpY3VsdCBmb3IgdGhlIG1vbWVudAorICAgICAgICAgICAgICAgICJHZXRNZW51SXRlbVByb3BlcnR5U2l6ZSIsCisgICAgICAgICAgICAgICAgIlNldE1lbnVJdGVtUHJvcGVydHkiLAorICAgICAgICAgICAgICAgICJSZW1vdmVNZW51SXRlbVByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAiU2V0TWVudUNvbW1hbmRQcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgIkdldE1lbnVDb21tYW5kUHJvcGVydHkiLAorICAgICAgICAgICAgICAgICJHZXRNZW51VGl0bGUiLCAjIEZ1bm55IGFyZy9yZXR1cm52YWx1ZQorICAgICAgICAgICAgICAgICJTZXRNZW51VGl0bGUiLAorICAgICAgICAgICAgICAgICJTZXRNZW51VGl0bGVJY29uIiwgIyB2b2lkKgorICAgICAgICAgICAgICAgICMgT1M4IGNhbGxzOgorICAgICAgICAgICAgICAgICdHZXRNZW51SXRlbVJlZkNvbjInLAorICAgICAgICAgICAgICAgICdTZXRNZW51SXRlbVJlZkNvbjInLAorICAgICAgICAgICAgICAgICdFbmFibGVJdGVtJywKKyAgICAgICAgICAgICAgICAnRGlzYWJsZUl0ZW0nLAorICAgICAgICAgICAgICAgICdDaGVja0l0ZW0nLAorICAgICAgICAgICAgICAgICdDb3VudE1JdGVtcycsCisgICAgICAgICAgICAgICAgJ09wZW5EZXNrQWNjJywKKyAgICAgICAgICAgICAgICAnU3lzdGVtRWRpdCcsCisgICAgICAgICAgICAgICAgJ1N5c3RlbU1lbnUnLAorICAgICAgICAgICAgICAgICdTZXRNZW51Rmxhc2gnLAorICAgICAgICAgICAgICAgICdJbml0TWVudXMnLAorICAgICAgICAgICAgICAgICdJbml0UHJvY01lbnUnLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQknTUNUYWJsZUhhbmRsZScsCi0JCQknTUNFbnRyeVB0cicsCi0JCQknTUNUYWJsZVB0cicsCi0JCQknQUVEZXNjX3B0cicsICMgRm9yIG5vdzogZG9hYmxlLCBidXQgbm90IGVhc3kKLQkJCSdQcm9jZXNzU2VyaWFsTnVtYmVyJywgIyBkaXR0bwotCQkJIk1lbnVEZWZTcGVjUHRyIiwgIyBUb28gZGlmZmljdWx0IGZvciBub3cKLQkJCSJNZW51RGVmU3BlY19wdHIiLCAjIGRpdHRvCi0JCQkiTWVudVRyYWNraW5nRGF0YSIsCi0JCQkidm9pZF9wdHIiLCAJIyBEb24ndCBrbm93IHlldC4KLQkJCSJFdmVudFJlZiIsCSMgRm9yIG5vdywgbm90IGV4cG9ydGVkIHlldC4KLQkJCSJNZW51SXRlbURhdGFQdHIiLCAjIE5vdCB5ZXQuCi0JCQkiTWVudUl0ZW1EYXRhUmVjX3B0ciIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAnTUNUYWJsZUhhbmRsZScsCisgICAgICAgICAgICAgICAgJ01DRW50cnlQdHInLAorICAgICAgICAgICAgICAgICdNQ1RhYmxlUHRyJywKKyAgICAgICAgICAgICAgICAnQUVEZXNjX3B0cicsICMgRm9yIG5vdzogZG9hYmxlLCBidXQgbm90IGVhc3kKKyAgICAgICAgICAgICAgICAnUHJvY2Vzc1NlcmlhbE51bWJlcicsICMgZGl0dG8KKyAgICAgICAgICAgICAgICAiTWVudURlZlNwZWNQdHIiLCAjIFRvbyBkaWZmaWN1bHQgZm9yIG5vdworICAgICAgICAgICAgICAgICJNZW51RGVmU3BlY19wdHIiLCAjIGRpdHRvCisgICAgICAgICAgICAgICAgIk1lbnVUcmFja2luZ0RhdGEiLAorICAgICAgICAgICAgICAgICJ2b2lkX3B0ciIsICAgICAjIERvbid0IGtub3cgeWV0LgorICAgICAgICAgICAgICAgICJFdmVudFJlZiIsICAgICAjIEZvciBub3csIG5vdCBleHBvcnRlZCB5ZXQuCisgICAgICAgICAgICAgICAgIk1lbnVJdGVtRGF0YVB0ciIsICMgTm90IHlldC4KKyAgICAgICAgICAgICAgICAiTWVudUl0ZW1EYXRhUmVjX3B0ciIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygiU3RyMjU1IiwgIml0ZW1TdHJpbmciLCAiSW5Nb2RlIildLAotCQkJIFsoIioiLCAiKiIsICJPdXRNb2RlIildKSwKLQkJCQotCQkJKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIiksCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJWYXJWYXJPdXRCdWZmZXIiLCAiKiIsICJJbk91dE1vZGUiKV0pLAotCQkJKFsoIk1lbnVSZWYiLCAnb3V0SGllck1lbnUnLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJPcHRNZW51UmVmIiwgJ291dEhpZXJNZW51JywgIk91dE1vZGUiKV0pLAotCQkJXQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCJTdHIyNTUiLCAiaXRlbVN0cmluZyIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIioiLCAiKiIsICJPdXRNb2RlIildKSwKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICAgICAgICAgIChbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibG9uZyIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlZhclZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCisgICAgICAgICAgICAgICAgKFsoIk1lbnVSZWYiLCAnb3V0SGllck1lbnUnLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiT3B0TWVudVJlZiIsICdvdXRIaWVyTWVudScsICJPdXRNb2RlIildKSwKKyAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL21lbnUvbWVudXN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9tZW51L21lbnVzdXBwb3J0LnB5CmluZGV4IDdjNGFlMGQuLmEwNGI3NTUgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21lbnUvbWVudXN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvbWVudS9tZW51c3VwcG9ydC5weQpAQCAtNiwxNyArNiwxNyBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ01lbnVzLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfTWVudScJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnTWVudScJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQorTUFDSEVBREVSRklMRSA9ICdNZW51cy5oJyAgICAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19NZW51JyAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ01lbnUnICAgICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ01lbnUnCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwotT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyAnSGFuZGxlJwkjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQotT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicJIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcworTU9EUFJFRklYID0gJ01lbnUnICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK09CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgJ0hhbmRsZScgICAgICAjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQorT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicgICAgICAgICMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKIEVYVFJBRklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2VkaXQucHknICMgQSBzaW1pbGFyIGZpbGUgYnV0IGhhbmQtbWFkZQotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNDgsNyArNDgsNyBAQAogZXh0ZXJuIGludCBfTWVudU9ial9Db252ZXJ0KFB5T2JqZWN0ICosIE1lbnVIYW5kbGUgKik7CiAKICNkZWZpbmUgTWVudU9ial9OZXcgX01lbnVPYmpfTmV3Ci0jZGVmaW5lIE1lbnVPYmpfQ29udmVydCBfTWVudU9ial9Db252ZXJ0IAorI2RlZmluZSBNZW51T2JqX0NvbnZlcnQgX01lbnVPYmpfQ29udmVydAogI2VuZGlmCiAKICNkZWZpbmUgYXNfTWVudShoKSAoKE1lbnVIYW5kbGUpaCkKQEAgLTU4LDMxICs1OCwzMSBAQAogLyogQWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBNZW51T2JqX05ldywgd2hpY2ggcmV0dXJucyBOb25lIGZvciBOVUxMIGFyZ3VtZW50ICovCiBQeU9iamVjdCAqT3B0TWVudU9ial9OZXcoTWVudVJlZiBpdHNlbGYpCiB7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBNZW51T2JqX05ldyhpdHNlbGYpOworICAgICAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1lbnVPYmpfTmV3KGl0c2VsZik7CiB9CiAKIC8qIEFsdGVybmF0aXZlIHZlcnNpb24gb2YgTWVudU9ial9Db252ZXJ0LCB3aGljaCByZXR1cm5zIE5VTEwgZm9yIGEgTm9uZSBhcmd1bWVudCAqLwogaW50IE9wdE1lbnVPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTWVudVJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCB2ID09IFB5X05vbmUgKSB7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gTWVudU9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKKyAgICAgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7CisgICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTWVudU9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKIH0KICIiIgogCiBpbml0c3R1ZmYgPSBpbml0c3R1ZmYgKyAiIiIKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNZW51SGFuZGxlLCBNZW51T2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1lbnVIYW5kbGUsIE1lbnVPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lbnVIYW5kbGUsIE1lbnVPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1lbnVIYW5kbGUsIE1lbnVPYmpfQ29udmVydCk7CiAiIiIKIAogY2xhc3MgTXlPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlwYXNzCisgICAgcGFzcwogCiAjIENyZWF0ZSB0aGUgZ2VuZXJhdG9yIGdyb3VwcyBhbmQgbGluayB0aGVtCiBtb2R1bGUgPSBNYWNNb2R1bGUoTU9ETkFNRSwgTU9EUFJFRklYLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZikKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL21sdGUvbWx0ZXNjYW4ucHkgYi9NYWMvTW9kdWxlcy9tbHRlL21sdGVzY2FuLnB5CmluZGV4IDEzNGJmZmEuLmFkZWNiNGYgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21sdGUvbWx0ZXNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvbWx0ZS9tbHRlc2Nhbi5weQpAQCAtMTIsMzMgKzEyLDMzIEBACiAjIEFERCBvYmplY3QgdHlwZW5hbWVzIGhlcmUKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9ICJNYWNUZXh0RWRpdG9yLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gIk1hY1RleHRFZGl0b3IuaCIKKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmdlbnR5cGV0ZXN0KFNIT1JUKyJ0eXBldGVzdC5weSIpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyX09TWCk6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgaW4gT0JKRUNUUyBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gdCArICJfbWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgIGlmIHQgaW4gT0JKRUNUUyBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gdCArICJfbWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCIiIgorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCIiIgogZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAogZmFsc2UgPSAwCiB0cnVlID0gMQpAQCAtNTUsODkgKzU1LDg5IEBACiBub3JtYWwgPSAwCiAiIiIpCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIlRYTkdldEZvbnREZWZhdWx0cyIsICMgQXJnIGlzIHRvbyBkaWZmaWN1bHQKLQkJCSJUWE5TZXRGb250RGVmYXVsdHMiLCAjIEFyZyBpcyB0b28gZGlmZmljdWx0Ci0JCQkiVFhOSW5pdFRleHRlbnNpb24iLCAjIGRvbmUgbWFudWFsbHkKLQkJCQotCQkJIyBDb25zdGFudHMgd2l0aCBmdW5ueSBkZWZpbml0aW9ucwotCQkJImtUWE5DbGVhclRoaXNDb250cm9sIiwgCi0JCQkia1RYTkNsZWFyVGhlc2VGb250RmVhdHVyZXMiLAotCQkJImtUWE5Eb250Q2FyZVR5cGVTaXplIiwKLQkJCSJrVFhORGVjcmVtZW50VHlwZVNpemUiLAotCQkJImtUWE5Vc2VDdXJyZW50U2VsZWN0aW9uIiwKLQkJCSJrVFhOU3RhcnRPZmZzZXQiLAotCQkJImtUWE5FbmRPZmZzZXQiLAotCQkJImtUWE5RREZvbnROYW1lQXR0cmlidXRlU2l6ZSIsCi0JCQkia1RYTlFERm9udEZhbWlseUlEQXR0cmlidXRlU2l6ZSIsCi0JCQkia1RYTlFERm9udFNpemVBdHRyaWJ1dGVTaXplIiwKLQkJCSJrVFhOUURGb250U3R5bGVBdHRyaWJ1dGVTaXplIiwKLQkJCSJrVFhOUURGb250Q29sb3JBdHRyaWJ1dGVTaXplIiwKLQkJCSJrVFhOVGV4dEVuY29kaW5nQXR0cmlidXRlU2l6ZSIsCi0JCQkia1RYTlVzZUVuY29kaW5nV29yZFJ1bGVzTWFzayIsCi0JCQkia1RYTkZvbnRTaXplQXR0cmlidXRlU2l6ZSIsCi0JCQkic3RhdHVzIiwKLQkJCSJqdXN0aWZpY2F0aW9uIiwKLQkJCSdUWE5UU01DaGVjaycsICMgT1M4Ci0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiVFhOR2V0Rm9udERlZmF1bHRzIiwgIyBBcmcgaXMgdG9vIGRpZmZpY3VsdAorICAgICAgICAgICAgICAgICJUWE5TZXRGb250RGVmYXVsdHMiLCAjIEFyZyBpcyB0b28gZGlmZmljdWx0CisgICAgICAgICAgICAgICAgIlRYTkluaXRUZXh0ZW5zaW9uIiwgIyBkb25lIG1hbnVhbGx5CiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIlRYTlRhYiIsICMgVEJECi0JCQkiVFhOTWFyZ2lucyIsICMgVEJECi0JCQkiVFhOQ29udHJvbERhdGEiLCAjVEJECi0JCQkiVFhOQVRTVUlGZWF0dXJlcyIsICNUQkQKLQkJCSJUWE5BVFNVSVZhcmlhdGlvbnMiLCAjVEJECi0JCQkiVFhOQXR0cmlidXRlRGF0YSIsICNUQkQKLQkJCSJUWE5UeXBlQXR0cmlidXRlcyIsICNUQkQKLQkJCSJUWE5NYXRjaFRleHRSZWNvcmQiLCAjVEJECi0JCQkiVFhOQmFja2dyb3VuZCIsICNUQkQKLQkJCSJUWE5GaW5kVVBQIiwgCi0JCQkiQVRTVVN0eWxlIiwgI1RCRAotCQkJIlRYTkJhY2tncm91bmRfcHRyIiwgI1RCRAotCQkJIlRYTkNvbnRyb2xEYXRhX3B0ciIsICNUQkQKLQkJCSJUWE5Db250cm9sVGFnX3B0ciIsICNUQkQKLQkJCSJUWE5Mb25nUmVjdCIsICNUQkQKLQkJCSJUWE5Mb25nUmVjdF9wdHIiLCAjVEJECi0JCQkiVFhOVHlwZUF0dHJpYnV0ZXNfcHRyIiwgI1RCRAorICAgICAgICAgICAgICAgICMgQ29uc3RhbnRzIHdpdGggZnVubnkgZGVmaW5pdGlvbnMKKyAgICAgICAgICAgICAgICAia1RYTkNsZWFyVGhpc0NvbnRyb2wiLAorICAgICAgICAgICAgICAgICJrVFhOQ2xlYXJUaGVzZUZvbnRGZWF0dXJlcyIsCisgICAgICAgICAgICAgICAgImtUWE5Eb250Q2FyZVR5cGVTaXplIiwKKyAgICAgICAgICAgICAgICAia1RYTkRlY3JlbWVudFR5cGVTaXplIiwKKyAgICAgICAgICAgICAgICAia1RYTlVzZUN1cnJlbnRTZWxlY3Rpb24iLAorICAgICAgICAgICAgICAgICJrVFhOU3RhcnRPZmZzZXQiLAorICAgICAgICAgICAgICAgICJrVFhORW5kT2Zmc2V0IiwKKyAgICAgICAgICAgICAgICAia1RYTlFERm9udE5hbWVBdHRyaWJ1dGVTaXplIiwKKyAgICAgICAgICAgICAgICAia1RYTlFERm9udEZhbWlseUlEQXR0cmlidXRlU2l6ZSIsCisgICAgICAgICAgICAgICAgImtUWE5RREZvbnRTaXplQXR0cmlidXRlU2l6ZSIsCisgICAgICAgICAgICAgICAgImtUWE5RREZvbnRTdHlsZUF0dHJpYnV0ZVNpemUiLAorICAgICAgICAgICAgICAgICJrVFhOUURGb250Q29sb3JBdHRyaWJ1dGVTaXplIiwKKyAgICAgICAgICAgICAgICAia1RYTlRleHRFbmNvZGluZ0F0dHJpYnV0ZVNpemUiLAorICAgICAgICAgICAgICAgICJrVFhOVXNlRW5jb2RpbmdXb3JkUnVsZXNNYXNrIiwKKyAgICAgICAgICAgICAgICAia1RYTkZvbnRTaXplQXR0cmlidXRlU2l6ZSIsCisgICAgICAgICAgICAgICAgInN0YXR1cyIsCisgICAgICAgICAgICAgICAgImp1c3RpZmljYXRpb24iLAorICAgICAgICAgICAgICAgICdUWE5UU01DaGVjaycsICMgT1M4CisgICAgICAgICAgICAgICAgXQogCi0JCQkiVFhOQWN0aW9uS2V5TWFwcGVyUHJvY1B0ciIsCi0JCQkiVFhOQWN0aW9uS2V5TWFwcGVyVVBQIiwKLQkJCSJUWE5UZXh0Qm94T3B0aW9uc0RhdGEiLAotCQkJIlRYTkNvdW50T3B0aW9ucyIsCi0JCQkidm9pZF9wdHIiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIlRYTlRhYiIsICMgVEJECisgICAgICAgICAgICAgICAgIlRYTk1hcmdpbnMiLCAjIFRCRAorICAgICAgICAgICAgICAgICJUWE5Db250cm9sRGF0YSIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOQVRTVUlGZWF0dXJlcyIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOQVRTVUlWYXJpYXRpb25zIiwgI1RCRAorICAgICAgICAgICAgICAgICJUWE5BdHRyaWJ1dGVEYXRhIiwgI1RCRAorICAgICAgICAgICAgICAgICJUWE5UeXBlQXR0cmlidXRlcyIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOTWF0Y2hUZXh0UmVjb3JkIiwgI1RCRAorICAgICAgICAgICAgICAgICJUWE5CYWNrZ3JvdW5kIiwgI1RCRAorICAgICAgICAgICAgICAgICJUWE5GaW5kVVBQIiwKKyAgICAgICAgICAgICAgICAiQVRTVVN0eWxlIiwgI1RCRAorICAgICAgICAgICAgICAgICJUWE5CYWNrZ3JvdW5kX3B0ciIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOQ29udHJvbERhdGFfcHRyIiwgI1RCRAorICAgICAgICAgICAgICAgICJUWE5Db250cm9sVGFnX3B0ciIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOTG9uZ1JlY3QiLCAjVEJECisgICAgICAgICAgICAgICAgIlRYTkxvbmdSZWN0X3B0ciIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOVHlwZUF0dHJpYnV0ZXNfcHRyIiwgI1RCRAogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkjIFRYTk5ld09iamVjdCBoYXMgYSBsb3Qgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycwotCQkJKFsoIkZTU3BlY19wdHIiLCAiaUZpbGVTcGVjIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJPcHRGU1NwZWNQdHIiLCAiKiIsICIqIildKSwKLQkJCShbKCJSZWN0IiwgImlGcmFtZSIsICJPdXRNb2RlIildLAotCQkJIFsoIk9wdFJlY3RQdHIiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJIAotCQkJIyBJbiBVSCAzMzIgc29tZSBvZiB0aGUgImNvbnN0IiBhcmUgbWlzc2luZyBmb3IgaW5wdXQgcGFyYW1ldGVycyBwYXNzZWQKLQkJCSMgYnkgcmVmZXJlbmNlLiBXZSBmaXggdGhhdCB1cCBoZXJlLgotCQkJKFsoIkV2ZW50UmVjb3JkIiwgImlFdmVudCIsICJPdXRNb2RlIildLAotCQkJIFsoIkV2ZW50UmVjb3JkX3B0ciIsICIqIiwgIkluTW9kZSIpXSksCi0JCQkoWygiRlNTcGVjIiwgImlGaWxlU3BlY2lmaWNhdGlvbiIsICJPdXRNb2RlIildLAotCQkJIFsoIkZTU3BlY19wdHIiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJKFsoIlRYTk1hY09TUHJlZmVycmVkRm9udERlc2NyaXB0aW9uIiwgImlGb250RGVmYXVsdHMiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJUWE5NYWNPU1ByZWZlcnJlZEZvbnREZXNjcmlwdGlvbl9wdHIiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJIAotCQkJIyBJbiBidWZmZXJzIGFyZSBwYXNzZWQgYXMgdm9pZCAqCi0JCQkoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJCeXRlQ291bnQiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiTWx0ZUluQnVmZmVyIiwgIioiLCAiSW5Nb2RlIildKSwKLQkJCSAKLQkJCSMgVGhlIEFkanVzdEN1cnNvciByZWdpb24gaGFuZGxlIGlzIG9wdGlvbmFsCi0JCQkoWygiUmduSGFuZGxlIiwgImlvQ3Vyc29yUmduIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJPcHRSZ25IYW5kbGUiLCAiKiIsICIqIildKSwKLQkJCSAKLQkJCSMgVGhlIEdXb3JsZCBmb3IgVFhORHJhdyBpcyBvcHRpb25hbAotCQkJKFsoJ0dXb3JsZFB0cicsICdpRHJhd1BvcnQnLCAnSW5Nb2RlJyldLAotCQkJIFsoJ09wdEdXb3JsZFB0cicsICcqJywgJyonKV0pLAotCQkJXQotCQkJCisgICAgICAgICAgICAgICAgIlRYTkFjdGlvbktleU1hcHBlclByb2NQdHIiLAorICAgICAgICAgICAgICAgICJUWE5BY3Rpb25LZXlNYXBwZXJVUFAiLAorICAgICAgICAgICAgICAgICJUWE5UZXh0Qm94T3B0aW9uc0RhdGEiLAorICAgICAgICAgICAgICAgICJUWE5Db3VudE9wdGlvbnMiLAorICAgICAgICAgICAgICAgICJ2b2lkX3B0ciIsCisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIyBUWE5OZXdPYmplY3QgaGFzIGEgbG90IG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAoWygiRlNTcGVjX3B0ciIsICJpRmlsZVNwZWMiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJPcHRGU1NwZWNQdHIiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICAoWygiUmVjdCIsICJpRnJhbWUiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiT3B0UmVjdFB0ciIsICIqIiwgIkluTW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAjIEluIFVIIDMzMiBzb21lIG9mIHRoZSAiY29uc3QiIGFyZSBtaXNzaW5nIGZvciBpbnB1dCBwYXJhbWV0ZXJzIHBhc3NlZAorICAgICAgICAgICAgICAgICMgYnkgcmVmZXJlbmNlLiBXZSBmaXggdGhhdCB1cCBoZXJlLgorICAgICAgICAgICAgICAgIChbKCJFdmVudFJlY29yZCIsICJpRXZlbnQiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXZlbnRSZWNvcmRfcHRyIiwgIioiLCAiSW5Nb2RlIildKSwKKyAgICAgICAgICAgICAgICAoWygiRlNTcGVjIiwgImlGaWxlU3BlY2lmaWNhdGlvbiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJGU1NwZWNfcHRyIiwgIioiLCAiSW5Nb2RlIildKSwKKyAgICAgICAgICAgICAgICAoWygiVFhOTWFjT1NQcmVmZXJyZWRGb250RGVzY3JpcHRpb24iLCAiaUZvbnREZWZhdWx0cyIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJUWE5NYWNPU1ByZWZlcnJlZEZvbnREZXNjcmlwdGlvbl9wdHIiLCAiKiIsICJJbk1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgIyBJbiBidWZmZXJzIGFyZSBwYXNzZWQgYXMgdm9pZCAqCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgiQnl0ZUNvdW50IiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJNbHRlSW5CdWZmZXIiLCAiKiIsICJJbk1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgIyBUaGUgQWRqdXN0Q3Vyc29yIHJlZ2lvbiBoYW5kbGUgaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgICAoWygiUmduSGFuZGxlIiwgImlvQ3Vyc29yUmduIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiT3B0UmduSGFuZGxlIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAjIFRoZSBHV29ybGQgZm9yIFRYTkRyYXcgaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgICAoWygnR1dvcmxkUHRyJywgJ2lEcmF3UG9ydCcsICdJbk1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ09wdEdXb3JsZFB0cicsICcqJywgJyonKV0pLAorICAgICAgICAgICAgICAgIF0KKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL21sdGUvbWx0ZXN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9tbHRlL21sdGVzdXBwb3J0LnB5CmluZGV4IDg2MmQwYmMuLjhkY2JlZDUgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21sdGUvbWx0ZXN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvbWx0ZS9tbHRlc3VwcG9ydC5weQpAQCAtOCwxMiArOCwxMiBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NT0ROQU1FID0gJ19NbHRlJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK01PRE5BTUUgPSAnX01sdGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnTWx0ZScJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitNT0RQUkVGSVggPSAnTWx0ZScgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNDMsMTQgKzQzLDE0IEBACiBzdGF0aWMgaW50CiBPcHRGU1NwZWNQdHJfQ29udmVydChQeU9iamVjdCAqdiwgRlNTcGVjICoqcF9pdHNlbGYpCiB7Ci0Jc3RhdGljIEZTU3BlYyBmc3M7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQkqcF9pdHNlbGYgPSAmZnNzOwotCXJldHVybiBQeU1hY19HZXRGU1NwZWModiwgKnBfaXRzZWxmKTsKKyAgICAgICAgc3RhdGljIEZTU3BlYyBmc3M7CisgICAgICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgICpwX2l0c2VsZiA9ICZmc3M7CisgICAgICAgIHJldHVybiBQeU1hY19HZXRGU1NwZWModiwgKnBfaXRzZWxmKTsKIH0KIAogLyoKQEAgLTU5LDE1ICs1OSwxNSBAQAogc3RhdGljIGludAogT3B0UmVjdFB0cl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBSZWN0ICoqcF9pdHNlbGYpCiB7Ci0Jc3RhdGljIFJlY3QgcjsKLQkKLQlpZiAodiA9PSBQeV9Ob25lKQotCXsKLQkJKnBfaXRzZWxmID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCSpwX2l0c2VsZiA9ICZyOwotCXJldHVybiBQeU1hY19HZXRSZWN0KHYsICpwX2l0c2VsZik7CisgICAgICAgIHN0YXRpYyBSZWN0IHI7CisKKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgKnBfaXRzZWxmID0gJnI7CisgICAgICAgIHJldHVybiBQeU1hY19HZXRSZWN0KHYsICpwX2l0c2VsZik7CiB9CiAKIC8qCkBAIC03NSwxOSArNzUsMTkgQEAKICovCiBzdGF0aWMgaW50CiBPcHRHV29ybGRPYmpfQ29udmVydChQeU9iamVjdCAqdiwgR1dvcmxkUHRyICpwX2l0c2VsZikKLXsJCi0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gR1dvcmxkT2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpOworeworICAgICAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gR1dvcmxkT2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpOwogfQogCiAiIiIKIAogaW5pdHN0dWZmID0gaW5pdHN0dWZmICsgIiIiCi0vLwlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyh4eHh4KTsKKy8vICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoeHh4eCk7CiAiIiIKIFRYTk9iamVjdCA9IE9wYXF1ZUJ5VmFsdWVUeXBlKCJUWE5PYmplY3QiLCAiVFhOT2JqIikKIFRYTkZvbnRNZW51T2JqZWN0ID0gT3BhcXVlQnlWYWx1ZVR5cGUoIlRYTkZvbnRNZW51T2JqZWN0IiwgIlRYTkZvbnRNZW51T2JqIikKQEAgLTEzMywxMiArMTMzLDEyIEBACiAjIE91ciAob3BhcXVlKSBvYmplY3RzCiAKIGNsYXNzIFRYTk9iakRlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCiAKIGNsYXNzIFRYTkZvbnRNZW51T2JqRGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKIAogCiAjIEFERCBvYmplY3QgY2xhc3MgaGVyZQpAQCAtMTgzLDcgKzE4Myw3IEBACiBUWE5Jbml0T3B0aW9ucyBpVXNhZ2VGbGFnczsKIFB5TWFjX1BSRUNIRUNLKFRYTkluaXRUZXh0ZW5zaW9uKTsKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLCAmaVVzYWdlRmxhZ3MpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIF9lcnIgPSBUWE5Jbml0VGV4dGVuc2lvbihpRGVmYXVsdEZvbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudERlZmF1bHRGb250cywKICAgICAgICAgICAgICAgICAgICAgICAgICBpVXNhZ2VGbGFncyk7CkBAIC0yMDAsNCArMjAwLDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL29zYS9vc2FzY2FuLnB5IGIvTWFjL01vZHVsZXMvb3NhL29zYXNjYW4ucHkKaW5kZXggNzVlMWEwOC4uZmI4MTk2ZiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvb3NhL29zYXNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvb3NhL29zYXNjYW4ucHkKQEAgLTEwLDUzICsxMCw1MyBAQAogU0hPUlQgPSAib3NhIgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gIk9TQS5oIgotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9ICJPU0EuaCIKKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBzY2FubmVyLmdlbnR5cGV0ZXN0KFNIT1JUKyJ0eXBldGVzdC5weSIpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCA9PSAiQ29tcG9uZW50SW5zdGFuY2UiIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgIGlmIHQgPT0gIkNvbXBvbmVudEluc3RhbmNlIiBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uQXBwbGVFdmVudHMgaW1wb3J0ICpcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtBRVVzZVN0YW5kYXJkRGlzcGF0Y2ggPSAtMVxuIikKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uQXBwbGVFdmVudHMgaW1wb3J0ICpcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImtBRVVzZVN0YW5kYXJkRGlzcGF0Y2ggPSAtMVxuIikKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiT1NBQ29weVNjcmlwdCIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiT1NBQ29weVNjcmlwdCIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJPU0FMb2NhbE9yR2xvYmFsIiwKLQkJCSJPU0FDcmVhdGVBcHBsZUV2ZW50VVBQIiwKLQkJCSJPU0FBY3RpdmVVUFAiLAotCQkJIkFFRXZlbnRIYW5kbGVyVVBQIiwKLQkJCSJPU0FTZW5kVVBQIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJPU0FMb2NhbE9yR2xvYmFsIiwKKyAgICAgICAgICAgICAgICAiT1NBQ3JlYXRlQXBwbGVFdmVudFVQUCIsCisgICAgICAgICAgICAgICAgIk9TQUFjdGl2ZVVQUCIsCisgICAgICAgICAgICAgICAgIkFFRXZlbnRIYW5kbGVyVVBQIiwKKyAgICAgICAgICAgICAgICAiT1NBU2VuZFVQUCIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQldCi0JCQkKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICBdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9vc2Evb3Nhc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL29zYS9vc2FzdXBwb3J0LnB5CmluZGV4IGIwZTdmNGMuLjgzNjk5MzIgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL29zYS9vc2FzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL29zYS9vc2FzdXBwb3J0LnB5CkBAIC02LDE0ICs2LDE0IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1BQ0hFQURFUkZJTEUgPSAnT1NBLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfT1NBJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK01BQ0hFQURFUkZJTEUgPSAnT1NBLmgnICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnX09TQScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnT1NBJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFBSRUZJWCA9ICdPU0FPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdPU0EnICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RQUkVGSVggPSAnT1NBT2JqJyAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC0zNiw4ICszNiw4IEBACiAKIGluaXRzdHVmZiA9IGluaXRzdHVmZiArICIiIgogLyoKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb21wb25lbnRJbnN0YW5jZSwgT1NBT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudEluc3RhbmNlLCBPU0FPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudEluc3RhbmNlLCBPU0FPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudEluc3RhbmNlLCBPU0FPYmpfQ29udmVydCk7CiAqLwogIiIiCiAKQEAgLTYzLDI0ICs2MywyNCBAQAogIyBOT1RFOiBhdCB0aGUgbW9tZW50IE9TQS5Db21wb25lbnRJbnN0YW5jZSBpcyBub3QgYSBzdWJjbGFzcwogIyBvZiBDbS5Db21wb25lbnRJbnN0YW5jZS4gSWYgdGhpcyBpcyBhIHByb2JsZW0gaXQgY2FuIGJlIGZpeGVkLgogY2xhc3MgTXlPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiIiJpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKE9TQV9FcnJvciwiTlVMTCBDb21wb25lbnRJbnN0YW5jZSIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9IiIiKQotCQkJCQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCU91dHB1dCgiIiIKLQkJCWlmIChDbXBJbnN0T2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpKQotCQkJCXJldHVybiAxOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCSIiIikKLQkJCQkJCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPU0FfRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IiIiKQorCisgICAgZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCIiIgorICAgICAgICAgICAgICAgIGlmIChDbXBJbnN0T2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICAiIiIpCisKIAogIyBDcmVhdGUgdGhlIGdlbmVyYXRvciBncm91cHMgYW5kIGxpbmsgdGhlbQogbW9kdWxlID0gTWFjTW9kdWxlKE1PRE5BTUUsIE1PRFBSRUZJWCwgaW5jbHVkZXN0dWZmLCBmaW5hbHN0dWZmLCBpbml0c3R1ZmYpCiBvYmplY3QgPSBNeU9iamVjdERlZmluaXRpb24oJ09TQUNvbXBvbmVudEluc3RhbmNlJywgT0JKRUNUUFJFRklYLAotCQknQ29tcG9uZW50SW5zdGFuY2UnKQorICAgICAgICAgICAgICAgICdDb21wb25lbnRJbnN0YW5jZScpCiBtb2R1bGUuYWRkb2JqZWN0KG9iamVjdCkKIAogIyBDcmVhdGUgdGhlIGdlbmVyYXRvciBjbGFzc2VzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGxpc3RzCkBAIC0xMDMsNCArMTAzLDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL29zYS9zZXR1cC5weSBiL01hYy9Nb2R1bGVzL29zYS9zZXR1cC5weQppbmRleCA4MmU3NzQyLi42MzUxMTRlIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9vc2Evc2V0dXAucHkKKysrIGIvTWFjL01vZHVsZXMvb3NhL3NldHVwLnB5CkBAIC00LDEwICs0LDEwIEBACiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBFeHRlbnNpb24sIHNldHVwCiAKIHNldHVwKG5hbWU9Ik9TQSIsIHZlcnNpb249IjAuMSIsCi0JZXh0X21vZHVsZXM9WwotCQlFeHRlbnNpb24oJ19PU0EnLCBbJ19PU0Ftb2R1bGUuYyddLAotCQlleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKQotCV0sCi0JcHlfbW9kdWxlcz1bJ09TQS5PU0EnLCAnT1NBLk9TQWNvbnN0J10sCi0JcGFja2FnZV9kaXI9eydPU0EnOicuLi8uLi8uLi9MaWIvcGxhdC1tYWMvQ2FyYm9uJ30KLQkpCisgICAgICAgIGV4dF9tb2R1bGVzPVsKKyAgICAgICAgICAgICAgICBFeHRlbnNpb24oJ19PU0EnLCBbJ19PU0Ftb2R1bGUuYyddLAorICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pCisgICAgICAgIF0sCisgICAgICAgIHB5X21vZHVsZXM9WydPU0EuT1NBJywgJ09TQS5PU0Fjb25zdCddLAorICAgICAgICBwYWNrYWdlX2Rpcj17J09TQSc6Jy4uLy4uLy4uL0xpYi9wbGF0LW1hYy9DYXJib24nfQorICAgICAgICApCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xZC9xZGVkaXQucHkgYi9NYWMvTW9kdWxlcy9xZC9xZGVkaXQucHkKaW5kZXggZDllNGExNS4uODNkODFlZCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcWQvcWRlZGl0LnB5CisrKyBiL01hYy9Nb2R1bGVzL3FkL3FkZWRpdC5weQpAQCAtMSw1ICsxLDUgQEAKIGYgPSBGdW5jdGlvbih2b2lkLCAnU2V0UG9ydCcsCi0JKEdyYWZQdHIsICd0aGVQb3J0JywgSW5Nb2RlKSwKKyAgICAgICAgKEdyYWZQdHIsICd0aGVQb3J0JywgSW5Nb2RlKSwKICkKIGZ1bmN0aW9ucy5hcHBlbmQoZikKIApAQCAtMTU2LDQgKzE1NiwzIEBACiAgICAgKHNob3J0LCAnYnl0ZUNvdW50JywgSW5Nb2RlKSwKICkKIGZ1bmN0aW9ucy5hcHBlbmQoZikKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvcWQvcWRzY2FuLnB5IGIvTWFjL01vZHVsZXMvcWQvcWRzY2FuLnB5CmluZGV4IGY1OGJiMjIuLjg1YThjZGMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3FkL3Fkc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9xZC9xZHNjYW4ucHkKQEAgLTgsMjI4ICs4LDIyOCBAQAogZnJvbSBzY2FudG9vbHMgaW1wb3J0IFNjYW5uZXIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9ICJRdWlja0RyYXcuaCIKLQlvdXRwdXQgPSAicWRnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiUXVpY2tEcmF3LnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCQotCSMgR3JtcGYuIFVuaXZlcnNhbCBIZWFkZXJzIGhhdmUgVGV4dC1zdHVmZiBpbiBhIGRpZmZlcmVudCBpbmNsdWRlIGZpbGUuLi4KLQlpbnB1dCA9ICJRdWlja0RyYXdUZXh0LmgiCi0Jb3V0cHV0ID0gIkBxZGdlbnRleHQucHkiCi0JZGVmc291dHB1dCA9ICJAUXVpY2tEcmF3VGV4dC5weSIKLQloYXZlX2V4dHJhID0gMAotCXRyeToKLQkJc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCQlzY2FubmVyLnNjYW4oKQotCQlzY2FubmVyLmNsb3NlKCkKLQkJaGF2ZV9leHRyYSA9IDEKLQlleGNlcHQgSU9FcnJvcjoKLQkJcGFzcwotCWlmIGhhdmVfZXh0cmE6Ci0JCXByaW50ICI9PT0gQ29weWluZyBRdWlja0RyYXdUZXh0IHN0dWZmIGludG8gbWFpbiBmaWxlcy4uLiA9PT0iCi0JCWlmcCA9IG9wZW4oIkBxZGdlbnRleHQucHkiKQotCQlvZnAgPSBvcGVuKCJxZGdlbi5weSIsICJhIikKLQkJb2ZwLndyaXRlKGlmcC5yZWFkKCkpCi0JCWlmcC5jbG9zZSgpCi0JCW9mcC5jbG9zZSgpCi0JCWlmcCA9IG9wZW4oIkBRdWlja0RyYXdUZXh0LnB5IikKLQkJb2ZwID0gb3BlbihUT09MQk9YRElSICsgIlF1aWNrRHJhdy5weSIsICJhIikKLQkJb2ZwLndyaXRlKGlmcC5yZWFkKCkpCi0JCWlmcC5jbG9zZSgpCi0JCW9mcC5jbG9zZSgpCi0JCQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWltcG9ydCBxZHN1cHBvcnQKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gIlF1aWNrRHJhdy5oIgorICAgIG91dHB1dCA9ICJxZGdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJRdWlja0RyYXcucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisKKyAgICAjIEdybXBmLiBVbml2ZXJzYWwgSGVhZGVycyBoYXZlIFRleHQtc3R1ZmYgaW4gYSBkaWZmZXJlbnQgaW5jbHVkZSBmaWxlLi4uCisgICAgaW5wdXQgPSAiUXVpY2tEcmF3VGV4dC5oIgorICAgIG91dHB1dCA9ICJAcWRnZW50ZXh0LnB5IgorICAgIGRlZnNvdXRwdXQgPSAiQFF1aWNrRHJhd1RleHQucHkiCisgICAgaGF2ZV9leHRyYSA9IDAKKyAgICB0cnk6CisgICAgICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICAgICAgc2Nhbm5lci5zY2FuKCkKKyAgICAgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgICAgIGhhdmVfZXh0cmEgPSAxCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBpZiBoYXZlX2V4dHJhOgorICAgICAgICBwcmludCAiPT09IENvcHlpbmcgUXVpY2tEcmF3VGV4dCBzdHVmZiBpbnRvIG1haW4gZmlsZXMuLi4gPT09IgorICAgICAgICBpZnAgPSBvcGVuKCJAcWRnZW50ZXh0LnB5IikKKyAgICAgICAgb2ZwID0gb3BlbigicWRnZW4ucHkiLCAiYSIpCisgICAgICAgIG9mcC53cml0ZShpZnAucmVhZCgpKQorICAgICAgICBpZnAuY2xvc2UoKQorICAgICAgICBvZnAuY2xvc2UoKQorICAgICAgICBpZnAgPSBvcGVuKCJAUXVpY2tEcmF3VGV4dC5weSIpCisgICAgICAgIG9mcCA9IG9wZW4oVE9PTEJPWERJUiArICJRdWlja0RyYXcucHkiLCAiYSIpCisgICAgICAgIG9mcC53cml0ZShpZnAucmVhZCgpKQorICAgICAgICBpZnAuY2xvc2UoKQorICAgICAgICBvZnAuY2xvc2UoKQorCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgaW1wb3J0IHFkc3VwcG9ydAorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCBpbiAoJ0dyYWZQdHInLCAnQ0dyYWZQdHInKSBhbmQgbSA9PSAnSW5Nb2RlJzoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gImdyX21ldGhvZHMiCi0JCQllbGlmIHQgPT0gJ0JpdE1hcFB0cicgYW5kIG0gPT0gJ0luTW9kZSc6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJibV9tZXRob2RzIgotIyMJCQllbGlmIHQgPT0gIlBvbHlIYW5kbGUiIGFuZCBtID09ICJJbk1vZGUiOgotIyMJCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLSMjCQkJCWxpc3RuYW1lID0gInBfbWV0aG9kcyIKLSMjCQkJZWxpZiB0ID09ICJSZ25IYW5kbGUiIGFuZCBtID09ICJJbk1vZGUiOgotIyMJCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLSMjCQkJCWxpc3RuYW1lID0gInJfbWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgIGlmIHQgaW4gKCdHcmFmUHRyJywgJ0NHcmFmUHRyJykgYW5kIG0gPT0gJ0luTW9kZSc6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJncl9tZXRob2RzIgorICAgICAgICAgICAgZWxpZiB0ID09ICdCaXRNYXBQdHInIGFuZCBtID09ICdJbk1vZGUnOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAiYm1fbWV0aG9kcyIKKyMjICAgICAgICAgICAgICAgICAgICAgIGVsaWYgdCA9PSAiUG9seUhhbmRsZSIgYW5kIG0gPT0gIkluTW9kZSI6CisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gInBfbWV0aG9kcyIKKyMjICAgICAgICAgICAgICAgICAgICAgIGVsaWYgdCA9PSAiUmduSGFuZGxlIiBhbmQgbSA9PSAiSW5Nb2RlIjoKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAicl9tZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiIiIKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiIiIKIGRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKLW5vcm1hbAkJCQkJCT0gMAotYm9sZAkJCQkJCT0gMQotaXRhbGljCQkJCQkJPSAyCi11bmRlcmxpbmUJCQkJCT0gNAotb3V0bGluZQkJCQkJCT0gOAotc2hhZG93CQkJCQkJPSAweDEwCi1jb25kZW5zZQkJCQkJPSAweDIwCi1leHRlbmQJCQkJCQk9IDB4NDAKK25vcm1hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMAorYm9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxCitpdGFsaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIKK3VuZGVybGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNAorb3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4CitzaGFkb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAKK2NvbmRlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMAorZXh0ZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwCiAiIiIpCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJJ0luaXRHcmFmJywKLQkJCSdTdHVmZkhleCcsCi0JCQknU3RkTGluZScsCi0JCQknU3RkQ29tbWVudCcsCi0JCQknU3RkR2V0UGljJywKLQkJCSdPcGVuUG9ydCcsCi0JCQknSW5pdFBvcnQnLAotCQkJJ0Nsb3NlUG9ydCcsCi0JCQknT3BlbkNQb3J0JywKLQkJCSdJbml0Q1BvcnQnLAotCQkJJ0Nsb3NlQ1BvcnQnLAotCQkJJ0JpdE1hcFRvUmVnaW9uR2x1ZScsCi0JCQknU3RkT3Bjb2RlJywgCSMgWFhYWCBNaXNzaW5nIGZyb20gbGlicmFyeS4uLgotCQkJIyBUaGUgZm9sbG93aW5nIGFyZSBmb3Igbm9uLW1hY29zIHVzZToKLQkJCSdMb2NrUG9ydEJpdHMnLAotCQkJJ1VubG9ja1BvcnRCaXRzJywKLQkJCSdVcGRhdGVQb3J0JywKLQkJCSdHZXRQb3J0TmF0aXZlV2luZG93JywKLQkJCSdHZXROYXRpdmVXaW5kb3dQb3J0JywKLQkJCSdOYXRpdmVSZWdpb25Ub01hY1JlZ2lvbicsCi0JCQknTWFjUmVnaW9uVG9OYXRpdmVSZWdpb24nLAotCQkJJ0dldFBvcnRIV05EJywKLQkJCSdHZXRIV05EUG9ydCcsCi0JCQknR2V0UElDVEZyb21ESUInLAotCQkJCi0JCQknSGFuZGxlVG9SZ24nLCAjIEZ1bm55IHNpZ25hdHVyZQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgJ0luaXRHcmFmJywKKyAgICAgICAgICAgICAgICAnU3R1ZmZIZXgnLAorICAgICAgICAgICAgICAgICdTdGRMaW5lJywKKyAgICAgICAgICAgICAgICAnU3RkQ29tbWVudCcsCisgICAgICAgICAgICAgICAgJ1N0ZEdldFBpYycsCisgICAgICAgICAgICAgICAgJ09wZW5Qb3J0JywKKyAgICAgICAgICAgICAgICAnSW5pdFBvcnQnLAorICAgICAgICAgICAgICAgICdDbG9zZVBvcnQnLAorICAgICAgICAgICAgICAgICdPcGVuQ1BvcnQnLAorICAgICAgICAgICAgICAgICdJbml0Q1BvcnQnLAorICAgICAgICAgICAgICAgICdDbG9zZUNQb3J0JywKKyAgICAgICAgICAgICAgICAnQml0TWFwVG9SZWdpb25HbHVlJywKKyAgICAgICAgICAgICAgICAnU3RkT3Bjb2RlJywgICAgIyBYWFhYIE1pc3NpbmcgZnJvbSBsaWJyYXJ5Li4uCisgICAgICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIGFyZSBmb3Igbm9uLW1hY29zIHVzZToKKyAgICAgICAgICAgICAgICAnTG9ja1BvcnRCaXRzJywKKyAgICAgICAgICAgICAgICAnVW5sb2NrUG9ydEJpdHMnLAorICAgICAgICAgICAgICAgICdVcGRhdGVQb3J0JywKKyAgICAgICAgICAgICAgICAnR2V0UG9ydE5hdGl2ZVdpbmRvdycsCisgICAgICAgICAgICAgICAgJ0dldE5hdGl2ZVdpbmRvd1BvcnQnLAorICAgICAgICAgICAgICAgICdOYXRpdmVSZWdpb25Ub01hY1JlZ2lvbicsCisgICAgICAgICAgICAgICAgJ01hY1JlZ2lvblRvTmF0aXZlUmVnaW9uJywKKyAgICAgICAgICAgICAgICAnR2V0UG9ydEhXTkQnLAorICAgICAgICAgICAgICAgICdHZXRIV05EUG9ydCcsCisgICAgICAgICAgICAgICAgJ0dldFBJQ1RGcm9tRElCJywKIAotCQkJIyBOZWVkIENtLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIGRyYWcgaW4ganVzdCB5ZXQKLQkJCSdPcGVuQ3Vyc29yQ29tcG9uZW50JywKLQkJCSdDbG9zZUN1cnNvckNvbXBvbmVudCcsCi0JCQknU2V0Q3Vyc29yQ29tcG9uZW50JywKLQkJCSdDdXJzb3JDb21wb25lbnRDaGFuZ2VkJywKLQkJCSdDdXJzb3JDb21wb25lbnRTZXREYXRhJywKLQkJCV0KKyAgICAgICAgICAgICAgICAnSGFuZGxlVG9SZ24nLCAjIEZ1bm55IHNpZ25hdHVyZQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJRRFJlZ2lvbkJpdHNSZWYiLCAjIFNob3VsZCBkbyB0aGlzLCBidXQgdG9vIGxhenkgbm93LgotCQkJJ0NJY29uSGFuZGxlJywgIyBPYnNvbGV0ZQotCQkJJ0NRRFByb2NzJywKLQkJCSdDUURQcm9jc1B0cicsCi0JCQknQ1NwZWNBcnJheScsCi0JCQknQ29sb3JDb21wbGVtZW50UHJvY1B0cicsCi0JCQknQ29sb3JDb21wbGVtZW50VVBQJywKLQkJCSdDb2xvclNlYXJjaFByb2NQdHInLAotCQkJJ0NvbG9yU2VhcmNoVVBQJywKLQkJCSdDb25zdFBhdHRlcm5QYXJhbScsCi0JCQknRGV2aWNlTG9vcERyYXdpbmdQcm9jUHRyJywKLQkJCSdEZXZpY2VMb29wRmxhZ3MnLAotCQkJJ0dyYWZWZXJiJywKLQkJCSdPcGVuQ1BpY1BhcmFtc19wdHInLAotCQkJJ1B0cicsCi0JCQknUURQcm9jcycsCi0JCQknUmVxTGlzdFJlYycsCi0JCQkndm9pZF9wdHInLAotCQkJJ0N1c3RvbVhGZXJQcm9jUHRyJywKLQkJCV0KKyAgICAgICAgICAgICAgICAjIE5lZWQgQ20sIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gZHJhZyBpbiBqdXN0IHlldAorICAgICAgICAgICAgICAgICdPcGVuQ3Vyc29yQ29tcG9uZW50JywKKyAgICAgICAgICAgICAgICAnQ2xvc2VDdXJzb3JDb21wb25lbnQnLAorICAgICAgICAgICAgICAgICdTZXRDdXJzb3JDb21wb25lbnQnLAorICAgICAgICAgICAgICAgICdDdXJzb3JDb21wb25lbnRDaGFuZ2VkJywKKyAgICAgICAgICAgICAgICAnQ3Vyc29yQ29tcG9uZW50U2V0RGF0YScsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygndm9pZF9wdHInLCAndGV4dEJ1ZicsICdJbk1vZGUnKSwKLQkJCSAgKCdzaG9ydCcsICdmaXJzdEJ5dGUnLCAnSW5Nb2RlJyksCi0JCQkgICgnc2hvcnQnLCAnYnl0ZUNvdW50JywgJ0luTW9kZScpXSwKLQkJCSBbKCdUZXh0VGhpbmdpZScsICcqJywgJyonKSwgKCcqJywgJyonLCAnKicpLCAoJyonLCAnKicsICcqJyldKSwKLQkJCQotCQkJIyBHZXRQZW4gYW5kIFNldFB0IHVzZSBhIHBvaW50LXBvaW50ZXIgYXMgb3V0cHV0LW9ubHk6Ci0JCQkoJ0dldFBlbicsIFsoJ1BvaW50JywgJyonLCAnT3V0TW9kZScpXSwgWygnKicsICcqJywgJ091dE1vZGUnKV0pLAotCQkJKCdTZXRQdCcsIFsoJ1BvaW50JywgJyonLCAnT3V0TW9kZScpXSwgWygnKicsICcqJywgJ091dE1vZGUnKV0pLAotCQkJCi0JCQkjIEFsbCBvdGhlcnMgdXNlIGl0IGFzIGlucHV0L291dHB1dDoKLQkJCShbKCdQb2ludCcsICcqJywgJ091dE1vZGUnKV0sCi0JCQkgWygnKicsICcqJywgJ0luT3V0TW9kZScpXSksCi0JCQkgCi0JCQkgIyBJbnNldFJlY3QsIE9mZnNldFJlY3QKLQkJCSAoWygnUmVjdCcsICdyJywgJ091dE1vZGUnKSwKLQkJCSAJKCdzaG9ydCcsICdkaCcsICdJbk1vZGUnKSwKLQkJCSAJKCdzaG9ydCcsICdkdicsICdJbk1vZGUnKV0sCi0JCQkgIFsoJ1JlY3QnLCAncicsICdJbk91dE1vZGUnKSwKLQkJCSAJKCdzaG9ydCcsICdkaCcsICdJbk1vZGUnKSwKLQkJCSAJKCdzaG9ydCcsICdkdicsICdJbk1vZGUnKV0pLAorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIlFEUmVnaW9uQml0c1JlZiIsICMgU2hvdWxkIGRvIHRoaXMsIGJ1dCB0b28gbGF6eSBub3cuCisgICAgICAgICAgICAgICAgJ0NJY29uSGFuZGxlJywgIyBPYnNvbGV0ZQorICAgICAgICAgICAgICAgICdDUURQcm9jcycsCisgICAgICAgICAgICAgICAgJ0NRRFByb2NzUHRyJywKKyAgICAgICAgICAgICAgICAnQ1NwZWNBcnJheScsCisgICAgICAgICAgICAgICAgJ0NvbG9yQ29tcGxlbWVudFByb2NQdHInLAorICAgICAgICAgICAgICAgICdDb2xvckNvbXBsZW1lbnRVUFAnLAorICAgICAgICAgICAgICAgICdDb2xvclNlYXJjaFByb2NQdHInLAorICAgICAgICAgICAgICAgICdDb2xvclNlYXJjaFVQUCcsCisgICAgICAgICAgICAgICAgJ0NvbnN0UGF0dGVyblBhcmFtJywKKyAgICAgICAgICAgICAgICAnRGV2aWNlTG9vcERyYXdpbmdQcm9jUHRyJywKKyAgICAgICAgICAgICAgICAnRGV2aWNlTG9vcEZsYWdzJywKKyAgICAgICAgICAgICAgICAnR3JhZlZlcmInLAorICAgICAgICAgICAgICAgICdPcGVuQ1BpY1BhcmFtc19wdHInLAorICAgICAgICAgICAgICAgICdQdHInLAorICAgICAgICAgICAgICAgICdRRFByb2NzJywKKyAgICAgICAgICAgICAgICAnUmVxTGlzdFJlYycsCisgICAgICAgICAgICAgICAgJ3ZvaWRfcHRyJywKKyAgICAgICAgICAgICAgICAnQ3VzdG9tWEZlclByb2NQdHInLAorICAgICAgICAgICAgICAgIF0KIAotCQkJICMgTWFwUmVjdAotCQkJIChbKCdSZWN0JywgJ3InLCAnT3V0TW9kZScpLAotCQkJIAkoJ1JlY3RfcHRyJywgJ3NyY1JlY3QnLCAnSW5Nb2RlJyksCi0JCQkgCSgnUmVjdF9wdHInLCAnZHN0UmVjdCcsICdJbk1vZGUnKV0sCi0JCQkgIFsoJ1JlY3QnLCAncicsICdJbk91dE1vZGUnKSwKLQkJCSAJKCdSZWN0X3B0cicsICdzcmNSZWN0JywgJ0luTW9kZScpLAotCQkJIAkoJ1JlY3RfcHRyJywgJ2RzdFJlY3QnLCAnSW5Nb2RlJyldKSwKLQkJCSAJCi0JCQkgIyBDb3B5Qml0cyBhbmQgZnJpZW5kcwotCQkJIChbKCdSZ25IYW5kbGUnLCAnbWFza1JnbicsICdJbk1vZGUnKV0sCi0JCQkgIFsoJ09wdFJnbkhhbmRsZScsICdtYXNrUmduJywgJ0luTW9kZScpXSksCi0JCQkgIAotCQkJICgnUURGbHVzaFBvcnRCdWZmZXInLAotCQkJICBbKCdSZ25IYW5kbGUnLCAnKicsICdJbk1vZGUnKV0sCi0JCQkgIFsoJ09wdFJnbkhhbmRsZScsICcqJywgJ0luTW9kZScpXSksCi0JCQkgIAotCQkJICMgQWNjZXNzb3JzIHdpdGggcmVmZXJlbmNlIGFyZ3VtZW50IGFsc28gcmV0dXJuZWQuCi0JCQkgKFsoJ1JlY3RfcHRyJywgJ0dldFBvcnRCb3VuZHMnLCAnUmV0dXJuTW9kZScpXSwKLQkJCSAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAotCQkJCi0JCQkgKFsoJ1JHQkNvbG9yX3B0cicsICdHZXRQb3J0Rm9yZUNvbG9yJywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdSR0JDb2xvcl9wdHInLCAnR2V0UG9ydEJhY2tDb2xvcicsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCSAoWygnUkdCQ29sb3JfcHRyJywgJ0dldFBvcnRPcENvbG9yJywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdSR0JDb2xvcl9wdHInLCAnR2V0UG9ydEhpbGl0ZUNvbG9yJywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdQb2ludF9wdHInLCAnR2V0UG9ydFBlblNpemUnLCAnUmV0dXJuTW9kZScpXSwKLQkJCSAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAotCQkJCi0JCQkgKFsoJ1BvaW50X3B0cicsICdHZXRQb3J0UGVuTG9jYXRpb24nLCAnUmV0dXJuTW9kZScpXSwKLQkJCSAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAotCQkJCi0JCQkgKFsoJ1JlY3RfcHRyJywgJ0dldFBpeEJvdW5kcycsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCSAoWygnQml0TWFwX3B0cicsICdHZXRRREdsb2JhbHNTY3JlZW5CaXRzJywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdDdXJzb3JfcHRyJywgJ0dldFFER2xvYmFsc0Fycm93JywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdSZWN0X3B0cicsICdHZXRSZWdpb25Cb3VuZHMnLCAnUmV0dXJuTW9kZScpXSwKLQkJCSAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAotCQkJCi0JCQkgKFsoJ1BhdHRlcm5fcHRyJywgJyonLCAnUmV0dXJuTW9kZScpXSwKLQkJCSAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAotCQkJCi0JCQkgKFsoJ1BvaW50X3B0cicsICdRRExvY2FsVG9HbG9iYWxQb2ludCcsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCSAoWygnUmVjdF9wdHInLCAnUURMb2NhbFRvR2xvYmFsUmVjdCcsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCSAoWygnUG9pbnRfcHRyJywgJ1FER2xvYmFsVG9Mb2NhbFBvaW50JywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdSZWN0X3B0cicsICdRREdsb2JhbFRvTG9jYWxSZWN0JywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJXQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCd2b2lkX3B0cicsICd0ZXh0QnVmJywgJ0luTW9kZScpLAorICAgICAgICAgICAgICAgICAgKCdzaG9ydCcsICdmaXJzdEJ5dGUnLCAnSW5Nb2RlJyksCisgICAgICAgICAgICAgICAgICAoJ3Nob3J0JywgJ2J5dGVDb3VudCcsICdJbk1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ1RleHRUaGluZ2llJywgJyonLCAnKicpLCAoJyonLCAnKicsICcqJyksICgnKicsICcqJywgJyonKV0pLAorCisgICAgICAgICAgICAgICAgIyBHZXRQZW4gYW5kIFNldFB0IHVzZSBhIHBvaW50LXBvaW50ZXIgYXMgb3V0cHV0LW9ubHk6CisgICAgICAgICAgICAgICAgKCdHZXRQZW4nLCBbKCdQb2ludCcsICcqJywgJ091dE1vZGUnKV0sIFsoJyonLCAnKicsICdPdXRNb2RlJyldKSwKKyAgICAgICAgICAgICAgICAoJ1NldFB0JywgWygnUG9pbnQnLCAnKicsICdPdXRNb2RlJyldLCBbKCcqJywgJyonLCAnT3V0TW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIEFsbCBvdGhlcnMgdXNlIGl0IGFzIGlucHV0L291dHB1dDoKKyAgICAgICAgICAgICAgICAoWygnUG9pbnQnLCAnKicsICdPdXRNb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCcqJywgJyonLCAnSW5PdXRNb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAjIEluc2V0UmVjdCwgT2Zmc2V0UmVjdAorICAgICAgICAgICAgICAgICAoWygnUmVjdCcsICdyJywgJ091dE1vZGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnc2hvcnQnLCAnZGgnLCAnSW5Nb2RlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoJ3Nob3J0JywgJ2R2JywgJ0luTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ1JlY3QnLCAncicsICdJbk91dE1vZGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnc2hvcnQnLCAnZGgnLCAnSW5Nb2RlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoJ3Nob3J0JywgJ2R2JywgJ0luTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgIyBNYXBSZWN0CisgICAgICAgICAgICAgICAgIChbKCdSZWN0JywgJ3InLCAnT3V0TW9kZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCdSZWN0X3B0cicsICdzcmNSZWN0JywgJ0luTW9kZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCdSZWN0X3B0cicsICdkc3RSZWN0JywgJ0luTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ1JlY3QnLCAncicsICdJbk91dE1vZGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnUmVjdF9wdHInLCAnc3JjUmVjdCcsICdJbk1vZGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnUmVjdF9wdHInLCAnZHN0UmVjdCcsICdJbk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgICMgQ29weUJpdHMgYW5kIGZyaWVuZHMKKyAgICAgICAgICAgICAgICAgKFsoJ1JnbkhhbmRsZScsICdtYXNrUmduJywgJ0luTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ09wdFJnbkhhbmRsZScsICdtYXNrUmduJywgJ0luTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgKCdRREZsdXNoUG9ydEJ1ZmZlcicsCisgICAgICAgICAgICAgICAgICBbKCdSZ25IYW5kbGUnLCAnKicsICdJbk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCdPcHRSZ25IYW5kbGUnLCAnKicsICdJbk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgICMgQWNjZXNzb3JzIHdpdGggcmVmZXJlbmNlIGFyZ3VtZW50IGFsc28gcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgIChbKCdSZWN0X3B0cicsICdHZXRQb3J0Qm91bmRzJywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgKFsoJ1JHQkNvbG9yX3B0cicsICdHZXRQb3J0Rm9yZUNvbG9yJywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgKFsoJ1JHQkNvbG9yX3B0cicsICdHZXRQb3J0QmFja0NvbG9yJywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgKFsoJ1JHQkNvbG9yX3B0cicsICdHZXRQb3J0T3BDb2xvcicsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdSR0JDb2xvcl9wdHInLCAnR2V0UG9ydEhpbGl0ZUNvbG9yJywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgKFsoJ1BvaW50X3B0cicsICdHZXRQb3J0UGVuU2l6ZScsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdQb2ludF9wdHInLCAnR2V0UG9ydFBlbkxvY2F0aW9uJywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgKFsoJ1JlY3RfcHRyJywgJ0dldFBpeEJvdW5kcycsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdCaXRNYXBfcHRyJywgJ0dldFFER2xvYmFsc1NjcmVlbkJpdHMnLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAoWygnQ3Vyc29yX3B0cicsICdHZXRRREdsb2JhbHNBcnJvdycsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdSZWN0X3B0cicsICdHZXRSZWdpb25Cb3VuZHMnLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAoWygnUGF0dGVybl9wdHInLCAnKicsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdQb2ludF9wdHInLCAnUURMb2NhbFRvR2xvYmFsUG9pbnQnLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAoWygnUmVjdF9wdHInLCAnUURMb2NhbFRvR2xvYmFsUmVjdCcsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdQb2ludF9wdHInLCAnUURHbG9iYWxUb0xvY2FsUG9pbnQnLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAoWygnUmVjdF9wdHInLCAnUURHbG9iYWxUb0xvY2FsUmVjdCcsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgXQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvcWQvcWRzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvcWQvcWRzdXBwb3J0LnB5CmluZGV4IGUzNjFjMDEuLmQwNzhhYzYgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3FkL3Fkc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9xZC9xZHN1cHBvcnQucHkKQEAgLTYsMjkgKzYsMjkgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdRdWlja0RyYXcuaCcJCSMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCi1NT0ROQU1FID0gJ19RZCcJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCi1PQkpFQ1ROQU1FID0gJ0dyYWYnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK01BQ0hFQURFUkZJTEUgPSAnUXVpY2tEcmF3LmgnICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfUWQnICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdHcmFmJyAgICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdRZCcJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArICdQdHInCQkjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQotT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicJIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcworTU9EUFJFRklYID0gJ1FkJyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK09CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgJ1B0cicgICAgICAgICAjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQorT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicgICAgICAgICMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKIEVYVFJBRklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2VkaXQucHknICMgQSBzaW1pbGFyIGZpbGUgYnV0IGhhbmQtbWFkZQotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIAogIyBDcmVhdGUgdGhlIHR5cGUgb2JqZWN0cwogCiBjbGFzcyBUZXh0VGhpbmdpZUNsYXNzKEZpeGVkSW5wdXRCdWZmZXJUeXBlKToKLQlkZWYgZ2V0YXJnc0NoZWNrKHNlbGYsIG5hbWUpOgotCQlPdXRwdXQoIi8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8iKQotCQlPdXRwdXQoIiVzX19pbl9sZW5fXyA9ICVzX19pbl9sZW5fXzsiLCBuYW1lLCBuYW1lKQorICAgIGRlZiBnZXRhcmdzQ2hlY2soc2VsZiwgbmFtZSk6CisgICAgICAgIE91dHB1dCgiLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLyIpCisgICAgICAgIE91dHB1dCgiJXNfX2luX2xlbl9fID0gJXNfX2luX2xlbl9fOyIsIG5hbWUsIG5hbWUpCiAKLQlkZWYgZGVjbGFyZVNpemUoc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgiaW50ICVzX19pbl9sZW5fXzsiLCBuYW1lKQorICAgIGRlZiBkZWNsYXJlU2l6ZShzZWxmLCBuYW1lKToKKyAgICAgICAgT3V0cHV0KCJpbnQgJXNfX2luX2xlbl9fOyIsIG5hbWUpCiAKIFRleHRUaGluZ2llID0gVGV4dFRoaW5naWVDbGFzcyhOb25lKQogCkBAIC05MiwxOSArOTIsMTkgQEAKIFB5T2JqZWN0ICpRZFJHQl9OZXcoUkdCQ29sb3JQdHIgaXRzZWxmKQogewogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbCIsIChsb25nKWl0c2VsZi0+cmVkLCAobG9uZylpdHNlbGYtPmdyZWVuLCAobG9uZylpdHNlbGYtPmJsdWUpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGxsIiwgKGxvbmcpaXRzZWxmLT5yZWQsIChsb25nKWl0c2VsZi0+Z3JlZW4sIChsb25nKWl0c2VsZi0+Ymx1ZSk7CiB9CiAKIGludCBRZFJHQl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBSR0JDb2xvclB0ciBwX2l0c2VsZikKIHsKLQlsb25nIHJlZCwgZ3JlZW4sIGJsdWU7Ci0JCi0JaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGwiLCAmcmVkLCAmZ3JlZW4sICZibHVlKSApCi0JCXJldHVybiAwOwotCXBfaXRzZWxmLT5yZWQgPSAodW5zaWduZWQgc2hvcnQpcmVkOwotCXBfaXRzZWxmLT5ncmVlbiA9ICh1bnNpZ25lZCBzaG9ydClncmVlbjsKLQlwX2l0c2VsZi0+Ymx1ZSA9ICh1bnNpZ25lZCBzaG9ydClibHVlOwotCXJldHVybiAxOworICAgICAgICBsb25nIHJlZCwgZ3JlZW4sIGJsdWU7CisKKyAgICAgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGwiLCAmcmVkLCAmZ3JlZW4sICZibHVlKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHBfaXRzZWxmLT5yZWQgPSAodW5zaWduZWQgc2hvcnQpcmVkOworICAgICAgICBwX2l0c2VsZi0+Z3JlZW4gPSAodW5zaWduZWQgc2hvcnQpZ3JlZW47CisgICAgICAgIHBfaXRzZWxmLT5ibHVlID0gKHVuc2lnbmVkIHNob3J0KWJsdWU7CisgICAgICAgIHJldHVybiAxOwogfQogCiAvKgpAQCAtMTE0LDggKzExNCw4IEBACiBQeU9iamVjdCAqUWRGSV9OZXcoRm9udEluZm8gKml0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoaGhoIiwgaXRzZWxmLT5hc2NlbnQsIGl0c2VsZi0+ZGVzY2VudCwKLQkJCWl0c2VsZi0+d2lkTWF4LCBpdHNlbGYtPmxlYWRpbmcpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaCIsIGl0c2VsZi0+YXNjZW50LCBpdHNlbGYtPmRlc2NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPndpZE1heCwgaXRzZWxmLT5sZWFkaW5nKTsKIH0KICIiIgogCkBAIC0xMjUsMTUgKzEyNSwxNSBAQAogKi8KIFB5T2JqZWN0ICpCTU9ial9OZXdDb3BpZWQoQml0TWFwUHRyIGl0c2VsZikKIHsKLQlCaXRNYXBPYmplY3QgKml0OwotCUJpdE1hcFB0ciBpdHNlbGZfY29weTsKLQkKLQlpZiAoKGl0c2VsZl9jb3B5PShCaXRNYXBQdHIpbWFsbG9jKHNpemVvZihCaXRNYXApKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JKml0c2VsZl9jb3B5ID0gKml0c2VsZjsKLQlpdCA9IChCaXRNYXBPYmplY3QgKilCTU9ial9OZXcoaXRzZWxmX2NvcHkpOwotCWl0LT5yZWZlcnJlZF9iaXRtYXAgPSBpdHNlbGZfY29weTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgICAgIEJpdE1hcE9iamVjdCAqaXQ7CisgICAgICAgIEJpdE1hcFB0ciBpdHNlbGZfY29weTsKKworICAgICAgICBpZiAoKGl0c2VsZl9jb3B5PShCaXRNYXBQdHIpbWFsbG9jKHNpemVvZihCaXRNYXApKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgKml0c2VsZl9jb3B5ID0gKml0c2VsZjsKKyAgICAgICAgaXQgPSAoQml0TWFwT2JqZWN0ICopQk1PYmpfTmV3KGl0c2VsZl9jb3B5KTsKKyAgICAgICAgaXQtPnJlZmVycmVkX2JpdG1hcCA9IGl0c2VsZl9jb3B5OworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKICIiIgpAQCAtMTQxLDExMiArMTQxLDExMiBAQAogdmFyaWFibGVzdHVmZiA9ICIiCiAKIGluaXRzdHVmZiA9IGluaXRzdHVmZiArICIiIgotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEJpdE1hcFB0ciwgQk1PYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQml0TWFwUHRyLCBCTU9ial9Db252ZXJ0KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhHcmFmUHRyLCBHcmFmT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdyYWZQdHIsIEdyYWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoUkdCQ29sb3JQdHIsIFFkUkdCX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFJHQkNvbG9yLCBRZFJHQl9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQml0TWFwUHRyLCBCTU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQml0TWFwUHRyLCBCTU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR3JhZlB0ciwgR3JhZk9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoR3JhZlB0ciwgR3JhZk9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoUkdCQ29sb3JQdHIsIFFkUkdCX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChSR0JDb2xvciwgUWRSR0JfQ29udmVydCk7CiAiIiIKIAogIyMgbm90IHlldC4uLgogIyMKICMjY2xhc3MgUmVnaW9uX09iamVjdERlZmluaXRpb24oR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0jIwlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0jIwkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKLSMjCWRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6Ci0jIwkJT3V0cHV0KCJEaXNwb3NlUmVnaW9uKCVzKTsiLCBpdHNlbGZuYW1lKQorIyMgICAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisjIyAgICAgICAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKKyMjICAgICAgZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKKyMjICAgICAgICAgICAgICBPdXRwdXQoIkRpc3Bvc2VSZWdpb24oJXMpOyIsIGl0c2VsZm5hbWUpCiAjIwogIyNjbGFzcyBQb2x5Z29uX09iamVjdERlZmluaXRpb24oR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0jIwlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0jIwkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKLSMjCWRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6Ci0jIwkJT3V0cHV0KCJLaWxsUG9seSglcyk7IiwgaXRzZWxmbmFtZSkKKyMjICAgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorIyMgICAgICAgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisjIyAgICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisjIyAgICAgICAgICAgICAgT3V0cHV0KCJLaWxsUG9seSglcyk7IiwgaXRzZWxmbmFtZSkKIAogY2xhc3MgTXlHUk9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWdldHNldGxpc3QgPSBbCi0JCSgndmlzUmduJywKLQkJIiIiUmduSGFuZGxlIGg9TmV3UmduKCk7IC8qIFhYWFggd3JvbmcgZGlzcG9zZSByb3V0aW5lICovCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFJlc09ial9OZXcsIChIYW5kbGUpR2V0UG9ydFZpc2libGVSZWdpb24oc2VsZi0+b2JfaXRzZWxmLCBoKSk7Ci0JCSIiIiwKLQkJTm9uZSwKLQkJIkNvbnZlbmllbmNlIGF0dHJpYnV0ZTogcmV0dXJuIGEgY29weSBvZiB0aGUgdmlzaWJsZSByZWdpb24iCi0JCSksICgKLQkJJ2NsaXBSZ24nLAotCQkiIiJSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlHZXRQb3J0Q2xpcFJlZ2lvbihzZWxmLT5vYl9pdHNlbGYsIGgpKTsKLQkJIiIiLAotCQlOb25lLAotCQkiQ29udmVuaWVuY2UgYXR0cmlidXRlOiByZXR1cm4gYSBjb3B5IG9mIHRoZSBjbGlwcGluZyByZWdpb24iCi0JCSldCi0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCU91dHB1dCgiI2lmIDEiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIldpbmRvd1JlZiB3aW47IikKLQkJT3V0TGJyYWNlKCJpZiAoV2luT2JqX0NvbnZlcnQodiwgJndpbikgJiYgdikiKQotCQlPdXRwdXQoIipwX2l0c2VsZiA9IChHcmFmUHRyKUdldFdpbmRvd1BvcnQod2luKTsiKQotCQlPdXRwdXQoInJldHVybiAxOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiUHlFcnJfQ2xlYXIoKTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoIiNlbHNlIikKLQkJT3V0TGJyYWNlKCJpZiAoRGxnT2JqX0NoZWNrKHYpKSIpCi0JCU91dHB1dCgiRGlhbG9nUmVmIGRsZyA9IChEaWFsb2dSZWYpKChHcmFmUG9ydE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7IikKLQkJT3V0cHV0KCIqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KEdldERpYWxvZ1dpbmRvdyhkbGcpKTsiKQotCQlPdXRwdXQoInJldHVybiAxOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dExicmFjZSgiaWYgKFdpbk9ial9DaGVjayh2KSkiKQotCQlPdXRwdXQoIldpbmRvd1JlZiB3aW4gPSAoV2luZG93UmVmKSgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOyIpCi0JCU91dHB1dCgiKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydCh3aW4pOyIpCi0JCU91dHB1dCgicmV0dXJuIDE7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCIjZW5kaWYiKQorICAgIGdldHNldGxpc3QgPSBbCisgICAgICAgICAgICAoJ3Zpc1JnbicsCisgICAgICAgICAgICAiIiJSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KKyAgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFJlc09ial9OZXcsIChIYW5kbGUpR2V0UG9ydFZpc2libGVSZWdpb24oc2VsZi0+b2JfaXRzZWxmLCBoKSk7CisgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgIkNvbnZlbmllbmNlIGF0dHJpYnV0ZTogcmV0dXJuIGEgY29weSBvZiB0aGUgdmlzaWJsZSByZWdpb24iCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnY2xpcFJnbicsCisgICAgICAgICAgICAiIiJSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KKyAgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFJlc09ial9OZXcsIChIYW5kbGUpR2V0UG9ydENsaXBSZWdpb24oc2VsZi0+b2JfaXRzZWxmLCBoKSk7CisgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgIkNvbnZlbmllbmNlIGF0dHJpYnV0ZTogcmV0dXJuIGEgY29weSBvZiB0aGUgY2xpcHBpbmcgcmVnaW9uIgorICAgICAgICAgICAgKV0KKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisgICAgZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCIjaWYgMSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiV2luZG93UmVmIHdpbjsiKQorICAgICAgICBPdXRMYnJhY2UoImlmIChXaW5PYmpfQ29udmVydCh2LCAmd2luKSAmJiB2KSIpCisgICAgICAgIE91dHB1dCgiKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydCh3aW4pOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJQeUVycl9DbGVhcigpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiI2Vsc2UiKQorICAgICAgICBPdXRMYnJhY2UoImlmIChEbGdPYmpfQ2hlY2sodikpIikKKyAgICAgICAgT3V0cHV0KCJEaWFsb2dSZWYgZGxnID0gKERpYWxvZ1JlZikoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsiKQorICAgICAgICBPdXRwdXQoIipwX2l0c2VsZiA9IChHcmFmUHRyKUdldFdpbmRvd1BvcnQoR2V0RGlhbG9nV2luZG93KGRsZykpOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0TGJyYWNlKCJpZiAoV2luT2JqX0NoZWNrKHYpKSIpCisgICAgICAgIE91dHB1dCgiV2luZG93UmVmIHdpbiA9IChXaW5kb3dSZWYpKChHcmFmUG9ydE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7IikKKyAgICAgICAgT3V0cHV0KCIqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoIiNlbmRpZiIpCiAKIGNsYXNzIE15Qk1PYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlnZXRzZXRsaXN0ID0gWwotCSgKLQknYmFzZUFkZHInLAotCSdyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc2VsZi0+b2JfaXRzZWxmLT5iYXNlQWRkcik7JywKLQlOb25lLAotCU5vbmUKLQkpLCAoCi0JJ3Jvd0J5dGVzJywKLQkncmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPm9iX2l0c2VsZi0+cm93Qnl0ZXMpOycsCi0JTm9uZSwKLQlOb25lCi0JKSwgKAotCSdib3VuZHMnLAotCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICZzZWxmLT5vYl9pdHNlbGYtPmJvdW5kcyk7JywKLQlOb25lLAotCU5vbmUKLQkpLCAoCi0JJ2JpdG1hcF9kYXRhJywKLQkncmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoQml0TWFwKSk7JywKLQlOb25lLAotCU5vbmUKLQkpLCAoCi0JJ3BpeG1hcF9kYXRhJywKLQkncmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoUGl4TWFwKSk7JywKLQlOb25lLAotCU5vbmUKLQkpXQotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKLQlkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJIyBXZSBuZWVkIHRvIG1vcmUgaXRlbXM6IGEgcG9pbnRlciB0byBwcml2YXRlbHkgYWxsb2NhdGVkIGRhdGEKLQkJIyBhbmQgYSBweXRob24gb2JqZWN0IHdlJ3JlIHJlZmVycmluZyB0by4KLQkJT3V0cHV0KCIlcyBvYl9pdHNlbGY7Iiwgc2VsZi5pdHNlbGZ0eXBlKQotCQlPdXRwdXQoIlB5T2JqZWN0ICpyZWZlcnJlZF9vYmplY3Q7IikKLQkJT3V0cHV0KCJCaXRNYXAgKnJlZmVycmVkX2JpdG1hcDsiKQotCWRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCJpdC0+b2JfaXRzZWxmID0gJXNpdHNlbGY7Iiwgc2VsZi5hcmdyZWYpCi0JCU91dHB1dCgiaXQtPnJlZmVycmVkX29iamVjdCA9IE5VTEw7IikKLQkJT3V0cHV0KCJpdC0+cmVmZXJyZWRfYml0bWFwID0gTlVMTDsiKQotCWRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPnJlZmVycmVkX29iamVjdCk7IikKLQkJT3V0cHV0KCJpZiAoc2VsZi0+cmVmZXJyZWRfYml0bWFwKSBmcmVlKHNlbGYtPnJlZmVycmVkX2JpdG1hcCk7IikJCQorICAgIGdldHNldGxpc3QgPSBbCisgICAgKAorICAgICdiYXNlQWRkcicsCisgICAgJ3JldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5vYl9pdHNlbGYtPmJhc2VBZGRyKTsnLAorICAgIE5vbmUsCisgICAgTm9uZQorICAgICksICgKKyAgICAncm93Qnl0ZXMnLAorICAgICdyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc2VsZi0+b2JfaXRzZWxmLT5yb3dCeXRlcyk7JywKKyAgICBOb25lLAorICAgIE5vbmUKKyAgICApLCAoCisgICAgJ2JvdW5kcycsCisgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJnNlbGYtPm9iX2l0c2VsZi0+Ym91bmRzKTsnLAorICAgIE5vbmUsCisgICAgTm9uZQorICAgICksICgKKyAgICAnYml0bWFwX2RhdGEnLAorICAgICdyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihCaXRNYXApKTsnLAorICAgIE5vbmUsCisgICAgTm9uZQorICAgICksICgKKyAgICAncGl4bWFwX2RhdGEnLAorICAgICdyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihQaXhNYXApKTsnLAorICAgIE5vbmUsCisgICAgTm9uZQorICAgICldCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorICAgIGRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICAjIFdlIG5lZWQgdG8gbW9yZSBpdGVtczogYSBwb2ludGVyIHRvIHByaXZhdGVseSBhbGxvY2F0ZWQgZGF0YQorICAgICAgICAjIGFuZCBhIHB5dGhvbiBvYmplY3Qgd2UncmUgcmVmZXJyaW5nIHRvLgorICAgICAgICBPdXRwdXQoIiVzIG9iX2l0c2VsZjsiLCBzZWxmLml0c2VsZnR5cGUpCisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKnJlZmVycmVkX29iamVjdDsiKQorICAgICAgICBPdXRwdXQoIkJpdE1hcCAqcmVmZXJyZWRfYml0bWFwOyIpCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPdXRwdXQoIml0LT5vYl9pdHNlbGYgPSAlc2l0c2VsZjsiLCBzZWxmLmFyZ3JlZikKKyAgICAgICAgT3V0cHV0KCJpdC0+cmVmZXJyZWRfb2JqZWN0ID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIml0LT5yZWZlcnJlZF9iaXRtYXAgPSBOVUxMOyIpCisgICAgZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+cmVmZXJyZWRfb2JqZWN0KTsiKQorICAgICAgICBPdXRwdXQoImlmIChzZWxmLT5yZWZlcnJlZF9iaXRtYXApIGZyZWUoc2VsZi0+cmVmZXJyZWRfYml0bWFwKTsiKQogCiAjIENyZWF0ZSB0aGUgZ2VuZXJhdG9yIGdyb3VwcyBhbmQgbGluayB0aGVtCiBtb2R1bGUgPSBNYWNNb2R1bGUoTU9ETkFNRSwgTU9EUFJFRklYLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZiwgdmFyaWFibGVzdHVmZikKQEAgLTI4NCw3ICsyODQsNyBAQAogY2hhciAqY3A7CiAKIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpaSIsICZmcm9tLCAmbGVuZ3RoKSApCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogY3AgPSBfc2VsZi0+b2JfaXRzZWxmLT5iYXNlQWRkcitmcm9tOwogX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNwLCBsZW5ndGgpOwogcmV0dXJuIF9yZXM7CkBAIC0yOTksNyArMjk5LDcgQEAKIGNoYXIgKmNwLCAqaWNwOwogCiBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaXMjIiwgJmZyb20sICZpY3AsICZsZW5ndGgpICkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBjcCA9IF9zZWxmLT5vYl9pdHNlbGYtPmJhc2VBZGRyK2Zyb207CiBtZW1jcHkoY3AsIGljcCwgbGVuZ3RoKTsKIFB5X0lOQ1JFRihQeV9Ob25lKTsKQEAgLTMyMSwyNCArMzIxLDI0IEBACiBjaGFyICpkYXRhOwogCiBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyFpTyYiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSwgJnJvd2J5dGVzLCBQeU1hY19HZXRSZWN0LAotCQkmYm91bmRzKSApCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgJmJvdW5kcykgKQorICAgICAgICByZXR1cm4gTlVMTDsKIGRhdGEgPSBQeVN0cmluZ19Bc1N0cmluZyhzb3VyY2UpOwogaWYgKChwdHI9KEJpdE1hcCAqKW1hbGxvYyhzaXplb2YoQml0TWFwKSkpID09IE5VTEwgKQotCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIHB0ci0+YmFzZUFkZHIgPSAoUHRyKWRhdGE7CiBwdHItPnJvd0J5dGVzID0gcm93Ynl0ZXM7CiBwdHItPmJvdW5kcyA9IGJvdW5kczsKIGlmICggKF9yZXMgPSBCTU9ial9OZXcocHRyKSkgPT0gTlVMTCApIHsKLQlmcmVlKHB0cik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIGZyZWUocHRyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiAoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9vYmplY3QgPSBzb3VyY2U7CiBQeV9JTkNSRUYoc291cmNlKTsKICgoQml0TWFwT2JqZWN0ICopX3JlcyktPnJlZmVycmVkX2JpdG1hcCA9IHB0cjsKIHJldHVybiBfcmVzOwogIiIiCi0JCisKIGYgPSBNYW51YWxHZW5lcmF0b3IoIkJpdE1hcCIsIEJpdE1hcF9ib2R5KQogZi5kb2NzdHJpbmcgPSBsYW1iZGE6ICIiIlRha2UgKHN0cmluZywgaW50LCBSZWN0KSBhcmd1bWVudCBhbmQgY3JlYXRlIEJpdE1hcCIiIgogbW9kdWxlLmFkZChmKQpAQCAtMzUxLDIyICszNTEsMjIgQEAKIFB5T2JqZWN0ICpzb3VyY2U7CiAKIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPISIsICZQeVN0cmluZ19UeXBlLCAmc291cmNlKSApCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogaWYgKCBQeVN0cmluZ19TaXplKHNvdXJjZSkgIT0gc2l6ZW9mKEJpdE1hcCkgJiYgUHlTdHJpbmdfU2l6ZShzb3VyY2UpICE9IHNpemVvZihQaXhNYXApICkgewotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIAotCQkiQXJndW1lbnQgc2l6ZSB3YXMgJWQsIHNob3VsZCBiZSAlZCAoc2l6ZW9mIEJpdE1hcCkgb3IgJWQgKHNpemVvZiBQaXhNYXApIiwgCi0JCVB5U3RyaW5nX1NpemUoc291cmNlKSwgc2l6ZW9mKEJpdE1hcCksIHNpemVvZihQaXhNYXApKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiQXJndW1lbnQgc2l6ZSB3YXMgJWQsIHNob3VsZCBiZSAlZCAoc2l6ZW9mIEJpdE1hcCkgb3IgJWQgKHNpemVvZiBQaXhNYXApIiwKKyAgICAgICAgICAgICAgICBQeVN0cmluZ19TaXplKHNvdXJjZSksIHNpemVvZihCaXRNYXApLCBzaXplb2YoUGl4TWFwKSk7CisgICAgICAgIHJldHVybiBOVUxMOwogfQogcHRyID0gKEJpdE1hcFB0cilQeVN0cmluZ19Bc1N0cmluZyhzb3VyY2UpOwogaWYgKCAoX3JlcyA9IEJNT2JqX05ldyhwdHIpKSA9PSBOVUxMICkgewotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIH0KICgoQml0TWFwT2JqZWN0ICopX3JlcyktPnJlZmVycmVkX29iamVjdCA9IHNvdXJjZTsKIFB5X0lOQ1JFRihzb3VyY2UpOwogcmV0dXJuIF9yZXM7CiAiIiIKLQkKKwogZiA9IE1hbnVhbEdlbmVyYXRvcigiUmF3Qml0TWFwIiwgUmF3Qml0TWFwX2JvZHkpCiBmLmRvY3N0cmluZyA9IGxhbWJkYTogIiIiVGFrZSBzdHJpbmcgQml0TWFwIGFuZCB0dXJuIGludG8gQml0TWFwIG9iamVjdCIiIgogbW9kdWxlLmFkZChmKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvcWRvZmZzL3Fkb2Zmc3NjYW4ucHkgYi9NYWMvTW9kdWxlcy9xZG9mZnMvcWRvZmZzc2Nhbi5weQppbmRleCBhZTcwNzA3Li5kNDU2ZTAwIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9xZG9mZnMvcWRvZmZzc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9xZG9mZnMvcWRvZmZzc2Nhbi5weQpAQCAtNyw2MSArNyw2MCBAQAogZnJvbSBzY2FudG9vbHMgaW1wb3J0IFNjYW5uZXIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9ICJRRE9mZnNjcmVlbi5oIgotCW91dHB1dCA9ICJxZG9mZnNnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiUURPZmZzY3JlZW4ucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JaW1wb3J0IHFkb2Zmc3N1cHBvcnQKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gIlFET2Zmc2NyZWVuLmgiCisgICAgb3V0cHV0ID0gInFkb2Zmc2dlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJRRE9mZnNjcmVlbi5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBpbXBvcnQgcWRvZmZzc3VwcG9ydAorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCA9PSAiR1dvcmxkUHRyIiBhbmQgbSBpbiAoIkluTW9kZSIsICJJbk91dE1vZGUiKToKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gIm1ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0ID09ICJHV29ybGRQdHIiIGFuZCBtIGluICgiSW5Nb2RlIiwgIkluT3V0TW9kZSIpOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAibWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSdEaXNwb3NlR1dvcmxkJywgIyBJbXBsaWVkIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkCi0JCQknTmV3R1dvcmxkRnJvbUhCSVRNQVAnLCAjIERvbid0IGtub3cgd2hhdCB0aGUgYXJncyBkbwotCQkJJ0dldEdEZXZpY2VBdHRyaWJ1dGVzJywgIyBXaW5kb3dzLW9ubHkKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICdEaXNwb3NlR1dvcmxkJywgIyBJbXBsaWVkIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkCisgICAgICAgICAgICAgICAgJ05ld0dXb3JsZEZyb21IQklUTUFQJywgIyBEb24ndCBrbm93IHdoYXQgdGhlIGFyZ3MgZG8KKyAgICAgICAgICAgICAgICAnR2V0R0RldmljZUF0dHJpYnV0ZXMnLCAjIFdpbmRvd3Mtb25seQorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkidm9pZF9wdHIiLAkJIyBHZXRHRGV2aWNlU3VyZmFjZSwgYmxhY2tsaXN0ZWQgZm9yIG5vdwotCQkJIlB0ciIsCQkJIyBBZ2FpbiwgZm9yIG5vdyAoYXJyYXkgaXMgcHJvYmFibHkgb2sgaGVyZSkKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJ2b2lkX3B0ciIsICAgICAgICAgICAgICMgR2V0R0RldmljZVN1cmZhY2UsIGJsYWNrbGlzdGVkIGZvciBub3cKKyAgICAgICAgICAgICAgICAiUHRyIiwgICAgICAgICAgICAgICAgICAjIEFnYWluLCBmb3Igbm93IChhcnJheSBpcyBwcm9iYWJseSBvayBoZXJlKQorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJCi0jIyAJCQkoIlVwZGF0ZUdXb3JsZCIsCi0jIyAJCQkgWygiR1dvcmxkUHRyIiwgIioiLCAiT3V0TW9kZSIpXSwKLSMjIAkJCSBbKCIqIiwgIioiLCAiSW5PdXRNb2RlIildKSwKLQkJCSAKLQkJCSMgVGhpcyBvbmUgaXMgaW5jb3JyZWN0OiB3ZSBzYXkgdGhhdCBhbGwgaW5wdXQgZ2RldmljZXMgYXJlCi0JCQkjIG9wdGlvbmFsLCBidXQgc29tZSBhcmUgbm90LiBNb3N0IGFyZSwgaG93ZXZlciwgc28gdXNlcnMgcGFzc2luZwotCQkJIyBOb25lIGZvciBub24tb3B0aW9uYWwgZ2RldmljZXMgd2lsbCBnZXQgYSBxZCBlcnJvciwgSSBndWVzcywgaW4KLQkJCSMgc3RlYWQgb2YgYSBweXRob24gYXJndW1lbnQgZXJyb3IuCi0JCQkoWygiR0RIYW5kbGUiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiT3B0R0RIYW5kbGUiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJXQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworCisjIyAgICAgICAgICAgICAgICAgICAgICAoIlVwZGF0ZUdXb3JsZCIsCisjIyAgICAgICAgICAgICAgICAgICAgICAgWygiR1dvcmxkUHRyIiwgIioiLCAiT3V0TW9kZSIpXSwKKyMjICAgICAgICAgICAgICAgICAgICAgICBbKCIqIiwgIioiLCAiSW5PdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgICMgVGhpcyBvbmUgaXMgaW5jb3JyZWN0OiB3ZSBzYXkgdGhhdCBhbGwgaW5wdXQgZ2RldmljZXMgYXJlCisgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgYnV0IHNvbWUgYXJlIG5vdC4gTW9zdCBhcmUsIGhvd2V2ZXIsIHNvIHVzZXJzIHBhc3NpbmcKKyAgICAgICAgICAgICAgICAjIE5vbmUgZm9yIG5vbi1vcHRpb25hbCBnZGV2aWNlcyB3aWxsIGdldCBhIHFkIGVycm9yLCBJIGd1ZXNzLCBpbgorICAgICAgICAgICAgICAgICMgc3RlYWQgb2YgYSBweXRob24gYXJndW1lbnQgZXJyb3IuCisgICAgICAgICAgICAgICAgKFsoIkdESGFuZGxlIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJPcHRHREhhbmRsZSIsICIqIiwgIkluTW9kZSIpXSksCisgICAgICAgICAgICAgICAgXQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQotCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xZG9mZnMvcWRvZmZzc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL3Fkb2Zmcy9xZG9mZnNzdXBwb3J0LnB5CmluZGV4IDFiZDhmNWEuLjE2MTc3NzMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3Fkb2Zmcy9xZG9mZnNzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL3Fkb2Zmcy9xZG9mZnNzdXBwb3J0LnB5CkBAIC02LDE3ICs2LDE3IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1BQ0hFQURFUkZJTEUgPSAnUURPZmZzY3JlZW4uaCcJCSMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCi1NT0ROQU1FID0gJ19RZG9mZnMnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICdHV29ybGQnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK01BQ0hFQURFUkZJTEUgPSAnUURPZmZzY3JlZW4uaCcgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfUWRvZmZzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ0dXb3JsZCcgICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ1Fkb2ZmcycJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArICdQdHInCQkjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQotT0JKRUNUUFJFRklYID0gT0JKRUNUTkFNRSArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdRZG9mZnMnICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArICdQdHInICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE9CSkVDVE5BTUUgKyAnT2JqJyAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCiAjRURJVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdlZGl0LnB5JyAjIFRoZSBtYW51YWwgZGVmaW5pdGlvbnMKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTQ5LDI4ICs0OSwyOCBAQAogIiIiCiAKIGluaXRzdHVmZiA9IGluaXRzdHVmZiArICIiIgotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEdXb3JsZFB0ciwgR1dvcmxkT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdXb3JsZFB0ciwgR1dvcmxkT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhHV29ybGRQdHIsIEdXb3JsZE9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoR1dvcmxkUHRyLCBHV29ybGRPYmpfQ29udmVydCk7CiAiIiIKIAogY2xhc3MgTXlPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQkjIFhYWFggU2hvdWxkIGluaGVyaXQgZnJvbSBHcmFmUHRyPwotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKLSMjIAlkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0jIyAJCUdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKLSMjIAkJT3V0cHV0KCJTZXRXUmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOyIpCi0jIyAJZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKLSMjIAkJT3V0TGJyYWNlKCJpZiAoRGxnT2JqX0NoZWNrKHYpKSIpCi0jIyAJCU91dHB1dCgiKnBfaXRzZWxmID0gKChXaW5kb3dPYmplY3QgKil2KS0+b2JfaXRzZWxmOyIpCi0jIyAJCU91dHB1dCgicmV0dXJuIDE7IikKLSMjIAkJT3V0UmJyYWNlKCkKLSMjIAkJT3V0KCIiIgotIyMgCQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0jIyAJCWlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoV2luZG93UHRyKVB5SW50X0FzTG9uZyh2KTsgcmV0dXJuIDE7IH0KLSMjIAkJIiIiKQotCWRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6Ci0JCU91dHB1dCgiRGlzcG9zZUdXb3JsZCglcyk7IiwgaXRzZWxmbmFtZSkKKyAgICAjIFhYWFggU2hvdWxkIGluaGVyaXQgZnJvbSBHcmFmUHRyPworICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKKyMjICAgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorIyMgICAgICAgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKKyMjICAgICAgICAgICAgICBPdXRwdXQoIlNldFdSZWZDb24oaXRzZWxmLCAobG9uZylpdCk7IikKKyMjICAgICAgZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKKyMjICAgICAgICAgICAgICBPdXRMYnJhY2UoImlmIChEbGdPYmpfQ2hlY2sodikpIikKKyMjICAgICAgICAgICAgICBPdXRwdXQoIipwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsiKQorIyMgICAgICAgICAgICAgIE91dHB1dCgicmV0dXJuIDE7IikKKyMjICAgICAgICAgICAgICBPdXRSYnJhY2UoKQorIyMgICAgICAgICAgICAgIE91dCgiIiIKKyMjICAgICAgICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisjIyAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChXaW5kb3dQdHIpUHlJbnRfQXNMb25nKHYpOyByZXR1cm4gMTsgfQorIyMgICAgICAgICAgICAgICIiIikKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgorICAgICAgICBPdXRwdXQoIkRpc3Bvc2VHV29ybGQoJXMpOyIsIGl0c2VsZm5hbWUpCiAjIEZyb20gaGVyZSBvbiBpdCdzIGJhc2ljYWxseSBhbGwgYm9pbGVyIHBsYXRlLi4uCiAKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgZ3JvdXBzIGFuZCBsaW5rIHRoZW0KQEAgLTEwMCw3ICsxMDAsNyBAQAogY2hhciAqY3A7CiAKIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmlpIiwgUmVzT2JqX0NvbnZlcnQsICZwbSwgJmZyb20sICZsZW5ndGgpICkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBjcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOwogX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNwLCBsZW5ndGgpOwogcmV0dXJuIF9yZXM7CkBAIC0xMTYsNyArMTE2LDcgQEAKIGNoYXIgKmNwLCAqaWNwOwogCiBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpcyMiLCBSZXNPYmpfQ29udmVydCwgJnBtLCAmZnJvbSwgJmljcCwgJmxlbmd0aCkgKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIGNwID0gR2V0UGl4QmFzZUFkZHIocG0pK2Zyb207CiBtZW1jcHkoY3AsIGljcCwgbGVuZ3RoKTsKIFB5X0lOQ1JFRihQeV9Ob25lKTsKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3F0L3F0c2Nhbi5weSBiL01hYy9Nb2R1bGVzL3F0L3F0c2Nhbi5weQppbmRleCBiNzU2YmZlLi5hMmRiYTE1IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9xdC9xdHNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvcXQvcXRzY2FuLnB5CkBAIC05LDMxMSArOSwzMTEgQEAKIExPTkcgPSAiUXVpY2tUaW1lIgogU0hPUlQgPSAicXQiCiBIRUFERVJGSUxFUz0gKAotIwkiQ29tcG9uZW50cy5oIiAgLS0gSW4gQ2FyYm9uLkNtCi0JIk1vdmllcy5oIiwgCi0JIkltYWdlQ29tcHJlc3Npb24uaCIsIAotCSJRdWlja1RpbWVDb21wb25lbnRzLmgiLAotIwkiSW1hZ2VDb2RlYy5oIiAgLS0gc2VlbXMgbm90IHRvbyB1c2VmdWwsIGFuZCBkaWZmaWN1bHQuCi0jCSJJc29jaHJvbm91c0RhdGFIYW5kbGVycy5oIiAtLSBJcyB0aGlzIHVzZWZ1bD8KLQkiTWVkaWFIYW5kbGVycy5oIiwKLSMJIlFUTUwuaCIsIC0tIFdpbmRvd3Mgb25seSwgbmVlZHMgc2VwYXJhdGUgbW9kdWxlCi0jCSJRdWlja1RpbWVTdHJlYW1pbmcuaCIsIC0tIERpZmZpY3VsdAotIwkiUVRTdHJlYW1pbmdDb21wb25lbnRzLmgiLCAtLSBOZWVkcyBRVFN0cmVhbWluZwotCSJRdWlja1RpbWVNdXNpYy5oIiwKLSMJIlF1aWNrVGltZVZSLmgiLCAtLSBOb3QgZG9uZSB5ZXQKLSMJIlNvdW5kLmgiLCAtLSBJbiBDYXJib24uU25kCi0JKQotT0JKRUNUUyA9ICgiTW92aWUiLCAiVHJhY2siLCAiTWVkaWEiLCAiVXNlckRhdGEiLCAiVGltZUJhc2UiLCAiTW92aWVDb250cm9sbGVyIiwgCi0JIklkbGVNYW5hZ2VyIiwgIlNHT3V0cHV0IikKKyMgICAgICAgIkNvbXBvbmVudHMuaCIgIC0tIEluIENhcmJvbi5DbQorICAgICAgICAiTW92aWVzLmgiLAorICAgICAgICAiSW1hZ2VDb21wcmVzc2lvbi5oIiwKKyAgICAgICAgIlF1aWNrVGltZUNvbXBvbmVudHMuaCIsCisjICAgICAgICJJbWFnZUNvZGVjLmgiICAtLSBzZWVtcyBub3QgdG9vIHVzZWZ1bCwgYW5kIGRpZmZpY3VsdC4KKyMgICAgICAgIklzb2Nocm9ub3VzRGF0YUhhbmRsZXJzLmgiIC0tIElzIHRoaXMgdXNlZnVsPworICAgICAgICAiTWVkaWFIYW5kbGVycy5oIiwKKyMgICAgICAgIlFUTUwuaCIsIC0tIFdpbmRvd3Mgb25seSwgbmVlZHMgc2VwYXJhdGUgbW9kdWxlCisjICAgICAgICJRdWlja1RpbWVTdHJlYW1pbmcuaCIsIC0tIERpZmZpY3VsdAorIyAgICAgICAiUVRTdHJlYW1pbmdDb21wb25lbnRzLmgiLCAtLSBOZWVkcyBRVFN0cmVhbWluZworICAgICAgICAiUXVpY2tUaW1lTXVzaWMuaCIsCisjICAgICAgICJRdWlja1RpbWVWUi5oIiwgLS0gTm90IGRvbmUgeWV0CisjICAgICAgICJTb3VuZC5oIiwgLS0gSW4gQ2FyYm9uLlNuZAorICAgICAgICApCitPQkpFQ1RTID0gKCJNb3ZpZSIsICJUcmFjayIsICJNZWRpYSIsICJVc2VyRGF0YSIsICJUaW1lQmFzZSIsICJNb3ZpZUNvbnRyb2xsZXIiLAorICAgICAgICAiSWRsZU1hbmFnZXIiLCAiU0dPdXRwdXQiKQogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gSEVBREVSRklMRVMKLQlvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlzY2FubmVyLmdlbnR5cGV0ZXN0KFNIT1JUKyJ0eXBldGVzdC5weSIpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBIRUFERVJGSUxFUworICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0IGluIE9CSkVDVFMgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0IGluIE9CSkVDVFMgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgieG1sSWRlbnRpZmllclVucmVjb2duaXplZCA9IC0xXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrQ29udHJvbGxlck1pbmltdW0gPSAtMHhmNzc3XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJub3RJbXBsZW1lbnRlZE11c2ljT1NFcnIgICAgICA9IC0yMDcxXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJjYW50U2VuZFRvU3ludGhlc2l6ZXJPU0VyciAgICA9IC0yMDcyXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJjYW50UmVjZWl2ZUZyb21TeW50aGVzaXplck9TRXJyID0gLTIwNzNcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImlsbGVnYWxWb2ljZUFsbG9jYXRpb25PU0VyciAgID0gLTIwNzRcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImlsbGVnYWxQYXJ0T1NFcnIgICAgICAgICAgICAgID0gLTIwNzVcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImlsbGVnYWxDaGFubmVsT1NFcnIgICAgICAgICAgID0gLTIwNzZcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImlsbGVnYWxLbm9iT1NFcnIgICAgICAgICAgICAgID0gLTIwNzdcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImlsbGVnYWxLbm9iVmFsdWVPU0VyciAgICAgICAgID0gLTIwNzhcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImlsbGVnYWxJbnN0cnVtZW50T1NFcnIgICAgICAgID0gLTIwNzlcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImlsbGVnYWxDb250cm9sbGVyT1NFcnIgICAgICAgID0gLTIwODBcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoIm1pZGlNYW5hZ2VyQWJzZW50T1NFcnIgICAgICAgID0gLTIwODFcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoInN5bnRoZXNpemVyTm90UmVzcG9uZGluZ09TRXJyID0gLTIwODJcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoInN5bnRoZXNpemVyT1NFcnIgICAgICAgICAgICAgID0gLTIwODNcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImlsbGVnYWxOb3RlQ2hhbm5lbE9TRXJyICAgICAgID0gLTIwODRcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoIm5vdGVDaGFubmVsTm90QWxsb2NhdGVkT1NFcnIgID0gLTIwODVcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoInR1bmVQbGF5ZXJGdWxsT1NFcnIgICAgICAgICAgID0gLTIwODZcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoInR1bmVQYXJzZU9TRXJyICAgICAgICAgICAgICAgID0gLTIwODdcbiIpCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoInhtbElkZW50aWZpZXJVbnJlY29nbml6ZWQgPSAtMVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgia0NvbnRyb2xsZXJNaW5pbXVtID0gLTB4Zjc3N1xuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgibm90SW1wbGVtZW50ZWRNdXNpY09TRXJyICAgICAgPSAtMjA3MVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiY2FudFNlbmRUb1N5bnRoZXNpemVyT1NFcnIgICAgPSAtMjA3MlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiY2FudFJlY2VpdmVGcm9tU3ludGhlc2l6ZXJPU0VyciA9IC0yMDczXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsVm9pY2VBbGxvY2F0aW9uT1NFcnIgICA9IC0yMDc0XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsUGFydE9TRXJyICAgICAgICAgICAgICA9IC0yMDc1XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsQ2hhbm5lbE9TRXJyICAgICAgICAgICA9IC0yMDc2XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsS25vYk9TRXJyICAgICAgICAgICAgICA9IC0yMDc3XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsS25vYlZhbHVlT1NFcnIgICAgICAgICA9IC0yMDc4XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsSW5zdHJ1bWVudE9TRXJyICAgICAgICA9IC0yMDc5XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsQ29udHJvbGxlck9TRXJyICAgICAgICA9IC0yMDgwXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJtaWRpTWFuYWdlckFic2VudE9TRXJyICAgICAgICA9IC0yMDgxXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJzeW50aGVzaXplck5vdFJlc3BvbmRpbmdPU0VyciA9IC0yMDgyXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJzeW50aGVzaXplck9TRXJyICAgICAgICAgICAgICA9IC0yMDgzXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsTm90ZUNoYW5uZWxPU0VyciAgICAgICA9IC0yMDg0XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJub3RlQ2hhbm5lbE5vdEFsbG9jYXRlZE9TRXJyICA9IC0yMDg1XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJ0dW5lUGxheWVyRnVsbE9TRXJyICAgICAgICAgICA9IC0yMDg2XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJ0dW5lUGFyc2VPU0VyciAgICAgICAgICAgICAgICA9IC0yMDg3XG4iKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJ4bWxJZGVudGlmaWVyVW5yZWNvZ25pemVkIiwgIyBjb25zdCB3aXRoIGluY29tcGF0aWJsZSBkZWZpbml0aW9uCi0JCQkiRGlzcG9zZU1vdmllIiwJCSMgRG9uZSBvbiBweXRob24tb2JqZWN0IGRpc3Bvc2FsCi0JCQkiRGlzcG9zZU1vdmllVHJhY2siLAkjIGRpdHRvCi0JCQkiRGlzcG9zZVRyYWNrTWVkaWEiLAkjIGRpdHRvCi0JCQkiRGlzcG9zZVVzZXJEYXRhIiwJCSMgZGl0dG8KLSMJCQkiRGlzcG9zZVRpbWVCYXNlIiwJCSMgZGl0dG8KLQkJCSJEaXNwb3NlTW92aWVDb250cm9sbGVyIiwgIyBkaXR0bworICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgInhtbElkZW50aWZpZXJVbnJlY29nbml6ZWQiLCAjIGNvbnN0IHdpdGggaW5jb21wYXRpYmxlIGRlZmluaXRpb24KKyAgICAgICAgICAgICAgICAiRGlzcG9zZU1vdmllIiwgICAgICAgICAjIERvbmUgb24gcHl0aG9uLW9iamVjdCBkaXNwb3NhbAorICAgICAgICAgICAgICAgICJEaXNwb3NlTW92aWVUcmFjayIsICAgICMgZGl0dG8KKyAgICAgICAgICAgICAgICAiRGlzcG9zZVRyYWNrTWVkaWEiLCAgICAjIGRpdHRvCisgICAgICAgICAgICAgICAgIkRpc3Bvc2VVc2VyRGF0YSIsICAgICAgICAgICAgICAjIGRpdHRvCisjICAgICAgICAgICAgICAgICAgICAgICAiRGlzcG9zZVRpbWVCYXNlIiwgICAgICAgICAgICAgICMgZGl0dG8KKyAgICAgICAgICAgICAgICAiRGlzcG9zZU1vdmllQ29udHJvbGxlciIsICMgZGl0dG8KIAotCQkJIyBUaGUgZm9sbG93aW5nIDQgdXNlICd2b2lkIConIGluIGFuIHVuY29udHJvbGxlZCB3YXkKLQkJCSMgVEJEIHdoZW4gSSd2ZSByZWFkIHRoZSBtYW51YWwuLi4KLQkJCSJHZXRVc2VyRGF0YUl0ZW0iLAotCQkJIlNldFVzZXJEYXRhSXRlbSIsCi0JCQkiU2V0VGV4dFNhbXBsZURhdGEiLAotCQkJIkJlZ2luRnVsbFNjcmVlbiIsCi0JCQkjIGJnZW4gZ2V0cyB0aGUgYXJndW1lbnQgaW4vb3V0IHdyb25nLi4KLQkJCSJBZGRUZXh0U2FtcGxlIiwKLQkJCSJBZGRURVNhbXBsZSIsCi0JCQkiQWRkSGlsaXRlU2FtcGxlIiwKLQkJCSJIaWxpdGVUZXh0U2FtcGxlIiwKLQkJCQotCQkJIk1ha2VUcmFja1RpbWVUYWJsZSIsICMgVXNlcyBsb25nICogcmV0dXJuPwotCQkJIk1ha2VNZWRpYVRpbWVUYWJsZSIsICMgZGl0dG8KLSMjCQkJIlZpZGVvTWVkaWFHZXRTdGFsbENvdW50IiwgIyBVbmRlZmluZWQgaW4gQ1cgUHJvIDMgbGlicmFyeQotCQkJIyBPUzggb25seToKLQkJCSdTcHJpdGVNZWRpYUdldEluZEltYWdlUHJvcGVydHknLAkjIFhYWFggV2h5IGlzbid0IHRoaXMgaW4gY2FyYm9uPwotCQkJJ0NoZWNrUXVpY2tUaW1lUmVnaXN0cmF0aW9uJywKLQkJCSdTZXRNb3ZpZUFuY2hvckRhdGFSZWYnLAotCQkJJ0dldE1vdmllQW5jaG9yRGF0YVJlZicsCi0JCQknR2V0TW92aWVMb2FkU3RhdGUnLAotCQkJJ09wZW5BRGF0YUhhbmRsZXInLAotCQkJJ01vdmllTWVkaWFHZXRDdXJyZW50TW92aWVQcm9wZXJ0eScsCi0JCQknTW92aWVNZWRpYUdldEN1cnJlbnRUcmFja1Byb3BlcnR5JywKLQkJCSdNb3ZpZU1lZGlhR2V0Q2hpbGRNb3ZpZURhdGFSZWZlcmVuY2UnLAotCQkJJ01vdmllTWVkaWFTZXRDaGlsZE1vdmllRGF0YVJlZmVyZW5jZScsCi0JCQknTW92aWVNZWRpYUxvYWRDaGlsZE1vdmllRnJvbURhdGFSZWZlcmVuY2UnLAotCQkJJ01lZGlhM0RHZXRWaWV3T2JqZWN0JywKKyAgICAgICAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgNCB1c2UgJ3ZvaWQgKicgaW4gYW4gdW5jb250cm9sbGVkIHdheQorICAgICAgICAgICAgICAgICMgVEJEIHdoZW4gSSd2ZSByZWFkIHRoZSBtYW51YWwuLi4KKyAgICAgICAgICAgICAgICAiR2V0VXNlckRhdGFJdGVtIiwKKyAgICAgICAgICAgICAgICAiU2V0VXNlckRhdGFJdGVtIiwKKyAgICAgICAgICAgICAgICAiU2V0VGV4dFNhbXBsZURhdGEiLAorICAgICAgICAgICAgICAgICJCZWdpbkZ1bGxTY3JlZW4iLAorICAgICAgICAgICAgICAgICMgYmdlbiBnZXRzIHRoZSBhcmd1bWVudCBpbi9vdXQgd3JvbmcuLgorICAgICAgICAgICAgICAgICJBZGRUZXh0U2FtcGxlIiwKKyAgICAgICAgICAgICAgICAiQWRkVEVTYW1wbGUiLAorICAgICAgICAgICAgICAgICJBZGRIaWxpdGVTYW1wbGUiLAorICAgICAgICAgICAgICAgICJIaWxpdGVUZXh0U2FtcGxlIiwKIAotICAgICAgICAgICAgIyB0aGVzZSBhcmUgSW1hZ2VDb21wcmVzc2lvbiBibGFja2xpc3RzCi0JCQkiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFB0ciIsCi0JCQkKLQkJCSMgUXVpY2tUaW1lQ29tcG9uZW50cwotCQkJIyBUaGVzZSB0d28gbmVlZCBzb21lIGhlbHA6IHRoZSBmaXJzdCByZXR1cm5zIGEgcG9pbnQgdG8gYSBkYXRhYnVmZmVyIHRoYXQKLQkJCSMgdGhlIHNlY29uZCBkaXNwb3Nlcy4gR2VuZXJhdGUgbWFudWFsbHk/Ci0JCQkiVkRDb21wcmVzc0RvbmUiLAotCQkJIlZEUmVsZWFzZUNvbXByZXNzQnVmZmVyIiwKLQkJCSJRVFZpZGVvT3V0cHV0R2V0R1dvcmxkUGFyYW1ldGVycyIsICMgSG93IHVzZWZ1bCBpcyB0aGlzPwotCQkJCi0JCQkjIE1lZGlhSGFuZGxlcnMKLQkJCSJNZWRpYU1ha2VNZWRpYVRpbWVUYWJsZSIsICMganVzdCBsYXp5Ci0JCQkiTWVkaWFHZXRTYW1wbGVEYXRhUG9pbnRlciIsICMgZnVubnkgb3V0cHV0IHBvaW50ZXIKLQkJCQotCQkJIyBRdWlja1RpbWVNdXNpYwotCQkJImtDb250cm9sbGVyTWluaW11bSIsCi0JCQkjIFRoZXNlIGFyZSBhcnRlZmFjdHMgb2YgYSBtYWNybyBkZWZpbml0aW9uCi0JCQkidWxlbiIsCi0JCQkiX2V4dCIsCi0JCQkieCIsCi0JCQkidzEiLAotCQkJIncyIiwKLQkJCV0KKyAgICAgICAgICAgICAgICAiTWFrZVRyYWNrVGltZVRhYmxlIiwgIyBVc2VzIGxvbmcgKiByZXR1cm4/CisgICAgICAgICAgICAgICAgIk1ha2VNZWRpYVRpbWVUYWJsZSIsICMgZGl0dG8KKyMjICAgICAgICAgICAgICAgICAgICAgICJWaWRlb01lZGlhR2V0U3RhbGxDb3VudCIsICMgVW5kZWZpbmVkIGluIENXIFBybyAzIGxpYnJhcnkKKyAgICAgICAgICAgICAgICAjIE9TOCBvbmx5OgorICAgICAgICAgICAgICAgICdTcHJpdGVNZWRpYUdldEluZEltYWdlUHJvcGVydHknLCAgICAgICAjIFhYWFggV2h5IGlzbid0IHRoaXMgaW4gY2FyYm9uPworICAgICAgICAgICAgICAgICdDaGVja1F1aWNrVGltZVJlZ2lzdHJhdGlvbicsCisgICAgICAgICAgICAgICAgJ1NldE1vdmllQW5jaG9yRGF0YVJlZicsCisgICAgICAgICAgICAgICAgJ0dldE1vdmllQW5jaG9yRGF0YVJlZicsCisgICAgICAgICAgICAgICAgJ0dldE1vdmllTG9hZFN0YXRlJywKKyAgICAgICAgICAgICAgICAnT3BlbkFEYXRhSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ01vdmllTWVkaWFHZXRDdXJyZW50TW92aWVQcm9wZXJ0eScsCisgICAgICAgICAgICAgICAgJ01vdmllTWVkaWFHZXRDdXJyZW50VHJhY2tQcm9wZXJ0eScsCisgICAgICAgICAgICAgICAgJ01vdmllTWVkaWFHZXRDaGlsZE1vdmllRGF0YVJlZmVyZW5jZScsCisgICAgICAgICAgICAgICAgJ01vdmllTWVkaWFTZXRDaGlsZE1vdmllRGF0YVJlZmVyZW5jZScsCisgICAgICAgICAgICAgICAgJ01vdmllTWVkaWFMb2FkQ2hpbGRNb3ZpZUZyb21EYXRhUmVmZXJlbmNlJywKKyAgICAgICAgICAgICAgICAnTWVkaWEzREdldFZpZXdPYmplY3QnLAogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSMgSSBkb24ndCB0aGluayB3ZSB3YW50IHRvIGRvIHRoZXNlCi0JCQkiUVRTeW5jVGFza1B0ciIsCi0JCQkjIFdlIGRvbnQgZG8gY2FsbGJhY2tzIHlldCwgc28gbm8gbmVlZCBmb3IgdGhlc2UKLQkJCSJRVENhbGxCYWNrIiwKLQkJCSMgU2tpcHBlZCBmb3Igbm93LCBkdWUgdG8gbGF6aW5lc3MKLQkJCSJUcmFja0VkaXRTdGF0ZSIsCi0JCQkiTW92aWVFZGl0U3RhdGUiLAotCQkJIk1hdHJpeFJlY29yZCIsCi0JCQkiTWF0cml4UmVjb3JkX3B0ciIsCi0JCQkiU2FtcGxlUmVmZXJlbmNlUHRyIiwKLQkJCSJRVFR3ZWVuZXIiLAotCQkJIlFURXJyb3JSZXBsYWNlbWVudFB0ciIsCi0JCQkiUVRSZXN0cmljdGlvblNldCIsCi0JCQkiUVRVVUlEIiwKLQkJCSJRVFVVSURfcHRyIiwKKyAgICAjIHRoZXNlIGFyZSBJbWFnZUNvbXByZXNzaW9uIGJsYWNrbGlzdHMKKyAgICAgICAgICAgICAgICAiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFB0ciIsCiAKLQkJCSMgUm91dGluZSBwb2ludGVycywgbm90IHlldC4KLQkJCSJNb3ZpZXNFcnJvclVQUCIsCi0JCQkiTW92aWVQcmV2aWV3Q2FsbE91dFVQUCIsCi0JCQkiTW92aWVEcmF3aW5nQ29tcGxldGVVUFAiLAotCQkJIlFUQ2FsbEJhY2tVUFAiLAotCQkJIlRleHRNZWRpYVVQUCIsCi0JCQkiTW92aWVQcm9ncmVzc1VQUCIsCi0JCQkiTW92aWVSZ25Db3ZlclVQUCIsCi0JCQkiTUNBY3Rpb25GaWx0ZXJVUFAiLAotCQkJIk1DQWN0aW9uRmlsdGVyV2l0aFJlZkNvblVQUCIsCi0JCQkiR2V0TW92aWVVUFAiLAotCQkJIk1vZGFsRmlsdGVyVVBQIiwKLQkJCSJUcmFja1RyYW5zZmVyVVBQIiwKLQkJCSJNb3ZpZVByZVByZXJvbGxDb21wbGV0ZVVQUCIsCi0JCQkiTW92aWVFeGVjdXRlV2lyZWRBY3Rpb25zVVBQIiwKLQkJCSJRVEJhbmR3aWR0aE5vdGlmaWNhdGlvblVQUCIsCi0JCQkiRG9NQ0FjdGlvblVQUCIsCi0JCQkiUVROZXh0VGFza05lZWRlZFNvb25lckNhbGxiYWNrVVBQIiwKLQkJCQotCQkJIlNhbXBsZVJlZmVyZW5jZTY0UHRyIiwJIyBEb24ndCBrbm93IHdoYXQgdGhpcyBkb2VzLCB5ZXQKLQkJCSJRVFJ1bnRpbWVTcHJpdGVEZXNjUHRyIiwKLQkJCSJRVEJhbmR3aWR0aFJlZmVyZW5jZSIsCi0JCQkiUVRTY2hlZHVsZWRCYW5kd2lkdGhSZWZlcmVuY2UiLAotCQkJIlFUQXRvbUNvbnRhaW5lciIsCi0JCQkiU3ByaXRlV29ybGQiLAotCQkJIlNwcml0ZSIsCisgICAgICAgICAgICAgICAgIyBRdWlja1RpbWVDb21wb25lbnRzCisgICAgICAgICAgICAgICAgIyBUaGVzZSB0d28gbmVlZCBzb21lIGhlbHA6IHRoZSBmaXJzdCByZXR1cm5zIGEgcG9pbnQgdG8gYSBkYXRhYnVmZmVyIHRoYXQKKyAgICAgICAgICAgICAgICAjIHRoZSBzZWNvbmQgZGlzcG9zZXMuIEdlbmVyYXRlIG1hbnVhbGx5PworICAgICAgICAgICAgICAgICJWRENvbXByZXNzRG9uZSIsCisgICAgICAgICAgICAgICAgIlZEUmVsZWFzZUNvbXByZXNzQnVmZmVyIiwKKyAgICAgICAgICAgICAgICAiUVRWaWRlb091dHB1dEdldEdXb3JsZFBhcmFtZXRlcnMiLCAjIEhvdyB1c2VmdWwgaXMgdGhpcz8KIAotICAgICAgICAgICAgIyB0aGVzZSBhcmUgSW1hZ2VDb21wcmVzc2lvbiBibGFja2xpc3RzCi0gICAgICAgICAgICAiSUNNRGF0YVVQUCIsCi0gICAgICAgICAgICAiSUNNRmx1c2hVUFAiLAotICAgICAgICAgICAgIklDTUNvbXBsZXRpb25VUFAiLAotICAgICAgICAgICAgIklDTVByb2dyZXNzVVBQIiwKLSAgICAgICAgICAgICJTdGRQaXhVUFAiLAotICAgICAgICAgICAgIlFEUGl4VVBQIiwKLSAgICAgICAgICAgICJJQ01BbGlnbm1lbnRVUFAiLAotICAgICAgICAgICAgIklDTUN1cnNvclNoaWVsZGVkVVBQIiwKLSAgICAgICAgICAgICJJQ01NZW1vcnlEaXNwb3NlZFVQUCIsCi0gICAgICAgICAgICAiSUNNQ29udmVydERhdGFGb3JtYXRVUFAiLAotICAgICAgICAgICAgIk1vZGFsRmlsdGVyWURVUFAiLAotCQkJIkZpbGVGaWx0ZXJVUFAiLAorICAgICAgICAgICAgICAgICMgTWVkaWFIYW5kbGVycworICAgICAgICAgICAgICAgICJNZWRpYU1ha2VNZWRpYVRpbWVUYWJsZSIsICMganVzdCBsYXp5CisgICAgICAgICAgICAgICAgIk1lZGlhR2V0U2FtcGxlRGF0YVBvaW50ZXIiLCAjIGZ1bm55IG91dHB1dCBwb2ludGVyCiAKLSAgICAgICAgICAgICJDb2RlY05hbWVTcGVjTGlzdFB0ciIsCi0gICAgICAgICAgICAiQ29kZWNJbmZvIiwKLSAgICAgICAgICAgICAiSW1hZ2VTZXF1ZW5jZSIsCi0gICAgICAgICAgICAiTWF0cml4UmVjb3JkUHRyIiwKLSAgICAgICAgICAgICJJQ01EYXRhUHJvY1JlY29yZFB0ciIsCi0gICAgICAgICAgICAiT3BlbkNQaWNQYXJhbXMiLAotICAgICAgICAgICAgIklDTVByb2dyZXNzUHJvY1JlY29yZFB0ciIsCi0gICAgICAgICAgICAiSUNNQWxpZ25tZW50UHJvY1JlY29yZFB0ciIsCi0gICAgICAgICAgICAiSUNNUGl4ZWxGb3JtYXRJbmZvUHRyIiwKLSAgICAgICAgICAgICJJbWFnZVNlcXVlbmNlRGF0YVNvdXJjZSIsCi0gICAgICAgICAgICAiQ29uc3RTdHJGaWxlTmFtZVBhcmFtIiwKLSAgICAgICAgICAgICJJbWFnZVRyYW5zY29kZVNlcXVlbmNlIiwKLSAgICAgICAgICAgICJJbWFnZUZpZWxkU2VxdWVuY2UiLAotICAgICAgICAgICAgIkZyYWN0IiwKLSAgICAgICAgICAgICJQaXhNYXBQdHIiLAotICAgICAgICAgICAgIkdXb3JsZEZsYWdzIiwKLSAgICAgICAgICAgICJ2b2lkX3B0ciIsICAgIyBYWFggQmVpbmcgbGF6eSwgdGhpcyBvbmUgaXMgZG9hYmxlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICAjIFRoZXNlIGFyZSBmcm9tIFF1aWNrVGltZUNvbXBvbmVudHMKLSAgICAgICAgICAgICJDRGF0YUhhbmRsZXJVUFAiLAotICAgICAgICAgICAgIkNoYXJEYXRhSGFuZGxlclVQUCIsCi0gICAgICAgICAgICAiQ29tbWVudEhhbmRsZXJVUFAiLAotICAgICAgICAgICAgIkRhdGFIQ29tcGxldGlvblVQUCIsCi0gICAgICAgICAgICAiJ01vdmllRXhwb3J0R2V0RGF0YVVQUCIsCi0gICAgICAgICAgICAiTW92aWVFeHBvcnRHZXRQcm9wZXJ0eVVQUCIsCi0gICAgICAgICAgICAiUHJlcHJvY2Vzc0luc3RydWN0aW9uSGFuZGxlclVQUCIsCi0gICAgICAgICAgICAiU0dNb2RhbEZpbHRlclVQUCIsCi0gICAgICAgICAgICAiU3RhcnREb2N1bWVudEhhbmRsZXJVUFAiLAotICAgICAgICAgICAgIlN0YXJ0RWxlbWVudEhhbmRsZXJVUFAiLAotICAgICAgICAgICAgIlZkaWdJbnRVUFAiLAotICAgICAgICAgICAgIlNHRGF0YVVQUCIsCi0gICAgICAgICAgICAiRW5kRG9jdW1lbnRIYW5kbGVyVVBQIiwKLSAgICAgICAgICAgICJFbmRFbGVtZW50SGFuZGxlclVQUCIsCi0gICAgICAgICAgICAiVmlkZW9Cb3R0bGVzIiwgIyBSZWNvcmQgZnVsbCBvZiBVUFBzCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICJTQ1BhcmFtcyIsCi0gICAgICAgICAgICAiSUNNQ29tcGxldGlvblByb2NSZWNvcmRQdHIiLAotICAgICAgICAgICAgIkRhdGFIVm9sdW1lTGlzdCIsCi0gICAgICAgICAgICAiRGlnaXRpemVySW5mbyIsCi0gICAgICAgICAgICAiU0dDb21wcmVzc0luZm8iLAotICAgICAgICAgICAgIlNlcUdyYWJFeHRlbmRlZEZyYW1lSW5mb1B0ciIsCi0gICAgICAgICAgICAiU2VxR3JhYkZyYW1lSW5mb1B0ciIsCi0gICAgICAgICAgICAiVENUZXh0T3B0aW9uc1B0ciIsCi0gICAgICAgICAgICAiU0dDb21wcmVzc0luZm9fcHRyIiwKLSAgICAgICAgICAgICJTR0RldmljZUxpc3QiLAotICAgICAgICAgICAgIlRleHREaXNwbGF5RGF0YSIsCi0gICAgICAgICAgICAiVGltZUNvZGVEZWYiLAotICAgICAgICAgICAgIlRpbWVDb2RlUmVjb3JkIiwKLSAgICAgICAgICAgICJUd2VlblJlY29yZCIsCi0gICAgICAgICAgICAiVkRHYW1SZWNQdHIiLAotICAgICAgICAgICAgIlRvbmVEZXNjcmlwdGlvbiIsIAkjIFhYWFggSnVzdCBsYXp5OiB0aGlzIG9uZSBpcyBlYXN5LgotICAgICAgICAgICAgIlhNTERvYyIsCi0gICAgICAgICAgICAiVUludDY0IiwgCSMgWFhYWCBsYXp5Ci0gICAgICAgICAgICAiVUludDY0X3B0ciIsICMgWFhYWCBsYXp5Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICMgRnJvbSBNZWRpYUhhbmRsZXJzCi0gICAgICAgICAgICAiQWN0aW9uc1VQUCIsCi0gICAgICAgICAgICAiUHJlUHJlcm9sbENvbXBsZXRlVVBQIiwKLSAgICAgICAgICAgICJDb2RlY0NvbXBvbmVudEhhbmRsZSIsICMgRGlmZmljdWx0OiBoYW5kbGUgY29udGFpbmluZyBsaXN0IG9mIGNvbXBvbmVudHMuCi0gICAgICAgICAgICAiR2V0TW92aWVDb21wbGV0ZVBhcmFtcyIsICMgSW1tZW5zZSBzdHJ1Y3QKLSAgICAgICAgICAgICJMZXZlbE1ldGVySW5mb1B0ciIsICMgTGF6eS4gQWxzbzogY2FuIGJlIGFuIG91dHB1dCBwYXJhbWV0ZXIhIQotICAgICAgICAgICAgIk1lZGlhRVFTcGVjdHJ1bUJhbmRzUmVjb3JkUHRyIiwgIyBkaXR0bwotICAgICAgICAgICAgCi0gICAgICAgICAgICAjIEZyb20gUXVpY2tUaW1lTXVzaWMKLSAgICAgICAgICAgICJNdXNpY01JRElTZW5kVVBQIiwKLSAgICAgICAgICAgICJNdXNpY09mZmxpbmVEYXRhVVBQIiwKLSAgICAgICAgICAgICJUdW5lQ2FsbEJhY2tVUFAiLAotICAgICAgICAgICAgIlR1bmVQbGF5Q2FsbEJhY2tVUFAiLAotICAgICAgICAgICAgIkdDUGFydCIsICMgU3RydWN0IHdpdGggbG90cyBvZiBmaWVsZHMKLSAgICAgICAgICAgICJHQ1BhcnRfcHRyIiwKLSAgICAgICAgICAgICJHZW5lcmljS25vYkRlc2NyaXB0aW9uIiwgIyBTdHJ1Y3Qgd2l0aCBsb3RzIG9mIGZpZWxkcwotICAgICAgICAgICAgIktub2JEZXNjcmlwdGlvbiIsICAjIFN0cnVjdCB3aXRoIGxvdHMgb2YgZmllbGRzCi0gICAgICAgICAgICAiSW5zdHJ1bWVudEFib3V0SW5mbyIsICMgU3RydWN0LCBub3QgdG9vIGRpZmZpY3VsdAotICAgICAgICAgICAgIk5vdGVDaGFubmVsIiwgIyBYWFhYIExhenkuIENvdWxkIGJlIG9wYXF1ZSwgSSB0aGluawotICAgICAgICAgICAgIk5vdGVSZXF1ZXN0IiwgIyBYWFhYIExhenkuIE5vdC10b28tZGlmZmljdWx0IHN0cnVjdAotICAgICAgICAgICAgIlN5bnRoZXNpemVyQ29ubmVjdGlvbnMiLCAjIFN0cnVjdCB3aXRoIGxvdHMgb2YgZmllbGRzCi0gICAgICAgICAgICAiU3ludGhlc2l6ZXJEZXNjcmlwdGlvbiIsICMgU3RydWN0IHdpdGggbG90cyBvZiBmaWVsZHMKLSAgICAgICAgICAgICJUdW5lU3RhdHVzIiwgIyBTdHJ1Y3Qgd2l0aCBsb3RzIG9mIGZpZWxkcwotICAgICAgICAgICAgCi0JCQldCisgICAgICAgICAgICAgICAgIyBRdWlja1RpbWVNdXNpYworICAgICAgICAgICAgICAgICJrQ29udHJvbGxlck1pbmltdW0iLAorICAgICAgICAgICAgICAgICMgVGhlc2UgYXJlIGFydGVmYWN0cyBvZiBhIG1hY3JvIGRlZmluaXRpb24KKyAgICAgICAgICAgICAgICAidWxlbiIsCisgICAgICAgICAgICAgICAgIl9leHQiLAorICAgICAgICAgICAgICAgICJ4IiwKKyAgICAgICAgICAgICAgICAidzEiLAorICAgICAgICAgICAgICAgICJ3MiIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygnRlNTcGVjJywgJyonLCAnT3V0TW9kZScpXSwgWygnRlNTcGVjX3B0cicsICcqJywgJ0luTW9kZScpXSksCi0JCQkKLQkJCSMgTW92aWUgY29udHJvbGxlciBjcmVhdGlvbgotCQkJKFsoJ0NvbXBvbmVudEluc3RhbmNlJywgJ05ld01vdmllQ29udHJvbGxlcicsICdSZXR1cm5Nb2RlJyldLAotCQkJIFsoJ01vdmllQ29udHJvbGxlcicsICcqJywgJ1JldHVybk1vZGUnKV0pLAotCQkJIAotCQkJIyBOZXdNb3ZpZUZyb21GaWxlCi0JCQkoWygnc2hvcnQnLCAncmVzSWQnLCAnT3V0TW9kZScpLCAoJ1N0cmluZ1B0cicsICdyZXNOYW1lJywgJ0luTW9kZScpXSwKLQkJCSBbKCdzaG9ydCcsICdyZXNJZCcsICdJbk91dE1vZGUnKSwgKCdkdW1teVN0cmluZ1B0cicsICdyZXNOYW1lJywgJ0luTW9kZScpXSksCi0JCQkgCi0JCQkjIE1DRG9BY3Rpb24gYW5kIG1vcmUKLQkJCShbKCd2b2lkJywgJyonLCAnT3V0TW9kZScpXSwgWygnbWNhY3Rpb25wYXJhbXMnLCAnKicsICdJbk1vZGUnKV0pLAotCQkJCi0JCQkjIFNldFRpbWVCYXNlWmVyby4gRG9lcyBub3QgaGFuZGxlIE5VTExzLCB1bmZvcnR1bmF0ZWx5Ci0JCQkoWygnVGltZVJlY29yZCcsICd6ZXJvJywgJ091dE1vZGUnKV0sIFsoJ1RpbWVSZWNvcmQnLCAnemVybycsICdJbk1vZGUnKV0pLAotCQkJCi0JCQkjIENvbnZlcnRUaW1lIGFuZCBDb252ZXJ0VGltZVNjYWxlCi0JCQkoWygnVGltZVJlY29yZCcsICdpbm91dCcsICdPdXRNb2RlJyldLCBbKCdUaW1lUmVjb3JkJywgJ2lub3V0JywgJ0luT3V0TW9kZScpXSksCi0JCQkoWygnVGltZVJlY29yZCcsICd0aGVUaW1lJywgJ091dE1vZGUnKV0sIFsoJ1RpbWVSZWNvcmQnLCAndGhlVGltZScsICdJbk91dE1vZGUnKV0pLAotCQkJCi0JCQkjIEFkZFRpbWUgYW5kIFN1YnRyYWN0VGltZQotCQkJKFsoJ1RpbWVSZWNvcmQnLCAnZHN0JywgJ091dE1vZGUnKV0sIFsoJ1RpbWVSZWNvcmQnLCAnZHN0JywgJ0luT3V0TW9kZScpXSksCi0JCQkKLQkJCSMgRnVubnkgZGVmaW5pdGlvbnMKLQkJCShbKCdjaGFyX3B0cicsICcqJywgJ0luTW9kZScpXSwgWygnc3RyaW5ncHRyJywgJyonLCAnSW5Nb2RlJyldKSwKLQkJCShbKCdGU1NwZWNQdHInLCAnKicsICdJbk1vZGUnKV0sIFsoJ0ZTU3BlY19wdHInLCAnKicsICdJbk1vZGUnKV0pLAotCQkJKFsoJ3Vuc2lnbmVkX2NoYXInLCAnc3dmVmVyc2lvbicsICdPdXRNb2RlJyldLCBbKCdVSW50OCcsICdzd2ZWZXJzaW9uJywgJ091dE1vZGUnKV0pLAotCQkJCi0JCQkjIEl0IHNlZW1zIE11c2ljTUlESVBhY2tldCBpZiBuZXZlciBmbGFnZ2VkIHdpdGggY29uc3QgYnV0IGFsd2F5cyB1c2VkCi0JCQkjIGZvciBzZW5kaW5nIG9ubHkuIElmIHRoYXQgZXZlciBjaGFuZ2VzIHRoaXMgbmVlZHMgdG8gYmUgZml4ZWQuCi0JCQkoWygnTXVzaWNNSURJUGFja2V0JywgJyonLCAnT3V0TW9kZScpXSwgWygnTXVzaWNNSURJUGFja2V0X3B0cicsICcqJywgJ0luTW9kZScpXSksCi0JCQkKLQkJCSMgUVRNdXNpYyBjb25zdC1sZXNzIGlucHV0IHBhcmFtZXRlcnMKLQkJCShbKCd1bnNpZ25lZF9sb25nJywgJ2hlYWRlcicsICdPdXRNb2RlJyldLCBbKCdVbnNpZ25lZExvbmdQdHInLCAnaGVhZGVyJywgJ0luTW9kZScpXSksCi0JCQldCi0JCQkKKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICMgSSBkb24ndCB0aGluayB3ZSB3YW50IHRvIGRvIHRoZXNlCisgICAgICAgICAgICAgICAgIlFUU3luY1Rhc2tQdHIiLAorICAgICAgICAgICAgICAgICMgV2UgZG9udCBkbyBjYWxsYmFja3MgeWV0LCBzbyBubyBuZWVkIGZvciB0aGVzZQorICAgICAgICAgICAgICAgICJRVENhbGxCYWNrIiwKKyAgICAgICAgICAgICAgICAjIFNraXBwZWQgZm9yIG5vdywgZHVlIHRvIGxhemluZXNzCisgICAgICAgICAgICAgICAgIlRyYWNrRWRpdFN0YXRlIiwKKyAgICAgICAgICAgICAgICAiTW92aWVFZGl0U3RhdGUiLAorICAgICAgICAgICAgICAgICJNYXRyaXhSZWNvcmQiLAorICAgICAgICAgICAgICAgICJNYXRyaXhSZWNvcmRfcHRyIiwKKyAgICAgICAgICAgICAgICAiU2FtcGxlUmVmZXJlbmNlUHRyIiwKKyAgICAgICAgICAgICAgICAiUVRUd2VlbmVyIiwKKyAgICAgICAgICAgICAgICAiUVRFcnJvclJlcGxhY2VtZW50UHRyIiwKKyAgICAgICAgICAgICAgICAiUVRSZXN0cmljdGlvblNldCIsCisgICAgICAgICAgICAgICAgIlFUVVVJRCIsCisgICAgICAgICAgICAgICAgIlFUVVVJRF9wdHIiLAorCisgICAgICAgICAgICAgICAgIyBSb3V0aW5lIHBvaW50ZXJzLCBub3QgeWV0LgorICAgICAgICAgICAgICAgICJNb3ZpZXNFcnJvclVQUCIsCisgICAgICAgICAgICAgICAgIk1vdmllUHJldmlld0NhbGxPdXRVUFAiLAorICAgICAgICAgICAgICAgICJNb3ZpZURyYXdpbmdDb21wbGV0ZVVQUCIsCisgICAgICAgICAgICAgICAgIlFUQ2FsbEJhY2tVUFAiLAorICAgICAgICAgICAgICAgICJUZXh0TWVkaWFVUFAiLAorICAgICAgICAgICAgICAgICJNb3ZpZVByb2dyZXNzVVBQIiwKKyAgICAgICAgICAgICAgICAiTW92aWVSZ25Db3ZlclVQUCIsCisgICAgICAgICAgICAgICAgIk1DQWN0aW9uRmlsdGVyVVBQIiwKKyAgICAgICAgICAgICAgICAiTUNBY3Rpb25GaWx0ZXJXaXRoUmVmQ29uVVBQIiwKKyAgICAgICAgICAgICAgICAiR2V0TW92aWVVUFAiLAorICAgICAgICAgICAgICAgICJNb2RhbEZpbHRlclVQUCIsCisgICAgICAgICAgICAgICAgIlRyYWNrVHJhbnNmZXJVUFAiLAorICAgICAgICAgICAgICAgICJNb3ZpZVByZVByZXJvbGxDb21wbGV0ZVVQUCIsCisgICAgICAgICAgICAgICAgIk1vdmllRXhlY3V0ZVdpcmVkQWN0aW9uc1VQUCIsCisgICAgICAgICAgICAgICAgIlFUQmFuZHdpZHRoTm90aWZpY2F0aW9uVVBQIiwKKyAgICAgICAgICAgICAgICAiRG9NQ0FjdGlvblVQUCIsCisgICAgICAgICAgICAgICAgIlFUTmV4dFRhc2tOZWVkZWRTb29uZXJDYWxsYmFja1VQUCIsCisKKyAgICAgICAgICAgICAgICAiU2FtcGxlUmVmZXJlbmNlNjRQdHIiLCAjIERvbid0IGtub3cgd2hhdCB0aGlzIGRvZXMsIHlldAorICAgICAgICAgICAgICAgICJRVFJ1bnRpbWVTcHJpdGVEZXNjUHRyIiwKKyAgICAgICAgICAgICAgICAiUVRCYW5kd2lkdGhSZWZlcmVuY2UiLAorICAgICAgICAgICAgICAgICJRVFNjaGVkdWxlZEJhbmR3aWR0aFJlZmVyZW5jZSIsCisgICAgICAgICAgICAgICAgIlFUQXRvbUNvbnRhaW5lciIsCisgICAgICAgICAgICAgICAgIlNwcml0ZVdvcmxkIiwKKyAgICAgICAgICAgICAgICAiU3ByaXRlIiwKKworICAgICMgdGhlc2UgYXJlIEltYWdlQ29tcHJlc3Npb24gYmxhY2tsaXN0cworICAgICJJQ01EYXRhVVBQIiwKKyAgICAiSUNNRmx1c2hVUFAiLAorICAgICJJQ01Db21wbGV0aW9uVVBQIiwKKyAgICAiSUNNUHJvZ3Jlc3NVUFAiLAorICAgICJTdGRQaXhVUFAiLAorICAgICJRRFBpeFVQUCIsCisgICAgIklDTUFsaWdubWVudFVQUCIsCisgICAgIklDTUN1cnNvclNoaWVsZGVkVVBQIiwKKyAgICAiSUNNTWVtb3J5RGlzcG9zZWRVUFAiLAorICAgICJJQ01Db252ZXJ0RGF0YUZvcm1hdFVQUCIsCisgICAgIk1vZGFsRmlsdGVyWURVUFAiLAorICAgICAgICAgICAgICAgICJGaWxlRmlsdGVyVVBQIiwKKworICAgICJDb2RlY05hbWVTcGVjTGlzdFB0ciIsCisgICAgIkNvZGVjSW5mbyIsCisgICAgICJJbWFnZVNlcXVlbmNlIiwKKyAgICAiTWF0cml4UmVjb3JkUHRyIiwKKyAgICAiSUNNRGF0YVByb2NSZWNvcmRQdHIiLAorICAgICJPcGVuQ1BpY1BhcmFtcyIsCisgICAgIklDTVByb2dyZXNzUHJvY1JlY29yZFB0ciIsCisgICAgIklDTUFsaWdubWVudFByb2NSZWNvcmRQdHIiLAorICAgICJJQ01QaXhlbEZvcm1hdEluZm9QdHIiLAorICAgICJJbWFnZVNlcXVlbmNlRGF0YVNvdXJjZSIsCisgICAgIkNvbnN0U3RyRmlsZU5hbWVQYXJhbSIsCisgICAgIkltYWdlVHJhbnNjb2RlU2VxdWVuY2UiLAorICAgICJJbWFnZUZpZWxkU2VxdWVuY2UiLAorICAgICJGcmFjdCIsCisgICAgIlBpeE1hcFB0ciIsCisgICAgIkdXb3JsZEZsYWdzIiwKKyAgICAidm9pZF9wdHIiLCAgICMgWFhYIEJlaW5nIGxhenksIHRoaXMgb25lIGlzIGRvYWJsZS4KKworICAgICMgVGhlc2UgYXJlIGZyb20gUXVpY2tUaW1lQ29tcG9uZW50cworICAgICJDRGF0YUhhbmRsZXJVUFAiLAorICAgICJDaGFyRGF0YUhhbmRsZXJVUFAiLAorICAgICJDb21tZW50SGFuZGxlclVQUCIsCisgICAgIkRhdGFIQ29tcGxldGlvblVQUCIsCisgICAgIidNb3ZpZUV4cG9ydEdldERhdGFVUFAiLAorICAgICJNb3ZpZUV4cG9ydEdldFByb3BlcnR5VVBQIiwKKyAgICAiUHJlcHJvY2Vzc0luc3RydWN0aW9uSGFuZGxlclVQUCIsCisgICAgIlNHTW9kYWxGaWx0ZXJVUFAiLAorICAgICJTdGFydERvY3VtZW50SGFuZGxlclVQUCIsCisgICAgIlN0YXJ0RWxlbWVudEhhbmRsZXJVUFAiLAorICAgICJWZGlnSW50VVBQIiwKKyAgICAiU0dEYXRhVVBQIiwKKyAgICAiRW5kRG9jdW1lbnRIYW5kbGVyVVBQIiwKKyAgICAiRW5kRWxlbWVudEhhbmRsZXJVUFAiLAorICAgICJWaWRlb0JvdHRsZXMiLCAjIFJlY29yZCBmdWxsIG9mIFVQUHMKKworICAgICJTQ1BhcmFtcyIsCisgICAgIklDTUNvbXBsZXRpb25Qcm9jUmVjb3JkUHRyIiwKKyAgICAiRGF0YUhWb2x1bWVMaXN0IiwKKyAgICAiRGlnaXRpemVySW5mbyIsCisgICAgIlNHQ29tcHJlc3NJbmZvIiwKKyAgICAiU2VxR3JhYkV4dGVuZGVkRnJhbWVJbmZvUHRyIiwKKyAgICAiU2VxR3JhYkZyYW1lSW5mb1B0ciIsCisgICAgIlRDVGV4dE9wdGlvbnNQdHIiLAorICAgICJTR0NvbXByZXNzSW5mb19wdHIiLAorICAgICJTR0RldmljZUxpc3QiLAorICAgICJUZXh0RGlzcGxheURhdGEiLAorICAgICJUaW1lQ29kZURlZiIsCisgICAgIlRpbWVDb2RlUmVjb3JkIiwKKyAgICAiVHdlZW5SZWNvcmQiLAorICAgICJWREdhbVJlY1B0ciIsCisgICAgIlRvbmVEZXNjcmlwdGlvbiIsICAjIFhYWFggSnVzdCBsYXp5OiB0aGlzIG9uZSBpcyBlYXN5LgorICAgICJYTUxEb2MiLAorICAgICJVSW50NjQiLCAgICMgWFhYWCBsYXp5CisgICAgIlVJbnQ2NF9wdHIiLCAjIFhYWFggbGF6eQorCisgICAgIyBGcm9tIE1lZGlhSGFuZGxlcnMKKyAgICAiQWN0aW9uc1VQUCIsCisgICAgIlByZVByZXJvbGxDb21wbGV0ZVVQUCIsCisgICAgIkNvZGVjQ29tcG9uZW50SGFuZGxlIiwgIyBEaWZmaWN1bHQ6IGhhbmRsZSBjb250YWluaW5nIGxpc3Qgb2YgY29tcG9uZW50cy4KKyAgICAiR2V0TW92aWVDb21wbGV0ZVBhcmFtcyIsICMgSW1tZW5zZSBzdHJ1Y3QKKyAgICAiTGV2ZWxNZXRlckluZm9QdHIiLCAjIExhenkuIEFsc286IGNhbiBiZSBhbiBvdXRwdXQgcGFyYW1ldGVyISEKKyAgICAiTWVkaWFFUVNwZWN0cnVtQmFuZHNSZWNvcmRQdHIiLCAjIGRpdHRvCisKKyAgICAjIEZyb20gUXVpY2tUaW1lTXVzaWMKKyAgICAiTXVzaWNNSURJU2VuZFVQUCIsCisgICAgIk11c2ljT2ZmbGluZURhdGFVUFAiLAorICAgICJUdW5lQ2FsbEJhY2tVUFAiLAorICAgICJUdW5lUGxheUNhbGxCYWNrVVBQIiwKKyAgICAiR0NQYXJ0IiwgIyBTdHJ1Y3Qgd2l0aCBsb3RzIG9mIGZpZWxkcworICAgICJHQ1BhcnRfcHRyIiwKKyAgICAiR2VuZXJpY0tub2JEZXNjcmlwdGlvbiIsICMgU3RydWN0IHdpdGggbG90cyBvZiBmaWVsZHMKKyAgICAiS25vYkRlc2NyaXB0aW9uIiwgICMgU3RydWN0IHdpdGggbG90cyBvZiBmaWVsZHMKKyAgICAiSW5zdHJ1bWVudEFib3V0SW5mbyIsICMgU3RydWN0LCBub3QgdG9vIGRpZmZpY3VsdAorICAgICJOb3RlQ2hhbm5lbCIsICMgWFhYWCBMYXp5LiBDb3VsZCBiZSBvcGFxdWUsIEkgdGhpbmsKKyAgICAiTm90ZVJlcXVlc3QiLCAjIFhYWFggTGF6eS4gTm90LXRvby1kaWZmaWN1bHQgc3RydWN0CisgICAgIlN5bnRoZXNpemVyQ29ubmVjdGlvbnMiLCAjIFN0cnVjdCB3aXRoIGxvdHMgb2YgZmllbGRzCisgICAgIlN5bnRoZXNpemVyRGVzY3JpcHRpb24iLCAjIFN0cnVjdCB3aXRoIGxvdHMgb2YgZmllbGRzCisgICAgIlR1bmVTdGF0dXMiLCAjIFN0cnVjdCB3aXRoIGxvdHMgb2YgZmllbGRzCisKKyAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygnRlNTcGVjJywgJyonLCAnT3V0TW9kZScpXSwgWygnRlNTcGVjX3B0cicsICcqJywgJ0luTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIE1vdmllIGNvbnRyb2xsZXIgY3JlYXRpb24KKyAgICAgICAgICAgICAgICAoWygnQ29tcG9uZW50SW5zdGFuY2UnLCAnTmV3TW92aWVDb250cm9sbGVyJywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ01vdmllQ29udHJvbGxlcicsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIyBOZXdNb3ZpZUZyb21GaWxlCisgICAgICAgICAgICAgICAgKFsoJ3Nob3J0JywgJ3Jlc0lkJywgJ091dE1vZGUnKSwgKCdTdHJpbmdQdHInLCAncmVzTmFtZScsICdJbk1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ3Nob3J0JywgJ3Jlc0lkJywgJ0luT3V0TW9kZScpLCAoJ2R1bW15U3RyaW5nUHRyJywgJ3Jlc05hbWUnLCAnSW5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICMgTUNEb0FjdGlvbiBhbmQgbW9yZQorICAgICAgICAgICAgICAgIChbKCd2b2lkJywgJyonLCAnT3V0TW9kZScpXSwgWygnbWNhY3Rpb25wYXJhbXMnLCAnKicsICdJbk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIyBTZXRUaW1lQmFzZVplcm8uIERvZXMgbm90IGhhbmRsZSBOVUxMcywgdW5mb3J0dW5hdGVseQorICAgICAgICAgICAgICAgIChbKCdUaW1lUmVjb3JkJywgJ3plcm8nLCAnT3V0TW9kZScpXSwgWygnVGltZVJlY29yZCcsICd6ZXJvJywgJ0luTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIENvbnZlcnRUaW1lIGFuZCBDb252ZXJ0VGltZVNjYWxlCisgICAgICAgICAgICAgICAgKFsoJ1RpbWVSZWNvcmQnLCAnaW5vdXQnLCAnT3V0TW9kZScpXSwgWygnVGltZVJlY29yZCcsICdpbm91dCcsICdJbk91dE1vZGUnKV0pLAorICAgICAgICAgICAgICAgIChbKCdUaW1lUmVjb3JkJywgJ3RoZVRpbWUnLCAnT3V0TW9kZScpXSwgWygnVGltZVJlY29yZCcsICd0aGVUaW1lJywgJ0luT3V0TW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIEFkZFRpbWUgYW5kIFN1YnRyYWN0VGltZQorICAgICAgICAgICAgICAgIChbKCdUaW1lUmVjb3JkJywgJ2RzdCcsICdPdXRNb2RlJyldLCBbKCdUaW1lUmVjb3JkJywgJ2RzdCcsICdJbk91dE1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIyBGdW5ueSBkZWZpbml0aW9ucworICAgICAgICAgICAgICAgIChbKCdjaGFyX3B0cicsICcqJywgJ0luTW9kZScpXSwgWygnc3RyaW5ncHRyJywgJyonLCAnSW5Nb2RlJyldKSwKKyAgICAgICAgICAgICAgICAoWygnRlNTcGVjUHRyJywgJyonLCAnSW5Nb2RlJyldLCBbKCdGU1NwZWNfcHRyJywgJyonLCAnSW5Nb2RlJyldKSwKKyAgICAgICAgICAgICAgICAoWygndW5zaWduZWRfY2hhcicsICdzd2ZWZXJzaW9uJywgJ091dE1vZGUnKV0sIFsoJ1VJbnQ4JywgJ3N3ZlZlcnNpb24nLCAnT3V0TW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIEl0IHNlZW1zIE11c2ljTUlESVBhY2tldCBpZiBuZXZlciBmbGFnZ2VkIHdpdGggY29uc3QgYnV0IGFsd2F5cyB1c2VkCisgICAgICAgICAgICAgICAgIyBmb3Igc2VuZGluZyBvbmx5LiBJZiB0aGF0IGV2ZXIgY2hhbmdlcyB0aGlzIG5lZWRzIHRvIGJlIGZpeGVkLgorICAgICAgICAgICAgICAgIChbKCdNdXNpY01JRElQYWNrZXQnLCAnKicsICdPdXRNb2RlJyldLCBbKCdNdXNpY01JRElQYWNrZXRfcHRyJywgJyonLCAnSW5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICMgUVRNdXNpYyBjb25zdC1sZXNzIGlucHV0IHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAoWygndW5zaWduZWRfbG9uZycsICdoZWFkZXInLCAnT3V0TW9kZScpXSwgWygnVW5zaWduZWRMb25nUHRyJywgJ2hlYWRlcicsICdJbk1vZGUnKV0pLAorICAgICAgICAgICAgICAgIF0KKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3F0L3F0c3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL3F0L3F0c3VwcG9ydC5weQppbmRleCAyMDMwNGM5Li4xMzJjMmI0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9xdC9xdHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvcXQvcXRzdXBwb3J0LnB5CkBAIC04LDE2ICs4LDE2IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1BQ0hFQURFUkZJTEUgPSAnTW92aWVzLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfUXQnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICdNb3ZpZScJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQorTUFDSEVBREVSRklMRSA9ICdNb3ZpZXMuaCcgICAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19RdCcgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ01vdmllJyAgICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ1F0JwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSAiTW92aWUiCQkjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQotT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicJIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcworTU9EUFJFRklYID0gJ1F0JyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK09CSkVDVFRZUEUgPSAiTW92aWUiICAgICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC01Nyw0NSArNTcsNDUgQEAKIAogLyogTWFjcm8gdG8gYWxsb3cgdXMgdG8gR2V0TmV4dEludGVyZXN0aW5nVGltZSB3aXRob3V0IGR1cmF0aW9uICovCiAjZGVmaW5lIEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHkobWVkaWEsIGZsYWdzLCB0aW1lLCByYXRlLCBydikgXAotCQkJR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKG1lZGlhLCBmbGFncywgdGltZSwgcmF0ZSwgcnYsIE5VTEwpCi0JCQkKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZShtZWRpYSwgZmxhZ3MsIHRpbWUsIHJhdGUsIHJ2LCBOVUxMKQorCiAvKgogKiogUGFyc2UvZ2VuZXJhdGUgdGltZSByZWNvcmRzCiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIFF0VGltZVJlY29yZF9OZXcoVGltZVJlY29yZCAqaXRzZWxmKQogewotCWlmIChpdHNlbGYtPmJhc2UpCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmxPJiIsIFB5TWFjX0J1aWxkd2lkZSwgJml0c2VsZi0+dmFsdWUsIGl0c2VsZi0+c2NhbGUsIAotCQkJVGltZUJhc2VPYmpfTmV3LCBpdHNlbGYtPmJhc2UpOwotCWVsc2UKLQkJcmV0dXJuICBQeV9CdWlsZFZhbHVlKCJPJmxPIiwgUHlNYWNfQnVpbGR3aWRlLCAmaXRzZWxmLT52YWx1ZSwgaXRzZWxmLT5zY2FsZSwgCi0JCQlQeV9Ob25lKTsKKyAgICAgICAgaWYgKGl0c2VsZi0+YmFzZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZsTyYiLCBQeU1hY19CdWlsZHdpZGUsICZpdHNlbGYtPnZhbHVlLCBpdHNlbGYtPnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBpdHNlbGYtPmJhc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuICBQeV9CdWlsZFZhbHVlKCJPJmxPIiwgUHlNYWNfQnVpbGR3aWRlLCAmaXRzZWxmLT52YWx1ZSwgaXRzZWxmLT5zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpOwogfQogCiBzdGF0aWMgaW50CiBRdFRpbWVSZWNvcmRfQ29udmVydChQeU9iamVjdCAqdiwgVGltZVJlY29yZCAqcF9pdHNlbGYpCiB7Ci0JUHlPYmplY3QgKmJhc2UgPSBOVUxMOwotCWlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZsfE8iLCBQeU1hY19HZXR3aWRlLCAmcF9pdHNlbGYtPnZhbHVlLCAmcF9pdHNlbGYtPnNjYWxlLAotCQkJJmJhc2UpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBiYXNlID09IE5VTEwgfHwgYmFzZSA9PSBQeV9Ob25lICkKLQkJcF9pdHNlbGYtPmJhc2UgPSBOVUxMOwotCWVsc2UKLQkJaWYgKCAhVGltZUJhc2VPYmpfQ29udmVydChiYXNlLCAmcF9pdHNlbGYtPmJhc2UpICkKLQkJCXJldHVybiAwOwotCXJldHVybiAxOworICAgICAgICBQeU9iamVjdCAqYmFzZSA9IE5VTEw7CisgICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZsfE8iLCBQeU1hY19HZXR3aWRlLCAmcF9pdHNlbGYtPnZhbHVlLCAmcF9pdHNlbGYtPnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgJmJhc2UpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBiYXNlID09IE5VTEwgfHwgYmFzZSA9PSBQeV9Ob25lICkKKyAgICAgICAgICAgICAgICBwX2l0c2VsZi0+YmFzZSA9IE5VTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZiAoICFUaW1lQmFzZU9ial9Db252ZXJ0KGJhc2UsICZwX2l0c2VsZi0+YmFzZSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBNdXNpY01JRElQYWNrZXQgKnBfaXRzZWxmKQogewotCWludCBkdW1teTsKLQkKLQlpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImhscyMiLCAmcF9pdHNlbGYtPmxlbmd0aCwgJnBfaXRzZWxmLT5yZXNlcnZlZCwgcF9pdHNlbGYtPmRhdGEsIGR1bW15KSApCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgICAgICBpbnQgZHVtbXk7CisKKyAgICAgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJobHMjIiwgJnBfaXRzZWxmLT5sZW5ndGgsICZwX2l0c2VsZi0+cmVzZXJ2ZWQsIHBfaXRzZWxmLT5kYXRhLCBkdW1teSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gMTsKIH0KIAogCkBAIC0xMDMsMTggKzEwMywxOCBAQAogIiIiCiAKIGluaXRzdHVmZiA9IGluaXRzdHVmZiArICIiIgotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRyYWNrLCBUcmFja09ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUcmFjaywgVHJhY2tPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTW92aWUsIE1vdmllT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1vdmllLCBNb3ZpZU9ial9Db252ZXJ0KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1vdmllQ29udHJvbGxlciwgTW92aWVDdGxPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVGltZUJhc2UsIFRpbWVCYXNlT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9Db252ZXJ0KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhVc2VyRGF0YSwgVXNlckRhdGFPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoVXNlckRhdGEsIFVzZXJEYXRhT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lZGlhLCBNZWRpYU9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZWRpYSwgTWVkaWFPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRyYWNrLCBUcmFja09ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoVHJhY2ssIFRyYWNrT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZSwgTW92aWVPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1vdmllLCBNb3ZpZU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTW92aWVDb250cm9sbGVyLCBNb3ZpZUN0bE9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTW92aWVDb250cm9sbGVyLCBNb3ZpZUN0bE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVGltZUJhc2UsIFRpbWVCYXNlT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUaW1lQmFzZSwgVGltZUJhc2VPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFVzZXJEYXRhLCBVc2VyRGF0YU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoVXNlckRhdGEsIFVzZXJEYXRhT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNZWRpYSwgTWVkaWFPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1lZGlhLCBNZWRpYU9ial9Db252ZXJ0KTsKICIiIgogCiAjIE91ciAob3BhcXVlKSBvYmplY3RzCkBAIC0yMzIsNTYgKzIzMiw1NiBAQAogCiAjIFhYWFggTmVlZCB0byBvdmVycmlkZSBvdXRwdXRfdHBfbmV3Qm9keSgpIHRvIGFsbG93IGZvciBOb25lIGluaXRpYWxpemVyLgogY2xhc3MgUXRHbG9iYWxPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCSMgV2UgZG9uJ3QgYWxsb3cgTlVMTCBwb2ludGVycyB0byBiZSByZXR1cm5lZCBieSBRdWlja1RpbWUgQVBJIGNhbGxzLAotCQkjIGluIHN0ZWFkIHdlIHJhaXNlIGFuIGV4Y2VwdGlvbgotCQlPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSAlcyBmcm9tIE5VTEwgcG9pbnRlciIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9IiIiLCBzZWxmLm5hbWUpCi0JCi0JZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKLQkJIyBCdXQgd2hhdCB3ZSBkbyBhbGxvdyBpcyBwYXNzaW5nIE5vbmUgd2hlcmVldmVyIGEgcXVpY2t0aW1lIG9iamVjdCBpcwotCQkjIGV4cGVjdGVkLCBhbmQgcGFzcyB0aGlzIGFzIE5VTEwgdG8gdGhlIEFQSSByb3V0aW5lcy4gTm90ZSB5b3UgY2FuCi0JCSMgY2FsbCBtZXRob2RzIHRvbyBieSBjcmVhdGluZyBhbiBvYmplY3Qgd2l0aCBOb25lIGFzIHRoZSBpbml0aWFsaXplci4KLQkJT3V0cHV0KCJpZiAodiA9PSBQeV9Ob25lKSIpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiKnBfaXRzZWxmID0gTlVMTDsiKQotCQlPdXRwdXQoInJldHVybiAxOyIpCi0JCU91dFJicmFjZSgpCi0JCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICAjIFdlIGRvbid0IGFsbG93IE5VTEwgcG9pbnRlcnMgdG8gYmUgcmV0dXJuZWQgYnkgUXVpY2tUaW1lIEFQSSBjYWxscywKKyAgICAgICAgIyBpbiBzdGVhZCB3ZSByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgJXMgZnJvbSBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IiIiLCBzZWxmLm5hbWUpCisKKyAgICBkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgorICAgICAgICAjIEJ1dCB3aGF0IHdlIGRvIGFsbG93IGlzIHBhc3NpbmcgTm9uZSB3aGVyZWV2ZXIgYSBxdWlja3RpbWUgb2JqZWN0IGlzCisgICAgICAgICMgZXhwZWN0ZWQsIGFuZCBwYXNzIHRoaXMgYXMgTlVMTCB0byB0aGUgQVBJIHJvdXRpbmVzLiBOb3RlIHlvdSBjYW4KKyAgICAgICAgIyBjYWxsIG1ldGhvZHMgdG9vIGJ5IGNyZWF0aW5nIGFuIG9iamVjdCB3aXRoIE5vbmUgYXMgdGhlIGluaXRpYWxpemVyLgorICAgICAgICBPdXRwdXQoImlmICh2ID09IFB5X05vbmUpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCIqcF9pdHNlbGYgPSBOVUxMOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKwogY2xhc3MgTW92aWVPYmplY3REZWZpbml0aW9uKFF0R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKLQkJT3V0cHV0KCJpZiAoJXMpIERpc3Bvc2VNb3ZpZSglcyk7IiwgaXRzZWxmbmFtZSwgaXRzZWxmbmFtZSkKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgorICAgICAgICBPdXRwdXQoImlmICglcykgRGlzcG9zZU1vdmllKCVzKTsiLCBpdHNlbGZuYW1lLCBpdHNlbGZuYW1lKQogCiBjbGFzcyBUcmFja09iamVjdERlZmluaXRpb24oUXRHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotCQlPdXRwdXQoImlmICglcykgRGlzcG9zZU1vdmllVHJhY2soJXMpOyIsIGl0c2VsZm5hbWUsIGl0c2VsZm5hbWUpCisgICAgZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKKyAgICAgICAgT3V0cHV0KCJpZiAoJXMpIERpc3Bvc2VNb3ZpZVRyYWNrKCVzKTsiLCBpdHNlbGZuYW1lLCBpdHNlbGZuYW1lKQogCiBjbGFzcyBNZWRpYU9iamVjdERlZmluaXRpb24oUXRHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotCQlPdXRwdXQoImlmICglcykgRGlzcG9zZVRyYWNrTWVkaWEoJXMpOyIsIGl0c2VsZm5hbWUsIGl0c2VsZm5hbWUpCisgICAgZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKKyAgICAgICAgT3V0cHV0KCJpZiAoJXMpIERpc3Bvc2VUcmFja01lZGlhKCVzKTsiLCBpdHNlbGZuYW1lLCBpdHNlbGZuYW1lKQogCiBjbGFzcyBVc2VyRGF0YU9iamVjdERlZmluaXRpb24oUXRHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotCQlPdXRwdXQoImlmICglcykgRGlzcG9zZVVzZXJEYXRhKCVzKTsiLCBpdHNlbGZuYW1lLCBpdHNlbGZuYW1lKQorICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisgICAgICAgIE91dHB1dCgiaWYgKCVzKSBEaXNwb3NlVXNlckRhdGEoJXMpOyIsIGl0c2VsZm5hbWUsIGl0c2VsZm5hbWUpCiAKIGNsYXNzIFRpbWVCYXNlT2JqZWN0RGVmaW5pdGlvbihRdEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCXBhc3MKLQkKKyAgICBwYXNzCisKIGNsYXNzIE1vdmllQ3RsT2JqZWN0RGVmaW5pdGlvbihRdEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6Ci0JCU91dHB1dCgiaWYgKCVzKSBEaXNwb3NlTW92aWVDb250cm9sbGVyKCVzKTsiLCBpdHNlbGZuYW1lLCBpdHNlbGZuYW1lKQorICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisgICAgICAgIE91dHB1dCgiaWYgKCVzKSBEaXNwb3NlTW92aWVDb250cm9sbGVyKCVzKTsiLCBpdHNlbGZuYW1lLCBpdHNlbGZuYW1lKQogCiBjbGFzcyBJZGxlTWFuYWdlck9iamVjdERlZmluaXRpb24oUXRHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlwYXNzCi0JCisgICAgcGFzcworCiBjbGFzcyBTR091dHB1dE9iamVjdERlZmluaXRpb24oUXRHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQkjIFhYWFggSSdtIG5vdCBzdXJlIEkgZnVsbHkgdW5kZXJzdGFuZCBob3cgU0dPdXRwdXQgd29ya3MuIEl0IHNlZW1zIGl0J3MgYWx3YXlzIHRpZWQKLQkjIHRvIGEgc3BlY2lmaWMgU2VxR3JhYkNvbXBvbmVudCwgYnV0IEknbSBub3QgMTAwJSBzdXJlLiBBbHNvLCBJJ20gbm90IHN1cmUgYWxsIHRoZQotCSMgcm91dGluZXMgdGhhdCByZXR1cm4gYW4gU0dPdXRwdXQgYWN0dWFsbHkgcmV0dXJuIGEgKm5ldyogU0dPdXRwdXQuIE5lZWQgdG8gcmVhZCB1cCBvbgotCSMgdGhpcy4KLQlwYXNzCisgICAgIyBYWFhYIEknbSBub3Qgc3VyZSBJIGZ1bGx5IHVuZGVyc3RhbmQgaG93IFNHT3V0cHV0IHdvcmtzLiBJdCBzZWVtcyBpdCdzIGFsd2F5cyB0aWVkCisgICAgIyB0byBhIHNwZWNpZmljIFNlcUdyYWJDb21wb25lbnQsIGJ1dCBJJ20gbm90IDEwMCUgc3VyZS4gQWxzbywgSSdtIG5vdCBzdXJlIGFsbCB0aGUKKyAgICAjIHJvdXRpbmVzIHRoYXQgcmV0dXJuIGFuIFNHT3V0cHV0IGFjdHVhbGx5IHJldHVybiBhICpuZXcqIFNHT3V0cHV0LiBOZWVkIHRvIHJlYWQgdXAgb24KKyAgICAjIHRoaXMuCisgICAgcGFzcwogCiAKICMgRnJvbSBoZXJlIG9uIGl0J3MgYmFzaWNhbGx5IGFsbCBib2lsZXIgcGxhdGUuLi4KQEAgLTMzMSwxOSArMzMxLDE5IEBACiBkdW1teVJlY3QgPSBGYWtlVHlwZSgnKFJlY3QgKikwJykKIAogZiA9IEZ1bmN0aW9uKHZvaWQsICdBbGlnbldpbmRvdycsCi0JKFdpbmRvd1B0ciwgJ3dwJywgSW5Nb2RlKSwKLQkoQm9vbGVhbiwgJ2Zyb250JywgSW5Nb2RlKSwKLQkoZHVtbXlSZWN0LCAnYWxpZ25tZW50UmVjdCcsIEluTW9kZSksCi0JKElDTUFsaWdubWVudFByb2NSZWNvcmRQdHIsICdhbGlnbm1lbnRQcm9jJywgSW5Nb2RlKSwKKyAgICAgICAgKFdpbmRvd1B0ciwgJ3dwJywgSW5Nb2RlKSwKKyAgICAgICAgKEJvb2xlYW4sICdmcm9udCcsIEluTW9kZSksCisgICAgICAgIChkdW1teVJlY3QsICdhbGlnbm1lbnRSZWN0JywgSW5Nb2RlKSwKKyAgICAgICAgKElDTUFsaWdubWVudFByb2NSZWNvcmRQdHIsICdhbGlnbm1lbnRQcm9jJywgSW5Nb2RlKSwKICkKIGZ1bmN0aW9ucy5hcHBlbmQoZikKIAogZiA9IEZ1bmN0aW9uKHZvaWQsICdEcmFnQWxpZ25lZFdpbmRvdycsCi0JKFdpbmRvd1B0ciwgJ3dwJywgSW5Nb2RlKSwKLQkoUG9pbnQsICdzdGFydFB0JywgSW5Nb2RlKSwKLQkoUmVjdF9wdHIsICdib3VuZHNSZWN0JywgSW5Nb2RlKSwKLQkoZHVtbXlSZWN0LCAnYWxpZ25tZW50UmVjdCcsIEluTW9kZSksCi0JKElDTUFsaWdubWVudFByb2NSZWNvcmRQdHIsICdhbGlnbm1lbnRQcm9jJywgSW5Nb2RlKSwKKyAgICAgICAgKFdpbmRvd1B0ciwgJ3dwJywgSW5Nb2RlKSwKKyAgICAgICAgKFBvaW50LCAnc3RhcnRQdCcsIEluTW9kZSksCisgICAgICAgIChSZWN0X3B0ciwgJ2JvdW5kc1JlY3QnLCBJbk1vZGUpLAorICAgICAgICAoZHVtbXlSZWN0LCAnYWxpZ25tZW50UmVjdCcsIEluTW9kZSksCisgICAgICAgIChJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyLCAnYWxpZ25tZW50UHJvYycsIEluTW9kZSksCiApCiBmdW5jdGlvbnMuYXBwZW5kKGYpCiAKQEAgLTM3Nyw0ICszNzcsMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvcXQvc2V0dXAucHkgYi9NYWMvTW9kdWxlcy9xdC9zZXR1cC5weQppbmRleCA5OGQ4MzZkLi44NDQyMDExIDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9xdC9zZXR1cC5weQorKysgYi9NYWMvTW9kdWxlcy9xdC9zZXR1cC5weQpAQCAtNCwxMCArNCwxMCBAQAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRXh0ZW5zaW9uLCBzZXR1cAogCiBzZXR1cChuYW1lPSJRdWlja1RpbWUiLCB2ZXJzaW9uPSIwLjIiLAotCWV4dF9tb2R1bGVzPVsKLQkJRXh0ZW5zaW9uKCdRdWlja1RpbWUuX1F0JywgWydfUXRtb2R1bGUuYyddLAotCQlleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbicsICctZnJhbWV3b3JrJywgJ1F1aWNrVGltZSddKQotCV0sCi0JcHlfbW9kdWxlcz1bJ1F1aWNrVGltZS5RdCcsICdRdWlja1RpbWUuUXVpY2tUaW1lJ10sCi0JcGFja2FnZV9kaXI9eydRdWlja1RpbWUnOicuLi8uLi8uLi9MaWIvcGxhdC1tYWMvQ2FyYm9uJ30KLQkpCisgICAgICAgIGV4dF9tb2R1bGVzPVsKKyAgICAgICAgICAgICAgICBFeHRlbnNpb24oJ1F1aWNrVGltZS5fUXQnLCBbJ19RdG1vZHVsZS5jJ10sCisgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nLCAnLWZyYW1ld29yaycsICdRdWlja1RpbWUnXSkKKyAgICAgICAgXSwKKyAgICAgICAgcHlfbW9kdWxlcz1bJ1F1aWNrVGltZS5RdCcsICdRdWlja1RpbWUuUXVpY2tUaW1lJ10sCisgICAgICAgIHBhY2thZ2VfZGlyPXsnUXVpY2tUaW1lJzonLi4vLi4vLi4vTGliL3BsYXQtbWFjL0NhcmJvbid9CisgICAgICAgICkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3Jlcy9yZXNlZGl0LnB5IGIvTWFjL01vZHVsZXMvcmVzL3Jlc2VkaXQucHkKaW5kZXggYWI2MGIzNC4uYjNlZjc5MCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcmVzL3Jlc2VkaXQucHkKKysrIGIvTWFjL01vZHVsZXMvcmVzL3Jlc2VkaXQucHkKQEAgLTQsMTEgKzQsMTEgQEAKICMjSGFuZGxlIGg7CiAjIwogIyNpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsICZidWYsICZsZW4pKQotIyMJcmV0dXJuIE5VTEw7CisjIyAgICAgIHJldHVybiBOVUxMOwogIyNoID0gTmV3SGFuZGxlKGxlbik7CiAjI2lmICggaCA9PSBOVUxMICkgewotIyMJUHlFcnJfTm9NZW1vcnkoKTsKLSMjCXJldHVybiBOVUxMOworIyMgICAgICBQeUVycl9Ob01lbW9yeSgpOworIyMgICAgICByZXR1cm4gTlVMTDsKICMjfQogIyNITG9jayhoKTsKICMjbWVtY3B5KCpoLCBidWYsIGxlbik7CkBAIC0zMywxMSArMzMsMTEgQEAKIFJlc291cmNlT2JqZWN0ICpydjsKIAogaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLCAmYnVmLCAmbGVuKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBoID0gTmV3SGFuZGxlKGxlbik7CiBpZiAoIGggPT0gTlVMTCApIHsKLQlQeUVycl9Ob01lbW9yeSgpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKIH0KIEhMb2NrKGgpOwogbWVtY3B5KCpoLCBidWYsIGxlbik7CkBAIC02NiwxMCArNjYsMTAgQEAKIAogZGVmIGdlbnJlc2NvbnZlcnRlcihsb25nbmFtZSwgc2hvcnRuYW1lKToKIAotCWYgPSBNYW51YWxHZW5lcmF0b3IoImFzXyVzIiVsb25nbmFtZSwgYXNfeHh4X2JvZHklKHNob3J0bmFtZSwgbG9uZ25hbWUpKQotCWRvY3N0cmluZyA9ICAiUmV0dXJuIHRoaXMgcmVzb3VyY2UvaGFuZGxlIGFzIGEgJXMiJWxvbmduYW1lCi0JZi5kb2NzdHJpbmcgPSBsYW1iZGEgZG9jc3RyaW5nPWRvY3N0cmluZzogZG9jc3RyaW5nCi0JcmV0dXJuIGYKKyAgICBmID0gTWFudWFsR2VuZXJhdG9yKCJhc18lcyIlbG9uZ25hbWUsIGFzX3h4eF9ib2R5JShzaG9ydG5hbWUsIGxvbmduYW1lKSkKKyAgICBkb2NzdHJpbmcgPSAgIlJldHVybiB0aGlzIHJlc291cmNlL2hhbmRsZSBhcyBhICVzIiVsb25nbmFtZQorICAgIGYuZG9jc3RyaW5nID0gbGFtYmRhIGRvY3N0cmluZz1kb2NzdHJpbmc6IGRvY3N0cmluZworICAgIHJldHVybiBmCiAKIHJlc21ldGhvZHMuYXBwZW5kKGdlbnJlc2NvbnZlcnRlcigiQ29udHJvbCIsICJDdGwiKSkKIHJlc21ldGhvZHMuYXBwZW5kKGdlbnJlc2NvbnZlcnRlcigiTWVudSIsICJNZW51IikpCkBAIC04NywxMyArODcsMTMgQEAKIEF1dG9EaXNwb3NlX2JvZHkgPSAiIiIKIGludCBvbm9mZiwgb2xkID0gMDsKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmb25vZmYpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIGlmICggX3NlbGYtPm9iX2ZyZWVpdCApCi0Jb2xkID0gMTsKKyAgICAgICAgb2xkID0gMTsKIGlmICggb25vZmYgKQotCV9zZWxmLT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsKKyAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlSGFuZGxlOwogZWxzZQotCV9zZWxmLT5vYl9mcmVlaXQgPSBOVUxMOworICAgICAgICBfc2VsZi0+b2JfZnJlZWl0ID0gTlVMTDsKIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgb2xkKTsKIHJldHVybiBfcmVzOwogIiIiCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9yZXMvcmVzc2Nhbi5weSBiL01hYy9Nb2R1bGVzL3Jlcy9yZXNzY2FuLnB5CmluZGV4IDQ3YTE5YTYuLjQ3YTk3ZTQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3Jlcy9yZXNzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL3Jlcy9yZXNzY2FuLnB5CkBAIC0xMyw3MyArMTMsNzMgQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSAiUmVzb3VyY2VzLmgiCi0Jb3V0cHV0ID0gInJlc2dlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJSZXNvdXJjZXMucHkiCi0Jc2Nhbm5lciA9IFJlc291cmNlc1NjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGRvaW5nICdpbXBvcnQgcmVzc3VwcG9ydCcgPT09IgotCWltcG9ydCByZXNzdXBwb3J0Ci0JcHJpbnQgIj09PSBEb25lICdpbXBvcnQgcmVzc3VwcG9ydCcuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIFJlc21vZHVsZS5jID09PSIKKyAgICBpbnB1dCA9ICJSZXNvdXJjZXMuaCIKKyAgICBvdXRwdXQgPSAicmVzZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIlJlc291cmNlcy5weSIKKyAgICBzY2FubmVyID0gUmVzb3VyY2VzU2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgZG9pbmcgJ2ltcG9ydCByZXNzdXBwb3J0JyA9PT0iCisgICAgaW1wb3J0IHJlc3N1cHBvcnQKKyAgICBwcmludCAiPT09IERvbmUgJ2ltcG9ydCByZXNzdXBwb3J0Jy4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgUmVzbW9kdWxlLmMgPT09IgogCiBjbGFzcyBSZXNvdXJjZXNTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiUmVzRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0ID09ICJIYW5kbGUiIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJSZXNNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAicmVzbWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJSZXNGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgIGlmIHQgPT0gIkhhbmRsZSIgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIlJlc01ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJyZXNtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJSZWFkUGFydGlhbFJlc291cmNlIiwKLQkJCSJXcml0ZVBhcnRpYWxSZXNvdXJjZSIsCi0JCQkiVGVtcEluc2VydFJPTU1hcCIsCi0jIwkJCSJSbXZlUmVzb3VyY2UiLAkJIyBSZW1vdmVSZXNvdXJjZQotIyMJCQkiU2l6ZVJlc291cmNlIiwJCSMgR2V0UmVzb3VyY2VTaXplT25EaXNrCi0jIwkJCSJNYXhTaXplUnNyYyIsCQkjIEdldE1heFJlc291cmNlU2l6ZQotCQkJIyBPUzggb25seQotCQkJJ1JHZXRSZXNvdXJjZScsCi0JCQknT3BlblJlc0ZpbGUnLAotCQkJJ0NyZWF0ZVJlc0ZpbGUnLAotCQkJJ1JzcmNab25lSW5pdCcsCi0JCQknSW5pdFJlc291cmNlcycsCi0JCQknUnNyY01hcEVudHJ5JywKLQkJCV0KLQkJCQotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQldCi0JCQkKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCJTdHIyNTUiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiKiIsICIqIiwgIk91dE1vZGUiKV0pLAotCQkJCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiSW5PdXRCdWZmZXIiLCAiKiIsICIqIildKSwKLQkJCQotCQkJKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibG9uZyIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKLQkJCSAKLQkJCShbKCJTSW50OCIsICIqIiwgIioiKV0sCi0JCQkgWygiU2lnbmVkQnl0ZSIsICIqIiwgIioiKV0pLAotCQkJIAotCQkJCi0JCQkoWygiVW5pQ2hhckNvdW50IiwgIioiLCAiSW5Nb2RlIiksICgiVW5pQ2hhcl9wdHIiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiVW5pY29kZVJldmVyc2VJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIlJlYWRQYXJ0aWFsUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICJXcml0ZVBhcnRpYWxSZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgIlRlbXBJbnNlcnRST01NYXAiLAorIyMgICAgICAgICAgICAgICAgICAgICAgIlJtdmVSZXNvdXJjZSIsICAgICAgICAgIyBSZW1vdmVSZXNvdXJjZQorIyMgICAgICAgICAgICAgICAgICAgICAgIlNpemVSZXNvdXJjZSIsICAgICAgICAgIyBHZXRSZXNvdXJjZVNpemVPbkRpc2sKKyMjICAgICAgICAgICAgICAgICAgICAgICJNYXhTaXplUnNyYyIsICAgICAgICAgICMgR2V0TWF4UmVzb3VyY2VTaXplCisgICAgICAgICAgICAgICAgIyBPUzggb25seQorICAgICAgICAgICAgICAgICdSR2V0UmVzb3VyY2UnLAorICAgICAgICAgICAgICAgICdPcGVuUmVzRmlsZScsCisgICAgICAgICAgICAgICAgJ0NyZWF0ZVJlc0ZpbGUnLAorICAgICAgICAgICAgICAgICdSc3JjWm9uZUluaXQnLAorICAgICAgICAgICAgICAgICdJbml0UmVzb3VyY2VzJywKKyAgICAgICAgICAgICAgICAnUnNyY01hcEVudHJ5JywKKyAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCJTdHIyNTUiLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIioiLCAiKiIsICJPdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbk91dEJ1ZmZlciIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJPdXRCdWZmZXIiLCAiKiIsICJJbk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIlNJbnQ4IiwgIioiLCAiKiIpXSwKKyAgICAgICAgICAgICAgICAgWygiU2lnbmVkQnl0ZSIsICIqIiwgIioiKV0pLAorCisKKyAgICAgICAgICAgICAgICAoWygiVW5pQ2hhckNvdW50IiwgIioiLCAiSW5Nb2RlIiksICgiVW5pQ2hhcl9wdHIiLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlVuaWNvZGVSZXZlcnNlSW5CdWZmZXIiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICBdCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9yZXMvcmVzc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL3Jlcy9yZXNzdXBwb3J0LnB5CmluZGV4IDYxMzU1NjAuLjA0YTE4MjEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3Jlcy9yZXNzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL3Jlcy9yZXNzdXBwb3J0LnB5CkBAIC03LDEzICs3LDEzIEBACiAKIGNsYXNzIFJlc01peEluOgogCi0JZGVmIGNoZWNraXQoc2VsZik6Ci0JCWlmIHNlbGYucmV0dXJudHlwZS5fX2NsYXNzX18gIT0gT1NFcnJUeXBlOgotCQkJT3V0TGJyYWNlKCkKLQkJCU91dHB1dCgiT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7IikKLQkJCU91dHB1dCgiaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsiKQotCQkJT3V0UmJyYWNlKCkKLQkJRnVuY3Rpb25HZW5lcmF0b3IuY2hlY2tpdChzZWxmKSAjIFhYWAorICAgIGRlZiBjaGVja2l0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJldHVybnR5cGUuX19jbGFzc19fICE9IE9TRXJyVHlwZToKKyAgICAgICAgICAgIE91dExicmFjZSgpCisgICAgICAgICAgICBPdXRwdXQoIk9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOyIpCisgICAgICAgICAgICBPdXRwdXQoImlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7IikKKyAgICAgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIEZ1bmN0aW9uR2VuZXJhdG9yLmNoZWNraXQoc2VsZikgIyBYWFgKIAogY2xhc3MgUmVzRnVuY3Rpb24oUmVzTWl4SW4sIE9TRXJyV2Vha0xpbmtGdW5jdGlvbkdlbmVyYXRvcik6IHBhc3MKIGNsYXNzIFJlc01ldGhvZChSZXNNaXhJbiwgT1NFcnJXZWFrTGlua01ldGhvZEdlbmVyYXRvcik6IHBhc3MKQEAgLTQyLDcgKzQyLDcgQEAKIHN0YXRpYyB2b2lkCiBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZShIYW5kbGUgaCkKIHsKLQlEaXNwb3NlSGFuZGxlKGgpOworICAgICAgICBEaXNwb3NlSGFuZGxlKGgpOwogfQogIiIiCiAKQEAgLTUxLDE1OSArNTEsMTU5IEBACiAvKiBBbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIFJlc09ial9OZXcsIHdoaWNoIHJldHVybnMgTm9uZSBmb3IgbnVsbCBhcmd1bWVudCAqLwogUHlPYmplY3QgKk9wdFJlc09ial9OZXcoSGFuZGxlIGl0c2VsZikKIHsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFJlc09ial9OZXcoaXRzZWxmKTsKKyAgICAgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXNPYmpfTmV3KGl0c2VsZik7CiB9CiAKIGludCBPcHRSZXNPYmpfQ29udmVydChQeU9iamVjdCAqdiwgSGFuZGxlICpwX2l0c2VsZikKIHsKLQlQeU9iamVjdCAqdG1wOwotCQotCWlmICggdiA9PSBQeV9Ob25lICkgewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFJlc09ial9DaGVjayh2KSkKLQl7Ci0JCSpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogSWYgaXQgaXNuJ3QgYSByZXNvdXJjZSB5ZXQgc2VlIHdoZXRoZXIgaXQgaXMgY29udmVydGlibGUgKi8KLQlpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICkgewotCQkqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdG1wKS0+b2JfaXRzZWxmOwotCQlQeV9ERUNSRUYodG1wKTsKLQkJcmV0dXJuIDE7Ci0JfQotCVB5RXJyX0NsZWFyKCk7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7Ci0JcmV0dXJuIDA7CisgICAgICAgIFB5T2JqZWN0ICp0bXA7CisKKyAgICAgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7CisgICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUmVzT2JqX0NoZWNrKHYpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gKChSZXNvdXJjZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgaXQgaXNuJ3QgYSByZXNvdXJjZSB5ZXQgc2VlIHdoZXRoZXIgaXQgaXMgY29udmVydGlibGUgKi8KKyAgICAgICAgaWYgKCAodG1wPVB5T2JqZWN0X0NhbGxNZXRob2QodiwgImFzX1Jlc291cmNlIiwgIiIpKSApIHsKKyAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdG1wKS0+b2JfaXRzZWxmOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJSZXNvdXJjZSByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKIH0KICIiIgogCiBpbml0c3R1ZmYgPSBpbml0c3R1ZmYgKyAiIiIKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhIYW5kbGUsIFJlc09ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChIYW5kbGUsIFJlc09ial9Db252ZXJ0KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhIYW5kbGUsIE9wdFJlc09ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChIYW5kbGUsIE9wdFJlc09ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoSGFuZGxlLCBSZXNPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEhhbmRsZSwgUmVzT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhIYW5kbGUsIE9wdFJlc09ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoSGFuZGxlLCBPcHRSZXNPYmpfQ29udmVydCk7CiAiIiIKIAogbW9kdWxlID0gTWFjTW9kdWxlKCdfUmVzJywgJ1JlcycsIGluY2x1ZGVzdHVmZiwgZmluYWxzdHVmZiwgaW5pdHN0dWZmKQogCiBjbGFzcyBSZXNEZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlnZXRzZXRsaXN0ID0gWwotCQkoJ2RhdGEnLAotCQkiIiIKLQkJUHlPYmplY3QgKnJlczsKLQkJY2hhciBzdGF0ZTsKKyAgICBnZXRzZXRsaXN0ID0gWworICAgICAgICAgICAgKCdkYXRhJywKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgICAgIGNoYXIgc3RhdGU7CiAKLQkJc3RhdGUgPSBIR2V0U3RhdGUoc2VsZi0+b2JfaXRzZWxmKTsKLQkJSExvY2soc2VsZi0+b2JfaXRzZWxmKTsKLQkJcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0JCQkqc2VsZi0+b2JfaXRzZWxmLAotCQkJR2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYpKTsKLQkJSFVubG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCQlIU2V0U3RhdGUoc2VsZi0+b2JfaXRzZWxmLCBzdGF0ZSk7Ci0JCXJldHVybiByZXM7Ci0JCSIiIiwKLQkJIiIiCi0JCWNoYXIgKmRhdGE7Ci0JCWxvbmcgc2l6ZTsKLQkKLQkJaWYgKCB2ID09IE5VTEwgKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoICFQeVN0cmluZ19DaGVjayh2KSApCi0JCQlyZXR1cm4gLTE7Ci0JCXNpemUgPSBQeVN0cmluZ19TaXplKHYpOwotCQlkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JCS8qIFhYWFggRG8gSSBuZWVkIHRoZSBHZXRTdGF0ZS9TZXRTdGF0ZSBjYWxscz8gKi8KLQkJU2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYsIHNpemUpOwotCQlpZiAoIE1lbUVycm9yKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCUhMb2NrKHNlbGYtPm9iX2l0c2VsZik7Ci0JCW1lbWNweSgoY2hhciAqKSpzZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUpOwotCQlIVW5sb2NrKHNlbGYtPm9iX2l0c2VsZik7Ci0JCS8qIFhYWFggU2hvdWxkIEkgZG8gdGhlIENoYW5nZWQgY2FsbCBpbW1lZGVhdGVseT8gKi8KLQkJcmV0dXJuIDA7Ci0JCSIiIiwKLQkJJ1RoZSByZXNvdXJjZSBkYXRhJwotCQkpLCAoCi0JCSdzaXplJywKLQkJJ3JldHVybiBQeUludF9Gcm9tTG9uZyhHZXRIYW5kbGVTaXplKHNlbGYtPm9iX2l0c2VsZikpOycsCi0JCU5vbmUsCi0JCSdUaGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBkYXRhJwotCQkpXQorICAgICAgICAgICAgc3RhdGUgPSBIR2V0U3RhdGUoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgIEhMb2NrKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgKnNlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgR2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYpKTsKKyAgICAgICAgICAgIEhVbmxvY2soc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgIEhTZXRTdGF0ZShzZWxmLT5vYl9pdHNlbGYsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGNoYXIgKmRhdGE7CisgICAgICAgICAgICBsb25nIHNpemU7CiAKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCi0JCQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCSMgaWYgaXQgaXNuJ3QgYSByZXNvdXJjZSB3ZSBtYXkgYmUgYWJsZSB0byBjb2VyY2UgaXQKLQkJT3V0cHV0KCJpZiAoISVzX0NoZWNrKHYpKSIsIHNlbGYucHJlZml4KQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlB5T2JqZWN0ICp0bXA7IikKLQkJT3V0cHV0KCdpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICknKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIipwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil0bXApLT5vYl9pdHNlbGY7IikKLQkJT3V0cHV0KCJQeV9ERUNSRUYodG1wKTsiKQotCQlPdXRwdXQoInJldHVybiAxOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiUHlFcnJfQ2xlYXIoKTsiKQotCQlPdXRSYnJhY2UoKQorICAgICAgICAgICAgaWYgKCB2ID09IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoICFQeVN0cmluZ19DaGVjayh2KSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHNpemUgPSBQeVN0cmluZ19TaXplKHYpOworICAgICAgICAgICAgZGF0YSA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgICAgICAgICAgLyogWFhYWCBEbyBJIG5lZWQgdGhlIEdldFN0YXRlL1NldFN0YXRlIGNhbGxzPyAqLworICAgICAgICAgICAgU2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYsIHNpemUpOworICAgICAgICAgICAgaWYgKCBNZW1FcnJvcigpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopKnNlbGYtPm9iX2l0c2VsZiwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBIVW5sb2NrKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICAvKiBYWFhYIFNob3VsZCBJIGRvIHRoZSBDaGFuZ2VkIGNhbGwgaW1tZWRlYXRlbHk/ICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICIiIiwKKyAgICAgICAgICAgICdUaGUgcmVzb3VyY2UgZGF0YScKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICdzaXplJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlJbnRfRnJvbUxvbmcoR2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYpKTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdUaGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBkYXRhJworICAgICAgICAgICAgKV0KIAotCWRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJ2b2lkICgqb2JfZnJlZWl0KSglcyBwdHIpOyIsIHNlbGYuaXRzZWxmdHlwZSkKLQkJCi0JZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiaXQtPm9iX2ZyZWVpdCA9IE5VTEw7IikKLQkJCi0JZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPdXRwdXQoImlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKSIpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgic2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOyIpCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQogCi0JZGVmIG91dHB1dF90cF9uZXdCb2R5KHNlbGYpOgotCQlPdXRwdXQoIlB5T2JqZWN0ICpzZWxmOyIpCi0JCU91dHB1dAotCQlPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQotCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9mcmVlaXQgPSBOVUxMOyIsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQotCQkKLQlkZWYgb3V0cHV0X3RwX2luaXRCb2R5KHNlbGYpOgotCQlPdXRwdXQoImNoYXIgKnNyY2RhdGEgPSBOVUxMOyIpCi0JCU91dHB1dCgiaW50IHNyY2xlbiA9IDA7IikKLQkJT3V0cHV0KCIlcyBpdHNlbGY7Iiwgc2VsZi5pdHNlbGZ0eXBlKTsKLQkJT3V0cHV0KCJjaGFyICprd1tdID0ge1wiaXRzZWxmXCIsIDB9OyIpCi0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcIk8mXCIsIGt3LCAlc19Db252ZXJ0LCAmaXRzZWxmKSkiLAotCQkJc2VsZi5wcmVmaXgpOwotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOyIsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX0NsZWFyKCk7IikKLQkJT3V0cHV0KCJpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcInxzI1wiLCBrdywgJnNyY2RhdGEsICZzcmNsZW4pKSByZXR1cm4gLTE7IikKLQkJT3V0cHV0KCJpZiAoKGl0c2VsZiA9IE5ld0hhbmRsZShzcmNsZW4pKSA9PSBOVUxMKSIpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiUHlFcnJfTm9NZW1vcnkoKTsiKQotCQlPdXRwdXQoInJldHVybiAwOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Iiwgc2VsZi5vYmplY3R0eXBlKQotIyBYWFhYCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VIYW5kbGU7IikKLQkJT3V0cHV0KCJpZiAoc3JjbGVuICYmIHNyY2RhdGEpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJITG9jayhpdHNlbGYpOyIpCi0JCU91dHB1dCgibWVtY3B5KCppdHNlbGYsIHNyY2RhdGEsIHNyY2xlbik7IikKLQkJT3V0cHV0KCJIVW5sb2NrKGl0c2VsZik7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQorICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisgICAgICAgICMgaWYgaXQgaXNuJ3QgYSByZXNvdXJjZSB3ZSBtYXkgYmUgYWJsZSB0byBjb2VyY2UgaXQKKyAgICAgICAgT3V0cHV0KCJpZiAoISVzX0NoZWNrKHYpKSIsIHNlbGYucHJlZml4KQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICp0bXA7IikKKyAgICAgICAgT3V0cHV0KCdpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICknKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIipwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil0bXApLT5vYl9pdHNlbGY7IikKKyAgICAgICAgT3V0cHV0KCJQeV9ERUNSRUYodG1wKTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAxOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfQ2xlYXIoKTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorCisgICAgZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoInZvaWQgKCpvYl9mcmVlaXQpKCVzIHB0cik7Iiwgc2VsZi5pdHNlbGZ0eXBlKQorCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX2ZyZWVpdCA9IE5VTEw7IikKKworICAgIGRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoInNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgic2VsZi0+b2JfaXRzZWxmID0gTlVMTDsiKQorCisgICAgZGVmIG91dHB1dF90cF9uZXdCb2R5KHNlbGYpOgorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpzZWxmOyIpCisgICAgICAgIE91dHB1dAorICAgICAgICBPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsiLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9mcmVlaXQgPSBOVUxMOyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQorCisgICAgZGVmIG91dHB1dF90cF9pbml0Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCJjaGFyICpzcmNkYXRhID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoImludCBzcmNsZW4gPSAwOyIpCisgICAgICAgIE91dHB1dCgiJXMgaXRzZWxmOyIsIHNlbGYuaXRzZWxmdHlwZSk7CisgICAgICAgIE91dHB1dCgiY2hhciAqa3dbXSA9IHtcIml0c2VsZlwiLCAwfTsiKQorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoImlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJPJlwiLCBrdywgJXNfQ29udmVydCwgJml0c2VsZikpIiwKKyAgICAgICAgICAgICAgICBzZWxmLnByZWZpeCk7CisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Iiwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfQ2xlYXIoKTsiKQorICAgICAgICBPdXRwdXQoImlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIFwifHMjXCIsIGt3LCAmc3JjZGF0YSwgJnNyY2xlbikpIHJldHVybiAtMTsiKQorICAgICAgICBPdXRwdXQoImlmICgoaXRzZWxmID0gTmV3SGFuZGxlKHNyY2xlbikpID09IE5VTEwpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJQeUVycl9Ob01lbW9yeSgpOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDA7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsiLCBzZWxmLm9iamVjdHR5cGUpCisjIFhYWFggICAgICAgICAgT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlSGFuZGxlOyIpCisgICAgICAgIE91dHB1dCgiaWYgKHNyY2xlbiAmJiBzcmNkYXRhKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiSExvY2soaXRzZWxmKTsiKQorICAgICAgICBPdXRwdXQoIm1lbWNweSgqaXRzZWxmLCBzcmNkYXRhLCBzcmNsZW4pOyIpCisgICAgICAgIE91dHB1dCgiSFVubG9jayhpdHNlbGYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDA7IikKIAogcmVzb2JqZWN0ID0gUmVzRGVmaW5pdGlvbignUmVzb3VyY2UnLCAnUmVzT2JqJywgJ0hhbmRsZScpCiBtb2R1bGUuYWRkb2JqZWN0KHJlc29iamVjdCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3NjcmFwL3NjcmFwc2Nhbi5weSBiL01hYy9Nb2R1bGVzL3NjcmFwL3NjcmFwc2Nhbi5weQppbmRleCAwYjE3M2E0Li4xZmM4MTkxIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9zY3JhcC9zY3JhcHNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvc2NyYXAvc2NyYXBzY2FuLnB5CkBAIC0xMyw0OSArMTMsNDkgQEAKIFNIT1JUID0gInNjcmFwIgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gIlNjcmFwLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSAiQFNjcmFwLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotIyMJcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLSMjCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9ICJTY3JhcC5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gIkBTY3JhcC5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyMjICAgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyMjICAgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgPT0gJ1NjcmFwUmVmJyBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gIm1ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0ID09ICdTY3JhcFJlZicgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJHZXRTY3JhcEZsYXZvckluZm9MaXN0IiwKLQkJCSdJbmZvU2NyYXAnLAotCQkJJ0dldFNjcmFwJywKLQkJCSdaZXJvU2NyYXAnLAotCQkJJ1B1dFNjcmFwJywKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJHZXRTY3JhcEZsYXZvckluZm9MaXN0IiwKKyAgICAgICAgICAgICAgICAnSW5mb1NjcmFwJywKKyAgICAgICAgICAgICAgICAnR2V0U2NyYXAnLAorICAgICAgICAgICAgICAgICdaZXJvU2NyYXAnLAorICAgICAgICAgICAgICAgICdQdXRTY3JhcCcsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSdTY3JhcFByb21pc2VLZWVwZXJVUFAnLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgJ1NjcmFwUHJvbWlzZUtlZXBlclVQUCcsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygndm9pZCcsICcqJywgJ091dE1vZGUnKV0sIFsoJ3B1dHNjcmFwYnVmZmVyJywgJyonLCAnSW5Nb2RlJyldKSwKLQkJCShbKCd2b2lkX3B0cicsICcqJywgJ0luTW9kZScpXSwgWygncHV0c2NyYXBidWZmZXInLCAnKicsICdJbk1vZGUnKV0pLAotCQkJXQotCQkJCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgKFsoJ3ZvaWQnLCAnKicsICdPdXRNb2RlJyldLCBbKCdwdXRzY3JhcGJ1ZmZlcicsICcqJywgJ0luTW9kZScpXSksCisgICAgICAgICAgICAgICAgKFsoJ3ZvaWRfcHRyJywgJyonLCAnSW5Nb2RlJyldLCBbKCdwdXRzY3JhcGJ1ZmZlcicsICcqJywgJ0luTW9kZScpXSksCisgICAgICAgICAgICAgICAgXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvc2NyYXAvc2NyYXBzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvc2NyYXAvc2NyYXBzdXBwb3J0LnB5CmluZGV4IDYzNGE0MzkuLjg0YTc1ZDIgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3NjcmFwL3NjcmFwc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9zY3JhcC9zY3JhcHN1cHBvcnQucHkKQEAgLTksMTYgKzksMTYgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdTY3JhcC5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX1NjcmFwJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnU2NyYXAnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK01BQ0hFQURFUkZJTEUgPSAnU2NyYXAuaCcgICAgICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfU2NyYXAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ1NjcmFwJyAgICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ1NjcmFwJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgJ1JlZicJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdTY3JhcCcgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArICdSZWYnICMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCitPQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJyAgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9ICdAJyArIE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9ICdAJyArIE1PRE5BTUUgKyAibW9kdWxlLmMiICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtMzMsMTIgKzMzLDEyIEBACiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIFNDUlJlY19OZXcoaXRzZWxmKQotCVNjcmFwU3R1ZmYgKml0c2VsZjsKKyAgICAgICAgU2NyYXBTdHVmZiAqaXRzZWxmOwogewogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxPJmhoTyYiLCBpdHNlbGYtPnNjcmFwU2l6ZSwKLQkJUmVzT2JqX05ldywgaXRzZWxmLT5zY3JhcEhhbmRsZSwgaXRzZWxmLT5zY3JhcENvdW50LCBpdHNlbGYtPnNjcmFwU3RhdGUsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBpdHNlbGYtPnNjcmFwTmFtZSk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsTyZoaE8mIiwgaXRzZWxmLT5zY3JhcFNpemUsCisgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaXRzZWxmLT5zY3JhcEhhbmRsZSwgaXRzZWxmLT5zY3JhcENvdW50LCBpdHNlbGYtPnNjcmFwU3RhdGUsCisgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGl0c2VsZi0+c2NyYXBOYW1lKTsKIH0KICIiIgogCkBAIC00OSw3ICs0OSw3IEBACiBwdXRzY3JhcGJ1ZmZlciA9IEZpeGVkSW5wdXRCdWZmZXJUeXBlKCd2b2lkIConKQogCiBjbGFzcyBNeU9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCXBhc3MKKyAgICBwYXNzCiAKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgZ3JvdXBzIGFuZCBsaW5rIHRoZW0KIG1vZHVsZSA9IE1hY01vZHVsZShNT0ROQU1FLCBNT0RQUkVGSVgsIGluY2x1ZGVzdHVmZiwgZmluYWxzdHVmZiwgaW5pdHN0dWZmKQpAQCAtNzMsNCArNzMsMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvc25kL3NuZHNjYW4ucHkgYi9NYWMvTW9kdWxlcy9zbmQvc25kc2Nhbi5weQppbmRleCBhMjg3YzczLi5jNGE4MjY2IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9zbmQvc25kc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9zbmQvc25kc2Nhbi5weQpAQCAtMTAsMTE5ICsxMCwxMTkgQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSAiU291bmQuaCIKLQlvdXRwdXQgPSAic25kZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIlNvdW5kLnB5IgotCXNjYW5uZXIgPSBTb3VuZFNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGRvaW5nICdpbXBvcnQgc25kc3VwcG9ydCcgPT09IgotCWltcG9ydCBzbmRzdXBwb3J0Ci0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBTbmRtb2R1bGUuYyA9PT0iCisgICAgaW5wdXQgPSAiU291bmQuaCIKKyAgICBvdXRwdXQgPSAic25kZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIlNvdW5kLnB5IgorICAgIHNjYW5uZXIgPSBTb3VuZFNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGRvaW5nICdpbXBvcnQgc25kc3VwcG9ydCcgPT09IgorICAgIGltcG9ydCBzbmRzdXBwb3J0CisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBTbmRtb2R1bGUuYyA9PT0iCiAKIGNsYXNzIFNvdW5kU2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIlNuZEZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCA9PSAiU25kQ2hhbm5lbFB0ciIgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIlNuZE1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJzbmRtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIlNuZEZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCA9PSAiU25kQ2hhbm5lbFB0ciIgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIlNuZE1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJzbmRtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJJ1NuZERpc3Bvc2VDaGFubmVsJywJCSMgYXV0b21hdGljIG9uIGRlYWxsb2NhdGlvbgotCQkJJ1NuZEFkZE1vZGlmaWVyJywJCSMgZm9yIGludGVybmFsIHVzZSBvbmx5Ci0JCQknU25kUGxheURvdWJsZUJ1ZmZlcicsCQkjIHZlcnkgbG93IGxldmVsIHJvdXRpbmUKLQkJCSMgTWlzc2luZyBmcm9tIGxpYnJhcmllcyAoVUgzMzIpCi0JCQknU291bmRNYW5hZ2VyU2V0SW5mbycsCi0JCQknU291bmRNYW5hZ2VyR2V0SW5mbycsCi0JCQkjIENvbnN0YW50cyB3aXRoIGZ1bm55IGRlZmluaXRpb25zCi0JCQkncmF0ZTQ4a2h6JywKLQkJCSdyYXRlNDRraHonLAotCQkJJ2tJbnZhbGlkU291cmNlJywKLQkJCSMgT1M4IG9ubHk6Ci0JCQknTUFDRVZlcnNpb24nLAotCQkJJ1NQQlJlY29yZFRvRmlsZScsCi0JCQknRXhwMXRvNicsCi0JCQknQ29tcDZ0bzEnLAotCQkJJ0V4cDF0bzMnLAotCQkJJ0NvbXAzdG8xJywKLQkJCSdTbmRDb250cm9sJywKLQkJCSdTbmRTdG9wRmlsZVBsYXknLAotCQkJJ1NuZFN0YXJ0RmlsZVBsYXknLAotCQkJJ1NuZFBhdXNlRmlsZVBsYXknLAotCQkJJ1NuZFJlY29yZFRvRmlsZScsCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAnU25kRGlzcG9zZUNoYW5uZWwnLCAgICAgICAgICAgICMgYXV0b21hdGljIG9uIGRlYWxsb2NhdGlvbgorICAgICAgICAgICAgICAgICdTbmRBZGRNb2RpZmllcicsICAgICAgICAgICAgICAgIyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkKKyAgICAgICAgICAgICAgICAnU25kUGxheURvdWJsZUJ1ZmZlcicsICAgICAgICAgICMgdmVyeSBsb3cgbGV2ZWwgcm91dGluZQorICAgICAgICAgICAgICAgICMgTWlzc2luZyBmcm9tIGxpYnJhcmllcyAoVUgzMzIpCisgICAgICAgICAgICAgICAgJ1NvdW5kTWFuYWdlclNldEluZm8nLAorICAgICAgICAgICAgICAgICdTb3VuZE1hbmFnZXJHZXRJbmZvJywKKyAgICAgICAgICAgICAgICAjIENvbnN0YW50cyB3aXRoIGZ1bm55IGRlZmluaXRpb25zCisgICAgICAgICAgICAgICAgJ3JhdGU0OGtoeicsCisgICAgICAgICAgICAgICAgJ3JhdGU0NGtoeicsCisgICAgICAgICAgICAgICAgJ2tJbnZhbGlkU291cmNlJywKKyAgICAgICAgICAgICAgICAjIE9TOCBvbmx5OgorICAgICAgICAgICAgICAgICdNQUNFVmVyc2lvbicsCisgICAgICAgICAgICAgICAgJ1NQQlJlY29yZFRvRmlsZScsCisgICAgICAgICAgICAgICAgJ0V4cDF0bzYnLAorICAgICAgICAgICAgICAgICdDb21wNnRvMScsCisgICAgICAgICAgICAgICAgJ0V4cDF0bzMnLAorICAgICAgICAgICAgICAgICdDb21wM3RvMScsCisgICAgICAgICAgICAgICAgJ1NuZENvbnRyb2wnLAorICAgICAgICAgICAgICAgICdTbmRTdG9wRmlsZVBsYXknLAorICAgICAgICAgICAgICAgICdTbmRTdGFydEZpbGVQbGF5JywKKyAgICAgICAgICAgICAgICAnU25kUGF1c2VGaWxlUGxheScsCisgICAgICAgICAgICAgICAgJ1NuZFJlY29yZFRvRmlsZScsCiAKLQkJCV0KKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkdldFNvdW5kVm9sIiwKLQkJCSJTZXRTb3VuZFZvbCIsCi0JCQkiVW5zaWduZWRGaXhlZCIsCi0JCQkjIERvbid0IGhhdmUgdGhlIHRpbWUgdG8gZGlnIGludG8gdGhpcy4uLgotCQkJIkNvbXBvbmVudCIsCi0JCQkiQ29tcG9uZW50SW5zdGFuY2UiLAotCQkJIlNvdW5kQ29tcG9uZW50RGF0YVB0ciIsCi0JCQkiU291bmRDb21wb25lbnREYXRhIiwKLQkJCSJTb3VuZENvbXBvbmVudERhdGFfcHRyIiwKLQkJCSJTb3VuZENvbnZlcnRlciIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiR2V0U291bmRWb2wiLAorICAgICAgICAgICAgICAgICJTZXRTb3VuZFZvbCIsCisgICAgICAgICAgICAgICAgIlVuc2lnbmVkRml4ZWQiLAorICAgICAgICAgICAgICAgICMgRG9uJ3QgaGF2ZSB0aGUgdGltZSB0byBkaWcgaW50byB0aGlzLi4uCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudCIsCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudEluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAiU291bmRDb21wb25lbnREYXRhUHRyIiwKKyAgICAgICAgICAgICAgICAiU291bmRDb21wb25lbnREYXRhIiwKKyAgICAgICAgICAgICAgICAiU291bmRDb21wb25lbnREYXRhX3B0ciIsCisgICAgICAgICAgICAgICAgIlNvdW5kQ29udmVydGVyIiwKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCJTdHIyNTUiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiKiIsICIqIiwgIk91dE1vZGUiKV0pLAotCQkJCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIlZhclZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCi0JCQkKLQkJCShbKCJTQ1N0YXR1c1B0ciIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJTQ1N0YXR1cyIsICIqIiwgIk91dE1vZGUiKV0pLAotCQkJCi0JCQkoWygiU01TdGF0dXNQdHIiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiU01TdGF0dXMiLCAiKiIsICJPdXRNb2RlIildKSwKLQkJCSAKLQkJCShbKCJDb21wcmVzc2lvbkluZm9QdHIiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiQ29tcHJlc3Npb25JbmZvIiwgIioiLCAiT3V0TW9kZSIpXSksCi0JCQkKLQkJCSMgRm9yIFNuZFBsYXkncyBTbmRMaXN0SGFuZGxlIGFyZ3VtZW50Ci0JCQkoWygiSGFuZGxlIiwgInNuZEhkbCIsICJJbk1vZGUiKV0sCi0JCQkgWygiU25kTGlzdEhhbmRsZSIsICIqIiwgIioiKV0pLAotCQkJIAotCQkJIyBGb3IgU25kU3RhcnRGaWxlUGxheQotCQkJKFsoImxvbmciLCAiYnVmZmVyU2l6ZSIsICJJbk1vZGUiKSwgKCJ2b2lkIiwgInRoZUJ1ZmZlciIsICJPdXRNb2RlIildLAotCQkJIFsoIioiLCAiKiIsICIqIiksICgiRmFrZVR5cGUoJzAnKSIsICIqIiwgIkluTW9kZSIpXSksCi0JCQkKLQkJCSMgRm9yIENvbXAzdG8xIGV0Yy4KLQkJCShbKCJ2b2lkX3B0ciIsICJpbkJ1ZmZlciIsICJJbk1vZGUiKSwKLQkJCSAgKCJ2b2lkIiwgIm91dEJ1ZmZlciIsICJPdXRNb2RlIiksCi0JCQkgICgidW5zaWduZWRfbG9uZyIsICJjbnQiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluT3V0QnVmZmVyIiwgImJ1ZmZlciIsICJJbk91dE1vZGUiKV0pLAotCQkJCi0JCQkjIERpdHRvCi0jIwkJCShbKCJ2b2lkX3B0ciIsICJpblN0YXRlIiwgIkluTW9kZSIpLCAoInZvaWQiLCAib3V0U3RhdGUiLCAiT3V0TW9kZSIpXSwKLSMjCQkJIFsoIkluT3V0QnVmMTI4IiwgInN0YXRlIiwgIkluT3V0TW9kZSIpXSksCi0JCQkoWygiU3RhdGVCbG9ja1B0ciIsICJpblN0YXRlIiwgIkluTW9kZSIpLCAoIlN0YXRlQmxvY2tQdHIiLCAib3V0U3RhdGUiLCAiSW5Nb2RlIildLAotCQkJIFsoIlN0YXRlQmxvY2siLCAic3RhdGUiLCAiSW5PdXRNb2RlIildKSwKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygiU3RyMjU1IiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCIqIiwgIioiLCAiT3V0TW9kZSIpXSksCiAKLQkJCSMgQ2F0Y2gtYWxsIGZvciB0aGUgbGFzdCBjb3VwbGUgb2Ygdm9pZCBwb2ludGVycwotCQkJKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIildKSwKLQkJCV0KKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJWYXJWYXJPdXRCdWZmZXIiLCAiKiIsICJJbk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIlNDU3RhdHVzUHRyIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJTQ1N0YXR1cyIsICIqIiwgIk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIlNNU3RhdHVzUHRyIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJTTVN0YXR1cyIsICIqIiwgIk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIkNvbXByZXNzaW9uSW5mb1B0ciIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiQ29tcHJlc3Npb25JbmZvIiwgIioiLCAiT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAjIEZvciBTbmRQbGF5J3MgU25kTGlzdEhhbmRsZSBhcmd1bWVudAorICAgICAgICAgICAgICAgIChbKCJIYW5kbGUiLCAic25kSGRsIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiU25kTGlzdEhhbmRsZSIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgIyBGb3IgU25kU3RhcnRGaWxlUGxheQorICAgICAgICAgICAgICAgIChbKCJsb25nIiwgImJ1ZmZlclNpemUiLCAiSW5Nb2RlIiksICgidm9pZCIsICJ0aGVCdWZmZXIiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiKiIsICIqIiwgIioiKSwgKCJGYWtlVHlwZSgnMCcpIiwgIioiLCAiSW5Nb2RlIildKSwKKworICAgICAgICAgICAgICAgICMgRm9yIENvbXAzdG8xIGV0Yy4KKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiaW5CdWZmZXIiLCAiSW5Nb2RlIiksCisgICAgICAgICAgICAgICAgICAoInZvaWQiLCAib3V0QnVmZmVyIiwgIk91dE1vZGUiKSwKKyAgICAgICAgICAgICAgICAgICgidW5zaWduZWRfbG9uZyIsICJjbnQiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbk91dEJ1ZmZlciIsICJidWZmZXIiLCAiSW5PdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgICMgRGl0dG8KKyMjICAgICAgICAgICAgICAgICAgICAgIChbKCJ2b2lkX3B0ciIsICJpblN0YXRlIiwgIkluTW9kZSIpLCAoInZvaWQiLCAib3V0U3RhdGUiLCAiT3V0TW9kZSIpXSwKKyMjICAgICAgICAgICAgICAgICAgICAgICBbKCJJbk91dEJ1ZjEyOCIsICJzdGF0ZSIsICJJbk91dE1vZGUiKV0pLAorICAgICAgICAgICAgICAgIChbKCJTdGF0ZUJsb2NrUHRyIiwgImluU3RhdGUiLCAiSW5Nb2RlIiksICgiU3RhdGVCbG9ja1B0ciIsICJvdXRTdGF0ZSIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlN0YXRlQmxvY2siLCAic3RhdGUiLCAiSW5PdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgICMgQ2F0Y2gtYWxsIGZvciB0aGUgbGFzdCBjb3VwbGUgb2Ygdm9pZCBwb2ludGVycworICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKV0pLAorICAgICAgICAgICAgICAgIF0KIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3NuZC9zbmRzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvc25kL3NuZHN1cHBvcnQucHkKaW5kZXggOTlkZjViZS4uY2YwZmE2YyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvc25kL3NuZHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvc25kL3NuZHN1cHBvcnQucHkKQEAgLTI3LDEyICsyNywxMiBAQAogIyBkZWZpbmUgdHlwZXMgdXNlZCBmb3IgYXJndW1lbnRzIChpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBhbmQgbWFjc3VwcG9ydCB0eXBlcykKIAogY2xhc3MgU25kQ2hhbm5lbFB0clR5cGUoT3BhcXVlQnlWYWx1ZVR5cGUpOgotCWRlZiBkZWNsYXJlKHNlbGYsIG5hbWUpOgotCQkjIEluaXRpYWxpemluZyBhbGwgU25kQ2hhbm5lbFB0ciBvYmplY3RzIHRvIDAgc2F2ZXMKLQkJIyBzcGVjaWFsLWNhc2luZyBOZXdTbmRDaGFubmVsKCksIHdoZXJlIGl0IGlzIGZvcm1hbGx5IGFuCi0JCSMgaW5wdXQtb3V0cHV0IHBhcmFtZXRlciBidXQgd2UgdHJlYXQgaXQgYXMgb3V0cHV0LW9ubHkKLQkJIyAoc2luY2UgUHl0aG9uIHVzZXJzIGFyZSBub3Qgc3VwcG9zZWQgdG8gYWxsb2NhdGUgbWVtb3J5KQotCQlPdXRwdXQoIlNuZENoYW5uZWxQdHIgJXMgPSAwOyIsIG5hbWUpCisgICAgZGVmIGRlY2xhcmUoc2VsZiwgbmFtZSk6CisgICAgICAgICMgSW5pdGlhbGl6aW5nIGFsbCBTbmRDaGFubmVsUHRyIG9iamVjdHMgdG8gMCBzYXZlcworICAgICAgICAjIHNwZWNpYWwtY2FzaW5nIE5ld1NuZENoYW5uZWwoKSwgd2hlcmUgaXQgaXMgZm9ybWFsbHkgYW4KKyAgICAgICAgIyBpbnB1dC1vdXRwdXQgcGFyYW1ldGVyIGJ1dCB3ZSB0cmVhdCBpdCBhcyBvdXRwdXQtb25seQorICAgICAgICAjIChzaW5jZSBQeXRob24gdXNlcnMgYXJlIG5vdCBzdXBwb3NlZCB0byBhbGxvY2F0ZSBtZW1vcnkpCisgICAgICAgIE91dHB1dCgiU25kQ2hhbm5lbFB0ciAlcyA9IDA7IiwgbmFtZSkKIAogU25kQ2hhbm5lbFB0ciA9IFNuZENoYW5uZWxQdHJUeXBlKCdTbmRDaGFubmVsUHRyJywgJ1NuZENoJykKIApAQCAtNDksMjggKzQ5LDI4IEBACiB2b2lkX3B0ciA9IFR5cGUoInZvaWQgKiIsICJ3IikKIAogY2xhc3MgU25kQ2FsbEJhY2tUeXBlKElucHV0T25seVR5cGUpOgotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJVHlwZS5fX2luaXRfXyhzZWxmLCAnUHlPYmplY3QqJywgJ08nKQotCWRlZiBnZXRhcmdzQ2hlY2soc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgiaWYgKCVzICE9IFB5X05vbmUgJiYgIVB5Q2FsbGFibGVfQ2hlY2soJXMpKSIsIG5hbWUsIG5hbWUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgnUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNhbGxiYWNrIG11c3QgYmUgY2FsbGFibGUiKTsnKQotCQlPdXRwdXQoImdvdG8gJXNfX2Vycm9yX187IiwgbmFtZSkKLQkJT3V0UmJyYWNlKCkKLQlkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIk5ld1NuZENhbGxCYWNrVVBQKFNuZENoX1VzZXJSb3V0aW5lKSIKLQlkZWYgY2xlYW51cChzZWxmLCBuYW1lKToKLQkJIyBYWFggVGhpcyBrbm93cyBpdCBpcyBleGVjdXRpbmcgaW5zaWRlIHRoZSBTbmROZXdDaGFubmVsIHdyYXBwZXIKLQkJT3V0cHV0KCJpZiAoX3JlcyAhPSBOVUxMICYmICVzICE9IFB5X05vbmUpIiwgbmFtZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilfcmVzOyIpCi0JCU91dHB1dCgicC0+b2JfaXRzZWxmLT51c2VySW5mbyA9IChsb25nKXA7IikKLQkJT3V0cHV0KCJQeV9JTkNSRUYoJXMpOyIsIG5hbWUpCi0JCU91dHB1dCgicC0+b2JfY2FsbGJhY2sgPSAlczsiLCBuYW1lKQotCQlPdXRSYnJhY2UoKQotCQlEZWRlbnRMZXZlbCgpCi0JCU91dHB1dCgiICVzX19lcnJvcl9fOiA7IiwgbmFtZSkKLQkJSW5kZW50TGV2ZWwoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVHlwZS5fX2luaXRfXyhzZWxmLCAnUHlPYmplY3QqJywgJ08nKQorICAgIGRlZiBnZXRhcmdzQ2hlY2soc2VsZiwgbmFtZSk6CisgICAgICAgIE91dHB1dCgiaWYgKCVzICE9IFB5X05vbmUgJiYgIVB5Q2FsbGFibGVfQ2hlY2soJXMpKSIsIG5hbWUsIG5hbWUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgnUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNhbGxiYWNrIG11c3QgYmUgY2FsbGFibGUiKTsnKQorICAgICAgICBPdXRwdXQoImdvdG8gJXNfX2Vycm9yX187IiwgbmFtZSkKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICBkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gIk5ld1NuZENhbGxCYWNrVVBQKFNuZENoX1VzZXJSb3V0aW5lKSIKKyAgICBkZWYgY2xlYW51cChzZWxmLCBuYW1lKToKKyAgICAgICAgIyBYWFggVGhpcyBrbm93cyBpdCBpcyBleGVjdXRpbmcgaW5zaWRlIHRoZSBTbmROZXdDaGFubmVsIHdyYXBwZXIKKyAgICAgICAgT3V0cHV0KCJpZiAoX3JlcyAhPSBOVUxMICYmICVzICE9IFB5X05vbmUpIiwgbmFtZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilfcmVzOyIpCisgICAgICAgIE91dHB1dCgicC0+b2JfaXRzZWxmLT51c2VySW5mbyA9IChsb25nKXA7IikKKyAgICAgICAgT3V0cHV0KCJQeV9JTkNSRUYoJXMpOyIsIG5hbWUpCisgICAgICAgIE91dHB1dCgicC0+b2JfY2FsbGJhY2sgPSAlczsiLCBuYW1lKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBEZWRlbnRMZXZlbCgpCisgICAgICAgIE91dHB1dCgiICVzX19lcnJvcl9fOiA7IiwgbmFtZSkKKyAgICAgICAgSW5kZW50TGV2ZWwoKQogCiBTbmRDYWxsQmFja1Byb2NQdHIgPSBTbmRDYWxsQmFja1R5cGUoKQogU25kQ2FsbEJhY2tVUFAgPSBTbmRDYWxsQmFja1Byb2NQdHIKQEAgLTk1LDE2ICs5NSwxNiBAQAogc3RhdGljIGludAogU25kQ21kX0NvbnZlcnQoUHlPYmplY3QgKnYsIFNuZENvbW1hbmQgKnBjKQogewotCWludCBsZW47Ci0JcGMtPnBhcmFtMSA9IDA7Ci0JcGMtPnBhcmFtMiA9IDA7Ci0JaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKLQkJaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImh8aGwiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yKSkKLQkJCXJldHVybiAxOwotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiSGhzIyIsICZwYy0+Y21kLCAmcGMtPnBhcmFtMSwgJnBjLT5wYXJhbTIsICZsZW4pOwotCX0KLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmcGMtPmNtZCk7CisgICAgICAgIGludCBsZW47CisgICAgICAgIHBjLT5wYXJhbTEgPSAwOworICAgICAgICBwYy0+cGFyYW0yID0gMDsKKyAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAiaHxobCIsICZwYy0+Y21kLCAmcGMtPnBhcmFtMSwgJnBjLT5wYXJhbTIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiSGhzIyIsICZwYy0+Y21kLCAmcGMtPnBhcmFtMSwgJnBjLT5wYXJhbTIsICZsZW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiSCIsICZwYy0+Y21kKTsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkIFNuZENoX1VzZXJSb3V0aW5lKFNuZENoYW5uZWxQdHIgY2hhbiwgU25kQ29tbWFuZCAqY21kKTsgLyogRm9yd2FyZCAqLwpAQCAtMTE3LDYyICsxMTcsNjIgQEAKIHN0YXRpYyBpbnQKIFNuZENoX0NhbGxDYWxsQmFjayh2b2lkICphcmcpCiB7Ci0JU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopYXJnOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpyZXM7Ci0JYXJncyA9IFB5X0J1aWxkVmFsdWUoIihPKGhobCkpIiwKLQkgICAgICAgICAgICAgICAgICAgICBwLCBwLT5vYl9jbWQuY21kLCBwLT5vYl9jbWQucGFyYW0xLCBwLT5vYl9jbWQucGFyYW0yKTsKLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChwLT5vYl9jYWxsYmFjaywgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgICAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilhcmc7CisgICAgICAgIFB5T2JqZWN0ICphcmdzOworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8oaGhsKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBwLT5vYl9jbWQuY21kLCBwLT5vYl9jbWQucGFyYW0xLCBwLT5vYl9jbWQucGFyYW0yKTsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfY2FsbGJhY2ssIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gMDsKIH0KIAogLyogUm91dGluZSBwYXNzZWQgdG8gTmV3U25kQ2hhbm5lbCAtLSBzY2hlZHVsZSBhIGNhbGwgdG8gU25kQ2hfQ2FsbENhbGxCYWNrICovCiBzdGF0aWMgcGFzY2FsIHZvaWQKIFNuZENoX1VzZXJSb3V0aW5lKFNuZENoYW5uZWxQdHIgY2hhbiwgU25kQ29tbWFuZCAqY21kKQogewotCVNuZENoYW5uZWxPYmplY3QgKnAgPSAoU25kQ2hhbm5lbE9iamVjdCAqKShjaGFuLT51c2VySW5mbyk7Ci0JaWYgKHAtPm9iX2NhbGxiYWNrICE9IE5VTEwpIHsKLQkJbG9uZyBBNSA9IFNldEE1KHAtPm9iX0E1KTsKLQkJcC0+b2JfY21kID0gKmNtZDsKLQkJUHlfQWRkUGVuZGluZ0NhbGwoU25kQ2hfQ2FsbENhbGxCYWNrLCAodm9pZCAqKXApOwotCQlTZXRBNShBNSk7Ci0JfQorICAgICAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKikoY2hhbi0+dXNlckluZm8pOworICAgICAgICBpZiAocC0+b2JfY2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGxvbmcgQTUgPSBTZXRBNShwLT5vYl9BNSk7CisgICAgICAgICAgICAgICAgcC0+b2JfY21kID0gKmNtZDsKKyAgICAgICAgICAgICAgICBQeV9BZGRQZW5kaW5nQ2FsbChTbmRDaF9DYWxsQ2FsbEJhY2ssICh2b2lkICopcCk7CisgICAgICAgICAgICAgICAgU2V0QTUoQTUpOworICAgICAgICB9CiB9CiAKIC8qIFNQQiBjYWxsYmFja3MgLSBTY2hlZHVsZSBjYWxsYmFja3MgdG8gUHl0aG9uICovCiBzdGF0aWMgaW50CiBTUEJfQ2FsbENhbGxCYWNrKHZvaWQgKmFyZykKIHsKLQlTUEJPYmplY3QgKnAgPSAoU1BCT2JqZWN0ICopYXJnOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpyZXM7Ci0JCi0JaWYgKCBwLT5vYl90aGlzY2FsbGJhY2sgPT0gMCApIHJldHVybiAwOwotCWFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTykiLCBwKTsKLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChwLT5vYl90aGlzY2FsbGJhY2ssIGFyZ3MpOwotCXAtPm9iX3RoaXNjYWxsYmFjayA9IDA7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgICAgICBTUEJPYmplY3QgKnAgPSAoU1BCT2JqZWN0ICopYXJnOworICAgICAgICBQeU9iamVjdCAqYXJnczsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKworICAgICAgICBpZiAoIHAtPm9iX3RoaXNjYWxsYmFjayA9PSAwICkgcmV0dXJuIDA7CisgICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTykiLCBwKTsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfdGhpc2NhbGxiYWNrLCBhcmdzKTsKKyAgICAgICAgcC0+b2JfdGhpc2NhbGxiYWNrID0gMDsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogU1BCX2NvbXBsZXRpb24oU1BCUHRyIG15X3NwYikKIHsKLQlTUEJPYmplY3QgKnAgPSAoU1BCT2JqZWN0ICopKG15X3NwYi0+dXNlckxvbmcpOwotCQotCWlmIChwICYmIHAtPm9iX2NvbXBsZXRpb24pIHsKLQkJbG9uZyBBNSA9IFNldEE1KHAtPm9iX0E1KTsKLQkJcC0+b2JfdGhpc2NhbGxiYWNrID0gcC0+b2JfY29tcGxldGlvbjsJLyogSG9wZSB3ZSBjYW5ub3QgZ2V0IHR3byBhdCB0aGUgc2FtZSB0aW1lICovCi0JCVB5X0FkZFBlbmRpbmdDYWxsKFNQQl9DYWxsQ2FsbEJhY2ssICh2b2lkICopcCk7Ci0JCVNldEE1KEE1KTsKLQl9CisgICAgICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKikobXlfc3BiLT51c2VyTG9uZyk7CisKKyAgICAgICAgaWYgKHAgJiYgcC0+b2JfY29tcGxldGlvbikgeworICAgICAgICAgICAgICAgIGxvbmcgQTUgPSBTZXRBNShwLT5vYl9BNSk7CisgICAgICAgICAgICAgICAgcC0+b2JfdGhpc2NhbGxiYWNrID0gcC0+b2JfY29tcGxldGlvbjsgIC8qIEhvcGUgd2UgY2Fubm90IGdldCB0d28gYXQgdGhlIHNhbWUgdGltZSAqLworICAgICAgICAgICAgICAgIFB5X0FkZFBlbmRpbmdDYWxsKFNQQl9DYWxsQ2FsbEJhY2ssICh2b2lkICopcCk7CisgICAgICAgICAgICAgICAgU2V0QTUoQTUpOworICAgICAgICB9CiB9CiAKICIiIgpAQCAtMTgyLDExMCArMTgyLDExMCBAQAogCiBjbGFzcyBTbmRPYmplY3REZWZpbml0aW9uKFBFUDI1Mk1peGluLCBPYmplY3REZWZpbml0aW9uKToKIAotCWRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCIvKiBNZW1iZXJzIHVzZWQgdG8gaW1wbGVtZW50IGNhbGxiYWNrczogKi8iKQotCQlPdXRwdXQoIlB5T2JqZWN0ICpvYl9jYWxsYmFjazsiKQotCQlPdXRwdXQoImxvbmcgb2JfQTU7Iik7Ci0JCU91dHB1dCgiU25kQ29tbWFuZCBvYl9jbWQ7IikKKyAgICBkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovIikKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqb2JfY2FsbGJhY2s7IikKKyAgICAgICAgT3V0cHV0KCJsb25nIG9iX0E1OyIpOworICAgICAgICBPdXRwdXQoIlNuZENvbW1hbmQgb2JfY21kOyIpCiAKLQlkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJpdC0+b2JfY2FsbGJhY2sgPSBOVUxMOyIpCi0JCU91dHB1dCgiaXQtPm9iX0E1ID0gU2V0Q3VycmVudEE1KCk7Iik7CisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIml0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOyIpOwogCi0JZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPYmplY3REZWZpbml0aW9uLm91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFjayk7IikKLQkKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotCQlPdXRwdXQoIlNuZERpc3Bvc2VDaGFubmVsKCVzLCAxKTsiLCBpdHNlbGZuYW1lKQotCQkKLQlkZWYgb3V0cHV0Q29udmVydChzZWxmKToKLQkJcGFzcyAjIE5vdCBuZWVkZWQKLQkJCisgICAgZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPYmplY3REZWZpbml0aW9uLm91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFjayk7IikKKworICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisgICAgICAgIE91dHB1dCgiU25kRGlzcG9zZUNoYW5uZWwoJXMsIDEpOyIsIGl0c2VsZm5hbWUpCisKKyAgICBkZWYgb3V0cHV0Q29udmVydChzZWxmKToKKyAgICAgICAgcGFzcyAjIE5vdCBuZWVkZWQKKwogIwogCiBjbGFzcyBTcGJPYmplY3REZWZpbml0aW9uKFBFUDI1Mk1peGluLCBPYmplY3REZWZpbml0aW9uKToKLQlnZXRzZXRsaXN0ID0gWwotCQkoCi0JCSdpblJlZk51bScsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5pblJlZk51bSk7JywKLQkJJ3JldHVybiAtMSArIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX3NwYi5pblJlZk51bSk7JywKLQkJTm9uZSwKLQkJKSwgKAotCQknY291bnQnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9zcGIuY291bnQpOycsCi0JCSdyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuY291bnQpOycsCi0JCU5vbmUKLQkJKSwgKAotCQknbWlsbGlzZWNvbmRzJywKLQkJJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLm1pbGxpc2Vjb25kcyk7JywKLQkJJ3JldHVybiAtMSArIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX3NwYi5taWxsaXNlY29uZHMpOycsCi0JCU5vbmUsCi0JCSksICgKLQkJJ2Vycm9yJywKLQkJJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+b2Jfc3BiLmVycm9yKTsnLAotCQlOb25lLAotCQlOb25lCi0JCSksICgKLQkJJ2NvbXBsZXRpb25Sb3V0aW5lJywKLQkJTm9uZSwKLQkJIiIic2VsZi0+b2Jfc3BiLmNvbXBsZXRpb25Sb3V0aW5lID0gTmV3U0lDb21wbGV0aW9uVVBQKFNQQl9jb21wbGV0aW9uKTsKLQkJc2VsZi0+b2JfY29tcGxldGlvbiA9IHY7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIDA7IiIiLAotCQlOb25lLAotCQkpXQorICAgIGdldHNldGxpc3QgPSBbCisgICAgICAgICAgICAoCisgICAgICAgICAgICAnaW5SZWZOdW0nLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLmluUmVmTnVtKTsnLAorICAgICAgICAgICAgJ3JldHVybiAtMSArIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX3NwYi5pblJlZk51bSk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnY291bnQnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLmNvdW50KTsnLAorICAgICAgICAgICAgJ3JldHVybiAtMSArIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX3NwYi5jb3VudCk7JywKKyAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICdtaWxsaXNlY29uZHMnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLm1pbGxpc2Vjb25kcyk7JywKKyAgICAgICAgICAgICdyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIubWlsbGlzZWNvbmRzKTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICdlcnJvcicsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzZWxmLT5vYl9zcGIuZXJyb3IpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ2NvbXBsZXRpb25Sb3V0aW5lJywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAiIiJzZWxmLT5vYl9zcGIuY29tcGxldGlvblJvdXRpbmUgPSBOZXdTSUNvbXBsZXRpb25VUFAoU1BCX2NvbXBsZXRpb24pOworICAgICAgICAgICAgc2VsZi0+b2JfY29tcGxldGlvbiA9IHY7CisgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gMDsiIiIsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgKV0KIAotCWRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPdXRwdXQoIi8qIE1lbWJlcnMgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzOiAqLyIpCi0JCU91dHB1dCgiUHlPYmplY3QgKm9iX2NvbXBsZXRpb247IikKLQkJT3V0cHV0KCJQeU9iamVjdCAqb2JfaW50ZXJydXB0OyIpCi0JCU91dHB1dCgiUHlPYmplY3QgKm9iX3RoaXNjYWxsYmFjazsiKTsKLQkJT3V0cHV0KCJsb25nIG9iX0E1OyIpCi0JCU91dHB1dCgiU1BCIG9iX3NwYjsiKQorICAgIGRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPdXRwdXQoIi8qIE1lbWJlcnMgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzOiAqLyIpCisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKm9iX2NvbXBsZXRpb247IikKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqb2JfaW50ZXJydXB0OyIpCisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKm9iX3RoaXNjYWxsYmFjazsiKTsKKyAgICAgICAgT3V0cHV0KCJsb25nIG9iX0E1OyIpCisgICAgICAgIE91dHB1dCgiU1BCIG9iX3NwYjsiKQogCi0JZGVmIG91dHB1dE5ldyhzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCIlc1B5T2JqZWN0IColc19OZXcodm9pZCkiLCBzZWxmLnN0YXRpYywgc2VsZi5wcmVmaXgpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiJXMgKml0OyIsIHNlbGYub2JqZWN0dHlwZSkKLQkJc2VsZi5vdXRwdXRDaGVja05ld0FyZygpCi0JCU91dHB1dCgiaXQgPSBQeU9iamVjdF9ORVcoJXMsICYlcyk7Iiwgc2VsZi5vYmplY3R0eXBlLCBzZWxmLnR5cGVuYW1lKQotCQlPdXRwdXQoImlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQotCQlzZWxmLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKCkKLQkJT3V0cHV0KCJyZXR1cm4gKFB5T2JqZWN0ICopaXQ7IikKLQkJT3V0UmJyYWNlKCkKKyAgICBkZWYgb3V0cHV0TmV3KHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoIiVzUHlPYmplY3QgKiVzX05ldyh2b2lkKSIsIHNlbGYuc3RhdGljLCBzZWxmLnByZWZpeCkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCIlcyAqaXQ7Iiwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBzZWxmLm91dHB1dENoZWNrTmV3QXJnKCkKKyAgICAgICAgT3V0cHV0KCJpdCA9IFB5T2JqZWN0X05FVyglcywgJiVzKTsiLCBzZWxmLm9iamVjdHR5cGUsIHNlbGYudHlwZW5hbWUpCisgICAgICAgIE91dHB1dCgiaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOyIpCisgICAgICAgIHNlbGYub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoKQorICAgICAgICBPdXRwdXQoInJldHVybiAoUHlPYmplY3QgKilpdDsiKQorICAgICAgICBPdXRSYnJhY2UoKQogCi0JZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPdXRwdXQoIml0LT5vYl9jb21wbGV0aW9uID0gTlVMTDsiKQotCQlPdXRwdXQoIml0LT5vYl9pbnRlcnJ1cHQgPSBOVUxMOyIpCi0JCU91dHB1dCgiaXQtPm9iX3RoaXNjYWxsYmFjayA9IE5VTEw7IikKLQkJT3V0cHV0KCJpdC0+b2JfQTUgPSBTZXRDdXJyZW50QTUoKTsiKQotCQlPdXRwdXQoIm1lbXNldCgoY2hhciAqKSZpdC0+b2Jfc3BiLCAwLCBzaXplb2YoaXQtPm9iX3NwYikpOyIpCi0JCU91dHB1dCgiaXQtPm9iX3NwYi51c2VyTG9uZyA9IChsb25nKWl0OyIpCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPdXRwdXQoIml0LT5vYl9jb21wbGV0aW9uID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIml0LT5vYl9pbnRlcnJ1cHQgPSBOVUxMOyIpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX3RoaXNjYWxsYmFjayA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfQTUgPSBTZXRDdXJyZW50QTUoKTsiKQorICAgICAgICBPdXRwdXQoIm1lbXNldCgoY2hhciAqKSZpdC0+b2Jfc3BiLCAwLCBzaXplb2YoaXQtPm9iX3NwYikpOyIpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX3NwYi51c2VyTG9uZyA9IChsb25nKWl0OyIpCiAKLQlkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU9iamVjdERlZmluaXRpb24ub3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJzZWxmLT5vYl9zcGIudXNlckxvbmcgPSAwOyIpCi0JCU91dHB1dCgic2VsZi0+b2JfdGhpc2NhbGxiYWNrID0gMDsiKQotCQlPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+b2JfY29tcGxldGlvbik7IikKLQkJT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPm9iX2ludGVycnVwdCk7IikKLQkKLQlkZWYgb3V0cHV0Q29udmVydChzZWxmKToKLQkJT3V0cHV0KCIlc2ludCAlc19Db252ZXJ0KFB5T2JqZWN0ICp2LCAlcyAqcF9pdHNlbGYpIiwgc2VsZi5zdGF0aWMsIHNlbGYucHJlZml4LCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dExicmFjZSgpCi0JCXNlbGYub3V0cHV0Q2hlY2tDb252ZXJ0QXJnKCkKLQkJT3V0cHV0KCJpZiAoISVzX0NoZWNrKHYpKSIsIHNlbGYucHJlZml4KQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoJ1B5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICIlcyByZXF1aXJlZCIpOycsIHNlbGYubmFtZSkKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoIipwX2l0c2VsZiA9ICYoKCVzICopdiktPm9iX3NwYjsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dHB1dCgicmV0dXJuIDE7IikKLQkJT3V0UmJyYWNlKCkKLQkJCQkJCisgICAgZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPYmplY3REZWZpbml0aW9uLm91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgic2VsZi0+b2Jfc3BiLnVzZXJMb25nID0gMDsiKQorICAgICAgICBPdXRwdXQoInNlbGYtPm9iX3RoaXNjYWxsYmFjayA9IDA7IikKKyAgICAgICAgT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPm9iX2NvbXBsZXRpb24pOyIpCisgICAgICAgIE91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5vYl9pbnRlcnJ1cHQpOyIpCisKKyAgICBkZWYgb3V0cHV0Q29udmVydChzZWxmKToKKyAgICAgICAgT3V0cHV0KCIlc2ludCAlc19Db252ZXJ0KFB5T2JqZWN0ICp2LCAlcyAqcF9pdHNlbGYpIiwgc2VsZi5zdGF0aWMsIHNlbGYucHJlZml4LCBzZWxmLml0c2VsZnR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIHNlbGYub3V0cHV0Q2hlY2tDb252ZXJ0QXJnKCkKKyAgICAgICAgT3V0cHV0KCJpZiAoISVzX0NoZWNrKHYpKSIsIHNlbGYucHJlZml4KQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoJ1B5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICIlcyByZXF1aXJlZCIpOycsIHNlbGYubmFtZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMDsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoIipwX2l0c2VsZiA9ICYoKCVzICopdiktPm9iX3NwYjsiLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKwogCiBzbmRvYmplY3QgPSBTbmRPYmplY3REZWZpbml0aW9uKCdTbmRDaGFubmVsJywgJ1NuZENoJywgJ1NuZENoYW5uZWxQdHInKQogc3Bib2JqZWN0ID0gU3BiT2JqZWN0RGVmaW5pdGlvbignU1BCJywgJ1NQQk9iaicsICdTUEJQdHInKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvdGUvdGVzY2FuLnB5IGIvTWFjL01vZHVsZXMvdGUvdGVzY2FuLnB5CmluZGV4IGM4MWE4YmYuLmY1YjZmZmYgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3RlL3Rlc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy90ZS90ZXNjYW4ucHkKQEAgLTExLDU3ICsxMSw1NyBAQAogT0JKRUNUID0gIlRFSGFuZGxlIgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gTE9ORyArICIuaCIKLQlvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9IExPTkcgKyAiLmgiCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFstMV0KLQkJCSMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQotCQkJaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFstMV0KKyAgICAgICAgICAgICMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQorICAgICAgICAgICAgaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJURURpc3Bvc2UiLAotCQkJIlRFSW5pdCIsCi0jIwkJCSJURUdldEhpbGl0ZVJnbiIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiVEVEaXNwb3NlIiwKKyAgICAgICAgICAgICAgICAiVEVJbml0IiwKKyMjICAgICAgICAgICAgICAgICAgICAgICJURUdldEhpbGl0ZVJnbiIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJURUNsaWNrTG9vcFVQUCIsCi0JCQkiVW5pdmVyc2FsUHJvY1B0ciIsCi0JCQkiV29yZEJyZWFrVVBQIiwKLQkJCSJURURvVGV4dFVQUCIsCi0JCQkiVEVSZWNhbGNVUFAiLAotCQkJIlRFRmluZFdvcmRVUFAiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIlRFQ2xpY2tMb29wVVBQIiwKKyAgICAgICAgICAgICAgICAiVW5pdmVyc2FsUHJvY1B0ciIsCisgICAgICAgICAgICAgICAgIldvcmRCcmVha1VQUCIsCisgICAgICAgICAgICAgICAgIlRFRG9UZXh0VVBQIiwKKyAgICAgICAgICAgICAgICAiVEVSZWNhbGNVUFAiLAorICAgICAgICAgICAgICAgICJURUZpbmRXb3JkVVBQIiwKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKLQkJCSAKLQkJCSMgVEVDb250aW51b3VzU3R5bGUKLQkJCShbKCJzaG9ydCIsICJtb2RlIiwgIk91dE1vZGUiKSwgKCJUZXh0U3R5bGUiLCAiYVN0eWxlIiwgIk91dE1vZGUiKV0sCi0JCQkgWygic2hvcnQiLCAibW9kZSIsICJJbk91dE1vZGUiKSwgKCJUZXh0U3R5bGUiLCAiYVN0eWxlIiwgIkluT3V0TW9kZSIpXSkKLQkJCV0KLQkJCQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAjIFRFQ29udGludW91c1N0eWxlCisgICAgICAgICAgICAgICAgKFsoInNob3J0IiwgIm1vZGUiLCAiT3V0TW9kZSIpLCAoIlRleHRTdHlsZSIsICJhU3R5bGUiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygic2hvcnQiLCAibW9kZSIsICJJbk91dE1vZGUiKSwgKCJUZXh0U3R5bGUiLCAiYVN0eWxlIiwgIkluT3V0TW9kZSIpXSkKKyAgICAgICAgICAgICAgICBdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy90ZS90ZXN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy90ZS90ZXN1cHBvcnQucHkKaW5kZXggMTNmMWI5Ny4uYWQ2YzA1MyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvdGUvdGVzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL3RlL3Rlc3VwcG9ydC5weQpAQCAtNiwxNyArNiwxNyBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ1RleHRFZGl0LmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfVEUnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICdURScJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQotS0lORCA9ICdIYW5kbGUnCQkJCSMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJworTUFDSEVBREVSRklMRSA9ICdUZXh0RWRpdC5oJyAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19URScgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ1RFJyAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK0tJTkQgPSAnSGFuZGxlJyAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ1RFJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSAiVEVIYW5kbGUiCQkjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQotT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicJIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcworTU9EUFJFRklYID0gJ1RFJyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK09CSkVDVFRZUEUgPSAiVEVIYW5kbGUiICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC01MiwxMzcgKzUyLDEzNyBAQAogVGV4dFN0eWxlX05ldyhUZXh0U3R5bGVQdHIgaXRzZWxmKQogewogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbE8mIiwgKGxvbmcpaXRzZWxmLT50c0ZvbnQsIChsb25nKWl0c2VsZi0+dHNGYWNlLCAobG9uZylpdHNlbGYtPnRzU2l6ZSwgUWRSR0JfTmV3LAotCQkJCSZpdHNlbGYtPnRzQ29sb3IpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGxsTyYiLCAobG9uZylpdHNlbGYtPnRzRm9udCwgKGxvbmcpaXRzZWxmLT50c0ZhY2UsIChsb25nKWl0c2VsZi0+dHNTaXplLCBRZFJHQl9OZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnRzQ29sb3IpOwogfQogCiBzdGF0aWMgaW50CiBUZXh0U3R5bGVfQ29udmVydChQeU9iamVjdCAqdiwgVGV4dFN0eWxlUHRyIHBfaXRzZWxmKQogewotCWxvbmcgZm9udCwgZmFjZSwgc2l6ZTsKLQkKLQlpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsbE8mIiwgJmZvbnQsICZmYWNlLCAmc2l6ZSwgUWRSR0JfQ29udmVydCwgJnBfaXRzZWxmLT50c0NvbG9yKSApCi0JCXJldHVybiAwOwotCXBfaXRzZWxmLT50c0ZvbnQgPSAoc2hvcnQpZm9udDsKLQlwX2l0c2VsZi0+dHNGYWNlID0gKFN0eWxlKWZhY2U7Ci0JcF9pdHNlbGYtPnRzU2l6ZSA9IChzaG9ydClzaXplOwotCXJldHVybiAxOworICAgICAgICBsb25nIGZvbnQsIGZhY2UsIHNpemU7CisKKyAgICAgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGxPJiIsICZmb250LCAmZmFjZSwgJnNpemUsIFFkUkdCX0NvbnZlcnQsICZwX2l0c2VsZi0+dHNDb2xvcikgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwX2l0c2VsZi0+dHNGb250ID0gKHNob3J0KWZvbnQ7CisgICAgICAgIHBfaXRzZWxmLT50c0ZhY2UgPSAoU3R5bGUpZmFjZTsKKyAgICAgICAgcF9pdHNlbGYtPnRzU2l6ZSA9IChzaG9ydClzaXplOworICAgICAgICByZXR1cm4gMTsKIH0KICIiIgogCiBpbml0c3R1ZmYgPSBpbml0c3R1ZmYgKyAiIiIKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhURUhhbmRsZSwgVEVPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoVEVIYW5kbGUsIFRFT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhURUhhbmRsZSwgVEVPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRFSGFuZGxlLCBURU9ial9Db252ZXJ0KTsKICIiIgogCiBjbGFzcyBURU1ldGhvZEdlbmVyYXRvcihPU0VycldlYWtMaW5rTWV0aG9kR2VuZXJhdG9yKToKLQkiIiJTaW1pbGFyIHRvIE1ldGhvZEdlbmVyYXRvciwgYnV0IGhhcyBzZWxmIGFzIGxhc3QgYXJndW1lbnQiIiIKKyAgICAiIiJTaW1pbGFyIHRvIE1ldGhvZEdlbmVyYXRvciwgYnV0IGhhcyBzZWxmIGFzIGxhc3QgYXJndW1lbnQiIiIKIAotCWRlZiBwYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKToKLQkJYXJncywgYTAgPSBhcmdzWzotMV0sIGFyZ3NbLTFdCi0JCXQwLCBuMCwgbTAgPSBhMAotCQlpZiBtMCAhPSBJbk1vZGU6Ci0JCQlyYWlzZSBWYWx1ZUVycm9yLCAibWV0aG9kJ3MgJ3NlbGYnIG11c3QgYmUgJ0luTW9kZSciCi0JCXNlbGYuaXRzZWxmID0gVmFyaWFibGUodDAsICJfc2VsZi0+b2JfaXRzZWxmIiwgU2VsZk1vZGUpCi0JCUZ1bmN0aW9uR2VuZXJhdG9yLnBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpCi0JCXNlbGYuYXJndW1lbnRMaXN0LmFwcGVuZChzZWxmLml0c2VsZikKKyAgICBkZWYgcGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncyk6CisgICAgICAgIGFyZ3MsIGEwID0gYXJnc1s6LTFdLCBhcmdzWy0xXQorICAgICAgICB0MCwgbjAsIG0wID0gYTAKKyAgICAgICAgaWYgbTAgIT0gSW5Nb2RlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1ldGhvZCdzICdzZWxmJyBtdXN0IGJlICdJbk1vZGUnIgorICAgICAgICBzZWxmLml0c2VsZiA9IFZhcmlhYmxlKHQwLCAiX3NlbGYtPm9iX2l0c2VsZiIsIFNlbGZNb2RlKQorICAgICAgICBGdW5jdGlvbkdlbmVyYXRvci5wYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKQorICAgICAgICBzZWxmLmFyZ3VtZW50TGlzdC5hcHBlbmQoc2VsZi5pdHNlbGYpCiAKIAogCiBjbGFzcyBNeU9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCSMgWFhYWCBDb3VsZCBiZSBzdWJ0eXBlIG9mIFJlc291cmNlCi0JIyBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHNldC4KLQlnZXRzZXRsaXN0ID0gWwotCQkoCi0JCSdkZXN0UmVjdCcsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICYoKnNlbGYtPm9iX2l0c2VsZiktPmRlc3RSZWN0KTsnLAotCQlOb25lLAotCQknRGVzdGluYXRpb24gcmVjdGFuZ2xlJwotCQkpLCAoCi0JCSd2aWV3UmVjdCcsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICYoKnNlbGYtPm9iX2l0c2VsZiktPnZpZXdSZWN0KTsnLAotCQlOb25lLAotCQknVmlld2luZyByZWN0YW5nbGUnCi0JCSksICgKLQkJJ3NlbFJlY3QnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxSZWN0KTsnLAotCQlOb25lLAotCQknU2VsZWN0aW9uIHJlY3RhbmdsZScKLQkJKSwgKAotCQknbGluZUhlaWdodCcsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bGluZUhlaWdodCk7JywKLQkJTm9uZSwKLQkJJ0hlaWdodCBvZiBhIGxpbmUnCi0JCSksICgKLQkJJ2ZvbnRBc2NlbnQnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmZvbnRBc2NlbnQpOycsCi0JCU5vbmUsCi0JCSdBc2NlbnQgb2YgYSBsaW5lJwotCQkpLCAoCi0JCSJzZWxQb2ludCIsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFBvaW50KTsnLAotCQlOb25lLAotCQknU2VsZWN0aW9uIFBvaW50JwotCQkpLCAoCi0JCSdzZWxTdGFydCcsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+c2VsU3RhcnQpOycsCi0JCU5vbmUsCi0JCSdTdGFydCBvZiBzZWxlY3Rpb24nCi0JCSksICgKLQkJJ3NlbEVuZCcsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+c2VsRW5kKTsnLAotCQlOb25lLAotCQknRW5kIG9mIHNlbGVjdGlvbicKLQkJKSwgKAotCQknYWN0aXZlJywKLQkJJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5hY3RpdmUpOycsCi0JCU5vbmUsCi0JCSdUQkQnCi0JCSksICgKLQkJJ2p1c3QnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmp1c3QpOycsCi0JCU5vbmUsCi0JCSdKdXN0aWZpY2F0aW9uJwotCQkpLCAoCi0JCSd0ZUxlbmd0aCcsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dGVMZW5ndGgpOycsCi0JCU5vbmUsCi0JCSdUQkQnCi0JCSksICgKLQkJJ3R4Rm9udCcsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhGb250KTsnLAotCQlOb25lLAotCQknQ3VycmVudCBmb250JwotCQkpLCAoCi0JCSd0eEZhY2UnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4RmFjZSk7JywKLQkJTm9uZSwKLQkJJ0N1cnJlbnQgZm9udCB2YXJpYW50JwotCQkpLCAoCi0JCSd0eE1vZGUnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4TW9kZSk7JywKLQkJTm9uZSwKLQkJJ0N1cnJlbnQgdGV4dC1kcmF3aW5nIG1vZGUnCi0JCSksICgKLQkJJ3R4U2l6ZScsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhTaXplKTsnLAotCQlOb25lLAotCQknQ3VycmVudCBmb250IHNpemUnCi0JCSksICgKLQkJJ25MaW5lcycsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bkxpbmVzKTsnLAotCQlOb25lLAotCQknVEJEJwotCQkpXQkJCi0JCQotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoVEVfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBURSIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9IiIiKQotCWRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6Ci0JCU91dHB1dCgiVEVEaXNwb3NlKCVzKTsiLCBpdHNlbGZuYW1lKQotCQkKKyAgICAjIFhYWFggQ291bGQgYmUgc3VidHlwZSBvZiBSZXNvdXJjZQorICAgICMgQXR0cmlidXRlcyB0aGF0IGNhbiBiZSBzZXQuCisgICAgZ2V0c2V0bGlzdCA9IFsKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICdkZXN0UmVjdCcsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5kZXN0UmVjdCk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAnRGVzdGluYXRpb24gcmVjdGFuZ2xlJworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ3ZpZXdSZWN0JywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICYoKnNlbGYtPm9iX2l0c2VsZiktPnZpZXdSZWN0KTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdWaWV3aW5nIHJlY3RhbmdsZScKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICdzZWxSZWN0JywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICYoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFJlY3QpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ1NlbGVjdGlvbiByZWN0YW5nbGUnCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnbGluZUhlaWdodCcsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmxpbmVIZWlnaHQpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ0hlaWdodCBvZiBhIGxpbmUnCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnZm9udEFzY2VudCcsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmZvbnRBc2NlbnQpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ0FzY2VudCBvZiBhIGxpbmUnCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAic2VsUG9pbnQiLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsICgqc2VsZi0+b2JfaXRzZWxmKS0+c2VsUG9pbnQpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ1NlbGVjdGlvbiBQb2ludCcKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICdzZWxTdGFydCcsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFN0YXJ0KTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdTdGFydCBvZiBzZWxlY3Rpb24nCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnc2VsRW5kJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+c2VsRW5kKTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdFbmQgb2Ygc2VsZWN0aW9uJworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ2FjdGl2ZScsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmFjdGl2ZSk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAnVEJEJworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ2p1c3QnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5qdXN0KTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdKdXN0aWZpY2F0aW9uJworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ3RlTGVuZ3RoJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dGVMZW5ndGgpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ1RCRCcKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICd0eEZvbnQnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eEZvbnQpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ0N1cnJlbnQgZm9udCcKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICd0eEZhY2UnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eEZhY2UpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ0N1cnJlbnQgZm9udCB2YXJpYW50JworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ3R4TW9kZScsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4TW9kZSk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAnQ3VycmVudCB0ZXh0LWRyYXdpbmcgbW9kZScKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICd0eFNpemUnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eFNpemUpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ0N1cnJlbnQgZm9udCBzaXplJworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ25MaW5lcycsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPm5MaW5lcyk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAnVEJEJworICAgICAgICAgICAgKV0KKworICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoVEVfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBURSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0iIiIpCisgICAgZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKKyAgICAgICAgT3V0cHV0KCJURURpc3Bvc2UoJXMpOyIsIGl0c2VsZm5hbWUpCisKIAogIyBGcm9tIGhlcmUgb24gaXQncyBiYXNpY2FsbHkgYWxsIGJvaWxlciBwbGF0ZS4uLgogCkBAIC0yMTQsNCArMjE0LDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3dhc3RlL3dhc3Rlc2Nhbi5weSBiL01hYy9Nb2R1bGVzL3dhc3RlL3dhc3Rlc2Nhbi5weQppbmRleCA4Mjk4ZjI2Li5iNWEyYjQzIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy93YXN0ZS93YXN0ZXNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvd2FzdGUvd2FzdGVzY2FuLnB5CkBAIC03LDkgKzcsOSBAQAogZnJvbSBzY2FudG9vbHMgaW1wb3J0IFNjYW5uZXIKIAogV0FTVEVESVI9Jy9Vc2Vycy9qYWNrL3NyYy93YXN0ZS9DX0MrKyBIZWFkZXJzLycKLQkJCisKIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhXQVNURURJUik6Ci0JcmFpc2UgJ0Vycm9yOiBub3QgZm91bmQ6ICVzJywgV0FTVEVESVIKKyAgICByYWlzZSAnRXJyb3I6IG5vdCBmb3VuZDogJXMnLCBXQVNURURJUgogCiBPQkpFQ1QgPSAiVEVIYW5kbGUiCiBTSE9SVCA9ICJ3YXN0ZSIKQEAgLTE3LDEzNiArMTcsMTM2IEBACiBPQkpFQ1QyID0gIldFT2JqZWN0UmVmZXJlbmNlIgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gV0FTVEVESVIgKyAiV0FTVEUuaCIKLQlvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCi0JZGVmc291dHB1dCA9IG9zLnBhdGguam9pbihvcy5wYXRoLnNwbGl0KFRPT0xCT1hESVIpWzBdLCAiV0FTVEVjb25zdC5weSIpCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0jIwlzY2FubmVyLmdlbnR5cGV0ZXN0KFNIT1JUKyJ0eXBldGVzdC5weSIpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBXQVNURURJUiArICJXQVNURS5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gb3MucGF0aC5qb2luKG9zLnBhdGguc3BsaXQoVE9PTEJPWERJUilbMF0sICJXQVNURWNvbnN0LnB5IikKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyMjICAgICAgc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiAjY2xhc3MgTXlTY2FubmVyKFNjYW5uZXJfUHJlVUgzKToKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFstMV0KLQkJCSMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQotCQkJaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQkJZWxzZToKLQkJCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJCWlmIHQgPT0gT0JKRUNUMiBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQkJY2xhc3NuYW1lID0gIk1ldGhvZDIiCi0JCQkJCWxpc3RuYW1lID0gIm1ldGhvZHMyIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFstMV0KKyAgICAgICAgICAgICMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQorICAgICAgICAgICAgaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgICAgIGlmIHQgPT0gT0JKRUNUMiBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZDIiCisgICAgICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMyIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtQYXNjYWxTdGFja0Jhc2VkID0gTm9uZSAjIHdvcmthcm91bmQgZm9yIGhlYWRlciBwYXJzaW5nXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJrUGFzY2FsU3RhY2tCYXNlZCA9IE5vbmUgIyB3b3JrYXJvdW5kIGZvciBoZWFkZXIgcGFyc2luZ1xuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiV0VEaXNwb3NlIiwKLQkJCSJXRVNldEluZm8iLCAjIEFyZ3VtZW50IHR5cGUgdW5rbm93bi4uLgotCQkJIldFR2V0SW5mbyIsCi0JCQkiV0VWZXJzaW9uIiwgIyBVbmZvcnR1bmF0ZWx5Li4uCi0JCQkiV0VQdXQiLCAjIFhYWFggVEJEOiBuZWVkcyBhcnJheSBvZiBmbGF2b3J0eXBlcy4KLQkJCSJXRUdldE9uZUF0dHJpYnV0ZSIsICMgWFhYWCBUQkQ6IG91dHB1dCBidWZmZXIKLQkJCSMgSW5jb21wYXRpYmxlIGNvbnN0YW50IGRlZmluaXRpb25zCi0JCQkid2VEb0F1dG9TY3JvbGwiLAotCQkJIndlRG9PdXRsaW5lSGlsaXRlIiwKLQkJCSJ3ZURvUmVhZE9ubHkiLAotCQkJIndlRG9VbmRvIiwKLQkJCSJ3ZURvSW50Q3V0QW5kUGFzdGUiLAotCQkJIndlRG9EcmFnQW5kRHJvcCIsCi0JCQkid2VEb0luaGliaXRSZWNhbCIsCi0JCQkid2VEb1VzZVRlbXBNZW0iLAotCQkJIndlRG9EcmF3T2Zmc2NyZWVuIiwKLQkJCSJ3ZURvSW5oaWJpdFJlZHJhdyIsCi0JCQkid2VEb01vbm9TdHlsZWQiLAotCQkJIndlRG9NdWx0aXBsZVVuZG8iLAotCQkJIndlRG9Ob0tleWJvYXJkU3luYyIsCi0JCQkid2VEb0luaGliaXRJQ1N1cHBvcnQiLAotCQkJIndlRG9JbmhpYml0Q29sb3IiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIldFRGlzcG9zZSIsCisgICAgICAgICAgICAgICAgIldFU2V0SW5mbyIsICMgQXJndW1lbnQgdHlwZSB1bmtub3duLi4uCisgICAgICAgICAgICAgICAgIldFR2V0SW5mbyIsCisgICAgICAgICAgICAgICAgIldFVmVyc2lvbiIsICMgVW5mb3J0dW5hdGVseS4uLgorICAgICAgICAgICAgICAgICJXRVB1dCIsICMgWFhYWCBUQkQ6IG5lZWRzIGFycmF5IG9mIGZsYXZvcnR5cGVzLgorICAgICAgICAgICAgICAgICJXRUdldE9uZUF0dHJpYnV0ZSIsICMgWFhYWCBUQkQ6IG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgICAgICAjIEluY29tcGF0aWJsZSBjb25zdGFudCBkZWZpbml0aW9ucworICAgICAgICAgICAgICAgICJ3ZURvQXV0b1Njcm9sbCIsCisgICAgICAgICAgICAgICAgIndlRG9PdXRsaW5lSGlsaXRlIiwKKyAgICAgICAgICAgICAgICAid2VEb1JlYWRPbmx5IiwKKyAgICAgICAgICAgICAgICAid2VEb1VuZG8iLAorICAgICAgICAgICAgICAgICJ3ZURvSW50Q3V0QW5kUGFzdGUiLAorICAgICAgICAgICAgICAgICJ3ZURvRHJhZ0FuZERyb3AiLAorICAgICAgICAgICAgICAgICJ3ZURvSW5oaWJpdFJlY2FsIiwKKyAgICAgICAgICAgICAgICAid2VEb1VzZVRlbXBNZW0iLAorICAgICAgICAgICAgICAgICJ3ZURvRHJhd09mZnNjcmVlbiIsCisgICAgICAgICAgICAgICAgIndlRG9JbmhpYml0UmVkcmF3IiwKKyAgICAgICAgICAgICAgICAid2VEb01vbm9TdHlsZWQiLAorICAgICAgICAgICAgICAgICJ3ZURvTXVsdGlwbGVVbmRvIiwKKyAgICAgICAgICAgICAgICAid2VEb05vS2V5Ym9hcmRTeW5jIiwKKyAgICAgICAgICAgICAgICAid2VEb0luaGliaXRJQ1N1cHBvcnQiLAorICAgICAgICAgICAgICAgICJ3ZURvSW5oaWJpdENvbG9yIiwKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkRyYWdSZWZlcmVuY2UiLAkjIEZvciBub3cuLi4KLQkJCSJVbml2ZXJzYWxQcm9jUHRyIiwKLQkJCSJXRUZvbnRJRFRvTmFtZVVQUCIsCi0JCQkiV0VGb250TmFtZVRvSURVUFAiLAotCQkJIldFQ2xpY2tMb29wVVBQIiwKLQkJCSJXRVNjcm9sbFVQUCIsCi0JCQkiV0VUU01QcmVVcGRhdGVVUFAiLAotCQkJIldFVFNNUG9zdFVwZGF0ZVVQUCIsCi0JCQkiV0VQcmVUcmFja0RyYWdVUFAiLAotCQkJIldFVHJhbnNsYXRlRHJhZ1VQUCIsCi0JCQkiV0VIaWxpdGVEcm9wQXJlYVVQUCIsCi0JCQkiV0VEcmF3VGV4dFVQUCIsCi0JCQkiV0VEcmF3VFNNSGlsaXRlVVBQIiwKLQkJCSJXRVBpeGVsVG9DaGFyVVBQIiwKLQkJCSJXRUNoYXJUb1BpeGVsVVBQIiwKLQkJCSJXRUxpbmVCcmVha1VQUCIsCi0JCQkiV0VXb3JkQnJlYWtVUFAiLAotCQkJIldFQ2hhckJ5dGVVUFAiLAotCQkJIldFQ2hhclR5cGVVUFAiLAotCQkJIldFRXJhc2VVUFAiLAotCQkJIldFRmx1eFVQUCIsCi0JCQkiV0VOZXdPYmplY3RVUFAiLAotCQkJIldFRGlzcG9zZU9iamVjdFVQUCIsCi0JCQkiV0VEcmF3T2JqZWN0VVBQIiwKLQkJCSJXRUNsaWNrT2JqZWN0VVBQIiwKLQkJCSJXRVN0cmVhbU9iamVjdFVQUCIsCi0JCQkiV0VIb3Zlck9iamVjdFVQUCIsCi0JCQkiV0VSdWxlciIsCQkjIFhYWFggVG8gYmUgZG9uZQotCQkJIldFUnVsZXJfcHRyIiwJIyBkaXR0bwotCQkJIldFUGFyYUluZm8iLAkjIFhYWFggVG8gYmUgZG9uZQotCQkJIldFUHJpbnRTZXNzaW9uIiwJIyBYWFhYIFRvIGJlIGRvbmUKLQkJCSJXRVByaW50T3B0aW9uc19wdHIiLCAjIFhYWFggVG8gYmUgZG9uZQotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkRyYWdSZWZlcmVuY2UiLCAgICAgICAgIyBGb3Igbm93Li4uCisgICAgICAgICAgICAgICAgIlVuaXZlcnNhbFByb2NQdHIiLAorICAgICAgICAgICAgICAgICJXRUZvbnRJRFRvTmFtZVVQUCIsCisgICAgICAgICAgICAgICAgIldFRm9udE5hbWVUb0lEVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VDbGlja0xvb3BVUFAiLAorICAgICAgICAgICAgICAgICJXRVNjcm9sbFVQUCIsCisgICAgICAgICAgICAgICAgIldFVFNNUHJlVXBkYXRlVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VUU01Qb3N0VXBkYXRlVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VQcmVUcmFja0RyYWdVUFAiLAorICAgICAgICAgICAgICAgICJXRVRyYW5zbGF0ZURyYWdVUFAiLAorICAgICAgICAgICAgICAgICJXRUhpbGl0ZURyb3BBcmVhVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VEcmF3VGV4dFVQUCIsCisgICAgICAgICAgICAgICAgIldFRHJhd1RTTUhpbGl0ZVVQUCIsCisgICAgICAgICAgICAgICAgIldFUGl4ZWxUb0NoYXJVUFAiLAorICAgICAgICAgICAgICAgICJXRUNoYXJUb1BpeGVsVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VMaW5lQnJlYWtVUFAiLAorICAgICAgICAgICAgICAgICJXRVdvcmRCcmVha1VQUCIsCisgICAgICAgICAgICAgICAgIldFQ2hhckJ5dGVVUFAiLAorICAgICAgICAgICAgICAgICJXRUNoYXJUeXBlVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VFcmFzZVVQUCIsCisgICAgICAgICAgICAgICAgIldFRmx1eFVQUCIsCisgICAgICAgICAgICAgICAgIldFTmV3T2JqZWN0VVBQIiwKKyAgICAgICAgICAgICAgICAiV0VEaXNwb3NlT2JqZWN0VVBQIiwKKyAgICAgICAgICAgICAgICAiV0VEcmF3T2JqZWN0VVBQIiwKKyAgICAgICAgICAgICAgICAiV0VDbGlja09iamVjdFVQUCIsCisgICAgICAgICAgICAgICAgIldFU3RyZWFtT2JqZWN0VVBQIiwKKyAgICAgICAgICAgICAgICAiV0VIb3Zlck9iamVjdFVQUCIsCisgICAgICAgICAgICAgICAgIldFUnVsZXIiLCAgICAgICAgICAgICAgIyBYWFhYIFRvIGJlIGRvbmUKKyAgICAgICAgICAgICAgICAiV0VSdWxlcl9wdHIiLCAgIyBkaXR0bworICAgICAgICAgICAgICAgICJXRVBhcmFJbmZvIiwgICAjIFhYWFggVG8gYmUgZG9uZQorICAgICAgICAgICAgICAgICJXRVByaW50U2Vzc2lvbiIsICAgICAgICMgWFhYWCBUbyBiZSBkb25lCisgICAgICAgICAgICAgICAgIldFUHJpbnRPcHRpb25zX3B0ciIsICMgWFhYWCBUbyBiZSBkb25lCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJTSW50MzIiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJTSW50MzIiLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCiAKLQkJCSMgV0VDb250aW51b3VzU3R5bGUKLQkJCShbKCJXRVN0eWxlTW9kZSIsICJpb01vZGUiLCAiT3V0TW9kZSIpLCAoIlRleHRTdHlsZSIsICJvdXRUZXh0U3R5bGUiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJXRVN0eWxlTW9kZSIsICIqIiwgIkluT3V0TW9kZSIpLCAoIlRleHRTdHlsZSIsICIqIiwgIioiKV0pLAotCQkJIAotCQkJIyBXRUNvcHlSYW5nZQotCQkJKFsoJ0hhbmRsZScsICdvdXRUZXh0JywgJ0luTW9kZScpLCAoJ1N0U2NycEhhbmRsZScsICdvdXRTdHlsZXMnLCAnSW5Nb2RlJyksCi0gICAgCQkJKCdXRVNvdXBIYW5kbGUnLCAnb3V0U291cCcsICdJbk1vZGUnKV0sCi0gICAgCQkgWygnT3B0SGFuZGxlJywgJyonLCAnKicpLCAoJ09wdFN0U2NycEhhbmRsZScsICcqJywgJyonKSwKLSAgICAJCQkoJ09wdFNvdXBIYW5kbGUnLCAnKicsICcqJyldKSwKLQkJCSAKLQkJCSMgV0VJbnNlcnQKLQkJCShbKCdTdFNjcnBIYW5kbGUnLCAnaW5TdHlsZXMnLCAnSW5Nb2RlJyksICgnV0VTb3VwSGFuZGxlJywgJ2luU291cCcsICdJbk1vZGUnKV0sCi0gICAgCQkgWygnT3B0U3RTY3JwSGFuZGxlJywgJyonLCAnKicpLCAoJ09wdFNvdXBIYW5kbGUnLCAnKicsICcqJyldKSwKLSAgICAJCSAKLSAgICAJCSMgV0VHZXRPYmplY3RPd25lcgotICAgIAkJKCJXRUdldE9iamVjdE93bmVyIiwKLSAgICAJCSBbKCdXRVJlZmVyZW5jZScsICcqJywgJ1JldHVybk1vZGUnKV0sCi0gICAgCQkgWygnRXhpc3RpbmdXRVJlZmVyZW5jZScsICcqJywgJ1JldHVybk1vZGUnKV0pLAotICAgIAkJIAotICAgIAkJIyBXRUZpbmRQYXJhZ3JhcGgKLSAgICAJCShbKCJjaGFyX3B0ciIsICJpbktleSIsICJJbk1vZGUiKV0sCi0gICAgCQkgWygic3RyaW5ncHRyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCSMgV0VTZXRPbmVBdHRyaWJ1dGUKLQkJCShbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoIkJ5dGVDb3VudCIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAotCQkJXQotCQkJCisgICAgICAgICAgICAgICAgIyBXRUNvbnRpbnVvdXNTdHlsZQorICAgICAgICAgICAgICAgIChbKCJXRVN0eWxlTW9kZSIsICJpb01vZGUiLCAiT3V0TW9kZSIpLCAoIlRleHRTdHlsZSIsICJvdXRUZXh0U3R5bGUiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiV0VTdHlsZU1vZGUiLCAiKiIsICJJbk91dE1vZGUiKSwgKCJUZXh0U3R5bGUiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgICMgV0VDb3B5UmFuZ2UKKyAgICAgICAgICAgICAgICAoWygnSGFuZGxlJywgJ291dFRleHQnLCAnSW5Nb2RlJyksICgnU3RTY3JwSGFuZGxlJywgJ291dFN0eWxlcycsICdJbk1vZGUnKSwKKyAgICAgICAgICAgICAgICAoJ1dFU291cEhhbmRsZScsICdvdXRTb3VwJywgJ0luTW9kZScpXSwKKyAgICAgICAgIFsoJ09wdEhhbmRsZScsICcqJywgJyonKSwgKCdPcHRTdFNjcnBIYW5kbGUnLCAnKicsICcqJyksCisgICAgICAgICAgICAgICAgKCdPcHRTb3VwSGFuZGxlJywgJyonLCAnKicpXSksCisKKyAgICAgICAgICAgICAgICAjIFdFSW5zZXJ0CisgICAgICAgICAgICAgICAgKFsoJ1N0U2NycEhhbmRsZScsICdpblN0eWxlcycsICdJbk1vZGUnKSwgKCdXRVNvdXBIYW5kbGUnLCAnaW5Tb3VwJywgJ0luTW9kZScpXSwKKyAgICAgICAgIFsoJ09wdFN0U2NycEhhbmRsZScsICcqJywgJyonKSwgKCdPcHRTb3VwSGFuZGxlJywgJyonLCAnKicpXSksCisKKyAgICAgICAgIyBXRUdldE9iamVjdE93bmVyCisgICAgICAgICgiV0VHZXRPYmplY3RPd25lciIsCisgICAgICAgICBbKCdXRVJlZmVyZW5jZScsICcqJywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICBbKCdFeGlzdGluZ1dFUmVmZXJlbmNlJywgJyonLCAnUmV0dXJuTW9kZScpXSksCisKKyAgICAgICAgIyBXRUZpbmRQYXJhZ3JhcGgKKyAgICAgICAgKFsoImNoYXJfcHRyIiwgImluS2V5IiwgIkluTW9kZSIpXSwKKyAgICAgICAgIFsoInN0cmluZ3B0ciIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgIyBXRVNldE9uZUF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoIkJ5dGVDb3VudCIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICBdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy93YXN0ZS93YXN0ZXN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy93YXN0ZS93YXN0ZXN1cHBvcnQucHkKaW5kZXggYzY2OWZhMS4uMTNkZGM0MCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvd2FzdGUvd2FzdGVzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL3dhc3RlL3dhc3Rlc3VwcG9ydC5weQpAQCAtNiwxOCArNiwxOCBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ1dBU1RFLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICd3YXN0ZScJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCi1PQkpFQ1ROQU1FID0gJ3dhc3RlJwkJCSMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCi1LSU5EID0gJ1B0cicJCQkJIyBVc3VhbGx5ICdQdHInIG9yICdIYW5kbGUnCitNQUNIRUFERVJGSUxFID0gJ1dBU1RFLmgnICAgICAgICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnd2FzdGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICd3YXN0ZScgICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitLSU5EID0gJ1B0cicgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc3VhbGx5ICdQdHInIG9yICdIYW5kbGUnCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9IE1PRE5BTUUJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gIldFUmVmZXJlbmNlIgkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9IE1PRE5BTUUgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gIldFUmVmZXJlbmNlIiAgICAgICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSAnd2FzdGVnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1UWVBFVEVTVEZJTEUgPSAnd2FzdGV0eXBldGVzdC5weScJIyBBbm90aGVyIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gIndhc3RlbW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorVFlQRVRFU1RGSUxFID0gJ3dhc3RldHlwZXRlc3QucHknICAgICAgICMgQW5vdGhlciBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgorT1VUUFVURklMRSA9ICJ3YXN0ZW1vZHVsZS5jIiAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTgzLDIxICs4MywyMSBAQAogVGV4dFN0eWxlX05ldyhUZXh0U3R5bGVQdHIgaXRzZWxmKQogewogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbE8mIiwgKGxvbmcpaXRzZWxmLT50c0ZvbnQsIChsb25nKWl0c2VsZi0+dHNGYWNlLCAobG9uZylpdHNlbGYtPnRzU2l6ZSwgUWRSR0JfTmV3LAotCQkJCSZpdHNlbGYtPnRzQ29sb3IpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGxsTyYiLCAobG9uZylpdHNlbGYtPnRzRm9udCwgKGxvbmcpaXRzZWxmLT50c0ZhY2UsIChsb25nKWl0c2VsZi0+dHNTaXplLCBRZFJHQl9OZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnRzQ29sb3IpOwogfQogCiBzdGF0aWMgaW50CiBUZXh0U3R5bGVfQ29udmVydChQeU9iamVjdCAqdiwgVGV4dFN0eWxlUHRyIHBfaXRzZWxmKQogewotCWxvbmcgZm9udCwgZmFjZSwgc2l6ZTsKLQkKLQlpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsbE8mIiwgJmZvbnQsICZmYWNlLCAmc2l6ZSwgUWRSR0JfQ29udmVydCwgJnBfaXRzZWxmLT50c0NvbG9yKSApCi0JCXJldHVybiAwOwotCXBfaXRzZWxmLT50c0ZvbnQgPSAoc2hvcnQpZm9udDsKLQlwX2l0c2VsZi0+dHNGYWNlID0gKFN0eWxlKWZhY2U7Ci0JcF9pdHNlbGYtPnRzU2l6ZSA9IChzaG9ydClzaXplOwotCXJldHVybiAxOworICAgICAgICBsb25nIGZvbnQsIGZhY2UsIHNpemU7CisKKyAgICAgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGxPJiIsICZmb250LCAmZmFjZSwgJnNpemUsIFFkUkdCX0NvbnZlcnQsICZwX2l0c2VsZi0+dHNDb2xvcikgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwX2l0c2VsZi0+dHNGb250ID0gKHNob3J0KWZvbnQ7CisgICAgICAgIHBfaXRzZWxmLT50c0ZhY2UgPSAoU3R5bGUpZmFjZTsKKyAgICAgICAgcF9pdHNlbGYtPnRzU2l6ZSA9IChzaG9ydClzaXplOworICAgICAgICByZXR1cm4gMTsKIH0KIAogLyoKQEAgLTEwNywzMyArMTA3LDMzIEBACiBSdW5JbmZvX05ldyhXRVJ1bkluZm8gKml0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsbGhoTyZPJiIsIGl0c2VsZi0+cnVuU3RhcnQsIGl0c2VsZi0+cnVuRW5kLCBpdHNlbGYtPnJ1bkhlaWdodCwKLQkJaXRzZWxmLT5ydW5Bc2NlbnQsIFRleHRTdHlsZV9OZXcsICZpdHNlbGYtPnJ1blN0eWxlLCBXRU9PYmpfTmV3LCBpdHNlbGYtPnJ1bk9iamVjdCk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbGhoTyZPJiIsIGl0c2VsZi0+cnVuU3RhcnQsIGl0c2VsZi0+cnVuRW5kLCBpdHNlbGYtPnJ1bkhlaWdodCwKKyAgICAgICAgICAgICAgICBpdHNlbGYtPnJ1bkFzY2VudCwgVGV4dFN0eWxlX05ldywgJml0c2VsZi0+cnVuU3R5bGUsIFdFT09ial9OZXcsIGl0c2VsZi0+cnVuT2JqZWN0KTsKIH0KIAogLyogQ29udmVyc2lvbiBvZiBsb25nIHBvaW50cyBhbmQgcmVjdHMgKi8KIGludAogTG9uZ1JlY3RfQ29udmVydChQeU9iamVjdCAqdiwgTG9uZ1JlY3QgKnIpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIobGxsbCkiLCAmci0+bGVmdCwgJnItPnRvcCwgJnItPnJpZ2h0LCAmci0+Ym90dG9tKTsKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIobGxsbCkiLCAmci0+bGVmdCwgJnItPnRvcCwgJnItPnJpZ2h0LCAmci0+Ym90dG9tKTsKIH0KIAogUHlPYmplY3QgKgogTG9uZ1JlY3RfTmV3KExvbmdSZWN0ICpyKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobGxsbCkiLCByLT5sZWZ0LCByLT50b3AsIHItPnJpZ2h0LCByLT5ib3R0b20pOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGxsbGwpIiwgci0+bGVmdCwgci0+dG9wLCByLT5yaWdodCwgci0+Ym90dG9tKTsKIH0KIAogaW50CiBMb25nUHRfQ29udmVydChQeU9iamVjdCAqdiwgTG9uZ1B0ICpwKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGxsKSIsICZwLT5oLCAmcC0+dik7CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGxsKSIsICZwLT5oLCAmcC0+dik7CiB9CiAKIFB5T2JqZWN0ICoKIExvbmdQdF9OZXcoTG9uZ1B0ICpwKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobGwpIiwgcC0+aCwgcC0+dik7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGwpIiwgcC0+aCwgcC0+dik7CiB9CiAKIC8qIFN0dWZmIGZvciB0aGUgY2FsbGJhY2tzOiAqLwpAQCAtMTQ2LDExMCArMTQ2LDExMCBAQAogc3RhdGljIE9TRXJyCiBhbnlfaGFuZGxlcihXRVNlbGVjdG9yIHdoYXQsIFdFT2JqZWN0UmVmZXJlbmNlIHdobywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICoqcnYpCiB7Ci0JRmxhdm9yVHlwZSB0cDsKLQlQeU9iamVjdCAqa2V5LCAqZnVuYzsKLQkKLQlpZiAoIGFyZ3MgPT0gTlVMTCApIHJldHVybiBlcnJBRUNvcnJ1cHREYXRhOwotCQotCXRwID0gV0VHZXRPYmplY3RUeXBlKHdobyk7Ci0JCi0JaWYoIChrZXk9UHlfQnVpbGRWYWx1ZSgiTyZPJiIsIFB5TWFjX0J1aWxkT1NUeXBlLCB0cCwgUHlNYWNfQnVpbGRPU1R5cGUsIHdoYXQpKSA9PSBOVUxMKQotCQlyZXR1cm4gZXJyQUVDb3JydXB0RGF0YTsKLQlpZiggKGZ1bmMgPSBQeURpY3RfR2V0SXRlbShjYWxsYmFja2RpY3QsIGtleSkpID09IE5VTEwgKSB7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlyZXR1cm4gZXJyQUVIYW5kbGVyTm90Rm91bmQ7Ci0JfQotCVB5X0lOQ1JFRihmdW5jKTsKLQkqcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JUHlfREVDUkVGKGtleSk7Ci0JaWYgKCAqcnYgPT0gTlVMTCApIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIi0tRXhjZXB0aW9uIGluIGNhbGxiYWNrOiAiKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIGVyckFFUmVwbHlOb3RBcnJpdmVkOwotCX0KLQlyZXR1cm4gMDsKKyAgICAgICAgRmxhdm9yVHlwZSB0cDsKKyAgICAgICAgUHlPYmplY3QgKmtleSwgKmZ1bmM7CisKKyAgICAgICAgaWYgKCBhcmdzID09IE5VTEwgKSByZXR1cm4gZXJyQUVDb3JydXB0RGF0YTsKKworICAgICAgICB0cCA9IFdFR2V0T2JqZWN0VHlwZSh3aG8pOworCisgICAgICAgIGlmKCAoa2V5PVB5X0J1aWxkVmFsdWUoIk8mTyYiLCBQeU1hY19CdWlsZE9TVHlwZSwgdHAsIFB5TWFjX0J1aWxkT1NUeXBlLCB3aGF0KSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyQUVDb3JydXB0RGF0YTsKKyAgICAgICAgaWYoIChmdW5jID0gUHlEaWN0X0dldEl0ZW0oY2FsbGJhY2tkaWN0LCBrZXkpKSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnJBRUhhbmRsZXJOb3RGb3VuZDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgICAgICpydiA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICBpZiAoICpydiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCItLUV4Y2VwdGlvbiBpbiBjYWxsYmFjazogIik7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyQUVSZXBseU5vdEFycml2ZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBwYXNjYWwgT1NFcnIKIG15X25ld19oYW5kbGVyKFBvaW50ICpvYmplY3RTaXplLCBXRU9iamVjdFJlZmVyZW5jZSBvYmpyZWYpCiB7Ci0JUHlPYmplY3QgKmFyZ3M9TlVMTCwgKnJ2PU5VTEw7Ci0JT1NFcnIgZXJyOwotCQotCWFyZ3M9UHlfQnVpbGRWYWx1ZSgiKE8mKSIsIFdFT09ial9OZXcsIG9ianJlZik7Ci0JZXJyID0gYW55X2hhbmRsZXIod2VOZXdIYW5kbGVyLCBvYmpyZWYsIGFyZ3MsICZydik7Ci0JaWYgKCFlcnIpIHsKLQkJaWYgKCFQeU1hY19HZXRQb2ludChydiwgb2JqZWN0U2l6ZSkgKQotCQkJZXJyID0gZXJyQUVDb2VyY2lvbkZhaWw7Ci0JfQotCWlmICggYXJncyApIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCX0KLQlpZiAoIHJ2ICkgewotCQlQeV9ERUNSRUYocnYpOwotCX0KLQlyZXR1cm4gZXJyOworICAgICAgICBQeU9iamVjdCAqYXJncz1OVUxMLCAqcnY9TlVMTDsKKyAgICAgICAgT1NFcnIgZXJyOworCisgICAgICAgIGFyZ3M9UHlfQnVpbGRWYWx1ZSgiKE8mKSIsIFdFT09ial9OZXcsIG9ianJlZik7CisgICAgICAgIGVyciA9IGFueV9oYW5kbGVyKHdlTmV3SGFuZGxlciwgb2JqcmVmLCBhcmdzLCAmcnYpOworICAgICAgICBpZiAoIWVycikgeworICAgICAgICAgICAgICAgIGlmICghUHlNYWNfR2V0UG9pbnQocnYsIG9iamVjdFNpemUpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyckFFQ29lcmNpb25GYWlsOworICAgICAgICB9CisgICAgICAgIGlmICggYXJncyApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBydiApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBwYXNjYWwgT1NFcnIKIG15X2Rpc3Bvc2VfaGFuZGxlcihXRU9iamVjdFJlZmVyZW5jZSBvYmpyZWYpCiB7Ci0JUHlPYmplY3QgKmFyZ3M9TlVMTCwgKnJ2PU5VTEw7Ci0JT1NFcnIgZXJyOwotCQotCWFyZ3M9UHlfQnVpbGRWYWx1ZSgiKE8mKSIsIFdFT09ial9OZXcsIG9ianJlZik7Ci0JZXJyID0gYW55X2hhbmRsZXIod2VEaXNwb3NlSGFuZGxlciwgb2JqcmVmLCBhcmdzLCAmcnYpOwotCWlmICggYXJncyApIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCX0KLQlpZiAoIHJ2ICkgewotCQlQeV9ERUNSRUYocnYpOwotCX0KLQlyZXR1cm4gZXJyOworICAgICAgICBQeU9iamVjdCAqYXJncz1OVUxMLCAqcnY9TlVMTDsKKyAgICAgICAgT1NFcnIgZXJyOworCisgICAgICAgIGFyZ3M9UHlfQnVpbGRWYWx1ZSgiKE8mKSIsIFdFT09ial9OZXcsIG9ianJlZik7CisgICAgICAgIGVyciA9IGFueV9oYW5kbGVyKHdlRGlzcG9zZUhhbmRsZXIsIG9ianJlZiwgYXJncywgJnJ2KTsKKyAgICAgICAgaWYgKCBhcmdzICkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHJ2ICkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHBhc2NhbCBPU0VycgogbXlfZHJhd19oYW5kbGVyKGNvbnN0IFJlY3QgKmRlc3RSZWN0LCBXRU9iamVjdFJlZmVyZW5jZSBvYmpyZWYpCiB7Ci0JUHlPYmplY3QgKmFyZ3M9TlVMTCwgKnJ2PU5VTEw7Ci0JT1NFcnIgZXJyOwotCQotCWFyZ3M9UHlfQnVpbGRWYWx1ZSgiTyZPJiIsIFB5TWFjX0J1aWxkUmVjdCwgZGVzdFJlY3QsIFdFT09ial9OZXcsIG9ianJlZik7Ci0JZXJyID0gYW55X2hhbmRsZXIod2VEcmF3SGFuZGxlciwgb2JqcmVmLCBhcmdzLCAmcnYpOwotCWlmICggYXJncyApIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCX0KLQlpZiAoIHJ2ICkgewotCQlQeV9ERUNSRUYocnYpOwotCX0KLQlyZXR1cm4gZXJyOworICAgICAgICBQeU9iamVjdCAqYXJncz1OVUxMLCAqcnY9TlVMTDsKKyAgICAgICAgT1NFcnIgZXJyOworCisgICAgICAgIGFyZ3M9UHlfQnVpbGRWYWx1ZSgiTyZPJiIsIFB5TWFjX0J1aWxkUmVjdCwgZGVzdFJlY3QsIFdFT09ial9OZXcsIG9ianJlZik7CisgICAgICAgIGVyciA9IGFueV9oYW5kbGVyKHdlRHJhd0hhbmRsZXIsIG9ianJlZiwgYXJncywgJnJ2KTsKKyAgICAgICAgaWYgKCBhcmdzICkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHJ2ICkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHBhc2NhbCBCb29sZWFuCiBteV9jbGlja19oYW5kbGVyKFBvaW50IGhpdFB0LCBFdmVudE1vZGlmaWVycyBtb2RpZmllcnMsCi0JCXVuc2lnbmVkIGxvbmcgY2xpY2tUaW1lLCBXRU9iamVjdFJlZmVyZW5jZSBvYmpyZWYpCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjbGlja1RpbWUsIFdFT2JqZWN0UmVmZXJlbmNlIG9ianJlZikKIHsKLQlQeU9iamVjdCAqYXJncz1OVUxMLCAqcnY9TlVMTDsKLQlpbnQgcmV0dmFsdWU7Ci0JT1NFcnIgZXJyOwotCQotCWFyZ3M9UHlfQnVpbGRWYWx1ZSgiTyZsbE8mIiwgUHlNYWNfQnVpbGRQb2ludCwgaGl0UHQsCi0JCQkobG9uZyltb2RpZmllcnMsIChsb25nKWNsaWNrVGltZSwgV0VPT2JqX05ldywgb2JqcmVmKTsKLQllcnIgPSBhbnlfaGFuZGxlcih3ZUNsaWNrSGFuZGxlciwgb2JqcmVmLCBhcmdzLCAmcnYpOwotCWlmICghZXJyKQotCQlyZXR2YWx1ZSA9IFB5SW50X0FzTG9uZyhydik7Ci0JZWxzZQotCQlyZXR2YWx1ZSA9IDA7Ci0JaWYgKCBhcmdzICkgewotCQlQeV9ERUNSRUYoYXJncyk7Ci0JfQotCWlmICggcnYgKSB7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfQotCXJldHVybiByZXR2YWx1ZTsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M9TlVMTCwgKnJ2PU5VTEw7CisgICAgICAgIGludCByZXR2YWx1ZTsKKyAgICAgICAgT1NFcnIgZXJyOworCisgICAgICAgIGFyZ3M9UHlfQnVpbGRWYWx1ZSgiTyZsbE8mIiwgUHlNYWNfQnVpbGRQb2ludCwgaGl0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyltb2RpZmllcnMsIChsb25nKWNsaWNrVGltZSwgV0VPT2JqX05ldywgb2JqcmVmKTsKKyAgICAgICAgZXJyID0gYW55X2hhbmRsZXIod2VDbGlja0hhbmRsZXIsIG9ianJlZiwgYXJncywgJnJ2KTsKKyAgICAgICAgaWYgKCFlcnIpCisgICAgICAgICAgICAgICAgcmV0dmFsdWUgPSBQeUludF9Bc0xvbmcocnYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dmFsdWUgPSAwOworICAgICAgICBpZiAoIGFyZ3MgKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmICggcnYgKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsdWU7CiB9Ci0JCQorCiAKICIiIgogZmluYWxzdHVmZiA9IGZpbmFsc3R1ZmYgKyAiIiIKQEAgLTI1Nyw2MiArMjU3LDYyIEBACiAKIFB5T2JqZWN0ICoKIEV4aXN0aW5nd2FzdGVPYmpfTmV3KHcpCi0JV0VSZWZlcmVuY2UgdzsKKyAgICAgICAgV0VSZWZlcmVuY2UgdzsKIHsKLQlQeU9iamVjdCAqaXQgPSBOVUxMOwotCQotCWlmICh3ID09IE5VTEwpCi0JCWl0ID0gTlVMTDsKLQllbHNlCi0JCVdFR2V0SW5mbyh3ZVJlZkNvbiwgKHZvaWQgKikmaXQsIHcpOwotCWlmIChpdCA9PSBOVUxMIHx8ICgod2FzdGVPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSB3KQotCQlpdCA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKGl0KTsKLQlyZXR1cm4gaXQ7CisgICAgICAgIFB5T2JqZWN0ICppdCA9IE5VTEw7CisKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBpdCA9IE5VTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBXRUdldEluZm8od2VSZWZDb24sICh2b2lkICopJml0LCB3KTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgKCh3YXN0ZU9iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IHcpCisgICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgICAgICByZXR1cm4gaXQ7CiB9CiAiIiIKIAogY2xhc3MgV0VNZXRob2RHZW5lcmF0b3IoT1NFcnJNZXRob2RHZW5lcmF0b3IpOgotCSIiIlNpbWlsYXIgdG8gTWV0aG9kR2VuZXJhdG9yLCBidXQgaGFzIHNlbGYgYXMgbGFzdCBhcmd1bWVudCIiIgorICAgICIiIlNpbWlsYXIgdG8gTWV0aG9kR2VuZXJhdG9yLCBidXQgaGFzIHNlbGYgYXMgbGFzdCBhcmd1bWVudCIiIgogCi0JZGVmIHBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpOgotCQlhcmdzLCBhMCA9IGFyZ3NbOi0xXSwgYXJnc1stMV0KLQkJdDAsIG4wLCBtMCA9IGEwCi0JCWlmIG0wICE9IEluTW9kZToKLQkJCXJhaXNlIFZhbHVlRXJyb3IsICJtZXRob2QncyAnc2VsZicgbXVzdCBiZSAnSW5Nb2RlJyIKLQkJc2VsZi5pdHNlbGYgPSBWYXJpYWJsZSh0MCwgIl9zZWxmLT5vYl9pdHNlbGYiLCBTZWxmTW9kZSkKLQkJRnVuY3Rpb25HZW5lcmF0b3IucGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncykKLQkJc2VsZi5hcmd1bWVudExpc3QuYXBwZW5kKHNlbGYuaXRzZWxmKQorICAgIGRlZiBwYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKToKKyAgICAgICAgYXJncywgYTAgPSBhcmdzWzotMV0sIGFyZ3NbLTFdCisgICAgICAgIHQwLCBuMCwgbTAgPSBhMAorICAgICAgICBpZiBtMCAhPSBJbk1vZGU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibWV0aG9kJ3MgJ3NlbGYnIG11c3QgYmUgJ0luTW9kZSciCisgICAgICAgIHNlbGYuaXRzZWxmID0gVmFyaWFibGUodDAsICJfc2VsZi0+b2JfaXRzZWxmIiwgU2VsZk1vZGUpCisgICAgICAgIEZ1bmN0aW9uR2VuZXJhdG9yLnBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpCisgICAgICAgIHNlbGYuYXJndW1lbnRMaXN0LmFwcGVuZChzZWxmLml0c2VsZikKIAogCiAKIGNsYXNzIFdFT2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyh3YXN0ZV9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIFdFIik7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0iIiIpCi0JZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiV0VTZXRJbmZvKHdlUmVmQ29uLCAodm9pZCAqKSZpdCwgaXRzZWxmKTsiKQotCWRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6Ci0JCU91dHB1dCgiV0VEaXNwb3NlKCVzKTsiLCBpdHNlbGZuYW1lKQotCQkKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiIiJpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHdhc3RlX0Vycm9yLCJDYW5ub3QgY3JlYXRlIG51bGwgV0UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IiIiKQorICAgIGRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoIldFU2V0SW5mbyh3ZVJlZkNvbiwgKHZvaWQgKikmaXQsIGl0c2VsZik7IikKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgorICAgICAgICBPdXRwdXQoIldFRGlzcG9zZSglcyk7IiwgaXRzZWxmbmFtZSkKKwogY2xhc3MgV0VPT2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCQkJcmV0dXJuIFB5X05vbmU7Ci0JCQkJfSIiIikKLQkJCQkKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiIiJpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0iIiIpCisKIHZhcmlhYmxlc3R1ZmYgPSAiIiIKLQljYWxsYmFja2RpY3QgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKGNhbGxiYWNrZGljdCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjYWxsYmFja3MiLCBjYWxsYmFja2RpY3QpICE9IDApCi0JCXJldHVybjsKLQl1cHBfbmV3X2hhbmRsZXIgPSBOZXdXRU5ld09iamVjdFByb2MobXlfbmV3X2hhbmRsZXIpOwotCXVwcF9kaXNwb3NlX2hhbmRsZXIgPSBOZXdXRURpc3Bvc2VPYmplY3RQcm9jKG15X2Rpc3Bvc2VfaGFuZGxlcik7Ci0JdXBwX2RyYXdfaGFuZGxlciA9IE5ld1dFRHJhd09iamVjdFByb2MobXlfZHJhd19oYW5kbGVyKTsKLQl1cHBfY2xpY2tfaGFuZGxlciA9IE5ld1dFQ2xpY2tPYmplY3RQcm9jKG15X2NsaWNrX2hhbmRsZXIpOworICAgICAgICBjYWxsYmFja2RpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChjYWxsYmFja2RpY3QgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY2FsbGJhY2tzIiwgY2FsbGJhY2tkaWN0KSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdXBwX25ld19oYW5kbGVyID0gTmV3V0VOZXdPYmplY3RQcm9jKG15X25ld19oYW5kbGVyKTsKKyAgICAgICAgdXBwX2Rpc3Bvc2VfaGFuZGxlciA9IE5ld1dFRGlzcG9zZU9iamVjdFByb2MobXlfZGlzcG9zZV9oYW5kbGVyKTsKKyAgICAgICAgdXBwX2RyYXdfaGFuZGxlciA9IE5ld1dFRHJhd09iamVjdFByb2MobXlfZHJhd19oYW5kbGVyKTsKKyAgICAgICAgdXBwX2NsaWNrX2hhbmRsZXIgPSBOZXdXRUNsaWNrT2JqZWN0UHJvYyhteV9jbGlja19oYW5kbGVyKTsKICIiIgogCiAKQEAgLTM0MSw3OCArMzQxLDc4IEBACiAKICMgQSBmdW5jdGlvbiB3cml0dGVuIGJ5IGhhbmQ6CiBzdGRoYW5kbGVyc19ib2R5ID0gIiIiCi0JT1NFcnIgZXJyOwotCS8vIGluc3RhbGwgdGhlIHNhbXBsZSBvYmplY3QgaGFuZGxlcnMgZm9yIHBpY3R1cmVzIGFuZCBzb3VuZHMKLSNkZWZpbmUJa1R5cGVQaWN0dXJlCQkJJ1BJQ1QnCi0jZGVmaW5lCWtUeXBlU291bmQJCQkJJ3NuZCAnCi0JCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpICkgcmV0dXJuIE5VTEw7Ci0JCi0JaWYgKChlcnIgPSBXRUluc3RhbGxPYmplY3RIYW5kbGVyKGtUeXBlUGljdHVyZSwgd2VOZXdIYW5kbGVyLAotCQkJCShVbml2ZXJzYWxQcm9jUHRyKSBOZXdXRU5ld09iamVjdFByb2MoSGFuZGxlTmV3UGljdHVyZSksIE5VTEwpKSAhPSBub0VycikKLQkJZ290byBjbGVhbnVwOwotCQotCWlmICgoZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihrVHlwZVBpY3R1cmUsIHdlRGlzcG9zZUhhbmRsZXIsCi0JCQkJKFVuaXZlcnNhbFByb2NQdHIpIE5ld1dFRGlzcG9zZU9iamVjdFByb2MoSGFuZGxlRGlzcG9zZVBpY3R1cmUpLCBOVUxMKSkgIT0gbm9FcnIpCi0JCWdvdG8gY2xlYW51cDsKLQkKLQlpZiAoKGVyciA9IFdFSW5zdGFsbE9iamVjdEhhbmRsZXIoa1R5cGVQaWN0dXJlLCB3ZURyYXdIYW5kbGVyLAotCQkJCShVbml2ZXJzYWxQcm9jUHRyKSBOZXdXRURyYXdPYmplY3RQcm9jKEhhbmRsZURyYXdQaWN0dXJlKSwgTlVMTCkpICE9IG5vRXJyKQotCQlnb3RvIGNsZWFudXA7Ci0JCi0JaWYgKChlcnIgPSBXRUluc3RhbGxPYmplY3RIYW5kbGVyKGtUeXBlU291bmQsIHdlTmV3SGFuZGxlciwKLQkJCQkoVW5pdmVyc2FsUHJvY1B0cikgTmV3V0VOZXdPYmplY3RQcm9jKEhhbmRsZU5ld1NvdW5kKSwgTlVMTCkpICE9IG5vRXJyKQotCQlnb3RvIGNsZWFudXA7Ci0JCi0JaWYgKChlcnIgPSBXRUluc3RhbGxPYmplY3RIYW5kbGVyKGtUeXBlU291bmQsIHdlRHJhd0hhbmRsZXIsCi0JCQkJKFVuaXZlcnNhbFByb2NQdHIpIE5ld1dFRHJhd09iamVjdFByb2MoSGFuZGxlRHJhd1NvdW5kKSwgTlVMTCkpICE9IG5vRXJyKQotCQlnb3RvIGNsZWFudXA7Ci0JCi0JaWYgKChlcnIgPSBXRUluc3RhbGxPYmplY3RIYW5kbGVyKGtUeXBlU291bmQsIHdlQ2xpY2tIYW5kbGVyLAotCQkJCShVbml2ZXJzYWxQcm9jUHRyKSBOZXdXRUNsaWNrT2JqZWN0UHJvYyhIYW5kbGVDbGlja1NvdW5kKSwgTlVMTCkpICE9IG5vRXJyKQotCQlnb3RvIGNsZWFudXA7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOwotCQorICAgICAgICBPU0VyciBlcnI7CisgICAgICAgIC8vIGluc3RhbGwgdGhlIHNhbXBsZSBvYmplY3QgaGFuZGxlcnMgZm9yIHBpY3R1cmVzIGFuZCBzb3VuZHMKKyNkZWZpbmUga1R5cGVQaWN0dXJlICAgICAgICAgICAgICAgICAgICAnUElDVCcKKyNkZWZpbmUga1R5cGVTb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbmQgJworCisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSApIHJldHVybiBOVUxMOworCisgICAgICAgIGlmICgoZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihrVHlwZVBpY3R1cmUsIHdlTmV3SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVuaXZlcnNhbFByb2NQdHIpIE5ld1dFTmV3T2JqZWN0UHJvYyhIYW5kbGVOZXdQaWN0dXJlKSwgTlVMTCkpICE9IG5vRXJyKQorICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgICAgICBpZiAoKGVyciA9IFdFSW5zdGFsbE9iamVjdEhhbmRsZXIoa1R5cGVQaWN0dXJlLCB3ZURpc3Bvc2VIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVW5pdmVyc2FsUHJvY1B0cikgTmV3V0VEaXNwb3NlT2JqZWN0UHJvYyhIYW5kbGVEaXNwb3NlUGljdHVyZSksIE5VTEwpKSAhPSBub0VycikKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICAgICAgaWYgKChlcnIgPSBXRUluc3RhbGxPYmplY3RIYW5kbGVyKGtUeXBlUGljdHVyZSwgd2VEcmF3SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVuaXZlcnNhbFByb2NQdHIpIE5ld1dFRHJhd09iamVjdFByb2MoSGFuZGxlRHJhd1BpY3R1cmUpLCBOVUxMKSkgIT0gbm9FcnIpCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgICAgIGlmICgoZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihrVHlwZVNvdW5kLCB3ZU5ld0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVbml2ZXJzYWxQcm9jUHRyKSBOZXdXRU5ld09iamVjdFByb2MoSGFuZGxlTmV3U291bmQpLCBOVUxMKSkgIT0gbm9FcnIpCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgICAgIGlmICgoZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihrVHlwZVNvdW5kLCB3ZURyYXdIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVW5pdmVyc2FsUHJvY1B0cikgTmV3V0VEcmF3T2JqZWN0UHJvYyhIYW5kbGVEcmF3U291bmQpLCBOVUxMKSkgIT0gbm9FcnIpCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgICAgIGlmICgoZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihrVHlwZVNvdW5kLCB3ZUNsaWNrSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVuaXZlcnNhbFByb2NQdHIpIE5ld1dFQ2xpY2tPYmplY3RQcm9jKEhhbmRsZUNsaWNrU291bmQpLCBOVUxMKSkgIT0gbm9FcnIpCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIF9yZXMgPSBQeV9Ob25lOworICAgICAgICByZXR1cm4gX3JlczsKKwogY2xlYW51cDoKLQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CiAiIiIKIAogaW5zaGFuZGxlcl9ib2R5ID0gIiIiCi0JT1NFcnIgZXJyOwotCUZsYXZvclR5cGUgb2JqZWN0VHlwZTsKLQlXRVNlbGVjdG9yIHNlbGVjdG9yOwotCVB5T2JqZWN0ICpweV9oYW5kbGVyOwotCVVuaXZlcnNhbFByb2NQdHIgaGFuZGxlcjsKLQlXRVJlZmVyZW5jZSB3ZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmtleTsKLQkKLQkKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk98TyYiLAotCQkJUHlNYWNfR2V0T1NUeXBlLCAmb2JqZWN0VHlwZSwKLQkJCVB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAotCQkJJnB5X2hhbmRsZXIsCi0JCQlXRU9PYmpfQ29udmVydCwgJndlKSApIHJldHVybiBOVUxMOwotCQkJCi0JaWYgKCBzZWxlY3RvciA9PSB3ZU5ld0hhbmRsZXIgKSBoYW5kbGVyID0gKFVuaXZlcnNhbFByb2NQdHIpdXBwX25ld19oYW5kbGVyOwotCWVsc2UgaWYgKCBzZWxlY3RvciA9PSB3ZURpc3Bvc2VIYW5kbGVyICkgaGFuZGxlciA9IChVbml2ZXJzYWxQcm9jUHRyKXVwcF9kaXNwb3NlX2hhbmRsZXI7Ci0JZWxzZSBpZiAoIHNlbGVjdG9yID09IHdlRHJhd0hhbmRsZXIgKSBoYW5kbGVyID0gKFVuaXZlcnNhbFByb2NQdHIpdXBwX2RyYXdfaGFuZGxlcjsKLQllbHNlIGlmICggc2VsZWN0b3IgPT0gd2VDbGlja0hhbmRsZXIgKSBoYW5kbGVyID0gKFVuaXZlcnNhbFByb2NQdHIpdXBwX2NsaWNrX2hhbmRsZXI7Ci0JZWxzZSByZXR1cm4gUHlNYWNfRXJyb3Iod2VVbmRlZmluZWRTZWxlY3RvckVycik7Ci0JCQkKLQlpZiAoKGtleSA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCAKLQkJCVB5TWFjX0J1aWxkT1NUeXBlLCBvYmplY3RUeXBlLCAKLQkJCVB5TWFjX0J1aWxkT1NUeXBlLCBzZWxlY3RvcikpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQkJCi0JUHlEaWN0X1NldEl0ZW0oY2FsbGJhY2tkaWN0LCBrZXksIHB5X2hhbmRsZXIpOwotCQotCWVyciA9IFdFSW5zdGFsbE9iamVjdEhhbmRsZXIob2JqZWN0VHlwZSwgc2VsZWN0b3IsIGhhbmRsZXIsIHdlKTsKLQlpZiAoIGVyciApIHJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICAgICAgT1NFcnIgZXJyOworICAgICAgICBGbGF2b3JUeXBlIG9iamVjdFR5cGU7CisgICAgICAgIFdFU2VsZWN0b3Igc2VsZWN0b3I7CisgICAgICAgIFB5T2JqZWN0ICpweV9oYW5kbGVyOworICAgICAgICBVbml2ZXJzYWxQcm9jUHRyIGhhbmRsZXI7CisgICAgICAgIFdFUmVmZXJlbmNlIHdlID0gTlVMTDsKKyAgICAgICAgUHlPYmplY3QgKmtleTsKKworCisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mT3xPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZvYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAmcHlfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdFT09ial9Db252ZXJ0LCAmd2UpICkgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgaWYgKCBzZWxlY3RvciA9PSB3ZU5ld0hhbmRsZXIgKSBoYW5kbGVyID0gKFVuaXZlcnNhbFByb2NQdHIpdXBwX25ld19oYW5kbGVyOworICAgICAgICBlbHNlIGlmICggc2VsZWN0b3IgPT0gd2VEaXNwb3NlSGFuZGxlciApIGhhbmRsZXIgPSAoVW5pdmVyc2FsUHJvY1B0cil1cHBfZGlzcG9zZV9oYW5kbGVyOworICAgICAgICBlbHNlIGlmICggc2VsZWN0b3IgPT0gd2VEcmF3SGFuZGxlciApIGhhbmRsZXIgPSAoVW5pdmVyc2FsUHJvY1B0cil1cHBfZHJhd19oYW5kbGVyOworICAgICAgICBlbHNlIGlmICggc2VsZWN0b3IgPT0gd2VDbGlja0hhbmRsZXIgKSBoYW5kbGVyID0gKFVuaXZlcnNhbFByb2NQdHIpdXBwX2NsaWNrX2hhbmRsZXI7CisgICAgICAgIGVsc2UgcmV0dXJuIFB5TWFjX0Vycm9yKHdlVW5kZWZpbmVkU2VsZWN0b3JFcnIpOworCisgICAgICAgIGlmICgoa2V5ID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgb2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBzZWxlY3RvcikpID09IE5VTEwgKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIFB5RGljdF9TZXRJdGVtKGNhbGxiYWNrZGljdCwga2V5LCBweV9oYW5kbGVyKTsKKworICAgICAgICBlcnIgPSBXRUluc3RhbGxPYmplY3RIYW5kbGVyKG9iamVjdFR5cGUsIHNlbGVjdG9yLCBoYW5kbGVyLCB3ZSk7CisgICAgICAgIGlmICggZXJyICkgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgX3JlcyA9IFB5X05vbmU7CisgICAgICAgIHJldHVybiBfcmVzOwogIiIiCiAKIHN0ZGhhbmQgPSBNYW51YWxHZW5lcmF0b3IoIlNURE9iamVjdEhhbmRsZXJzIiwgc3RkaGFuZGxlcnNfYm9keSkKQEAgLTQ0Miw0ICs0NDIsMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvd2luL3dpbmVkaXQucHkgYi9NYWMvTW9kdWxlcy93aW4vd2luZWRpdC5weQppbmRleCBkNzkzNTZmLi4wMWNmZTg2IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy93aW4vd2luZWRpdC5weQorKysgYi9NYWMvTW9kdWxlcy93aW4vd2luZWRpdC5weQpAQCAtNywyNSArNywyNSBAQAogbWV0aG9kcy5hcHBlbmQoZikKIAogZiA9IE1ldGhvZCh2b2lkLCAnR2V0V2luZG93U3RydWN0dXJlUmduJywKLQkoV2luZG93UmVmLCAndGhlV2luZG93JywgSW5Nb2RlKSwKLQkoUmduSGFuZGxlLCAncicsIEluTW9kZSksCisgICAgICAgIChXaW5kb3dSZWYsICd0aGVXaW5kb3cnLCBJbk1vZGUpLAorICAgICAgICAoUmduSGFuZGxlLCAncicsIEluTW9kZSksCiApCiBtZXRob2RzLmFwcGVuZChmKQogCiBmID0gTWV0aG9kKHZvaWQsICdHZXRXaW5kb3dDb250ZW50UmduJywKLQkoV2luZG93UmVmLCAndGhlV2luZG93JywgSW5Nb2RlKSwKLQkoUmduSGFuZGxlLCAncicsIEluTW9kZSksCisgICAgICAgIChXaW5kb3dSZWYsICd0aGVXaW5kb3cnLCBJbk1vZGUpLAorICAgICAgICAoUmduSGFuZGxlLCAncicsIEluTW9kZSksCiApCiBtZXRob2RzLmFwcGVuZChmKQogCiBmID0gTWV0aG9kKHZvaWQsICdHZXRXaW5kb3dVcGRhdGVSZ24nLAotCShXaW5kb3dSZWYsICd0aGVXaW5kb3cnLCBJbk1vZGUpLAotCShSZ25IYW5kbGUsICdyJywgSW5Nb2RlKSwKKyAgICAgICAgKFdpbmRvd1JlZiwgJ3RoZVdpbmRvdycsIEluTW9kZSksCisgICAgICAgIChSZ25IYW5kbGUsICdyJywgSW5Nb2RlKSwKICkKIG1ldGhvZHMuYXBwZW5kKGYpCiAKIGYgPSBNZXRob2QoRXhpc3RpbmdXaW5kb3dQdHIsICdHZXROZXh0V2luZG93JywKLQkoV2luZG93UmVmLCAndGhlV2luZG93JywgSW5Nb2RlKSwKKyAgICAgICAgKFdpbmRvd1JlZiwgJ3RoZVdpbmRvdycsIEluTW9kZSksCiApCiBtZXRob2RzLmFwcGVuZChmKQogCkBAIC01NCwxOCArNTQsMTYgQEAKIEF1dG9EaXNwb3NlX2JvZHkgPSAiIiIKIGludCBvbm9mZiwgb2xkID0gMDsKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmb25vZmYpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIGlmICggX3NlbGYtPm9iX2ZyZWVpdCApCi0Jb2xkID0gMTsKKyAgICAgICAgb2xkID0gMTsKIGlmICggb25vZmYgKQotCV9zZWxmLT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZVdpbmRvdzsKKyAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlV2luZG93OwogZWxzZQotCV9zZWxmLT5vYl9mcmVlaXQgPSBOVUxMOworICAgICAgICBfc2VsZi0+b2JfZnJlZWl0ID0gTlVMTDsKIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgb2xkKTsKIHJldHVybiBfcmVzOwogIiIiCiBmID0gTWFudWFsR2VuZXJhdG9yKCJBdXRvRGlzcG9zZSIsIEF1dG9EaXNwb3NlX2JvZHkpCiBmLmRvY3N0cmluZyA9IGxhbWJkYTogIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgRGlzcG9zZUhhbmRsZSB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIKIG1ldGhvZHMuYXBwZW5kKGYpCi0KLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvd2luL3dpbnNjYW4ucHkgYi9NYWMvTW9kdWxlcy93aW4vd2luc2Nhbi5weQppbmRleCA2YjA4YzAwLi5mNzg5MzVkIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy93aW4vd2luc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy93aW4vd2luc2Nhbi5weQpAQCAtNywxMjUgKzcsMTI0IEBACiBmcm9tIHNjYW50b29scyBpbXBvcnQgU2Nhbm5lcgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gIk1hY1dpbmRvd3MuaCIKLQlvdXRwdXQgPSAid2luZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIldpbmRvd3MucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JaW1wb3J0IHdpbnN1cHBvcnQKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gIk1hY1dpbmRvd3MuaCIKKyAgICBvdXRwdXQgPSAid2luZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIldpbmRvd3MucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgaW1wb3J0IHdpbnN1cHBvcnQKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgaW4gKCJXaW5kb3dQdHIiLCAiV2luZG93UGVlayIsICJXaW5kb3dSZWYiKSBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gIm1ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0IGluICgiV2luZG93UHRyIiwgIldpbmRvd1BlZWsiLCAiV2luZG93UmVmIikgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImZhbHNlID0gMFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgidHJ1ZSA9IDFcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtXaW5kb3dOb0NvbnN0cmFpbkF0dHJpYnV0ZSA9IDB4ODAwMDAwMDBcbiIpCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImZhbHNlID0gMFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgidHJ1ZSA9IDFcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImtXaW5kb3dOb0NvbnN0cmFpbkF0dHJpYnV0ZSA9IDB4ODAwMDAwMDBcbiIpCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJJ0Rpc3Bvc2VXaW5kb3cnLCAjIEltcGxpZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQKLQkJCSdDbG9zZVdpbmRvdycsCi0JCQknU2V0V2luZG93UHJvcGVydHknLAkjIEZvciB0aGUgbW9tZW50Ci0JCQknR2V0V2luZG93UHJvcGVydHknLAotCQkJJ0dldFdpbmRvd1Byb3BlcnR5U2l6ZScsCi0JCQknUmVtb3ZlV2luZG93UHJvcGVydHknLAotCQkJJ01hY0Nsb3NlV2luZG93JywKLQkJCSdHZXRXaW5kb3dMaXN0JywgIyBEb24ndCBrbm93IHdoZXRoZXIgdGhpcyBpcyBzYWZlLi4uCi0JCQkjIENvbnN0YW50cyB3aXRoIGZ1bm55IGRlZmluaXRpb25zCi0JCQkna01vdXNlVXBPdXRPZlNsb3AnLAotCQkJJ2tBbGxXaW5kb3dDbGFzc2VzJywKLQkJCSdrV2luZG93Tm9Db25zdHJhaW5BdHRyaWJ1dGUnLAotCQkJIyBPUzggb25seToKLQkJCSdHZXRBdXhXaW4nLAotCQkJJ0dldFdpbmRvd0RhdGFIYW5kbGUnLAotCQkJJ1NhdmVPbGQnLAotCQkJJ0RyYXdOZXcnLAotCQkJJ1NldFdpbkNvbG9yJywKLQkJCSdTZXREZXNrQ1BhdCcsCi0JCQknSW5pdFdpbmRvd3MnLAotCQkJJ0luaXRGbG9hdGluZ1dpbmRvd3MnLAotCQkJJ0dldFdNZ3JQb3J0JywKLQkJCSdHZXRDV01nclBvcnQnLAotCQkJJ1ZhbGlkUmduJywJCSMgVXNlIHZlcnNpb25zIHdpdGggV2luZG93IGluIHRoZWlyIG5hbWUKLQkJCSdWYWxpZFJlY3QnLAotCQkJJ0ludmFsUmduJywKLQkJCSdJbnZhbFJlY3QnLAotCQkJJ0lzVmFsaWRXaW5kb3dQdHInLCAjIEkgdGhpbmsgdGhpcyBpcyB1c2VsZXNzIGZvciBQeXRob24sIGJ1dCBub3Qgc3VyZS4uLgotCQkJJ0dldFdpbmRvd1pvb21GbGFnJywJIyBOb3QgYXZhaWxhYmxlIGluIENhcmJvbgotCQkJJ0dldFdpbmRvd1RpdGxlV2lkdGgnLAkjIERpdHRvCi0JCQknR2V0V2luZG93R29Bd2F5RmxhZycsCi0JCQknR2V0V2luZG93U3BhcmVGbGFnJywKLQkJCV0KLQkJCQkJCQotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQknUHJvY1B0cicsCi0JCQknRHJhZ0dyYXlSZ25VUFAnLAotCQkJJ1dpbmRvd1BhaW50VVBQJywKLQkJCSdDb2xsZWN0aW9uJywJCSMgRm9yIG5vdywgdG8gYmUgZG9uZSBsYXRlcgotCQkJJ1dpbmRvd0RlZlNwZWMnLAkjIFRvbyBkaWZmaWN1bHQgZm9yIG5vdwotCQkJJ1dpbmRvd0RlZlNwZWNfcHRyJywKLQkJCSdFdmVudFJlZicsICNUQkQKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICdEaXNwb3NlV2luZG93JywgIyBJbXBsaWVkIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkCisgICAgICAgICAgICAgICAgJ0Nsb3NlV2luZG93JywKKyAgICAgICAgICAgICAgICAnU2V0V2luZG93UHJvcGVydHknLCAgICAjIEZvciB0aGUgbW9tZW50CisgICAgICAgICAgICAgICAgJ0dldFdpbmRvd1Byb3BlcnR5JywKKyAgICAgICAgICAgICAgICAnR2V0V2luZG93UHJvcGVydHlTaXplJywKKyAgICAgICAgICAgICAgICAnUmVtb3ZlV2luZG93UHJvcGVydHknLAorICAgICAgICAgICAgICAgICdNYWNDbG9zZVdpbmRvdycsCisgICAgICAgICAgICAgICAgJ0dldFdpbmRvd0xpc3QnLCAjIERvbid0IGtub3cgd2hldGhlciB0aGlzIGlzIHNhZmUuLi4KKyAgICAgICAgICAgICAgICAjIENvbnN0YW50cyB3aXRoIGZ1bm55IGRlZmluaXRpb25zCisgICAgICAgICAgICAgICAgJ2tNb3VzZVVwT3V0T2ZTbG9wJywKKyAgICAgICAgICAgICAgICAna0FsbFdpbmRvd0NsYXNzZXMnLAorICAgICAgICAgICAgICAgICdrV2luZG93Tm9Db25zdHJhaW5BdHRyaWJ1dGUnLAorICAgICAgICAgICAgICAgICMgT1M4IG9ubHk6CisgICAgICAgICAgICAgICAgJ0dldEF1eFdpbicsCisgICAgICAgICAgICAgICAgJ0dldFdpbmRvd0RhdGFIYW5kbGUnLAorICAgICAgICAgICAgICAgICdTYXZlT2xkJywKKyAgICAgICAgICAgICAgICAnRHJhd05ldycsCisgICAgICAgICAgICAgICAgJ1NldFdpbkNvbG9yJywKKyAgICAgICAgICAgICAgICAnU2V0RGVza0NQYXQnLAorICAgICAgICAgICAgICAgICdJbml0V2luZG93cycsCisgICAgICAgICAgICAgICAgJ0luaXRGbG9hdGluZ1dpbmRvd3MnLAorICAgICAgICAgICAgICAgICdHZXRXTWdyUG9ydCcsCisgICAgICAgICAgICAgICAgJ0dldENXTWdyUG9ydCcsCisgICAgICAgICAgICAgICAgJ1ZhbGlkUmduJywgICAgICAgICAgICAgIyBVc2UgdmVyc2lvbnMgd2l0aCBXaW5kb3cgaW4gdGhlaXIgbmFtZQorICAgICAgICAgICAgICAgICdWYWxpZFJlY3QnLAorICAgICAgICAgICAgICAgICdJbnZhbFJnbicsCisgICAgICAgICAgICAgICAgJ0ludmFsUmVjdCcsCisgICAgICAgICAgICAgICAgJ0lzVmFsaWRXaW5kb3dQdHInLCAjIEkgdGhpbmsgdGhpcyBpcyB1c2VsZXNzIGZvciBQeXRob24sIGJ1dCBub3Qgc3VyZS4uLgorICAgICAgICAgICAgICAgICdHZXRXaW5kb3dab29tRmxhZycsICAgICMgTm90IGF2YWlsYWJsZSBpbiBDYXJib24KKyAgICAgICAgICAgICAgICAnR2V0V2luZG93VGl0bGVXaWR0aCcsICAjIERpdHRvCisgICAgICAgICAgICAgICAgJ0dldFdpbmRvd0dvQXdheUZsYWcnLAorICAgICAgICAgICAgICAgICdHZXRXaW5kb3dTcGFyZUZsYWcnLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJCi0JCQkjIEdldFdUaXRsZQotCQkJKFsoIlN0cjI1NSIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCIqIiwgIioiLCAiT3V0TW9kZSIpXSksCi0JCQkKLQkJCShbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKLQkJCQotCQkJKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibG9uZyIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiVmFyVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKLQkJCQotCQkJKFsoInZvaWQiLCAid1N0b3JhZ2UiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJOdWxsU3RvcmFnZSIsICIqIiwgIkluTW9kZSIpXSksCi0JCQkKLQkJCSMgbWF0Y2ggRmluZFdpbmRvd09mQ2xhc3MKLQkJCShbKCJXaW5kb3dSZWYiLCAib3V0V2luZG93IiwgIk91dE1vZGUiKSwgKCJXaW5kb3dQYXJ0Q29kZSIsICJvdXRXaW5kb3dQYXJ0IiwgIk91dE1vZGUiKV0sCi0JCQkgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICJPdXRNb2RlIiksICgiV2luZG93UGFydENvZGUiLCAib3V0V2luZG93UGFydCIsICJPdXRNb2RlIildKSwKLQkJICAgICMgdGhlbiBtYXRjaCBDcmVhdGVOZXdXaW5kb3cgYW5kIENyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZQotCQkJKFsoIldpbmRvd1JlZiIsICJvdXRXaW5kb3ciLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJXaW5kb3dSZWYiLCAiKiIsICIqIildKSwKLQkJCQotCQkJKFsoIldpbmRvd1B0ciIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKLQkJCShbKCJXaW5kb3dSZWYiLCAiKiIsICJPdXRNb2RlIildLAkjIFNhbWUsIGJ1dCBvdGhlciBzdHlsZSBoZWFkZXJmaWxlcwotCQkJIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJXaW5kb3dQdHIiLCAiRnJvbnRXaW5kb3ciLCAiUmV0dXJuTW9kZSIpXSwKLQkJCSBbKCJFeGlzdGluZ1dpbmRvd1B0ciIsICIqIiwgIioiKV0pLAotCQkJKFsoIldpbmRvd1JlZiIsICJGcm9udFdpbmRvdyIsICJSZXR1cm5Nb2RlIildLAkjIERpdHRvCi0JCQkgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKLQkJCShbKCJXaW5kb3dQdHIiLCAiRnJvbnROb25GbG9hdGluZ1dpbmRvdyIsICJSZXR1cm5Nb2RlIildLAotCQkJIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCi0JCQkoWygiV2luZG93UmVmIiwgIkZyb250Tm9uRmxvYXRpbmdXaW5kb3ciLCAiUmV0dXJuTW9kZSIpXSwJIyBEaXR0bwotCQkJIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCi0JCQkgCi0JCQkoWygiUmVjdF9wdHIiLCAiKiIsICJSZXR1cm5Nb2RlIildLCAjIEdldFdpbmRvd1hYWFN0YXRlIGFjY2Vzc29ycwotCQkJIFsoInZvaWQiLCAiKiIsICJSZXR1cm5Nb2RlIildKSwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICdQcm9jUHRyJywKKyAgICAgICAgICAgICAgICAnRHJhZ0dyYXlSZ25VUFAnLAorICAgICAgICAgICAgICAgICdXaW5kb3dQYWludFVQUCcsCisgICAgICAgICAgICAgICAgJ0NvbGxlY3Rpb24nLCAgICAgICAgICAgIyBGb3Igbm93LCB0byBiZSBkb25lIGxhdGVyCisgICAgICAgICAgICAgICAgJ1dpbmRvd0RlZlNwZWMnLCAgICAgICAgIyBUb28gZGlmZmljdWx0IGZvciBub3cKKyAgICAgICAgICAgICAgICAnV2luZG93RGVmU3BlY19wdHInLAorICAgICAgICAgICAgICAgICdFdmVudFJlZicsICNUQkQKKyAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKworICAgICAgICAgICAgICAgICMgR2V0V1RpdGxlCisgICAgICAgICAgICAgICAgKFsoIlN0cjI1NSIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiKiIsICIqIiwgIk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiVmFyVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIndTdG9yYWdlIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIk51bGxTdG9yYWdlIiwgIioiLCAiSW5Nb2RlIildKSwKKworICAgICAgICAgICAgICAgICMgbWF0Y2ggRmluZFdpbmRvd09mQ2xhc3MKKyAgICAgICAgICAgICAgICAoWygiV2luZG93UmVmIiwgIm91dFdpbmRvdyIsICJPdXRNb2RlIiksICgiV2luZG93UGFydENvZGUiLCAib3V0V2luZG93UGFydCIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJFeGlzdGluZ1dpbmRvd1B0ciIsICIqIiwgIk91dE1vZGUiKSwgKCJXaW5kb3dQYXJ0Q29kZSIsICJvdXRXaW5kb3dQYXJ0IiwgIk91dE1vZGUiKV0pLAorICAgICAgICAgICAgIyB0aGVuIG1hdGNoIENyZWF0ZU5ld1dpbmRvdyBhbmQgQ3JlYXRlV2luZG93RnJvbVJlc291cmNlCisgICAgICAgICAgICAgICAgKFsoIldpbmRvd1JlZiIsICJvdXRXaW5kb3ciLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiV2luZG93UmVmIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygiV2luZG93UHRyIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICAoWygiV2luZG93UmVmIiwgIioiLCAiT3V0TW9kZSIpXSwgICAgICAgIyBTYW1lLCBidXQgb3RoZXIgc3R5bGUgaGVhZGVyZmlsZXMKKyAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJXaW5kb3dQdHIiLCAiRnJvbnRXaW5kb3ciLCAiUmV0dXJuTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICAoWygiV2luZG93UmVmIiwgIkZyb250V2luZG93IiwgIlJldHVybk1vZGUiKV0sICAjIERpdHRvCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgKFsoIldpbmRvd1B0ciIsICJGcm9udE5vbkZsb2F0aW5nV2luZG93IiwgIlJldHVybk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgKFsoIldpbmRvd1JlZiIsICJGcm9udE5vbkZsb2F0aW5nV2luZG93IiwgIlJldHVybk1vZGUiKV0sICAgICAgICMgRGl0dG8KKyAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJSZWN0X3B0ciIsICIqIiwgIlJldHVybk1vZGUiKV0sICMgR2V0V2luZG93WFhYU3RhdGUgYWNjZXNzb3JzCisgICAgICAgICAgICAgICAgIFsoInZvaWQiLCAiKiIsICJSZXR1cm5Nb2RlIildKSwKKyAgICAgICAgICAgICAgICBdCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCi0KKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3dpbi93aW5zdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvd2luL3dpbnN1cHBvcnQucHkKaW5kZXggNjQwZTMzYS4uMDhhMDM3OSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvd2luL3dpbnN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvd2luL3dpbnN1cHBvcnQucHkKQEAgLTYsMTcgKzYsMTcgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdXaW5kb3dzLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfV2luJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnV2luZG93JwkJCSMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitNQUNIRUFERVJGSUxFID0gJ1dpbmRvd3MuaCcgICAgICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnX1dpbicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdXaW5kb3cnICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdXaW4nCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwotT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyAnUHRyJwkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdXaW4nICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArICdQdHInICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCiBFRElURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2VkaXQucHknICMgVGhlIG1hbnVhbCBkZWZpbml0aW9ucwotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNzksNyArNzksNyBAQAogc3RhdGljIHZvaWQKIFB5TWFjX0F1dG9EaXNwb3NlV2luZG93KFdpbmRvd1B0ciB3KQogewotCURpc3Bvc2VXaW5kb3codyk7CisgICAgICAgIERpc3Bvc2VXaW5kb3codyk7CiB9CiAiIiIKIApAQCAtODksOTQgKzg5LDk0IEBACiBQeU9iamVjdCAqCiBXaW5PYmpfV2hpY2hXaW5kb3coV2luZG93UHRyIHcpCiB7Ci0JUHlPYmplY3QgKml0OwotCQotCWlmICh3ID09IE5VTEwpIHsKLQkJaXQgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoaXQpOwotCX0gZWxzZSB7Ci0JCWl0ID0gKFB5T2JqZWN0ICopIEdldFdSZWZDb24odyk7Ci0JCWlmIChpdCA9PSBOVUxMIHx8ICFJc1BvaW50ZXJWYWxpZCgoUHRyKWl0KSB8fCAoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IHcgfHwgIVdpbk9ial9DaGVjayhpdCkpIHsKLQkJCWl0ID0gV2luT2JqX05ldyh3KTsKLQkJCSgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9mcmVlaXQgPSBOVUxMOwotCQl9IGVsc2UgewotCQkJUHlfSU5DUkVGKGl0KTsKLQkJfQotCX0KLQlyZXR1cm4gaXQ7CisgICAgICAgIFB5T2JqZWN0ICppdDsKKworICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXQgPSAoUHlPYmplY3QgKikgR2V0V1JlZkNvbih3KTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCB8fCAhSXNQb2ludGVyVmFsaWQoKFB0cilpdCkgfHwgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSB3IHx8ICFXaW5PYmpfQ2hlY2soaXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCA9IFdpbk9ial9OZXcodyk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGl0OwogfQogIiIiCiAKIGluaXRzdHVmZiA9IGluaXRzdHVmZiArICIiIgotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFdpbmRvd1B0ciwgV2luT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoV2luZG93UHRyLCBXaW5PYmpfV2hpY2hXaW5kb3cpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChXaW5kb3dQdHIsIFdpbk9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoV2luZG93UHRyLCBXaW5PYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoV2luZG93UHRyLCBXaW5PYmpfV2hpY2hXaW5kb3cpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoV2luZG93UHRyLCBXaW5PYmpfQ29udmVydCk7CiAiIiIKIAogY2xhc3MgTXlPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCi0JCU91dHB1dCgiLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFdoaWNoV2luZG93IGNvZGUgaGVyZT8gKi8iKQotCWRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJ2b2lkICgqb2JfZnJlZWl0KSglcyBwdHIpOyIsIHNlbGYuaXRzZWxmdHlwZSkKLQlkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCUdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJpdC0+b2JfZnJlZWl0ID0gTlVMTDsiKQotCQlPdXRwdXQoImlmIChHZXRXUmVmQ29uKGl0c2VsZikgPT0gMCkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlNldFdSZWZDb24oaXRzZWxmLCAobG9uZylpdCk7IikKLQkJT3V0cHV0KCJpdC0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7IikKLQkJT3V0UmJyYWNlKCkKLQlkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgotCQlPdXQoIiIiCi0JCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkJaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChXaW5kb3dQdHIpUHlJbnRfQXNMb25nKHYpOyByZXR1cm4gMTsgfQotCQkiIiIpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiRGlhbG9nUmVmIGRsZzsiKQotCQlPdXRMYnJhY2UoImlmIChEbGdPYmpfQ29udmVydCh2LCAmZGxnKSAmJiBkbGcpIikKLQkJT3V0cHV0KCIqcF9pdHNlbGYgPSBHZXREaWFsb2dXaW5kb3coZGxnKTsiKQotCQlPdXRwdXQoInJldHVybiAxOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiUHlFcnJfQ2xlYXIoKTsiKQotCQlPdXRSYnJhY2UoKQotCWRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlNldFdSZWZDb24oc2VsZi0+b2JfaXRzZWxmLCAwKTsiKQotCQlPdXRwdXQoInNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgic2VsZi0+b2JfaXRzZWxmID0gTlVMTDsiKQotCQlPdXRwdXQoInNlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7IikKLQkJCi0JZGVmIG91dHB1dENvbXBhcmUoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIGludCAlc19jb21wYXJlKCVzICpzZWxmLCAlcyAqb3RoZXIpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOyIpCi0JCU91dHB1dCgiaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOyIpCi0JCU91dHB1dCgicmV0dXJuIDA7IikKLQkJT3V0UmJyYWNlKCkKLQkJCi0JZGVmIG91dHB1dEhhc2goc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIGludCAlc19oYXNoKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgicmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOyIpCi0JCU91dFJicmFjZSgpCi0JCQotCWRlZiBvdXRwdXRSZXByKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCi0JCU91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxXaW5kb3cgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQotCQlPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKLQkJT3V0UmJyYWNlKCkKLQkJCi0jIwlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotIyMJCU91dHB1dCgiRGlzcG9zZVdpbmRvdyglcyk7IiwgaXRzZWxmbmFtZSkKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisgICAgICAgIE91dHB1dCgiLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFdoaWNoV2luZG93IGNvZGUgaGVyZT8gKi8iKQorICAgIGRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICAgICAgT3V0cHV0KCJ2b2lkICgqb2JfZnJlZWl0KSglcyBwdHIpOyIsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICBkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfZnJlZWl0ID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoImlmIChHZXRXUmVmQ29uKGl0c2VsZikgPT0gMCkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlNldFdSZWZDb24oaXRzZWxmLCAobG9uZylpdCk7IikKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICBkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgorICAgICAgICBPdXQoIiIiCisgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChXaW5kb3dQdHIpUHlJbnRfQXNMb25nKHYpOyByZXR1cm4gMTsgfQorICAgICAgICAiIiIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiRGlhbG9nUmVmIGRsZzsiKQorICAgICAgICBPdXRMYnJhY2UoImlmIChEbGdPYmpfQ29udmVydCh2LCAmZGxnKSAmJiBkbGcpIikKKyAgICAgICAgT3V0cHV0KCIqcF9pdHNlbGYgPSBHZXREaWFsb2dXaW5kb3coZGxnKTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAxOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfQ2xlYXIoKTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgIGRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlNldFdSZWZDb24oc2VsZi0+b2JfaXRzZWxmLCAwKTsiKQorICAgICAgICBPdXRwdXQoInNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgic2VsZi0+b2JfaXRzZWxmID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoInNlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7IikKKworICAgIGRlZiBvdXRwdXRDb21wYXJlKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBpbnQgJXNfY29tcGFyZSglcyAqc2VsZiwgJXMgKm90aGVyKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsiKQorICAgICAgICBPdXRwdXQoImlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKKyAgICBkZWYgb3V0cHV0SGFzaChzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgaW50ICVzX2hhc2goJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKworICAgIGRlZiBvdXRwdXRSZXByKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCisgICAgICAgIE91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxXaW5kb3cgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQorICAgICAgICBPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKworIyMgICAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgorIyMgICAgICAgICAgICAgIE91dHB1dCgiRGlzcG9zZVdpbmRvdyglcyk7IiwgaXRzZWxmbmFtZSkKICMgRnJvbSBoZXJlIG9uIGl0J3MgYmFzaWNhbGx5IGFsbCBib2lsZXIgcGxhdGUuLi4KIAogIyBDcmVhdGUgdGhlIGdlbmVyYXRvciBncm91cHMgYW5kIGxpbmsgdGhlbQpAQCAtMTk5LDcgKzE5OSw3IEBACiBsb25nIHB0cjsKIAogaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmcHRyKSApCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogX3JlcyA9IFdpbk9ial9XaGljaFdpbmRvdygoV2luZG93UHRyKXB0cik7CiByZXR1cm4gX3JlczsKICIiIgpkaWZmIC0tZ2l0IGEvTWFjL09TWC9Eb2MvSGVscEluZGV4aW5nVG9vbC9TdGFuZGFyZF9TdWl0ZS5weSBiL01hYy9PU1gvRG9jL0hlbHBJbmRleGluZ1Rvb2wvU3RhbmRhcmRfU3VpdGUucHkKaW5kZXggZTk4NmQ3NS4uNGY2NjA0YyAxMDA2NDQKLS0tIGEvTWFjL09TWC9Eb2MvSGVscEluZGV4aW5nVG9vbC9TdGFuZGFyZF9TdWl0ZS5weQorKysgYi9NYWMvT1NYL0RvYy9IZWxwSW5kZXhpbmdUb29sL1N0YW5kYXJkX1N1aXRlLnB5CkBAIC0zMDQsOSArMzA0LDkgQEAKIGRvY3VtZW50Ll9wcml2ZWxlbWRpY3QgPSB7CiB9CiBfRW51bV9zYXZvID0gewotICAgICd5ZXMnIDogJ3llcyAnLAkjIFNhdmUgb2JqZWN0cyBub3cKLSAgICAnbm8nIDogJ25vICAnLAkjIERvIG5vdCBzYXZlIG9iamVjdHMKLSAgICAnYXNrJyA6ICdhc2sgJywJIyBBc2sgdGhlIHVzZXIgd2hldGhlciB0byBzYXZlCisgICAgJ3llcycgOiAneWVzICcsICAgICAjIFNhdmUgb2JqZWN0cyBub3cKKyAgICAnbm8nIDogJ25vICAnLCAgICAgICMgRG8gbm90IHNhdmUgb2JqZWN0cworICAgICdhc2snIDogJ2FzayAnLCAgICAgIyBBc2sgdGhlIHVzZXIgd2hldGhlciB0byBzYXZlCiB9CiAKIApkaWZmIC0tZ2l0IGEvTWFjL09TWC9Eb2MvSGVscEluZGV4aW5nVG9vbC9fX2luaXRfXy5weSBiL01hYy9PU1gvRG9jL0hlbHBJbmRleGluZ1Rvb2wvX19pbml0X18ucHkKaW5kZXggMjc0NTA4Ni4uNTM1OWRmNSAxMDA2NDQKLS0tIGEvTWFjL09TWC9Eb2MvSGVscEluZGV4aW5nVG9vbC9fX2luaXRfXy5weQorKysgYi9NYWMvT1NYL0RvYy9IZWxwSW5kZXhpbmdUb29sL19faW5pdF9fLnB5CkBAIC03Niw0ICs3NiwzIEBACiAgICAgX3NpZ25hdHVyZSA9ICdoaXRpJwogCiAgICAgX21vZHVsZU5hbWUgPSAnSGVscEluZGV4aW5nVG9vbCcKLQpkaWZmIC0tZ2l0IGEvTWFjL09TWC9Eb2Mvc2V0dXAucHkgYi9NYWMvT1NYL0RvYy9zZXR1cC5weQppbmRleCA1OGQ4ZGY2Li5hZTg2YjgwIDEwMDY0NAotLS0gYS9NYWMvT1NYL0RvYy9zZXR1cC5weQorKysgYi9NYWMvT1NYL0RvYy9zZXR1cC5weQpAQCAtMjksMTgwICsyOSwxODAgQEAKIGltcG9ydCB0aW1lCiAKIGNsYXNzIERvY0J1aWxkKGJ1aWxkKToKLQlkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgotCQlidWlsZC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKLQkJc2VsZi5idWlsZF9odG1sID0gTm9uZQotCQlzZWxmLmJ1aWxkX2Rlc3QgPSBOb25lCi0JCXNlbGYuZG93bmxvYWQgPSAwCi0JCXNlbGYuZG9jX3ZlcnNpb24gPSAnMi4zYjEnICMgT25seSBuZWVkZWQgaWYgZG93bmxvYWQgaXMgdHJ1ZQotCQkKLQlkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKLQkJYnVpbGQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQotCQlpZiBzZWxmLmJ1aWxkX2h0bWwgaXMgTm9uZToKLQkJCXNlbGYuYnVpbGRfaHRtbCA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Jhc2UsICdodG1sJykKLQkJaWYgc2VsZi5idWlsZF9kZXN0IGlzIE5vbmU6Ci0JCQlzZWxmLmJ1aWxkX2Rlc3QgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9iYXNlLCAnUHl0aG9uRG9jdW1lbnRhdGlvbicpCi0JCi0JZGVmIHNwYXduKHNlbGYsICphcmdzKToKLQkJc3Bhd24oYXJncywgMSwgIHNlbGYudmVyYm9zZSwgc2VsZi5kcnlfcnVuKQotCQotCWRlZiBkb3dubG9hZERvY3Moc2VsZik6Ci0JCXdvcmtkaXIgPSBvcy5nZXRjd2QoKQotCQl1cmwgPSAnaHR0cDovL3d3dy5weXRob24ub3JnL2Z0cC9weXRob24vZG9jLyVzL2h0bWwtJXMudGd6JyAlIFwKLQkJCShzZWxmLmRvY192ZXJzaW9uLHNlbGYuZG9jX3ZlcnNpb24pCi0JCW9zLmNoZGlyKHNlbGYuYnVpbGRfYmFzZSkKLQkJc2VsZi5zcGF3bignY3VybCcsJy1PJywgdXJsKQotCQlvcy5jaGRpcih3b3JrZGlyKQotCQl0YXJmaWxlID0gJ2h0bWwtJXMudGd6JyAlIHNlbGYuZG9jX3ZlcnNpb24KLSMjIFRoaXMgbm8gbG9uZ2VyIHdvcmtzIGR1ZSB0byBuYW1lIGNoYW5nZXMKLSMjCQlzZWxmLm1rcGF0aChzZWxmLmJ1aWxkX2h0bWwpCi0jIwkJb3MuY2hkaXIoc2VsZi5idWlsZF9odG1sKQotIyMJCXNlbGYuc3Bhd24oJ3RhcicsICcteHpmJywgJy4uLycgKyB0YXJmaWxlKQotIyMJCW9zLmNoZGlyKHdvcmtkaXIpCi0JCXByaW50ICIqKiBQbGVhc2UgdW5wYWNrICVzIiAlIG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Jhc2UsIHRhcmZpbGUpCi0JCXByaW50ICIqKiBVbnBhY2sgdGhlIGZpbGVzIGludG8gJXMiICUgc2VsZi5idWlsZF9odG1sCi0JCXJhaXNlIFJ1bnRpbWVFcnJvciwgIllvdSBuZWVkIHRvIHVucGFjayB0aGUgZG9jcyBtYW51YWxseSIKLQkJCi0JZGVmIGJ1aWxkRG9jc0Zyb21Tb3VyY2Uoc2VsZik6Ci0JCXNyY2RpciA9ICcuLi8uLi8uLicKLQkJZG9jZGlyID0gb3MucGF0aC5qb2luKHNyY2RpciwgJ0RvYycpCi0JCWh0bWxkaXIgPSBvcy5wYXRoLmpvaW4oZG9jZGlyLCAnaHRtbCcpCi0JCXNwYXduKCgnbWFrZScsJy0tZGlyZWN0b3J5JywgZG9jZGlyLCAnaHRtbCcpLCAxLCBzZWxmLnZlcmJvc2UsIHNlbGYuZHJ5X3J1bikKLQkJc2VsZi5ta3BhdGgoc2VsZi5idWlsZF9odG1sKQotCQljb3B5X3RyZWUoaHRtbGRpciwgc2VsZi5idWlsZF9odG1sKQotCQkKLQlkZWYgZW5zdXJlSHRtbChzZWxmKToKLQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuYnVpbGRfaHRtbCk6Ci0JCQlpZiBzZWxmLmRvd25sb2FkOgotCQkJCXNlbGYuZG93bmxvYWREb2NzKCkKLQkJCWVsc2U6Ci0JCQkJc2VsZi5idWlsZERvY3NGcm9tU291cmNlKCkKLQkJCQkKLQlkZWYgaGFja0luZGV4KHNlbGYpOgotCQlpbmRfaHRtbCA9ICdpbmRleC5odG1sJwotCQkjcHJpbnQgJ3NlbGYuYnVpbGRfZGVzdCA9Jywgc2VsZi5idWlsZF9kZXN0Ci0JCWhhY2tlZEluZGV4ID0gZmlsZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kZXN0LCBpbmRfaHRtbCksJ3cnKQotCQlvcmlnSW5kZXggPSBmaWxlKG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2h0bWwsaW5kX2h0bWwpKQotCQlyID0gcmUuY29tcGlsZSgnPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uKjwvc3R5bGU+JywgcmUuRE9UQUxMKQotCQloYWNrZWRJbmRleC53cml0ZShyLnN1YignPE1FVEEgTkFNRT0iQXBwbGVUaXRsZSIgQ09OVEVOVD0iUHl0aG9uIERvY3VtZW50YXRpb24iPicsb3JpZ0luZGV4LnJlYWQoKSkpCi0JCi0JZGVmIGhhY2tGaWxlKHNlbGYsZCxmKToKLQkJb3JpZ1BhdGggPSBvcy5wYXRoLmpvaW4oZCxmKQotCQlhc3NlcnQob3JpZ1BhdGhbOmxlbihzZWxmLmJ1aWxkX2h0bWwpXSA9PSBzZWxmLmJ1aWxkX2h0bWwpCi0JCW91dFBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kZXN0LCBkW2xlbihzZWxmLmJ1aWxkX2h0bWwpKzE6XSwgZikKLQkJKG5hbWUsIGV4dCkgPSBvcy5wYXRoLnNwbGl0ZXh0KGYpCi0JCWlmIG9zLnBhdGguaXNkaXIob3JpZ1BhdGgpOgotCQkJc2VsZi5ta3BhdGgob3V0UGF0aCkKLQkJZWxpZiBleHQgPT0gJy5odG1sJzoKLQkJCWlmIHNlbGYudmVyYm9zZTogcHJpbnQgJ2hhY2tpbmcgJXMgdG8gJXMnICUgKG9yaWdQYXRoLG91dFBhdGgpCi0JCQloYWNrZWRGaWxlID0gZmlsZShvdXRQYXRoLCAndycpCi0JCQlvcmlnRmlsZSA9IGZpbGUob3JpZ1BhdGgsJ3InKQotCQkJaGFja2VkRmlsZS53cml0ZShzZWxmLnIuc3ViKCc8ZGw+PGR0PjxkZD4nLCBvcmlnRmlsZS5yZWFkKCkpKQotCQllbHNlOgotCQkJY29weV9maWxlKG9yaWdQYXRoLCBvdXRQYXRoKQotCQkJCi0JZGVmIGhhY2tIdG1sKHNlbGYpOgotCQlzZWxmLnIgPSByZS5jb21waWxlKCc8ZGw+PGRkPicpCi0JCW9zLnBhdGgud2FsayhzZWxmLmJ1aWxkX2h0bWwsIHNlbGYudmlzaXQsIE5vbmUpCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgYnVpbGQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYuYnVpbGRfaHRtbCA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF9kZXN0ID0gTm9uZQorICAgICAgICBzZWxmLmRvd25sb2FkID0gMAorICAgICAgICBzZWxmLmRvY192ZXJzaW9uID0gJzIuM2IxJyAjIE9ubHkgbmVlZGVkIGlmIGRvd25sb2FkIGlzIHRydWUKIAotCWRlZiB2aXNpdChzZWxmLCBkdW1teSwgZGlybmFtZSwgZmlsZW5hbWVzKToKLQkJZm9yIGYgaW4gZmlsZW5hbWVzOgotCQkJc2VsZi5oYWNrRmlsZShkaXJuYW1lLCBmKQotCQkJCi0JZGVmIG1ha2VIZWxwSW5kZXgoc2VsZik6Ci0JCWFwcCA9ICcvRGV2ZWxvcGVyL0FwcGxpY2F0aW9ucy9BcHBsZSBIZWxwIEluZGV4aW5nIFRvb2wuYXBwJwotCQlzZWxmLnNwYXduKCdvcGVuJywgJy1hJywgYXBwICwgc2VsZi5idWlsZF9kZXN0KQotCQlwcmludCAiUGxlYXNlIHdhaXQgdW50aWwgQXBwbGUgSGVscCBJbmRleGluZyBUb29sIGZpbmlzaGVzIGJlZm9yZSBpbnN0YWxsaW5nIgotCQkKLQlkZWYgbWFrZUhlbHBJbmRleChzZWxmKToKLQkJYXBwID0gSGVscEluZGV4aW5nVG9vbC5IZWxwSW5kZXhpbmdUb29sKHN0YXJ0PTEpCi0JCWFwcC5vcGVuKENhcmJvbi5GaWxlLkZTU3BlYyhzZWxmLmJ1aWxkX2Rlc3QpKQotCQlzeXMuc3RkZXJyLndyaXRlKCJXYWl0aW5nIGZvciBIZWxwIEluZGV4aW5nIFRvb2wgdG8gc3RhcnQuLi4iKQotCQl3aGlsZSAxOgotCQkJIyBUaGlzIGlzIGJhZCBkZXNpZ24gaW4gdGhlIHN1aXRlIGdlbmVyYXRpb24gY29kZSEKLQkJCWlkbGUgPSBhcHAuX2dldChIZWxwSW5kZXhpbmdUb29sLkhlbHBfSW5kZXhpbmdfVG9vbF9TdWl0ZS5fUHJvcF9pZGxlU3RhdHVzKCkpCi0JCQl0aW1lLnNsZWVwKDEwKQotCQkJaWYgbm90IGlkbGU6IGJyZWFrCi0JCQlzeXMuc3RkZXJyLndyaXRlKCIuIikKLQkJc3lzLnN0ZGVyci53cml0ZSgiXG4iKQotCQlzeXMuc3RkZXJyLndyaXRlKCJXYWl0aW5nIGZvciBIZWxwIEluZGV4aW5nIFRvb2wgdG8gZmluaXNoLi4uIikKLQkJd2hpbGUgMToKLQkJCSMgVGhpcyBpcyBiYWQgZGVzaWduIGluIHRoZSBzdWl0ZSBnZW5lcmF0aW9uIGNvZGUhCi0JCQlpZGxlID0gYXBwLl9nZXQoSGVscEluZGV4aW5nVG9vbC5IZWxwX0luZGV4aW5nX1Rvb2xfU3VpdGUuX1Byb3BfaWRsZVN0YXR1cygpKQotCQkJdGltZS5zbGVlcCgxMCkKLQkJCWlmIGlkbGU6IGJyZWFrCi0JCQlzeXMuc3RkZXJyLndyaXRlKCIuIikKLQkJc3lzLnN0ZGVyci53cml0ZSgiXG4iKQotCQkJCi0JCQotCWRlZiBydW4oc2VsZik6Ci0JCXNlbGYuZW5zdXJlX2ZpbmFsaXplZCgpCi0JCXNlbGYubWtwYXRoKHNlbGYuYnVpbGRfYmFzZSkKLQkJc2VsZi5lbnN1cmVIdG1sKCkKLQkJaWYgbm90IG9zLnBhdGguaXNkaXIoc2VsZi5idWlsZF9odG1sKToKLQkJCXJhaXNlIFJ1bnRpbWVFcnJvciwgXAotICAJCQkiQ2FuJ3QgZmluZCBzb3VyY2UgZm9sZGVyIGZvciBkb2N1bWVudGF0aW9uLiIKLSAgCQlzZWxmLm1rcGF0aChzZWxmLmJ1aWxkX2Rlc3QpCi0JCWlmIGRlcF91dGlsLm5ld2VyKG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2h0bWwsJ2luZGV4Lmh0bWwnKSwgb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGVzdCwnaW5kZXguaHRtbCcpKToKLQkJCXNlbGYubWtwYXRoKHNlbGYuYnVpbGRfZGVzdCkKLQkJCXNlbGYuaGFja0h0bWwoKQotCQkJc2VsZi5oYWNrSW5kZXgoKQotCQkJc2VsZi5tYWtlSGVscEluZGV4KCkKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgYnVpbGQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBpZiBzZWxmLmJ1aWxkX2h0bWwgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfaHRtbCA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Jhc2UsICdodG1sJykKKyAgICAgICAgaWYgc2VsZi5idWlsZF9kZXN0IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX2Rlc3QgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9iYXNlLCAnUHl0aG9uRG9jdW1lbnRhdGlvbicpCisKKyAgICBkZWYgc3Bhd24oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzcGF3bihhcmdzLCAxLCAgc2VsZi52ZXJib3NlLCBzZWxmLmRyeV9ydW4pCisKKyAgICBkZWYgZG93bmxvYWREb2NzKHNlbGYpOgorICAgICAgICB3b3JrZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgdXJsID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy9mdHAvcHl0aG9uL2RvYy8lcy9odG1sLSVzLnRneicgJSBcCisgICAgICAgICAgICAgICAgKHNlbGYuZG9jX3ZlcnNpb24sc2VsZi5kb2NfdmVyc2lvbikKKyAgICAgICAgb3MuY2hkaXIoc2VsZi5idWlsZF9iYXNlKQorICAgICAgICBzZWxmLnNwYXduKCdjdXJsJywnLU8nLCB1cmwpCisgICAgICAgIG9zLmNoZGlyKHdvcmtkaXIpCisgICAgICAgIHRhcmZpbGUgPSAnaHRtbC0lcy50Z3onICUgc2VsZi5kb2NfdmVyc2lvbgorIyMgVGhpcyBubyBsb25nZXIgd29ya3MgZHVlIHRvIG5hbWUgY2hhbmdlcworIyMgICAgICAgICAgICAgIHNlbGYubWtwYXRoKHNlbGYuYnVpbGRfaHRtbCkKKyMjICAgICAgICAgICAgICBvcy5jaGRpcihzZWxmLmJ1aWxkX2h0bWwpCisjIyAgICAgICAgICAgICAgc2VsZi5zcGF3bigndGFyJywgJy14emYnLCAnLi4vJyArIHRhcmZpbGUpCisjIyAgICAgICAgICAgICAgb3MuY2hkaXIod29ya2RpcikKKyAgICAgICAgcHJpbnQgIioqIFBsZWFzZSB1bnBhY2sgJXMiICUgb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfYmFzZSwgdGFyZmlsZSkKKyAgICAgICAgcHJpbnQgIioqIFVucGFjayB0aGUgZmlsZXMgaW50byAlcyIgJSBzZWxmLmJ1aWxkX2h0bWwKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiWW91IG5lZWQgdG8gdW5wYWNrIHRoZSBkb2NzIG1hbnVhbGx5IgorCisgICAgZGVmIGJ1aWxkRG9jc0Zyb21Tb3VyY2Uoc2VsZik6CisgICAgICAgIHNyY2RpciA9ICcuLi8uLi8uLicKKyAgICAgICAgZG9jZGlyID0gb3MucGF0aC5qb2luKHNyY2RpciwgJ0RvYycpCisgICAgICAgIGh0bWxkaXIgPSBvcy5wYXRoLmpvaW4oZG9jZGlyLCAnaHRtbCcpCisgICAgICAgIHNwYXduKCgnbWFrZScsJy0tZGlyZWN0b3J5JywgZG9jZGlyLCAnaHRtbCcpLCAxLCBzZWxmLnZlcmJvc2UsIHNlbGYuZHJ5X3J1bikKKyAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5idWlsZF9odG1sKQorICAgICAgICBjb3B5X3RyZWUoaHRtbGRpciwgc2VsZi5idWlsZF9odG1sKQorCisgICAgZGVmIGVuc3VyZUh0bWwoc2VsZik6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmJ1aWxkX2h0bWwpOgorICAgICAgICAgICAgaWYgc2VsZi5kb3dubG9hZDoKKyAgICAgICAgICAgICAgICBzZWxmLmRvd25sb2FkRG9jcygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYnVpbGREb2NzRnJvbVNvdXJjZSgpCisKKyAgICBkZWYgaGFja0luZGV4KHNlbGYpOgorICAgICAgICBpbmRfaHRtbCA9ICdpbmRleC5odG1sJworICAgICAgICAjcHJpbnQgJ3NlbGYuYnVpbGRfZGVzdCA9Jywgc2VsZi5idWlsZF9kZXN0CisgICAgICAgIGhhY2tlZEluZGV4ID0gZmlsZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kZXN0LCBpbmRfaHRtbCksJ3cnKQorICAgICAgICBvcmlnSW5kZXggPSBmaWxlKG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2h0bWwsaW5kX2h0bWwpKQorICAgICAgICByID0gcmUuY29tcGlsZSgnPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uKjwvc3R5bGU+JywgcmUuRE9UQUxMKQorICAgICAgICBoYWNrZWRJbmRleC53cml0ZShyLnN1YignPE1FVEEgTkFNRT0iQXBwbGVUaXRsZSIgQ09OVEVOVD0iUHl0aG9uIERvY3VtZW50YXRpb24iPicsb3JpZ0luZGV4LnJlYWQoKSkpCisKKyAgICBkZWYgaGFja0ZpbGUoc2VsZixkLGYpOgorICAgICAgICBvcmlnUGF0aCA9IG9zLnBhdGguam9pbihkLGYpCisgICAgICAgIGFzc2VydChvcmlnUGF0aFs6bGVuKHNlbGYuYnVpbGRfaHRtbCldID09IHNlbGYuYnVpbGRfaHRtbCkKKyAgICAgICAgb3V0UGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Rlc3QsIGRbbGVuKHNlbGYuYnVpbGRfaHRtbCkrMTpdLCBmKQorICAgICAgICAobmFtZSwgZXh0KSA9IG9zLnBhdGguc3BsaXRleHQoZikKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihvcmlnUGF0aCk6CisgICAgICAgICAgICBzZWxmLm1rcGF0aChvdXRQYXRoKQorICAgICAgICBlbGlmIGV4dCA9PSAnLmh0bWwnOgorICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOiBwcmludCAnaGFja2luZyAlcyB0byAlcycgJSAob3JpZ1BhdGgsb3V0UGF0aCkKKyAgICAgICAgICAgIGhhY2tlZEZpbGUgPSBmaWxlKG91dFBhdGgsICd3JykKKyAgICAgICAgICAgIG9yaWdGaWxlID0gZmlsZShvcmlnUGF0aCwncicpCisgICAgICAgICAgICBoYWNrZWRGaWxlLndyaXRlKHNlbGYuci5zdWIoJzxkbD48ZHQ+PGRkPicsIG9yaWdGaWxlLnJlYWQoKSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb3B5X2ZpbGUob3JpZ1BhdGgsIG91dFBhdGgpCisKKyAgICBkZWYgaGFja0h0bWwoc2VsZik6CisgICAgICAgIHNlbGYuciA9IHJlLmNvbXBpbGUoJzxkbD48ZGQ+JykKKyAgICAgICAgb3MucGF0aC53YWxrKHNlbGYuYnVpbGRfaHRtbCwgc2VsZi52aXNpdCwgTm9uZSkKKworICAgIGRlZiB2aXNpdChzZWxmLCBkdW1teSwgZGlybmFtZSwgZmlsZW5hbWVzKToKKyAgICAgICAgZm9yIGYgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgc2VsZi5oYWNrRmlsZShkaXJuYW1lLCBmKQorCisgICAgZGVmIG1ha2VIZWxwSW5kZXgoc2VsZik6CisgICAgICAgIGFwcCA9ICcvRGV2ZWxvcGVyL0FwcGxpY2F0aW9ucy9BcHBsZSBIZWxwIEluZGV4aW5nIFRvb2wuYXBwJworICAgICAgICBzZWxmLnNwYXduKCdvcGVuJywgJy1hJywgYXBwICwgc2VsZi5idWlsZF9kZXN0KQorICAgICAgICBwcmludCAiUGxlYXNlIHdhaXQgdW50aWwgQXBwbGUgSGVscCBJbmRleGluZyBUb29sIGZpbmlzaGVzIGJlZm9yZSBpbnN0YWxsaW5nIgorCisgICAgZGVmIG1ha2VIZWxwSW5kZXgoc2VsZik6CisgICAgICAgIGFwcCA9IEhlbHBJbmRleGluZ1Rvb2wuSGVscEluZGV4aW5nVG9vbChzdGFydD0xKQorICAgICAgICBhcHAub3BlbihDYXJib24uRmlsZS5GU1NwZWMoc2VsZi5idWlsZF9kZXN0KSkKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FpdGluZyBmb3IgSGVscCBJbmRleGluZyBUb29sIHRvIHN0YXJ0Li4uIikKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICMgVGhpcyBpcyBiYWQgZGVzaWduIGluIHRoZSBzdWl0ZSBnZW5lcmF0aW9uIGNvZGUhCisgICAgICAgICAgICBpZGxlID0gYXBwLl9nZXQoSGVscEluZGV4aW5nVG9vbC5IZWxwX0luZGV4aW5nX1Rvb2xfU3VpdGUuX1Byb3BfaWRsZVN0YXR1cygpKQorICAgICAgICAgICAgdGltZS5zbGVlcCgxMCkKKyAgICAgICAgICAgIGlmIG5vdCBpZGxlOiBicmVhaworICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiLiIpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlxuIikKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FpdGluZyBmb3IgSGVscCBJbmRleGluZyBUb29sIHRvIGZpbmlzaC4uLiIpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjIFRoaXMgaXMgYmFkIGRlc2lnbiBpbiB0aGUgc3VpdGUgZ2VuZXJhdGlvbiBjb2RlIQorICAgICAgICAgICAgaWRsZSA9IGFwcC5fZ2V0KEhlbHBJbmRleGluZ1Rvb2wuSGVscF9JbmRleGluZ19Ub29sX1N1aXRlLl9Qcm9wX2lkbGVTdGF0dXMoKSkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMTApCisgICAgICAgICAgICBpZiBpZGxlOiBicmVhaworICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiLiIpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlxuIikKKworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5idWlsZF9iYXNlKQorICAgICAgICBzZWxmLmVuc3VyZUh0bWwoKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihzZWxmLmJ1aWxkX2h0bWwpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCisgICAgICAgICAgICAiQ2FuJ3QgZmluZCBzb3VyY2UgZm9sZGVyIGZvciBkb2N1bWVudGF0aW9uLiIKKyAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5idWlsZF9kZXN0KQorICAgICAgICBpZiBkZXBfdXRpbC5uZXdlcihvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9odG1sLCdpbmRleC5odG1sJyksIG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Rlc3QsJ2luZGV4Lmh0bWwnKSk6CisgICAgICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmJ1aWxkX2Rlc3QpCisgICAgICAgICAgICBzZWxmLmhhY2tIdG1sKCkKKyAgICAgICAgICAgIHNlbGYuaGFja0luZGV4KCkKKyAgICAgICAgICAgIHNlbGYubWFrZUhlbHBJbmRleCgpCiAKIGNsYXNzIEFIVkRvY0luc3RhbGwoQ29tbWFuZCk6Ci0JZGVzY3JpcHRpb24gPSAiaW5zdGFsbCBBcHBsZSBIZWxwIFZpZXdlciBodG1sIGZpbGVzIgotCXVzZXJfb3B0aW9ucyA9IFsoJ2luc3RhbGwtZG9jPScsICdkJywKLQkJJ2RpcmVjdG9yeSB0byBpbnN0YWxsIEhUTUwgdHJlZScpLAotCQkgKCdyb290PScsIE5vbmUsCi0JCSAiaW5zdGFsbCBldmVyeXRoaW5nIHJlbGF0aXZlIHRvIHRoaXMgYWx0ZXJuYXRlIHJvb3QgZGlyZWN0b3J5IiksCi0JCV0KLQkJCi0JZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKLQkJc2VsZi5idWlsZF9kZXN0ID0gTm9uZQotCQlzZWxmLmluc3RhbGxfZG9jID0gTm9uZQotCQlzZWxmLnByZWZpeCA9IE5vbmUKLQkJc2VsZi5yb290ID0gTm9uZQotCQkJCi0JZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6Ci0JCXNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsJywKLQkJCSgncHJlZml4JywgJ3ByZWZpeCcpLAotCQkJKCdyb290JywgJ3Jvb3QnKSkKLSMJCWltcG9ydCBwZGIgOyBwZGIuc2V0X3RyYWNlKCkKLQkJYnVpbGRfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKLQkJaWYgc2VsZi5idWlsZF9kZXN0ID09IE5vbmU6Ci0JCQlidWlsZF9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQotCQkJc2VsZi5idWlsZF9kZXN0ID0gYnVpbGRfY21kLmJ1aWxkX2Rlc3QKLQkJaWYgc2VsZi5pbnN0YWxsX2RvYyA9PSBOb25lOgotCQkJc2VsZi5pbnN0YWxsX2RvYyA9IG9zLnBhdGguam9pbihzZWxmLnByZWZpeCwgJ1Jlc291cmNlcy9QeXRob24uYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL1B5dGhvbkRvY3VtZW50YXRpb24nKQotCQlwcmludCAnSU5TVEFMTCcsIHNlbGYuYnVpbGRfZGVzdCwgJy0+Jywgc2VsZi5pbnN0YWxsX2RvYwotCQkKLQlkZWYgcnVuKHNlbGYpOgotCQlzZWxmLmZpbmFsaXplX29wdGlvbnMoKQotCQlzZWxmLmVuc3VyZV9maW5hbGl6ZWQoKQotCQlwcmludCAiUnVubmluZyBJbnN0YWxsZXIiCi0JCWluc3Rsb2MgPSBzZWxmLmluc3RhbGxfZG9jCi0JCWlmIHNlbGYucm9vdDoKLQkJCWluc3Rsb2MgPSBjaGFuZ2Vfcm9vdChzZWxmLnJvb3QsIGluc3Rsb2MpCi0JCXNlbGYubWtwYXRoKGluc3Rsb2MpCi0JCWNvcHlfdHJlZShzZWxmLmJ1aWxkX2Rlc3QsIGluc3Rsb2MpCi0JCXByaW50ICJJbnN0YWxsYXRpb24gY29tcGxldGUiCi0JCQorICAgIGRlc2NyaXB0aW9uID0gImluc3RhbGwgQXBwbGUgSGVscCBWaWV3ZXIgaHRtbCBmaWxlcyIKKyAgICB1c2VyX29wdGlvbnMgPSBbKCdpbnN0YWxsLWRvYz0nLCAnZCcsCisgICAgICAgICAgICAnZGlyZWN0b3J5IHRvIGluc3RhbGwgSFRNTCB0cmVlJyksCisgICAgICAgICAgICAgKCdyb290PScsIE5vbmUsCisgICAgICAgICAgICAgImluc3RhbGwgZXZlcnl0aGluZyByZWxhdGl2ZSB0byB0aGlzIGFsdGVybmF0ZSByb290IGRpcmVjdG9yeSIpLAorICAgICAgICAgICAgXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5idWlsZF9kZXN0ID0gTm9uZQorICAgICAgICBzZWxmLmluc3RhbGxfZG9jID0gTm9uZQorICAgICAgICBzZWxmLnByZWZpeCA9IE5vbmUKKyAgICAgICAgc2VsZi5yb290ID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsJywKKyAgICAgICAgICAgICAgICAoJ3ByZWZpeCcsICdwcmVmaXgnKSwKKyAgICAgICAgICAgICAgICAoJ3Jvb3QnLCAncm9vdCcpKQorIyAgICAgICAgICAgICAgIGltcG9ydCBwZGIgOyBwZGIuc2V0X3RyYWNlKCkKKyAgICAgICAgYnVpbGRfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKKyAgICAgICAgaWYgc2VsZi5idWlsZF9kZXN0ID09IE5vbmU6CisgICAgICAgICAgICBidWlsZF9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQorICAgICAgICAgICAgc2VsZi5idWlsZF9kZXN0ID0gYnVpbGRfY21kLmJ1aWxkX2Rlc3QKKyAgICAgICAgaWYgc2VsZi5pbnN0YWxsX2RvYyA9PSBOb25lOgorICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RvYyA9IG9zLnBhdGguam9pbihzZWxmLnByZWZpeCwgJ1Jlc291cmNlcy9QeXRob24uYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL1B5dGhvbkRvY3VtZW50YXRpb24nKQorICAgICAgICBwcmludCAnSU5TVEFMTCcsIHNlbGYuYnVpbGRfZGVzdCwgJy0+Jywgc2VsZi5pbnN0YWxsX2RvYworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgcHJpbnQgIlJ1bm5pbmcgSW5zdGFsbGVyIgorICAgICAgICBpbnN0bG9jID0gc2VsZi5pbnN0YWxsX2RvYworICAgICAgICBpZiBzZWxmLnJvb3Q6CisgICAgICAgICAgICBpbnN0bG9jID0gY2hhbmdlX3Jvb3Qoc2VsZi5yb290LCBpbnN0bG9jKQorICAgICAgICBzZWxmLm1rcGF0aChpbnN0bG9jKQorICAgICAgICBjb3B5X3RyZWUoc2VsZi5idWlsZF9kZXN0LCBpbnN0bG9jKQorICAgICAgICBwcmludCAiSW5zdGFsbGF0aW9uIGNvbXBsZXRlIgorCiBkZWYgbXVuZ2VWZXJzaW9uKGluZmlsZSwgb3V0ZmlsZSk6Ci0JaSA9IGZpbGUoaW5maWxlLCdyJykKLQlvID0gZmlsZShvdXRmaWxlLCd3JykKLQlvLndyaXRlKHJlLnN1YignXCRcKFZFUlNJT05cKScsc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdWRVJTSU9OJyksaS5yZWFkKCkpKQotCWkuY2xvc2UoKQotCW8uY2xvc2UoKQotCQkKKyAgICBpID0gZmlsZShpbmZpbGUsJ3InKQorICAgIG8gPSBmaWxlKG91dGZpbGUsJ3cnKQorICAgIG8ud3JpdGUocmUuc3ViKCdcJFwoVkVSU0lPTlwpJyxzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1ZFUlNJT04nKSxpLnJlYWQoKSkpCisgICAgaS5jbG9zZSgpCisgICAgby5jbG9zZSgpCisKIGRlZiBtYWluKCk6Ci0JIyB0dXJuIG9mZiB3YXJuaW5ncyB3aGVuIGRlcHJlY2F0ZWQgbW9kdWxlcyBhcmUgaW1wb3J0ZWQKLSMjCWltcG9ydCB3YXJuaW5ncwotIyMJd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nKQotCXNldHVwKG5hbWUgPSAnRG9jdW1lbnRhdGlvbicsCi0gIAkJdmVyc2lvbiA9ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKLSAgCQljbWRjbGFzcyA9IHsnaW5zdGFsbF9kYXRhJzpBSFZEb2NJbnN0YWxsLCAnYnVpbGQnOkRvY0J1aWxkfSwKLSAgCQlkYXRhX2ZpbGVzID0gWydkdW1teSddLAotIAkJKQorICAgICMgdHVybiBvZmYgd2FybmluZ3Mgd2hlbiBkZXByZWNhdGVkIG1vZHVsZXMgYXJlIGltcG9ydGVkCisjIyAgICAgIGltcG9ydCB3YXJuaW5ncworIyMgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIixjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcpCisgICAgc2V0dXAobmFtZSA9ICdEb2N1bWVudGF0aW9uJywKKyAgICAgICAgICAgIHZlcnNpb24gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCisgICAgICAgICAgICBjbWRjbGFzcyA9IHsnaW5zdGFsbF9kYXRhJzpBSFZEb2NJbnN0YWxsLCAnYnVpbGQnOkRvY0J1aWxkfSwKKyAgICAgICAgICAgIGRhdGFfZmlsZXMgPSBbJ2R1bW15J10sCisgICAgICAgICAgICApCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvT1NYL0V4dHJhcy5pbnN0YWxsLnB5IGIvTWFjL09TWC9FeHRyYXMuaW5zdGFsbC5weQppbmRleCAxOTM5OTA0Li4yNTIxZjA2IDEwMDY0NAotLS0gYS9NYWMvT1NYL0V4dHJhcy5pbnN0YWxsLnB5CisrKyBiL01hYy9PU1gvRXh0cmFzLmluc3RhbGwucHkKQEAgLTksNDUgKzksNDUgQEAKIGRlYnVnID0gMAogCiBkZWYgaXNjbGVhbihuYW1lKToKLQlpZiBuYW1lID09ICdDVlMnOiByZXR1cm4gMAotCWlmIG5hbWUgPT0gJy5jdnNpZ25vcmUnOiByZXR1cm4gMAotCWlmIG5hbWUgPT0gJy5EU19zdG9yZSc6IHJldHVybiAwCi0JaWYgbmFtZS5lbmRzd2l0aCgnficpOiByZXR1cm4gMAotCWlmIG5hbWUuZW5kc3dpdGgoJy5CQUsnKTogcmV0dXJuIDAKLQlpZiBuYW1lLmVuZHN3aXRoKCcucHljJyk6IHJldHVybiAwCi0JaWYgbmFtZS5lbmRzd2l0aCgnLnB5bycpOiByZXR1cm4gMAotCWlmIG5hbWUuZW5kc3dpdGgoJy5vcmlnJyk6IHJldHVybiAwCi0JcmV0dXJuIDEKLQkKKyAgICBpZiBuYW1lID09ICdDVlMnOiByZXR1cm4gMAorICAgIGlmIG5hbWUgPT0gJy5jdnNpZ25vcmUnOiByZXR1cm4gMAorICAgIGlmIG5hbWUgPT0gJy5EU19zdG9yZSc6IHJldHVybiAwCisgICAgaWYgbmFtZS5lbmRzd2l0aCgnficpOiByZXR1cm4gMAorICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5CQUsnKTogcmV0dXJuIDAKKyAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHljJyk6IHJldHVybiAwCisgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5bycpOiByZXR1cm4gMAorICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5vcmlnJyk6IHJldHVybiAwCisgICAgcmV0dXJuIDEKKwogZGVmIGNvcHljbGVhbmRpcihzcmMsIGRzdCk6Ci0JZm9yIGN1cnNyYywgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzcmMpOgotCQlhc3NlcnQgY3Vyc3JjLnN0YXJ0c3dpdGgoc3JjKQotCQljdXJkc3QgPSBkc3QgKyBjdXJzcmNbbGVuKHNyYyk6XQotCQlpZiB2ZXJib3NlOgotCQkJcHJpbnQgIm1rZGlyIiwgY3VyZHN0Ci0JCWlmIG5vdCBkZWJ1ZzoKLQkJCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhjdXJkc3QpOgotCQkJCW9zLm1ha2VkaXJzKGN1cmRzdCkKLQkJZm9yIGZuIGluIGZpbGVzOgotCQkJaWYgaXNjbGVhbihmbik6Ci0JCQkJaWYgdmVyYm9zZToKLQkJCQkJcHJpbnQgImNvcHkiLCBvcy5wYXRoLmpvaW4oY3Vyc3JjLCBmbiksIG9zLnBhdGguam9pbihjdXJkc3QsIGZuKQotCQkJCWlmIG5vdCBkZWJ1ZzoKLQkJCQkJc2h1dGlsLmNvcHkyKG9zLnBhdGguam9pbihjdXJzcmMsIGZuKSwgb3MucGF0aC5qb2luKGN1cmRzdCwgZm4pKQotCQkJZWxzZToKLQkJCQlpZiB2ZXJib3NlOgotCQkJCQlwcmludCAic2tpcGZpbGUiLCBvcy5wYXRoLmpvaW4oY3Vyc3JjLCBmbikKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKGRpcnMpLTEsIC0xLCAtMSk6Ci0JCQlpZiBub3QgaXNjbGVhbihkaXJzW2ldKToKLQkJCQlpZiB2ZXJib3NlOgotCQkJCQlwcmludCAic2tpcGRpciIsIG9zLnBhdGguam9pbihjdXJzcmMsIGRpcnNbaV0pCi0JCQkJZGVsIGRpcnNbaV0KLQkJCQkKKyAgICBmb3IgY3Vyc3JjLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNyYyk6CisgICAgICAgIGFzc2VydCBjdXJzcmMuc3RhcnRzd2l0aChzcmMpCisgICAgICAgIGN1cmRzdCA9IGRzdCArIGN1cnNyY1tsZW4oc3JjKTpdCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAibWtkaXIiLCBjdXJkc3QKKyAgICAgICAgaWYgbm90IGRlYnVnOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGN1cmRzdCk6CisgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoY3VyZHN0KQorICAgICAgICBmb3IgZm4gaW4gZmlsZXM6CisgICAgICAgICAgICBpZiBpc2NsZWFuKGZuKToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiY29weSIsIG9zLnBhdGguam9pbihjdXJzcmMsIGZuKSwgb3MucGF0aC5qb2luKGN1cmRzdCwgZm4pCisgICAgICAgICAgICAgICAgaWYgbm90IGRlYnVnOgorICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIob3MucGF0aC5qb2luKGN1cnNyYywgZm4pLCBvcy5wYXRoLmpvaW4oY3VyZHN0LCBmbikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJza2lwZmlsZSIsIG9zLnBhdGguam9pbihjdXJzcmMsIGZuKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZGlycyktMSwgLTEsIC0xKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2NsZWFuKGRpcnNbaV0pOgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJza2lwZGlyIiwgb3MucGF0aC5qb2luKGN1cnNyYywgZGlyc1tpXSkKKyAgICAgICAgICAgICAgICBkZWwgZGlyc1tpXQorCiBkZWYgbWFpbigpOgotCWlmIGxlbihzeXMuYXJndikgIT0gMzoKLQkJc3lzLnN0ZGVyci53cml0ZSgiVXNhZ2U6ICVzIHNyY2RpciBkc3RkaXJcbiIgJSBzeXMuYXJndlswXSkKLQkJc3lzLmV4aXQoMSkKLQljb3B5Y2xlYW5kaXIoc3lzLmFyZ3ZbMV0sIHN5cy5hcmd2WzJdKQotCQorICAgIGlmIGxlbihzeXMuYXJndikgIT0gMzoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVXNhZ2U6ICVzIHNyY2RpciBkc3RkaXJcbiIgJSBzeXMuYXJndlswXSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBjb3B5Y2xlYW5kaXIoc3lzLmFyZ3ZbMV0sIHN5cy5hcmd2WzJdKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9PU1gvZml4dmVyc2lvbnMucHkgYi9NYWMvT1NYL2ZpeHZlcnNpb25zLnB5CmluZGV4IGU3ODJlOGMuLjAyNzdjNzkgMTAwNjQ0Ci0tLSBhL01hYy9PU1gvZml4dmVyc2lvbnMucHkKKysrIGIvTWFjL09TWC9maXh2ZXJzaW9ucy5weQpAQCAtOCw2MyArOCw2MiBAQAogCiBTSE9SVFZFUlNJT04gPSAiJWQuJWQiICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pCiBpZiBzeXMudmVyc2lvbl9pbmZvWzJdOgotCVNIT1JUVkVSU0lPTiA9IFNIT1JUVkVSU0lPTiArICIuJWQiICUgc3lzLnZlcnNpb25faW5mb1syXQorICAgIFNIT1JUVkVSU0lPTiA9IFNIT1JUVkVSU0lPTiArICIuJWQiICUgc3lzLnZlcnNpb25faW5mb1syXQogaWYgc3lzLnZlcnNpb25faW5mb1szXSAhPSAnZmluYWwnOgotCVNIT1JUVkVSU0lPTiA9IFNIT1JUVkVSU0lPTiArICIlcyVkIiAlIChzeXMudmVyc2lvbl9pbmZvWzNdLCBzeXMudmVyc2lvbl9pbmZvWzRdKQorICAgIFNIT1JUVkVSU0lPTiA9IFNIT1JUVkVSU0lPTiArICIlcyVkIiAlIChzeXMudmVyc2lvbl9pbmZvWzNdLCBzeXMudmVyc2lvbl9pbmZvWzRdKQogCiBDT1BZUklHSFQgPSAiKGMpICVkIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiIgJSB0aW1lLmdtdGltZSgpWzBdCiAKIExPTkdWRVJTSU9OID0gU0hPUlRWRVJTSU9OICsgIiwgIiArIENPUFlSSUdIVAogCiBkZWYgZml4KGZpbGUpOgotCXBsaXN0ID0gcGxpc3RsaWIuUGxpc3QuZnJvbUZpbGUoZmlsZSkKLQljaGFuZ2VkID0gRmFsc2UKLQlpZiBwbGlzdC5oYXNfa2V5KCJDRkJ1bmRsZUdldEluZm9TdHJpbmciKSBhbmQgXAotCQkJcGxpc3RbIkNGQnVuZGxlR2V0SW5mb1N0cmluZyJdICE9IExPTkdWRVJTSU9OOgotCQlwbGlzdFsiQ0ZCdW5kbGVHZXRJbmZvU3RyaW5nIl0gPSBMT05HVkVSU0lPTgotCQljaGFuZ2VkID0gVHJ1ZQotCWlmIHBsaXN0Lmhhc19rZXkoIkNGQnVuZGxlTG9uZ1ZlcnNpb25TdHJpbmciKSBhbmQgXAotCQkJcGxpc3RbIkNGQnVuZGxlTG9uZ1ZlcnNpb25TdHJpbmciXSAhPSBMT05HVkVSU0lPTjoKLQkJcGxpc3RbIkNGQnVuZGxlTG9uZ1ZlcnNpb25TdHJpbmciXSA9IExPTkdWRVJTSU9OCi0JCWNoYW5nZWQgPSBUcnVlCi0JaWYgcGxpc3QuaGFzX2tleSgiTlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0IikgYW5kIFwKLQkJCXBsaXN0WyJOU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQiXSAhPSBDT1BZUklHSFQ6Ci0JCXBsaXN0WyJOU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQiXSA9IENPUFlSSUdIVAotCQljaGFuZ2VkID0gVHJ1ZQotCWlmIHBsaXN0Lmhhc19rZXkoIkNGQnVuZGxlVmVyc2lvbiIpIGFuZCBcCi0JCQlwbGlzdFsiQ0ZCdW5kbGVWZXJzaW9uIl0gIT0gU0hPUlRWRVJTSU9OOgotCQlwbGlzdFsiQ0ZCdW5kbGVWZXJzaW9uIl0gPSBTSE9SVFZFUlNJT04KLQkJY2hhbmdlZCA9IFRydWUKLQlpZiBwbGlzdC5oYXNfa2V5KCJDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyIpIGFuZCBcCi0JCQlwbGlzdFsiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciXSAhPSBTSE9SVFZFUlNJT046Ci0JCXBsaXN0WyJDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyJdID0gU0hPUlRWRVJTSU9OCi0JCWNoYW5nZWQgPSBUcnVlCi0JaWYgY2hhbmdlZDoKLQkJb3MucmVuYW1lKGZpbGUsIGZpbGUgKyAnficpCi0JCXBsaXN0LndyaXRlKGZpbGUpCi0JCQorICAgIHBsaXN0ID0gcGxpc3RsaWIuUGxpc3QuZnJvbUZpbGUoZmlsZSkKKyAgICBjaGFuZ2VkID0gRmFsc2UKKyAgICBpZiBwbGlzdC5oYXNfa2V5KCJDRkJ1bmRsZUdldEluZm9TdHJpbmciKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICBwbGlzdFsiQ0ZCdW5kbGVHZXRJbmZvU3RyaW5nIl0gIT0gTE9OR1ZFUlNJT046CisgICAgICAgIHBsaXN0WyJDRkJ1bmRsZUdldEluZm9TdHJpbmciXSA9IExPTkdWRVJTSU9OCisgICAgICAgIGNoYW5nZWQgPSBUcnVlCisgICAgaWYgcGxpc3QuaGFzX2tleSgiQ0ZCdW5kbGVMb25nVmVyc2lvblN0cmluZyIpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgIHBsaXN0WyJDRkJ1bmRsZUxvbmdWZXJzaW9uU3RyaW5nIl0gIT0gTE9OR1ZFUlNJT046CisgICAgICAgIHBsaXN0WyJDRkJ1bmRsZUxvbmdWZXJzaW9uU3RyaW5nIl0gPSBMT05HVkVSU0lPTgorICAgICAgICBjaGFuZ2VkID0gVHJ1ZQorICAgIGlmIHBsaXN0Lmhhc19rZXkoIk5TSHVtYW5SZWFkYWJsZUNvcHlyaWdodCIpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgIHBsaXN0WyJOU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQiXSAhPSBDT1BZUklHSFQ6CisgICAgICAgIHBsaXN0WyJOU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQiXSA9IENPUFlSSUdIVAorICAgICAgICBjaGFuZ2VkID0gVHJ1ZQorICAgIGlmIHBsaXN0Lmhhc19rZXkoIkNGQnVuZGxlVmVyc2lvbiIpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgIHBsaXN0WyJDRkJ1bmRsZVZlcnNpb24iXSAhPSBTSE9SVFZFUlNJT046CisgICAgICAgIHBsaXN0WyJDRkJ1bmRsZVZlcnNpb24iXSA9IFNIT1JUVkVSU0lPTgorICAgICAgICBjaGFuZ2VkID0gVHJ1ZQorICAgIGlmIHBsaXN0Lmhhc19rZXkoIkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIikgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgcGxpc3RbIkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIl0gIT0gU0hPUlRWRVJTSU9OOgorICAgICAgICBwbGlzdFsiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciXSA9IFNIT1JUVkVSU0lPTgorICAgICAgICBjaGFuZ2VkID0gVHJ1ZQorICAgIGlmIGNoYW5nZWQ6CisgICAgICAgIG9zLnJlbmFtZShmaWxlLCBmaWxlICsgJ34nKQorICAgICAgICBwbGlzdC53cml0ZShmaWxlKQorCiBkZWYgbWFpbigpOgotCWlmIGxlbihzeXMuYXJndikgPCAyOgotCQlwcmludCAiVXNhZ2U6ICVzIHBsaXN0ZmlsZSAuLi4iICUgc3lzLmFyZ3ZbMF0KLQkJcHJpbnQgIm9yOiAlcyAtYSAgICAgIGZpeCBzdGFuZGFyZCBQeXRob24gcGxpc3QgZmlsZXMiCi0JCXN5cy5leGl0KDEpCi0JaWYgc3lzLmFyZ3ZbMV0gPT0gIi1hIjoKLQkJZmlsZXMgPSBbCi0JCQkiLi4vT1NYUmVzb3VyY2VzL2FwcC9JbmZvLnBsaXN0IiwKLQkJCSIuLi9PU1hSZXNvdXJjZXMvZnJhbWV3b3JrL3ZlcnNpb24ucGxpc3QiLAotCQkJIi4uL1Rvb2xzL0lERS9QYWNrYWdlTWFuYWdlci5wbGlzdCIsCi0JCQkiLi4vVG9vbHMvSURFL1B5dGhvbklERS5wbGlzdCIsCi0JCQkiLi4vc2NyaXB0cy9CdWlsZEFwcGxldC5wbGlzdCIKLQkJXQotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZXNbMF0pOgotCQkJcHJpbnQgIiVzIC1hIG11c3QgYmUgcnVuIGZyb20gTWFjL09TWCBkaXJlY3RvcnkiCi0JCQlzeXMuZXhpdCgxKQotCWVsc2U6Ci0JCWZpbGVzID0gc3lzLmFyZ3ZbMTpdCi0JZm9yIGZpbGUgaW4gZmlsZXM6Ci0JCWZpeChmaWxlKQotCXN5cy5leGl0KDApCi0JCisgICAgaWYgbGVuKHN5cy5hcmd2KSA8IDI6CisgICAgICAgIHByaW50ICJVc2FnZTogJXMgcGxpc3RmaWxlIC4uLiIgJSBzeXMuYXJndlswXQorICAgICAgICBwcmludCAib3I6ICVzIC1hICAgICAgZml4IHN0YW5kYXJkIFB5dGhvbiBwbGlzdCBmaWxlcyIKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBpZiBzeXMuYXJndlsxXSA9PSAiLWEiOgorICAgICAgICBmaWxlcyA9IFsKKyAgICAgICAgICAgICAgICAiLi4vT1NYUmVzb3VyY2VzL2FwcC9JbmZvLnBsaXN0IiwKKyAgICAgICAgICAgICAgICAiLi4vT1NYUmVzb3VyY2VzL2ZyYW1ld29yay92ZXJzaW9uLnBsaXN0IiwKKyAgICAgICAgICAgICAgICAiLi4vVG9vbHMvSURFL1BhY2thZ2VNYW5hZ2VyLnBsaXN0IiwKKyAgICAgICAgICAgICAgICAiLi4vVG9vbHMvSURFL1B5dGhvbklERS5wbGlzdCIsCisgICAgICAgICAgICAgICAgIi4uL3NjcmlwdHMvQnVpbGRBcHBsZXQucGxpc3QiCisgICAgICAgIF0KKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVzWzBdKToKKyAgICAgICAgICAgIHByaW50ICIlcyAtYSBtdXN0IGJlIHJ1biBmcm9tIE1hYy9PU1ggZGlyZWN0b3J5IgorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBlbHNlOgorICAgICAgICBmaWxlcyA9IHN5cy5hcmd2WzE6XQorICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgICBmaXgoZmlsZSkKKyAgICBzeXMuZXhpdCgwKQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvQnVpbGRJREUucHkgYi9NYWMvVG9vbHMvSURFL0J1aWxkSURFLnB5CmluZGV4IDdlNjU4NjkuLjkxNDAyOGMgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvQnVpbGRJREUucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9CdWlsZElERS5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIkJ1aWxkIGEgImJpZyIgYXBwbGV0IGZvciB0aGUgSURFLCBhbmQgcHV0IGl0IGluIHRoZSBQeXRob24gaG9tZSAKKyIiIkJ1aWxkIGEgImJpZyIgYXBwbGV0IGZvciB0aGUgSURFLCBhbmQgcHV0IGl0IGluIHRoZSBQeXRob24gaG9tZQogZGlyZWN0b3J5LiBJdCB3aWxsIGNvbnRhaW4gYWxsIElERS1zcGVjaWZpYyBtb2R1bGVzIGFzIFBZQyByZXNvdXJjZXMsCiB3aGljaCByZWR1Y2VzIHRoZSBzdGFydHVwIHRpbWUgKGVzcGVjaWFsbHkgb24gc2xvd2VyIG1hY2hpbmVzKS4iIiIKIApAQCAtMjUsMTcgKzI1LDE2IEBACiBmaWxlcyA9IG9zLmxpc3RkaXIoaWRlX2hvbWUpCiAKICMgc2tpcCB0aGlzIHNjcmlwdCBhbmQgdGhlIG1haW4gcHJvZ3JhbQotZmlsZXMgPSBmaWx0ZXIobGFtYmRhIHg6IHhbLTM6XSA9PSAnLnB5JyBhbmQgCi0JCXggbm90IGluICgiQnVpbGRJREUucHkiLCAiUHl0aG9uSURFLnB5IiksIGZpbGVzKQorZmlsZXMgPSBmaWx0ZXIobGFtYmRhIHg6IHhbLTM6XSA9PSAnLnB5JyBhbmQKKyAgICAgICAgICAgICAgICB4IG5vdCBpbiAoIkJ1aWxkSURFLnB5IiwgIlB5dGhvbklERS5weSIpLCBmaWxlcykKIAogIyBhZGQgdGhlIG1vZHVsZXMgYXMgUFlDIHJlc291cmNlcwogZm9yIG5hbWUgaW4gZmlsZXM6Ci0JcHJpbnQgImFkZGluZyIsIG5hbWUKLQlmdWxscGF0aCA9IG9zLnBhdGguam9pbihpZGVfaG9tZSwgbmFtZSkKLQlpZCwgbmFtZSA9IHB5X3Jlc291cmNlLmZyb21weWZpbGUoZnVsbHBhdGgsIG5hbWVbOi0zXSwgcHJlbG9hZD0xLAotCQlpc3BhY2thZ2U9MCkKKyAgICBwcmludCAiYWRkaW5nIiwgbmFtZQorICAgIGZ1bGxwYXRoID0gb3MucGF0aC5qb2luKGlkZV9ob21lLCBuYW1lKQorICAgIGlkLCBuYW1lID0gcHlfcmVzb3VyY2UuZnJvbXB5ZmlsZShmdWxscGF0aCwgbmFtZVs6LTNdLCBwcmVsb2FkPTEsCisgICAgICAgICAgICBpc3BhY2thZ2U9MCkKIAogIyBhZGQgVyByZXNvdXJjZXMKIHdyZXNyZWYgPSBSZXMuRlNwT3BlblJlc0ZpbGUob3MucGF0aC5qb2luKGlkZV9ob21lLCAiV2lkZ2V0cy5yc3JjIiksIDEpCiBidWlsZHRvb2xzLmNvcHlyZXMod3Jlc3JlZiwgdGFyZ2V0cmVmLCBbXSwgMCkKLQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9Gb250U2V0dGluZ3MucHkgYi9NYWMvVG9vbHMvSURFL0ZvbnRTZXR0aW5ncy5weQppbmRleCBhZjJiZDgwLi5kNzEzNDM4IDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL0ZvbnRTZXR0aW5ncy5weQorKysgYi9NYWMvVG9vbHMvSURFL0ZvbnRTZXR0aW5ncy5weQpAQCAtMSw5ICsxLDkgQEAKLSIiInVzYWdlOiAKLW5ld3NldHRpbmdzID0gRm9udERpYWxvZygoJ0NoaWNhZ28nLCAwLCAxMiwgKDAsIDAsIDApKSkJIyBmb250IG5hbWUgb3IgaWQsIHN0eWxlIGZsYWdzLCBzaXplLCBjb2xvciAoY29sb3IgaXMgaWdub3JlZCkKKyIiInVzYWdlOgorbmV3c2V0dGluZ3MgPSBGb250RGlhbG9nKCgnQ2hpY2FnbycsIDAsIDEyLCAoMCwgMCwgMCkpKSAjIGZvbnQgbmFtZSBvciBpZCwgc3R5bGUgZmxhZ3MsIHNpemUsIGNvbG9yIChjb2xvciBpcyBpZ25vcmVkKQogaWYgbmV3c2V0dGluZ3M6Ci0JZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IG5ld3NldHRpbmdzCi0JZm9udCwgc3R5bGUsIHNpemUsIGNvbG9yID0gZm9udHNldHRpbmdzCSMgJ2ZvbnQnIGlzIGFsd2F5cyB0aGUgZm9udCBuYW1lLCBub3QgdGhlIGlkIG51bWJlcgotCSMgZG8gc29tZXRoaW5nCisgICAgICAgIGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MgPSBuZXdzZXR0aW5ncworICAgICAgICBmb250LCBzdHlsZSwgc2l6ZSwgY29sb3IgPSBmb250c2V0dGluZ3MgIyAnZm9udCcgaXMgYWx3YXlzIHRoZSBmb250IG5hbWUsIG5vdCB0aGUgaWQgbnVtYmVyCisgICAgICAgICMgZG8gc29tZXRoaW5nCiAiIiIKIAogaW1wb3J0IFcKQEAgLTE1LDIwOSArMTUsMjA5IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgTWFjT1MKIGlmIGhhc2F0dHIoTWFjT1MsICJTeXNCZWVwIik6Ci0JU3lzQmVlcCA9IE1hY09TLlN5c0JlZXAKKyAgICBTeXNCZWVwID0gTWFjT1MuU3lzQmVlcAogZWxzZToKLQlkZWYgU3lzQmVlcCgqYXJncyk6Ci0JCXBhc3MKKyAgICBkZWYgU3lzQmVlcCgqYXJncyk6CisgICAgICAgIHBhc3MKIAogX3N0eWxlbmFtZXMgPSBbIlBsYWluIiwgIkJvbGQiLCAiSXRhbGljIiwgIlVuZGVybGluZSIsICJPdXRsaW5lIiwgIlNoYWRvdyIsICJDb25kZW5zZWQiLCAiRXh0ZW5kZWQiXQogCiAKIGNsYXNzIF9Gb250RGlhbG9nOgotCQotCSNkZWYgX19kZWxfXyhzZWxmKToKLQkjCXByaW50ICJkb2VpISIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyk6Ci0JCWxlZnRtYXJnaW4gPSA2MAotCQlsZWZ0bWFyZ2luMiA9IGxlZnRtYXJnaW4gLSAxNgotCQlzZWxmLncgPSBXLk1vZGFsRGlhbG9nKCg0NDAsIDE4MCksICdGb250IHNldHRpbmdzJykKLQkJc2VsZi53LmZvbnR0aXRsZSA9IFcuVGV4dEJveCgoMTAsIDEyLCBsZWZ0bWFyZ2luMiwgMTQpLCAiRm9udDoiLCBUZXh0RWRpdC50ZUp1c3RSaWdodCkKLQkJc2VsZi53LnBvcCA9IFcuRm9udE1lbnUoKGxlZnRtYXJnaW4sIDEwLCAxNiwgMTYpLCBzZWxmLnNldGZvbnQpCi0JCXNlbGYudy5mb250bmFtZSA9IFcuVGV4dEJveCgobGVmdG1hcmdpbiArIDIwLCAxMiwgMTUwLCAxNCkpCi0JCXNlbGYudy5zaXpldGl0bGUgPSBXLlRleHRCb3goKDEwLCAzOCwgbGVmdG1hcmdpbjIsIDE0KSwgIlNpemU6IiwgVGV4dEVkaXQudGVKdXN0UmlnaHQpCi0JCXNlbGYudy5zaXplZWRpdCA9IFcuRWRpdFRleHQoKGxlZnRtYXJnaW4sIDM1LCA0MCwgMjApLCAiIiwgc2VsZi5jaGVja3NpemUpCi0JCXN0eWxldG9wID0gNjQKLQkJc2VsZi53LnN0eWxldGl0bGUgPSBXLlRleHRCb3goKDEwLCBzdHlsZXRvcCArIDIsIGxlZnRtYXJnaW4yLCAxNCksICJTdHlsZToiLCBUZXh0RWRpdC50ZUp1c3RSaWdodCkKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKF9zdHlsZW5hbWVzKSk6Ci0JCQl0b3AgPSBzdHlsZXRvcCArIChpICUgNCkgKiAyMAotCQkJbGVmdCA9IGxlZnRtYXJnaW4gKyA4MCAqIChpID4gMykgLSAyCi0JCQlpZiBpOgotCQkJCXNlbGYud1tpXSA9IFcuQ2hlY2tCb3goKGxlZnQsIHRvcCwgNzYsIDE2KSwgX3N0eWxlbmFtZXNbaV0sIHNlbGYuZG9zdHlsZSkKLQkJCWVsc2U6Ci0JCQkJc2VsZi53W2ldID0gVy5DaGVja0JveCgobGVmdCwgdG9wLCA3MCwgMTYpLCBfc3R5bGVuYW1lc1tpXSwgc2VsZi5kb3BsYWluKQotCQkKLQkJaWYgdGFic2V0dGluZ3M6Ci0JCQlzZWxmLmxhc3R0YWIsIHNlbGYudGFibW9kZSA9IHRhYnNldHRpbmdzCi0JCQlzZWxmLncudGFic2l6ZXRpdGxlID0gVy5UZXh0Qm94KCgxMCwgLTI2LCBsZWZ0bWFyZ2luMiwgMTQpLCAiVGFic2l6ZToiLCBUZXh0RWRpdC50ZUp1c3RSaWdodCkKLQkJCXNlbGYudy50YWJzaXplZWRpdCA9IFcuRWRpdFRleHQoKGxlZnRtYXJnaW4sIC0yOSwgNDAsIDIwKSwgIiIsIHNlbGYuY2hlY2t0YWIpCi0JCQlzZWxmLncudGFic2l6ZWVkaXQuc2V0KHJlcHIoc2VsZi5sYXN0dGFiKSkKLQkJCXJhZGlvYnV0dG9ucyA9IFtdCi0JCQlzZWxmLncudGFic2l6ZWNoYXJzID0gVy5SYWRpb0J1dHRvbigobGVmdG1hcmdpbiArIDQ4LCAtMjYsIDU1LCAxNCksICJTcGFjZXMiLCAKLQkJCQkJcmFkaW9idXR0b25zLCBzZWxmLnRvZ2dsZXRhYm1vZGUpCi0JCQlzZWxmLncudGFic2l6ZXBpeGVscyA9IFcuUmFkaW9CdXR0b24oKGxlZnRtYXJnaW4gKyAxMTAsIC0yNiwgNTUsIDE0KSwgIlBpeGVscyIsIAotCQkJCQlyYWRpb2J1dHRvbnMsIHNlbGYudG9nZ2xldGFibW9kZSkKLQkJCWlmIHNlbGYudGFibW9kZToKLQkJCQlzZWxmLncudGFic2l6ZWNoYXJzLnNldCgxKQotCQkJZWxzZToKLQkJCQlzZWxmLncudGFic2l6ZXBpeGVscy5zZXQoMSkKLQkJZWxzZToKLQkJCXNlbGYudGFibW9kZSA9IE5vbmUKLQkJCi0JCXNlbGYudy5jYW5jZWxidXR0b24gPSBXLkJ1dHRvbigoLTE4MCwgLTI2LCA4MCwgMTYpLCAiQ2FuY2VsIiwgc2VsZi5jYW5jZWwpCi0JCXNlbGYudy5kb25lYnV0dG9uID0gVy5CdXR0b24oKC05MCwgLTI2LCA4MCwgMTYpLCAiRG9uZSIsIHNlbGYuZG9uZSkKLQkJCi0JCXNhbXBsZXRleHQgPSAiU2FtcGxlIHRleHQuIgotCQlzZWxmLncuc2FtcGxlID0gVy5FZGl0VGV4dCgoMjMwLCAxMCwgLTEwLCAxMzApLCBzYW1wbGV0ZXh0LCAKLQkJCQlmb250c2V0dGluZ3MgPSBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gdGFic2V0dGluZ3MpCi0JCQotCQlzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLncuZG9uZWJ1dHRvbikKLQkJc2VsZi53LmJpbmQoJ2NtZC4nLCBzZWxmLncuY2FuY2VsYnV0dG9uLnB1c2gpCi0JCXNlbGYudy5iaW5kKCdjbWR3Jywgc2VsZi53LmRvbmVidXR0b24ucHVzaCkKLQkJc2VsZi5sYXN0c2l6ZSA9IGZvbnRzZXR0aW5nc1syXQotCQlzZWxmLl9ydiA9IE5vbmUKLQkJc2VsZi5zZXQoZm9udHNldHRpbmdzKQotCQlzZWxmLncub3BlbigpCi0JCi0JZGVmIHRvZ2dsZXRhYm1vZGUoc2VsZiwgb25vZmYpOgotCQlpZiBzZWxmLncudGFic2l6ZWNoYXJzLmdldCgpOgotCQkJdGFibW9kZSA9IDEKLQkJZWxzZToKLQkJCXRhYm1vZGUgPSAwCi0JCWlmIHNlbGYudGFibW9kZSA8PiB0YWJtb2RlOgotCQkJcG9ydCA9IHNlbGYudy53aWQuR2V0V2luZG93UG9ydCgpCi0JCQkoZm9udCwgc3R5bGUsIHNpemUsIGNvbG9yKSwgKHRhYnNpemUsIGR1bW15KSA9IHNlbGYuZ2V0KCkKLQkJCXNhdmVzZXR0aW5ncyA9IFcuR2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0KQotCQkJVy5TZXRQb3J0Rm9udFNldHRpbmdzKHBvcnQsIChmb250LCBzdHlsZSwgc2l6ZSkpCi0JCQlzcGFjZXdpZHRoID0gUWQuU3RyaW5nV2lkdGgoJyAnKQotCQkJVy5TZXRQb3J0Rm9udFNldHRpbmdzKHBvcnQsIHNhdmVzZXR0aW5ncykKLQkJCWlmIHRhYm1vZGU6Ci0JCQkJIyBjb252ZXJ0IHBpeGVscyB0byBzcGFjZXMKLQkJCQlzZWxmLmxhc3R0YWIgPSBpbnQocm91bmQoZmxvYXQodGFic2l6ZSkgLyBzcGFjZXdpZHRoKSkKLQkJCWVsc2U6Ci0JCQkJIyBjb252ZXJ0IHNwYWNlcyB0byBwaXhlbHMKLQkJCQlzZWxmLmxhc3R0YWIgPSBzcGFjZXdpZHRoICogdGFic2l6ZQotCQkJc2VsZi53LnRhYnNpemVlZGl0LnNldChyZXByKHNlbGYubGFzdHRhYikpCi0JCQlzZWxmLnRhYm1vZGUgPSB0YWJtb2RlCi0JCQlzZWxmLmRvaXQoKQotCQotCWRlZiBzZXQoc2VsZiwgZm9udHNldHRpbmdzKToKLQkJZm9udCwgc3R5bGUsIHNpemUsIGNvbG9yID0gZm9udHNldHRpbmdzCi0JCWlmIHR5cGUoZm9udCkgPD4gdHlwZXMuU3RyaW5nVHlwZToKLQkJCWZyb20gQ2FyYm9uIGltcG9ydCBSZXMKLQkJCXJlcyA9IFJlcy5HZXRSZXNvdXJjZSgnRk9ORCcsIGZvbnQpCi0JCQlmb250ID0gcmVzLkdldFJlc0luZm8oKVsyXQotCQlzZWxmLncuZm9udG5hbWUuc2V0KGZvbnQpCi0JCXNlbGYudy5zaXplZWRpdC5zZXQoc3RyKHNpemUpKQotCQlpZiBzdHlsZToKLQkJCWZvciBpIGluIHJhbmdlKDEsIGxlbihfc3R5bGVuYW1lcykpOgotCQkJCXNlbGYud1tpXS5zZXQoc3R5bGUgJiAweDAxKQotCQkJCXN0eWxlID0gc3R5bGUgPj4gMQotCQllbHNlOgotCQkJc2VsZi53WzBdLnNldCgxKQotCQotCWRlZiBnZXQoc2VsZik6Ci0JCWZvbnQgPSBzZWxmLncuZm9udG5hbWUuZ2V0KCkKLQkJc3R5bGUgPSAwCi0JCWlmIG5vdCBzZWxmLndbMF0uZ2V0KCk6Ci0JCQlmbGFnID0gMHgwMQotCQkJZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKF9zdHlsZW5hbWVzKSk6Ci0JCQkJaWYgc2VsZi53W2ldLmdldCgpOgotCQkJCQlzdHlsZSA9IHN0eWxlIHwgZmxhZwotCQkJCWZsYWcgPSBmbGFnIDw8IDEKLQkJc2l6ZSA9IHNlbGYubGFzdHNpemUKLQkJaWYgc2VsZi50YWJtb2RlIGlzIE5vbmU6Ci0JCQlyZXR1cm4gKGZvbnQsIHN0eWxlLCBzaXplLCAoMCwgMCwgMCkpLCAoMzIsIDApCi0JCWVsc2U6Ci0JCQlyZXR1cm4gKGZvbnQsIHN0eWxlLCBzaXplLCAoMCwgMCwgMCkpLCAoc2VsZi5sYXN0dGFiLCBzZWxmLnRhYm1vZGUpCi0JCi0JZGVmIGRvaXQoc2VsZik6Ci0JCWlmIHNlbGYud1swXS5nZXQoKToKLQkJCXN0eWxlID0gMAotCQllbHNlOgotCQkJc3R5bGUgPSAwCi0JCQlmb3IgaSBpbiByYW5nZSgxLCBsZW4oX3N0eWxlbmFtZXMpKToKLQkJCQlpZiBzZWxmLndbaV0uZ2V0KCk6Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCAyICoqIChpIC0gMSkKLQkJI3NlbGYudy5zYW1wbGUuc2V0KHJlcHIoc3R5bGUpKQotCQlmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gc2VsZi5nZXQoKQotCQlzZWxmLncuc2FtcGxlLnNldGZvbnRzZXR0aW5ncyhmb250c2V0dGluZ3MpCi0JCXNlbGYudy5zYW1wbGUuc2V0dGFic2V0dGluZ3ModGFic2V0dGluZ3MpCi0JCi0JZGVmIGNoZWNrdGFiKHNlbGYpOgotCQl0YWJzaXplID0gc2VsZi53LnRhYnNpemVlZGl0LmdldCgpCi0JCWlmIG5vdCB0YWJzaXplOgotCQkJcmV0dXJuCi0JCXRyeToKLQkJCXRhYnNpemUgPSBzdHJpbmcuYXRvaSh0YWJzaXplKQotCQlleGNlcHQgKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IpOgotCQkJZ29vZCA9IDAKLQkJCXN5cy5leGNfdHJhY2ViYWNrID0gTm9uZQotCQllbHNlOgotCQkJZ29vZCA9IDEgPD0gdGFic2l6ZSA8PSA1MDAKLQkJaWYgZ29vZDoKLQkJCWlmIHNlbGYubGFzdHRhYiA8PiB0YWJzaXplOgotCQkJCXNlbGYubGFzdHRhYiA9IHRhYnNpemUKLQkJCQlzZWxmLmRvaXQoKQotCQllbHNlOgotCQkJU3lzQmVlcCgwKQotCQkJc2VsZi53LnRhYnNpemVlZGl0LnNldChyZXByKHNlbGYubGFzdHRhYikpCi0JCQlzZWxmLncudGFic2l6ZWVkaXQuc2VsZWN0YWxsKCkKLQkKLQlkZWYgY2hlY2tzaXplKHNlbGYpOgotCQlzaXplID0gc2VsZi53LnNpemVlZGl0LmdldCgpCi0JCWlmIG5vdCBzaXplOgotCQkJcmV0dXJuCi0JCXRyeToKLQkJCXNpemUgPSBzdHJpbmcuYXRvaShzaXplKQotCQlleGNlcHQgKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IpOgotCQkJZ29vZCA9IDAKLQkJCXN5cy5leGNfdHJhY2ViYWNrID0gTm9uZQotCQllbHNlOgotCQkJZ29vZCA9IDEgPD0gc2l6ZSA8PSA1MDAKLQkJaWYgZ29vZDoKLQkJCWlmIHNlbGYubGFzdHNpemUgPD4gc2l6ZToKLQkJCQlzZWxmLmxhc3RzaXplID0gc2l6ZQotCQkJCXNlbGYuZG9pdCgpCi0JCWVsc2U6Ci0JCQlTeXNCZWVwKDApCi0JCQlzZWxmLncuc2l6ZWVkaXQuc2V0KHJlcHIoc2VsZi5sYXN0c2l6ZSkpCi0JCQlzZWxmLncuc2l6ZWVkaXQuc2VsZWN0YWxsKCkKLQkKLQlkZWYgZG9wbGFpbihzZWxmKToKLQkJZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKF9zdHlsZW5hbWVzKSk6Ci0JCQlzZWxmLndbaV0uc2V0KDApCi0JCXNlbGYud1swXS5zZXQoMSkKLQkJc2VsZi5kb2l0KCkKLQkKLQlkZWYgZG9zdHlsZShzZWxmKToKLQkJZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKF9zdHlsZW5hbWVzKSk6Ci0JCQlpZiBzZWxmLndbaV0uZ2V0KCk6Ci0JCQkJc2VsZi53WzBdLnNldCgwKQotCQkJCWJyZWFrCi0JCWVsc2U6Ci0JCQlzZWxmLndbMF0uc2V0KDEpCi0JCXNlbGYuZG9pdCgpCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlzZWxmLncuY2xvc2UoKQotCQlkZWwgc2VsZi53Ci0JCi0JZGVmIGNhbmNlbChzZWxmKToKLQkJc2VsZi5jbG9zZSgpCi0JCi0JZGVmIGRvbmUoc2VsZik6Ci0JCXNlbGYuX3J2ID0gc2VsZi5nZXQoKQotCQlzZWxmLmNsb3NlKCkKLQkKLQlkZWYgc2V0Zm9udChzZWxmLCBmb250bmFtZSk6Ci0JCXNlbGYudy5mb250bmFtZS5zZXQoZm9udG5hbWUpCi0JCXNlbGYuZG9pdCgpCi0JCisKKyAgICAjZGVmIF9fZGVsX18oc2VsZik6CisgICAgIyAgICAgICBwcmludCAiZG9laSEiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyk6CisgICAgICAgIGxlZnRtYXJnaW4gPSA2MAorICAgICAgICBsZWZ0bWFyZ2luMiA9IGxlZnRtYXJnaW4gLSAxNgorICAgICAgICBzZWxmLncgPSBXLk1vZGFsRGlhbG9nKCg0NDAsIDE4MCksICdGb250IHNldHRpbmdzJykKKyAgICAgICAgc2VsZi53LmZvbnR0aXRsZSA9IFcuVGV4dEJveCgoMTAsIDEyLCBsZWZ0bWFyZ2luMiwgMTQpLCAiRm9udDoiLCBUZXh0RWRpdC50ZUp1c3RSaWdodCkKKyAgICAgICAgc2VsZi53LnBvcCA9IFcuRm9udE1lbnUoKGxlZnRtYXJnaW4sIDEwLCAxNiwgMTYpLCBzZWxmLnNldGZvbnQpCisgICAgICAgIHNlbGYudy5mb250bmFtZSA9IFcuVGV4dEJveCgobGVmdG1hcmdpbiArIDIwLCAxMiwgMTUwLCAxNCkpCisgICAgICAgIHNlbGYudy5zaXpldGl0bGUgPSBXLlRleHRCb3goKDEwLCAzOCwgbGVmdG1hcmdpbjIsIDE0KSwgIlNpemU6IiwgVGV4dEVkaXQudGVKdXN0UmlnaHQpCisgICAgICAgIHNlbGYudy5zaXplZWRpdCA9IFcuRWRpdFRleHQoKGxlZnRtYXJnaW4sIDM1LCA0MCwgMjApLCAiIiwgc2VsZi5jaGVja3NpemUpCisgICAgICAgIHN0eWxldG9wID0gNjQKKyAgICAgICAgc2VsZi53LnN0eWxldGl0bGUgPSBXLlRleHRCb3goKDEwLCBzdHlsZXRvcCArIDIsIGxlZnRtYXJnaW4yLCAxNCksICJTdHlsZToiLCBUZXh0RWRpdC50ZUp1c3RSaWdodCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKF9zdHlsZW5hbWVzKSk6CisgICAgICAgICAgICB0b3AgPSBzdHlsZXRvcCArIChpICUgNCkgKiAyMAorICAgICAgICAgICAgbGVmdCA9IGxlZnRtYXJnaW4gKyA4MCAqIChpID4gMykgLSAyCisgICAgICAgICAgICBpZiBpOgorICAgICAgICAgICAgICAgIHNlbGYud1tpXSA9IFcuQ2hlY2tCb3goKGxlZnQsIHRvcCwgNzYsIDE2KSwgX3N0eWxlbmFtZXNbaV0sIHNlbGYuZG9zdHlsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53W2ldID0gVy5DaGVja0JveCgobGVmdCwgdG9wLCA3MCwgMTYpLCBfc3R5bGVuYW1lc1tpXSwgc2VsZi5kb3BsYWluKQorCisgICAgICAgIGlmIHRhYnNldHRpbmdzOgorICAgICAgICAgICAgc2VsZi5sYXN0dGFiLCBzZWxmLnRhYm1vZGUgPSB0YWJzZXR0aW5ncworICAgICAgICAgICAgc2VsZi53LnRhYnNpemV0aXRsZSA9IFcuVGV4dEJveCgoMTAsIC0yNiwgbGVmdG1hcmdpbjIsIDE0KSwgIlRhYnNpemU6IiwgVGV4dEVkaXQudGVKdXN0UmlnaHQpCisgICAgICAgICAgICBzZWxmLncudGFic2l6ZWVkaXQgPSBXLkVkaXRUZXh0KChsZWZ0bWFyZ2luLCAtMjksIDQwLCAyMCksICIiLCBzZWxmLmNoZWNrdGFiKQorICAgICAgICAgICAgc2VsZi53LnRhYnNpemVlZGl0LnNldChyZXByKHNlbGYubGFzdHRhYikpCisgICAgICAgICAgICByYWRpb2J1dHRvbnMgPSBbXQorICAgICAgICAgICAgc2VsZi53LnRhYnNpemVjaGFycyA9IFcuUmFkaW9CdXR0b24oKGxlZnRtYXJnaW4gKyA0OCwgLTI2LCA1NSwgMTQpLCAiU3BhY2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpb2J1dHRvbnMsIHNlbGYudG9nZ2xldGFibW9kZSkKKyAgICAgICAgICAgIHNlbGYudy50YWJzaXplcGl4ZWxzID0gVy5SYWRpb0J1dHRvbigobGVmdG1hcmdpbiArIDExMCwgLTI2LCA1NSwgMTQpLCAiUGl4ZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpb2J1dHRvbnMsIHNlbGYudG9nZ2xldGFibW9kZSkKKyAgICAgICAgICAgIGlmIHNlbGYudGFibW9kZToKKyAgICAgICAgICAgICAgICBzZWxmLncudGFic2l6ZWNoYXJzLnNldCgxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLncudGFic2l6ZXBpeGVscy5zZXQoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGFibW9kZSA9IE5vbmUKKworICAgICAgICBzZWxmLncuY2FuY2VsYnV0dG9uID0gVy5CdXR0b24oKC0xODAsIC0yNiwgODAsIDE2KSwgIkNhbmNlbCIsIHNlbGYuY2FuY2VsKQorICAgICAgICBzZWxmLncuZG9uZWJ1dHRvbiA9IFcuQnV0dG9uKCgtOTAsIC0yNiwgODAsIDE2KSwgIkRvbmUiLCBzZWxmLmRvbmUpCisKKyAgICAgICAgc2FtcGxldGV4dCA9ICJTYW1wbGUgdGV4dC4iCisgICAgICAgIHNlbGYudy5zYW1wbGUgPSBXLkVkaXRUZXh0KCgyMzAsIDEwLCAtMTAsIDEzMCksIHNhbXBsZXRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBmb250c2V0dGluZ3MgPSBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gdGFic2V0dGluZ3MpCisKKyAgICAgICAgc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53LmRvbmVidXR0b24pCisgICAgICAgIHNlbGYudy5iaW5kKCdjbWQuJywgc2VsZi53LmNhbmNlbGJ1dHRvbi5wdXNoKQorICAgICAgICBzZWxmLncuYmluZCgnY21kdycsIHNlbGYudy5kb25lYnV0dG9uLnB1c2gpCisgICAgICAgIHNlbGYubGFzdHNpemUgPSBmb250c2V0dGluZ3NbMl0KKyAgICAgICAgc2VsZi5fcnYgPSBOb25lCisgICAgICAgIHNlbGYuc2V0KGZvbnRzZXR0aW5ncykKKyAgICAgICAgc2VsZi53Lm9wZW4oKQorCisgICAgZGVmIHRvZ2dsZXRhYm1vZGUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBzZWxmLncudGFic2l6ZWNoYXJzLmdldCgpOgorICAgICAgICAgICAgdGFibW9kZSA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhYm1vZGUgPSAwCisgICAgICAgIGlmIHNlbGYudGFibW9kZSA8PiB0YWJtb2RlOgorICAgICAgICAgICAgcG9ydCA9IHNlbGYudy53aWQuR2V0V2luZG93UG9ydCgpCisgICAgICAgICAgICAoZm9udCwgc3R5bGUsIHNpemUsIGNvbG9yKSwgKHRhYnNpemUsIGR1bW15KSA9IHNlbGYuZ2V0KCkKKyAgICAgICAgICAgIHNhdmVzZXR0aW5ncyA9IFcuR2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0KQorICAgICAgICAgICAgVy5TZXRQb3J0Rm9udFNldHRpbmdzKHBvcnQsIChmb250LCBzdHlsZSwgc2l6ZSkpCisgICAgICAgICAgICBzcGFjZXdpZHRoID0gUWQuU3RyaW5nV2lkdGgoJyAnKQorICAgICAgICAgICAgVy5TZXRQb3J0Rm9udFNldHRpbmdzKHBvcnQsIHNhdmVzZXR0aW5ncykKKyAgICAgICAgICAgIGlmIHRhYm1vZGU6CisgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBpeGVscyB0byBzcGFjZXMKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3R0YWIgPSBpbnQocm91bmQoZmxvYXQodGFic2l6ZSkgLyBzcGFjZXdpZHRoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHNwYWNlcyB0byBwaXhlbHMKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3R0YWIgPSBzcGFjZXdpZHRoICogdGFic2l6ZQorICAgICAgICAgICAgc2VsZi53LnRhYnNpemVlZGl0LnNldChyZXByKHNlbGYubGFzdHRhYikpCisgICAgICAgICAgICBzZWxmLnRhYm1vZGUgPSB0YWJtb2RlCisgICAgICAgICAgICBzZWxmLmRvaXQoKQorCisgICAgZGVmIHNldChzZWxmLCBmb250c2V0dGluZ3MpOgorICAgICAgICBmb250LCBzdHlsZSwgc2l6ZSwgY29sb3IgPSBmb250c2V0dGluZ3MKKyAgICAgICAgaWYgdHlwZShmb250KSA8PiB0eXBlcy5TdHJpbmdUeXBlOgorICAgICAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IFJlcworICAgICAgICAgICAgcmVzID0gUmVzLkdldFJlc291cmNlKCdGT05EJywgZm9udCkKKyAgICAgICAgICAgIGZvbnQgPSByZXMuR2V0UmVzSW5mbygpWzJdCisgICAgICAgIHNlbGYudy5mb250bmFtZS5zZXQoZm9udCkKKyAgICAgICAgc2VsZi53LnNpemVlZGl0LnNldChzdHIoc2l6ZSkpCisgICAgICAgIGlmIHN0eWxlOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKF9zdHlsZW5hbWVzKSk6CisgICAgICAgICAgICAgICAgc2VsZi53W2ldLnNldChzdHlsZSAmIDB4MDEpCisgICAgICAgICAgICAgICAgc3R5bGUgPSBzdHlsZSA+PiAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndbMF0uc2V0KDEpCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICBmb250ID0gc2VsZi53LmZvbnRuYW1lLmdldCgpCisgICAgICAgIHN0eWxlID0gMAorICAgICAgICBpZiBub3Qgc2VsZi53WzBdLmdldCgpOgorICAgICAgICAgICAgZmxhZyA9IDB4MDEKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihfc3R5bGVuYW1lcykpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYud1tpXS5nZXQoKToKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSBzdHlsZSB8IGZsYWcKKyAgICAgICAgICAgICAgICBmbGFnID0gZmxhZyA8PCAxCisgICAgICAgIHNpemUgPSBzZWxmLmxhc3RzaXplCisgICAgICAgIGlmIHNlbGYudGFibW9kZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIChmb250LCBzdHlsZSwgc2l6ZSwgKDAsIDAsIDApKSwgKDMyLCAwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIChmb250LCBzdHlsZSwgc2l6ZSwgKDAsIDAsIDApKSwgKHNlbGYubGFzdHRhYiwgc2VsZi50YWJtb2RlKQorCisgICAgZGVmIGRvaXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYud1swXS5nZXQoKToKKyAgICAgICAgICAgIHN0eWxlID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3R5bGUgPSAwCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4oX3N0eWxlbmFtZXMpKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLndbaV0uZ2V0KCk6CisgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gc3R5bGUgfCAyICoqIChpIC0gMSkKKyAgICAgICAgI3NlbGYudy5zYW1wbGUuc2V0KHJlcHIoc3R5bGUpKQorICAgICAgICBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gc2VsZi5nZXQoKQorICAgICAgICBzZWxmLncuc2FtcGxlLnNldGZvbnRzZXR0aW5ncyhmb250c2V0dGluZ3MpCisgICAgICAgIHNlbGYudy5zYW1wbGUuc2V0dGFic2V0dGluZ3ModGFic2V0dGluZ3MpCisKKyAgICBkZWYgY2hlY2t0YWIoc2VsZik6CisgICAgICAgIHRhYnNpemUgPSBzZWxmLncudGFic2l6ZWVkaXQuZ2V0KCkKKyAgICAgICAgaWYgbm90IHRhYnNpemU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFic2l6ZSA9IHN0cmluZy5hdG9pKHRhYnNpemUpCisgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgT3ZlcmZsb3dFcnJvcik6CisgICAgICAgICAgICBnb29kID0gMAorICAgICAgICAgICAgc3lzLmV4Y190cmFjZWJhY2sgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnb29kID0gMSA8PSB0YWJzaXplIDw9IDUwMAorICAgICAgICBpZiBnb29kOgorICAgICAgICAgICAgaWYgc2VsZi5sYXN0dGFiIDw+IHRhYnNpemU6CisgICAgICAgICAgICAgICAgc2VsZi5sYXN0dGFiID0gdGFic2l6ZQorICAgICAgICAgICAgICAgIHNlbGYuZG9pdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTeXNCZWVwKDApCisgICAgICAgICAgICBzZWxmLncudGFic2l6ZWVkaXQuc2V0KHJlcHIoc2VsZi5sYXN0dGFiKSkKKyAgICAgICAgICAgIHNlbGYudy50YWJzaXplZWRpdC5zZWxlY3RhbGwoKQorCisgICAgZGVmIGNoZWNrc2l6ZShzZWxmKToKKyAgICAgICAgc2l6ZSA9IHNlbGYudy5zaXplZWRpdC5nZXQoKQorICAgICAgICBpZiBub3Qgc2l6ZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzaXplID0gc3RyaW5nLmF0b2koc2l6ZSkKKyAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKKyAgICAgICAgICAgIGdvb2QgPSAwCisgICAgICAgICAgICBzeXMuZXhjX3RyYWNlYmFjayA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGdvb2QgPSAxIDw9IHNpemUgPD0gNTAwCisgICAgICAgIGlmIGdvb2Q6CisgICAgICAgICAgICBpZiBzZWxmLmxhc3RzaXplIDw+IHNpemU6CisgICAgICAgICAgICAgICAgc2VsZi5sYXN0c2l6ZSA9IHNpemUKKyAgICAgICAgICAgICAgICBzZWxmLmRvaXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU3lzQmVlcCgwKQorICAgICAgICAgICAgc2VsZi53LnNpemVlZGl0LnNldChyZXByKHNlbGYubGFzdHNpemUpKQorICAgICAgICAgICAgc2VsZi53LnNpemVlZGl0LnNlbGVjdGFsbCgpCisKKyAgICBkZWYgZG9wbGFpbihzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKF9zdHlsZW5hbWVzKSk6CisgICAgICAgICAgICBzZWxmLndbaV0uc2V0KDApCisgICAgICAgIHNlbGYud1swXS5zZXQoMSkKKyAgICAgICAgc2VsZi5kb2l0KCkKKworICAgIGRlZiBkb3N0eWxlKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4oX3N0eWxlbmFtZXMpKToKKyAgICAgICAgICAgIGlmIHNlbGYud1tpXS5nZXQoKToKKyAgICAgICAgICAgICAgICBzZWxmLndbMF0uc2V0KDApCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud1swXS5zZXQoMSkKKyAgICAgICAgc2VsZi5kb2l0KCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi53LmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYudworCisgICAgZGVmIGNhbmNlbChzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZG9uZShzZWxmKToKKyAgICAgICAgc2VsZi5fcnYgPSBzZWxmLmdldCgpCisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIHNldGZvbnQoc2VsZiwgZm9udG5hbWUpOgorICAgICAgICBzZWxmLncuZm9udG5hbWUuc2V0KGZvbnRuYW1lKQorICAgICAgICBzZWxmLmRvaXQoKQorCiAKIGRlZiBGb250RGlhbG9nKGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MgPSAoMzIsIDApKToKLQlmZCA9IF9Gb250RGlhbG9nKGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MpCi0JcmV0dXJuIGZkLl9ydgorICAgIGZkID0gX0ZvbnREaWFsb2coZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncykKKyAgICByZXR1cm4gZmQuX3J2CiAKIGRlZiB0ZXN0KCk6Ci0JcHJpbnQgRm9udERpYWxvZygoJ1phcGF0YS1MaWdodCcsIDAsIDI1LCAoMCwgMCwgMCkpKQorICAgIHByaW50IEZvbnREaWFsb2coKCdaYXBhdGEtTGlnaHQnLCAwLCAyNSwgKDAsIDAsIDApKSkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvTWFjUHJlZnMucHkgYi9NYWMvVG9vbHMvSURFL01hY1ByZWZzLnB5CmluZGV4IDI1ZGRhNGYuLjNjZjkxNTMgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvTWFjUHJlZnMucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9NYWNQcmVmcy5weQpAQCAtNCwxMDUgKzQsMTA1IEBACiBmcm9tIENhcmJvbiBpbXBvcnQgRm9sZGVycwogCiBjbGFzcyBQcmVmT2JqZWN0OgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBkaWN0ID0gTm9uZSk6Ci0JCWlmIGRpY3QgPT0gTm9uZToKLQkJCXNlbGYuX3ByZWZzZGljdCA9IHt9Ci0JCWVsc2U6Ci0JCQlzZWxmLl9wcmVmc2RpY3QgPSBkaWN0Ci0JCi0JZGVmIF9fbGVuX18oc2VsZik6Ci0JCXJldHVybiBsZW4oc2VsZi5fcHJlZnNkaWN0KQotCQotCWRlZiBfX2RlbGF0dHJfXyhzZWxmLCBhdHRyKToKLQkJaWYgc2VsZi5fcHJlZnNkaWN0Lmhhc19rZXkoYXR0cik6Ci0JCQlkZWwgc2VsZi5fcHJlZnNkaWN0W2F0dHJdCi0JCWVsc2U6Ci0JCQlyYWlzZSBBdHRyaWJ1dGVFcnJvciwgJ2RlbGV0ZSBub24tZXhpc3RpbmcgaW5zdGFuY2UgYXR0cmlidXRlJwotCQotCWRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKLQkJaWYgYXR0ciA9PSAnX19tZW1iZXJzX18nOgotCQkJa2V5cyA9IHNlbGYuX3ByZWZzZGljdC5rZXlzKCkKLQkJCWtleXMuc29ydCgpCi0JCQlyZXR1cm4ga2V5cwotCQl0cnk6Ci0JCQlyZXR1cm4gc2VsZi5fcHJlZnNkaWN0W2F0dHJdCi0JCWV4Y2VwdCBLZXlFcnJvcjoKLQkJCXJhaXNlIEF0dHJpYnV0ZUVycm9yLCBhdHRyCi0JCi0JZGVmIF9fc2V0YXR0cl9fKHNlbGYsIGF0dHIsIHZhbHVlKToKLQkJaWYgYXR0clswXSA8PiAnXyc6Ci0JCQlzZWxmLl9wcmVmc2RpY3RbYXR0cl0gPSB2YWx1ZQotCQllbHNlOgotCQkJc2VsZi5fX2RpY3RfX1thdHRyXSA9IHZhbHVlCi0JCi0JZGVmIGdldHByZWZzZGljdChzZWxmKToKLQkJcmV0dXJuIHNlbGYuX3ByZWZzZGljdAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpY3QgPSBOb25lKToKKyAgICAgICAgaWYgZGljdCA9PSBOb25lOgorICAgICAgICAgICAgc2VsZi5fcHJlZnNkaWN0ID0ge30KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3ByZWZzZGljdCA9IGRpY3QKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3ByZWZzZGljdCkKKworICAgIGRlZiBfX2RlbGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgaWYgc2VsZi5fcHJlZnNkaWN0Lmhhc19rZXkoYXR0cik6CisgICAgICAgICAgICBkZWwgc2VsZi5fcHJlZnNkaWN0W2F0dHJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgJ2RlbGV0ZSBub24tZXhpc3RpbmcgaW5zdGFuY2UgYXR0cmlidXRlJworCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICBpZiBhdHRyID09ICdfX21lbWJlcnNfXyc6CisgICAgICAgICAgICBrZXlzID0gc2VsZi5fcHJlZnNkaWN0LmtleXMoKQorICAgICAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgICAgIHJldHVybiBrZXlzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcmVmc2RpY3RbYXR0cl0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIGF0dHIKKworICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBhdHRyLCB2YWx1ZSk6CisgICAgICAgIGlmIGF0dHJbMF0gPD4gJ18nOgorICAgICAgICAgICAgc2VsZi5fcHJlZnNkaWN0W2F0dHJdID0gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX19kaWN0X19bYXR0cl0gPSB2YWx1ZQorCisgICAgZGVmIGdldHByZWZzZGljdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ByZWZzZGljdAogCiAKIGNsYXNzIFByZWZGaWxlKFByZWZPYmplY3QpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBjcmVhdG9yID0gJ1B5dGgnKToKLQkJIyBGaW5kIHRoZSBwcmVmZXJlbmNlcyBmb2xkZXIgYW5kIG91ciBwcmVmcyBmaWxlLCBjcmVhdGUgaWYgbmVlZGVkLgotCQlzZWxmLl9fcGF0aCA9IHBhdGgKLQkJc2VsZi5fX2NyZWF0b3IgPSBjcmVhdG9yCi0JCXNlbGYuX3ByZWZzZGljdCA9IHt9Ci0JCXRyeToKLQkJCXByZWZkaWN0ID0gbWFyc2hhbC5sb2FkKG9wZW4oc2VsZi5fX3BhdGgsICdyYicpKQotCQlleGNlcHQgKElPRXJyb3IsIFZhbHVlRXJyb3IpOgotCQkJIyBmaWxlIG5vdCBmb3VuZCwgb3IgY3VycnVwdCBtYXJzaGFsIGRhdGEKLQkJCXBhc3MKLQkJZWxzZToKLQkJCWZvciBrZXksIHZhbHVlIGluIHByZWZkaWN0Lml0ZW1zKCk6Ci0JCQkJaWYgdHlwZSh2YWx1ZSkgPT0gdHlwZXMuRGljdFR5cGU6Ci0JCQkJCXNlbGYuX3ByZWZzZGljdFtrZXldID0gUHJlZk9iamVjdCh2YWx1ZSkKLQkJCQllbHNlOgotCQkJCQlzZWxmLl9wcmVmc2RpY3Rba2V5XSA9IHZhbHVlCi0JCi0JZGVmIHNhdmUoc2VsZik6Ci0JCXByZWZkaWN0ID0ge30KLQkJZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fcHJlZnNkaWN0Lml0ZW1zKCk6Ci0JCQlpZiB0eXBlKHZhbHVlKSA9PSB0eXBlcy5JbnN0YW5jZVR5cGU6Ci0JCQkJcHJlZmRpY3Rba2V5XSA9IHZhbHVlLmdldHByZWZzZGljdCgpCi0JCQkJaWYgbm90IHByZWZkaWN0W2tleV06Ci0JCQkJCWRlbCBwcmVmZGljdFtrZXldCi0JCQllbHNlOgotCQkJCXByZWZkaWN0W2tleV0gPSB2YWx1ZQotCQltYXJzaGFsLmR1bXAocHJlZmRpY3QsIG9wZW4oc2VsZi5fX3BhdGgsICd3YicpKQotCQl0cnk6Ci0JCQlNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShzZWxmLl9fcGF0aCwgc2VsZi5fX2NyZWF0b3IsICdwcmVmJykKLQkJZXhjZXB0OgotCQkJcGFzcwotCQotCWRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKLQkJaWYgYXR0ciA9PSAnX19tZW1iZXJzX18nOgotCQkJa2V5cyA9IHNlbGYuX3ByZWZzZGljdC5rZXlzKCkKLQkJCWtleXMuc29ydCgpCi0JCQlyZXR1cm4ga2V5cwotCQl0cnk6Ci0JCQlyZXR1cm4gc2VsZi5fcHJlZnNkaWN0W2F0dHJdCi0JCWV4Y2VwdCBLZXlFcnJvcjoKLQkJCWlmIGF0dHJbMF0gPD4gJ18nOgotCQkJCXNlbGYuX3ByZWZzZGljdFthdHRyXSA9IFByZWZPYmplY3QoKQotCQkJCXJldHVybiBzZWxmLl9wcmVmc2RpY3RbYXR0cl0KLQkJCWVsc2U6Ci0JCQkJcmFpc2UgQXR0cmlidXRlRXJyb3IsIGF0dHIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBjcmVhdG9yID0gJ1B5dGgnKToKKyAgICAgICAgIyBGaW5kIHRoZSBwcmVmZXJlbmNlcyBmb2xkZXIgYW5kIG91ciBwcmVmcyBmaWxlLCBjcmVhdGUgaWYgbmVlZGVkLgorICAgICAgICBzZWxmLl9fcGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5fX2NyZWF0b3IgPSBjcmVhdG9yCisgICAgICAgIHNlbGYuX3ByZWZzZGljdCA9IHt9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByZWZkaWN0ID0gbWFyc2hhbC5sb2FkKG9wZW4oc2VsZi5fX3BhdGgsICdyYicpKQorICAgICAgICBleGNlcHQgKElPRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgIyBmaWxlIG5vdCBmb3VuZCwgb3IgY3VycnVwdCBtYXJzaGFsIGRhdGEKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHByZWZkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgdHlwZSh2YWx1ZSkgPT0gdHlwZXMuRGljdFR5cGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3ByZWZzZGljdFtrZXldID0gUHJlZk9iamVjdCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wcmVmc2RpY3Rba2V5XSA9IHZhbHVlCisKKyAgICBkZWYgc2F2ZShzZWxmKToKKyAgICAgICAgcHJlZmRpY3QgPSB7fQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9wcmVmc2RpY3QuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHR5cGUodmFsdWUpID09IHR5cGVzLkluc3RhbmNlVHlwZToKKyAgICAgICAgICAgICAgICBwcmVmZGljdFtrZXldID0gdmFsdWUuZ2V0cHJlZnNkaWN0KCkKKyAgICAgICAgICAgICAgICBpZiBub3QgcHJlZmRpY3Rba2V5XToKKyAgICAgICAgICAgICAgICAgICAgZGVsIHByZWZkaWN0W2tleV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJlZmRpY3Rba2V5XSA9IHZhbHVlCisgICAgICAgIG1hcnNoYWwuZHVtcChwcmVmZGljdCwgb3BlbihzZWxmLl9fcGF0aCwgJ3diJykpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIE1hY09TLlNldENyZWF0b3JBbmRUeXBlKHNlbGYuX19wYXRoLCBzZWxmLl9fY3JlYXRvciwgJ3ByZWYnKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIGlmIGF0dHIgPT0gJ19fbWVtYmVyc19fJzoKKyAgICAgICAgICAgIGtleXMgPSBzZWxmLl9wcmVmc2RpY3Qua2V5cygpCisgICAgICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICAgICAgcmV0dXJuIGtleXMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZWZzZGljdFthdHRyXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBpZiBhdHRyWzBdIDw+ICdfJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9wcmVmc2RpY3RbYXR0cl0gPSBQcmVmT2JqZWN0KCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJlZnNkaWN0W2F0dHJdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBhdHRyCiAKIAogX3ByZWZzY2FjaGUgPSB7fQogCiBkZWYgR2V0UHJlZnMocHJlZm5hbWUsIGNyZWF0b3IgPSAnUHl0aCcpOgotCWltcG9ydCBtYWNvc3Rvb2xzLCBvcwotCWlmIF9wcmVmc2NhY2hlLmhhc19rZXkocHJlZm5hbWUpOgotCQlyZXR1cm4gX3ByZWZzY2FjaGVbcHJlZm5hbWVdCi0JIyBGaW5kIHRoZSBwcmVmZXJlbmNlcyBmb2xkZXIgYW5kIG91ciBwcmVmcyBmaWxlLCBjcmVhdGUgaWYgbmVlZGVkLgotCWZzciA9IEZvbGRlci5GU0ZpbmRGb2xkZXIoRm9sZGVycy5rT25TeXN0ZW1EaXNrLCAncHJlZicsIDEpCi0JcHJlZnNmb2xkZXIgPSBmc3IuYXNfcGF0aG5hbWUoKQotCXBhdGggPSBvcy5wYXRoLmpvaW4ocHJlZnNmb2xkZXIsIHByZWZuYW1lKQotCWhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCi0JIyBtYWtlIHN1cmUgdGhlIGZvbGRlcihzKSBleGlzdAotCW1hY29zdG9vbHMubWtkaXJzKGhlYWQpCi0JCi0JcHJlZmZpbGUgPSBQcmVmRmlsZShwYXRoLCBjcmVhdG9yKQotCV9wcmVmc2NhY2hlW3ByZWZuYW1lXSA9IHByZWZmaWxlCi0JcmV0dXJuIHByZWZmaWxlCisgICAgaW1wb3J0IG1hY29zdG9vbHMsIG9zCisgICAgaWYgX3ByZWZzY2FjaGUuaGFzX2tleShwcmVmbmFtZSk6CisgICAgICAgIHJldHVybiBfcHJlZnNjYWNoZVtwcmVmbmFtZV0KKyAgICAjIEZpbmQgdGhlIHByZWZlcmVuY2VzIGZvbGRlciBhbmQgb3VyIHByZWZzIGZpbGUsIGNyZWF0ZSBpZiBuZWVkZWQuCisgICAgZnNyID0gRm9sZGVyLkZTRmluZEZvbGRlcihGb2xkZXJzLmtPblN5c3RlbURpc2ssICdwcmVmJywgMSkKKyAgICBwcmVmc2ZvbGRlciA9IGZzci5hc19wYXRobmFtZSgpCisgICAgcGF0aCA9IG9zLnBhdGguam9pbihwcmVmc2ZvbGRlciwgcHJlZm5hbWUpCisgICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyAgICAjIG1ha2Ugc3VyZSB0aGUgZm9sZGVyKHMpIGV4aXN0CisgICAgbWFjb3N0b29scy5ta2RpcnMoaGVhZCkKKworICAgIHByZWZmaWxlID0gUHJlZkZpbGUocGF0aCwgY3JlYXRvcikKKyAgICBfcHJlZnNjYWNoZVtwcmVmbmFtZV0gPSBwcmVmZmlsZQorICAgIHJldHVybiBwcmVmZmlsZQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9Nb2R1bGVCcm93c2VyLnB5IGIvTWFjL1Rvb2xzL0lERS9Nb2R1bGVCcm93c2VyLnB5CmluZGV4IDBlODg1MGYuLjlmZTEwNjQgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvTW9kdWxlQnJvd3Nlci5weQorKysgYi9NYWMvVG9vbHMvSURFL01vZHVsZUJyb3dzZXIucHkKQEAgLTYsMTcyICs2LDE3MiBAQAogX19hdXRob3JfXyA9ICJqdnIiCiAKIGNsYXNzIF9tb2R1bGVicm93c2VyOgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJc2VsZi5lZGl0bW9kdWxlcyA9IFtdCi0JCXNlbGYubW9kdWxlcyA9IFtdCi0JCXNlbGYud2luZG93ID0gVy5XaW5kb3coKDIxMCwgMTAwMCksICJNb2R1bGUgQnJvd3NlciIsIG1pbnNpemUgPSAoMjEwLCAxNjApLCBtYXhzaXplID0gKDM0MCwgMjAwMDApKQotCQkKLQkJc2VsZi53aW5kb3cub3BlbmJ1dHRvbiA9IFcuQnV0dG9uKCgxMCwgOCwgOTAsIDE2KSwgIk9wZW4iLCBzZWxmLm9wZW5idXR0b25oaXQpCi0JCXNlbGYud2luZG93LmJyb3dzZWJ1dHRvbiA9IFcuQnV0dG9uKCgxMTAsIDgsIDkwLCAxNiksICJCcm93c2VceGM5Iiwgc2VsZi5icm93c2VidXR0b25oaXQpCi0JCXNlbGYud2luZG93LnJlbG9hZGJ1dHRvbiA9IFcuQnV0dG9uKCgxMCwgMzIsIDkwLCAxNiksICJSZWxvYWQiLCBzZWxmLnJlbG9hZGJ1dHRvbmhpdCkKLQkJc2VsZi53aW5kb3cub3Blbm90aGVyYnV0dG9uID0gVy5CdXR0b24oKDExMCwgMzIsIDkwLCAxNiksICJPcGVuIG90aGVyXHhjOSIsIHNlbGYub3Blbm90aGVyKQotCQkKLQkJc2VsZi53aW5kb3cub3BlbmJ1dHRvbi5lbmFibGUoMCkKLQkJc2VsZi53aW5kb3cucmVsb2FkYnV0dG9uLmVuYWJsZSgwKQotCQlzZWxmLndpbmRvdy5icm93c2VidXR0b24uZW5hYmxlKDApCi0JCXNlbGYud2luZG93LnNldGRlZmF1bHRidXR0b24oc2VsZi53aW5kb3cuYnJvd3NlYnV0dG9uKQotCQkKLQkJc2VsZi53aW5kb3cuYmluZCgiY21kciIsIHNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5wdXNoKQotCQlzZWxmLndpbmRvdy5iaW5kKCJjbWRiIiwgc2VsZi53aW5kb3cuYnJvd3NlYnV0dG9uLnB1c2gpCi0JCi0JCXNlbGYud2luZG93LmJpbmQoIjxhY3RpdmF0ZT4iLCBzZWxmLmFjdGl2YXRlKQotCQlzZWxmLndpbmRvdy5iaW5kKCI8Y2xvc2U+Iiwgc2VsZi5jbG9zZSkKLQkJCi0JCXNlbGYud2luZG93Lmxpc3QgPSBXLkxpc3QoKC0xLCA1NiwgMSwgLTE0KSwgW10sIHNlbGYubGlzdGhpdCkKLQkJCi0JCXNlbGYud2luZG93Lm9wZW4oKQotCQlzZWxmLmNoZWNrYnV0dG9ucygpCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlnbG9iYWwgX2Jyb3dzZXIKLQkJX2Jyb3dzZXIgPSBOb25lCi0JCi0JZGVmIGFjdGl2YXRlKHNlbGYsIG9ub2ZmKToKLQkJaWYgb25vZmY6Ci0JCQlzZWxmLm1ha2VsaXN0KCkKLQkJCi0JZGVmIGxpc3RoaXQoc2VsZiwgaXNkYmwpOgotCQlzZWxmLmNoZWNrYnV0dG9ucygpCi0JCWlmIGlzZGJsOgotCQkJaWYgc2VsZi53aW5kb3cuX2RlZmF1bHRidXR0b246Ci0JCQkJc2VsZi53aW5kb3cuX2RlZmF1bHRidXR0b24ucHVzaCgpCi0JCi0JZGVmIGNoZWNrYnV0dG9ucyhzZWxmKToKLQkJc2VsID0gc2VsZi53aW5kb3cubGlzdC5nZXRzZWxlY3Rpb24oKQotCQlpZiBzZWw6Ci0JCQlmb3IgaSBpbiBzZWw6Ci0JCQkJaWYgc2VsZi5lZGl0bW9kdWxlc1tpXToKLQkJCQkJc2VsZi53aW5kb3cub3BlbmJ1dHRvbi5lbmFibGUoMSkKLQkJCQkJc2VsZi53aW5kb3cucmVsb2FkYnV0dG9uLmVuYWJsZSgxKQotCQkJCQlzZWxmLndpbmRvdy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud2luZG93Lm9wZW5idXR0b24pCi0JCQkJCWJyZWFrCi0JCQllbHNlOgotCQkJCXNlbGYud2luZG93Lm9wZW5idXR0b24uZW5hYmxlKDApCi0JCQkJc2VsZi53aW5kb3cucmVsb2FkYnV0dG9uLmVuYWJsZSgwKQotCQkJCXNlbGYud2luZG93LnNldGRlZmF1bHRidXR0b24oc2VsZi53aW5kb3cuYnJvd3NlYnV0dG9uKQotCQkJc2VsZi53aW5kb3cuYnJvd3NlYnV0dG9uLmVuYWJsZSgxKQotCQllbHNlOgotCQkJI3NlbGYud2luZG93LnNldGRlZmF1bHRidXR0b24oc2VsZi53aW5kb3cuYnJvd3NlYnV0dG9uKQotCQkJc2VsZi53aW5kb3cub3BlbmJ1dHRvbi5lbmFibGUoMCkKLQkJCXNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5lbmFibGUoMCkKLQkJCXNlbGYud2luZG93LmJyb3dzZWJ1dHRvbi5lbmFibGUoMCkKLQkKLQlkZWYgb3BlbmJ1dHRvbmhpdChzZWxmKToKLQkJaW1wb3J0IGltcAotCQlzZWwgPSBzZWxmLndpbmRvdy5saXN0LmdldHNlbGVjdGlvbigpCi0JCVcuU2V0Q3Vyc29yKCJ3YXRjaCIpCi0JCWZvciBpIGluIHNlbDoKLQkJCW1vZG5hbWUgPSBzZWxmLndpbmRvdy5saXN0W2ldCi0JCQl0cnk6Ci0JCQkJc2VsZi5vcGVuc2NyaXB0KHN5cy5tb2R1bGVzW21vZG5hbWVdLl9fZmlsZV9fLCBtb2RuYW1lKQotCQkJZXhjZXB0IElPRXJyb3I6Ci0JCQkJdHJ5OgotCQkJCQlmaWxlLCBwYXRoLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZShtb2RuYW1lKQotCQkJCWV4Y2VwdCBJbXBvcnRFcnJvcjoKLQkJCQkJVy5TZXRDdXJzb3IoImFycm93IikKLQkJCQkJVy5NZXNzYWdlKCJDYW4ndCBmaW5kIGZpbGUgZm9yIG1vZHVsZSAnJXMnLiIgCi0JCQkJCQkJJSBtb2RuYW1lKQotCQkJCWVsc2U6Ci0JCQkJCXNlbGYub3BlbnNjcmlwdChwYXRoLCBtb2RuYW1lKQkJCQkJCi0JCi0JZGVmIG9wZW5zY3JpcHQoc2VsZiwgcGF0aCwgbW9kbmFtZSk6Ci0JCWltcG9ydCBvcwotCQlpZiBwYXRoWy0zOl0gPT0gJy5weSc6Ci0JCQlXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChwYXRoLCBtb2RuYW1lPW1vZG5hbWUpCi0JCWVsaWYgcGF0aFstNDpdIGluIFsnLnB5YycsICcucHlvJ106Ci0JCQlXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChwYXRoWzotMV0sIG1vZG5hbWU9bW9kbmFtZSkKLQkJZWxzZToKLQkJCVcuTWVzc2FnZSgiQ2FuJ3QgZWRpdCAnJXMnOyBpdCBtaWdodCBiZSBhIHNoYXJlZCBsaWJyYXJ5IG9yIGEgLnB5YyBmaWxlLiIgCi0JCQkJCSUgbW9kbmFtZSkKLQkKLQlkZWYgb3Blbm90aGVyKHNlbGYpOgotCQlpbXBvcnQgaW1wCi0JCWltcG9ydCBFYXN5RGlhbG9ncwotCQkKLQkJbW9kbmFtZSA9IEVhc3lEaWFsb2dzLkFza1N0cmluZygiT3BlbiBtb2R1bGU6IikKLQkJaWYgbW9kbmFtZToKLQkJCXRyeToKLQkJCQlmaWxlLCBwYXRoLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZShtb2RuYW1lKQotCQkJZXhjZXB0IEltcG9ydEVycm9yOgotCQkJCWlmIG1vZG5hbWUgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgotCQkJCQlhbGVydHRleHQgPSAiJyVzJyBpcyBhIGJ1aWx0aW4gbW9kdWxlLCB3aGljaCB5b3UgY2FuJ3QgZWRpdC4iICUgbW9kbmFtZQotCQkJCWVsc2U6Ci0JCQkJCWFsZXJ0dGV4dCA9ICJObyBtb2R1bGUgbmFtZWQgJyVzJy4iICUgbW9kbmFtZQotCQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgYWxlcnR0ZXh0Ci0JCQlzZWxmLm9wZW5zY3JpcHQocGF0aCwgbW9kbmFtZSkKLQkKLQlkZWYgcmVsb2FkYnV0dG9uaGl0KHNlbGYpOgotCQlzZWwgPSBzZWxmLndpbmRvdy5saXN0LmdldHNlbGVjdGlvbigpCi0JCVcuU2V0Q3Vyc29yKCJ3YXRjaCIpCi0JCWZvciBpIGluIHNlbDoKLQkJCW1uYW1lID0gc2VsZi53aW5kb3cubGlzdFtpXQotCQkJbSA9IHN5cy5tb2R1bGVzW21uYW1lXQotCQkJIyBTZXQgdGhlIF9fbmFtZV9fIGF0dHJpYnV0ZSBvZiB0aGUgbW9kdWxlIHRvIGl0cyByZWFsIG5hbWUuCi0JCQkjIHJlbG9hZCgpIGNvbXBsYWlucyBpZiBpdCdzIF9fbWFpbl9fLCB3aGljaCBpcyB0cnVlCi0JCQkjIHdoZW4gaXQgcmVjZW50bHkgaGFzIGJlZW4gcnVuIGFzIGEgc2NyaXB0IHdpdGggIlJ1biBhcyBfX21haW5fXyIgCi0JCQkjIGVuYWJsZWQuCi0JCQltLl9fbmFtZV9fID0gbW5hbWUKLQkJCXJlbG9hZChtKQotCQotCWRlZiBicm93c2VidXR0b25oaXQoc2VsZik6Ci0JCXNlbCA9IHNlbGYud2luZG93Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKLQkJaWYgbm90IHNlbDoKLQkJCXJldHVybgotCQlpbXBvcnQgUHlCcm93c2VyCi0JCWZvciBpIGluIHNlbDoKLQkJCVB5QnJvd3Nlci5Ccm93c2VyKHN5cy5tb2R1bGVzW3NlbGYud2luZG93Lmxpc3RbaV1dKQotCQotCWRlZiBtYWtlbGlzdChzZWxmKToKLQkJZWRpdG1vZHVsZXMsIG1vZHVsZXMgPSBnZXRtb2R1bGVzbGlzdCgpCi0JCWlmIG1vZHVsZXMgPT0gc2VsZi5tb2R1bGVzOgotCQkJcmV0dXJuCi0JCXNlbGYuZWRpdG1vZHVsZXMsIHNlbGYubW9kdWxlcyA9IGVkaXRtb2R1bGVzLCBtb2R1bGVzCi0JCXNlbGYud2luZG93Lmxpc3Quc2V0ZHJhd2luZ21vZGUoMCkKLQkJc2VsID0gc2VsZi53aW5kb3cubGlzdC5nZXRzZWxlY3RlZG9iamVjdHMoKQotCQlzZWxmLndpbmRvdy5saXN0LnNldChzZWxmLm1vZHVsZXMpCi0JCXNlbGYud2luZG93Lmxpc3Quc2V0c2VsZWN0ZWRvYmplY3RzKHNlbCkKLQkJc2VsZi53aW5kb3cubGlzdC5zZXRkcmF3aW5nbW9kZSgxKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmVkaXRtb2R1bGVzID0gW10KKyAgICAgICAgc2VsZi5tb2R1bGVzID0gW10KKyAgICAgICAgc2VsZi53aW5kb3cgPSBXLldpbmRvdygoMjEwLCAxMDAwKSwgIk1vZHVsZSBCcm93c2VyIiwgbWluc2l6ZSA9ICgyMTAsIDE2MCksIG1heHNpemUgPSAoMzQwLCAyMDAwMCkpCisKKyAgICAgICAgc2VsZi53aW5kb3cub3BlbmJ1dHRvbiA9IFcuQnV0dG9uKCgxMCwgOCwgOTAsIDE2KSwgIk9wZW4iLCBzZWxmLm9wZW5idXR0b25oaXQpCisgICAgICAgIHNlbGYud2luZG93LmJyb3dzZWJ1dHRvbiA9IFcuQnV0dG9uKCgxMTAsIDgsIDkwLCAxNiksICJCcm93c2VceGM5Iiwgc2VsZi5icm93c2VidXR0b25oaXQpCisgICAgICAgIHNlbGYud2luZG93LnJlbG9hZGJ1dHRvbiA9IFcuQnV0dG9uKCgxMCwgMzIsIDkwLCAxNiksICJSZWxvYWQiLCBzZWxmLnJlbG9hZGJ1dHRvbmhpdCkKKyAgICAgICAgc2VsZi53aW5kb3cub3Blbm90aGVyYnV0dG9uID0gVy5CdXR0b24oKDExMCwgMzIsIDkwLCAxNiksICJPcGVuIG90aGVyXHhjOSIsIHNlbGYub3Blbm90aGVyKQorCisgICAgICAgIHNlbGYud2luZG93Lm9wZW5idXR0b24uZW5hYmxlKDApCisgICAgICAgIHNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgc2VsZi53aW5kb3cuYnJvd3NlYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICBzZWxmLndpbmRvdy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud2luZG93LmJyb3dzZWJ1dHRvbikKKworICAgICAgICBzZWxmLndpbmRvdy5iaW5kKCJjbWRyIiwgc2VsZi53aW5kb3cucmVsb2FkYnV0dG9uLnB1c2gpCisgICAgICAgIHNlbGYud2luZG93LmJpbmQoImNtZGIiLCBzZWxmLndpbmRvdy5icm93c2VidXR0b24ucHVzaCkKKworICAgICAgICBzZWxmLndpbmRvdy5iaW5kKCI8YWN0aXZhdGU+Iiwgc2VsZi5hY3RpdmF0ZSkKKyAgICAgICAgc2VsZi53aW5kb3cuYmluZCgiPGNsb3NlPiIsIHNlbGYuY2xvc2UpCisKKyAgICAgICAgc2VsZi53aW5kb3cubGlzdCA9IFcuTGlzdCgoLTEsIDU2LCAxLCAtMTQpLCBbXSwgc2VsZi5saXN0aGl0KQorCisgICAgICAgIHNlbGYud2luZG93Lm9wZW4oKQorICAgICAgICBzZWxmLmNoZWNrYnV0dG9ucygpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGdsb2JhbCBfYnJvd3NlcgorICAgICAgICBfYnJvd3NlciA9IE5vbmUKKworICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6CisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgc2VsZi5tYWtlbGlzdCgpCisKKyAgICBkZWYgbGlzdGhpdChzZWxmLCBpc2RibCk6CisgICAgICAgIHNlbGYuY2hlY2tidXR0b25zKCkKKyAgICAgICAgaWYgaXNkYmw6CisgICAgICAgICAgICBpZiBzZWxmLndpbmRvdy5fZGVmYXVsdGJ1dHRvbjoKKyAgICAgICAgICAgICAgICBzZWxmLndpbmRvdy5fZGVmYXVsdGJ1dHRvbi5wdXNoKCkKKworICAgIGRlZiBjaGVja2J1dHRvbnMoc2VsZik6CisgICAgICAgIHNlbCA9IHNlbGYud2luZG93Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgaWYgc2VsOgorICAgICAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZWRpdG1vZHVsZXNbaV06CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2luZG93Lm9wZW5idXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5lbmFibGUoMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53aW5kb3cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndpbmRvdy5vcGVuYnV0dG9uKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLndpbmRvdy5vcGVuYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgICAgIHNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgICAgICBzZWxmLndpbmRvdy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud2luZG93LmJyb3dzZWJ1dHRvbikKKyAgICAgICAgICAgIHNlbGYud2luZG93LmJyb3dzZWJ1dHRvbi5lbmFibGUoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICNzZWxmLndpbmRvdy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud2luZG93LmJyb3dzZWJ1dHRvbikKKyAgICAgICAgICAgIHNlbGYud2luZG93Lm9wZW5idXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBzZWxmLndpbmRvdy5yZWxvYWRidXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBzZWxmLndpbmRvdy5icm93c2VidXR0b24uZW5hYmxlKDApCisKKyAgICBkZWYgb3BlbmJ1dHRvbmhpdChzZWxmKToKKyAgICAgICAgaW1wb3J0IGltcAorICAgICAgICBzZWwgPSBzZWxmLndpbmRvdy5saXN0LmdldHNlbGVjdGlvbigpCisgICAgICAgIFcuU2V0Q3Vyc29yKCJ3YXRjaCIpCisgICAgICAgIGZvciBpIGluIHNlbDoKKyAgICAgICAgICAgIG1vZG5hbWUgPSBzZWxmLndpbmRvdy5saXN0W2ldCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5vcGVuc2NyaXB0KHN5cy5tb2R1bGVzW21vZG5hbWVdLl9fZmlsZV9fLCBtb2RuYW1lKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmaWxlLCBwYXRoLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZShtb2RuYW1lKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgVy5TZXRDdXJzb3IoImFycm93IikKKyAgICAgICAgICAgICAgICAgICAgVy5NZXNzYWdlKCJDYW4ndCBmaW5kIGZpbGUgZm9yIG1vZHVsZSAnJXMnLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgbW9kbmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm9wZW5zY3JpcHQocGF0aCwgbW9kbmFtZSkKKworICAgIGRlZiBvcGVuc2NyaXB0KHNlbGYsIHBhdGgsIG1vZG5hbWUpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgcGF0aFstMzpdID09ICcucHknOgorICAgICAgICAgICAgVy5nZXRhcHBsaWNhdGlvbigpLm9wZW5zY3JpcHQocGF0aCwgbW9kbmFtZT1tb2RuYW1lKQorICAgICAgICBlbGlmIHBhdGhbLTQ6XSBpbiBbJy5weWMnLCAnLnB5byddOgorICAgICAgICAgICAgVy5nZXRhcHBsaWNhdGlvbigpLm9wZW5zY3JpcHQocGF0aFs6LTFdLCBtb2RuYW1lPW1vZG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBXLk1lc3NhZ2UoIkNhbid0IGVkaXQgJyVzJzsgaXQgbWlnaHQgYmUgYSBzaGFyZWQgbGlicmFyeSBvciBhIC5weWMgZmlsZS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBtb2RuYW1lKQorCisgICAgZGVmIG9wZW5vdGhlcihzZWxmKToKKyAgICAgICAgaW1wb3J0IGltcAorICAgICAgICBpbXBvcnQgRWFzeURpYWxvZ3MKKworICAgICAgICBtb2RuYW1lID0gRWFzeURpYWxvZ3MuQXNrU3RyaW5nKCJPcGVuIG1vZHVsZToiKQorICAgICAgICBpZiBtb2RuYW1lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpbGUsIHBhdGgsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKG1vZG5hbWUpCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgaWYgbW9kbmFtZSBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIGFsZXJ0dGV4dCA9ICInJXMnIGlzIGEgYnVpbHRpbiBtb2R1bGUsIHdoaWNoIHlvdSBjYW4ndCBlZGl0LiIgJSBtb2RuYW1lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYWxlcnR0ZXh0ID0gIk5vIG1vZHVsZSBuYW1lZCAnJXMnLiIgJSBtb2RuYW1lCisgICAgICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCBhbGVydHRleHQKKyAgICAgICAgICAgIHNlbGYub3BlbnNjcmlwdChwYXRoLCBtb2RuYW1lKQorCisgICAgZGVmIHJlbG9hZGJ1dHRvbmhpdChzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi53aW5kb3cubGlzdC5nZXRzZWxlY3Rpb24oKQorICAgICAgICBXLlNldEN1cnNvcigid2F0Y2giKQorICAgICAgICBmb3IgaSBpbiBzZWw6CisgICAgICAgICAgICBtbmFtZSA9IHNlbGYud2luZG93Lmxpc3RbaV0KKyAgICAgICAgICAgIG0gPSBzeXMubW9kdWxlc1ttbmFtZV0KKyAgICAgICAgICAgICMgU2V0IHRoZSBfX25hbWVfXyBhdHRyaWJ1dGUgb2YgdGhlIG1vZHVsZSB0byBpdHMgcmVhbCBuYW1lLgorICAgICAgICAgICAgIyByZWxvYWQoKSBjb21wbGFpbnMgaWYgaXQncyBfX21haW5fXywgd2hpY2ggaXMgdHJ1ZQorICAgICAgICAgICAgIyB3aGVuIGl0IHJlY2VudGx5IGhhcyBiZWVuIHJ1biBhcyBhIHNjcmlwdCB3aXRoICJSdW4gYXMgX19tYWluX18iCisgICAgICAgICAgICAjIGVuYWJsZWQuCisgICAgICAgICAgICBtLl9fbmFtZV9fID0gbW5hbWUKKyAgICAgICAgICAgIHJlbG9hZChtKQorCisgICAgZGVmIGJyb3dzZWJ1dHRvbmhpdChzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi53aW5kb3cubGlzdC5nZXRzZWxlY3Rpb24oKQorICAgICAgICBpZiBub3Qgc2VsOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGltcG9ydCBQeUJyb3dzZXIKKyAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgUHlCcm93c2VyLkJyb3dzZXIoc3lzLm1vZHVsZXNbc2VsZi53aW5kb3cubGlzdFtpXV0pCisKKyAgICBkZWYgbWFrZWxpc3Qoc2VsZik6CisgICAgICAgIGVkaXRtb2R1bGVzLCBtb2R1bGVzID0gZ2V0bW9kdWxlc2xpc3QoKQorICAgICAgICBpZiBtb2R1bGVzID09IHNlbGYubW9kdWxlczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmVkaXRtb2R1bGVzLCBzZWxmLm1vZHVsZXMgPSBlZGl0bW9kdWxlcywgbW9kdWxlcworICAgICAgICBzZWxmLndpbmRvdy5saXN0LnNldGRyYXdpbmdtb2RlKDApCisgICAgICAgIHNlbCA9IHNlbGYud2luZG93Lmxpc3QuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKKyAgICAgICAgc2VsZi53aW5kb3cubGlzdC5zZXQoc2VsZi5tb2R1bGVzKQorICAgICAgICBzZWxmLndpbmRvdy5saXN0LnNldHNlbGVjdGVkb2JqZWN0cyhzZWwpCisgICAgICAgIHNlbGYud2luZG93Lmxpc3Quc2V0ZHJhd2luZ21vZGUoMSkKIAogCiBkZWYgZ2V0bW9kdWxlc2xpc3QoKToKLQlpbXBvcnQgUHlCcm93c2VyCSMgZm9yIGNhc2VsZXNzc29ydCBmdW5jdGlvbgotCW1vZHVsZWl0ZW1zID0gc3lzLm1vZHVsZXMuaXRlbXMoKQotCW1vZHVsZWl0ZW1zID0gZmlsdGVyKGxhbWJkYSAobmFtZSwgbW9kdWxlKTogbW9kdWxlIGlzIG5vdCBOb25lLCBtb2R1bGVpdGVtcykKLQltb2R1bGVzID0gbWFwKGxhbWJkYSAobmFtZSwgbW9kdWxlKTogbmFtZSwgbW9kdWxlaXRlbXMpCi0JbW9kdWxlcyA9IFB5QnJvd3Nlci5jYXNlbGVzc3NvcnQobW9kdWxlcykKLQllZGl0bW9kdWxlcyA9IFtdCi0Jc3lzbW9kdWxlcyA9IHN5cy5tb2R1bGVzCi0JbW9kdWxlc2FwcGVuZCA9IGVkaXRtb2R1bGVzLmFwcGVuZAotCWZvciBtIGluIG1vZHVsZXM6Ci0JCW1vZHVsZSA9IHN5c21vZHVsZXNbbV0KLQkJdHJ5OgotCQkJaWYgc3lzbW9kdWxlc1ttXS5fX2ZpbGVfX1stMzpdID09ICcucHknIG9yIFwKLQkJCQkJc3lzbW9kdWxlc1ttXS5fX2ZpbGVfX1stNDpdIGluIFsnLnB5YycsICcucHlvJ106Ci0JCQkJbW9kdWxlc2FwcGVuZCgxKQotCQkJZWxzZToKLQkJCQltb2R1bGVzYXBwZW5kKDApCi0JCWV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLQkJCW1vZHVsZXNhcHBlbmQoMCkKLQlyZXR1cm4gZWRpdG1vZHVsZXMsIG1vZHVsZXMKLQkKLQkKKyAgICBpbXBvcnQgUHlCcm93c2VyICAgICAgICAjIGZvciBjYXNlbGVzc3NvcnQgZnVuY3Rpb24KKyAgICBtb2R1bGVpdGVtcyA9IHN5cy5tb2R1bGVzLml0ZW1zKCkKKyAgICBtb2R1bGVpdGVtcyA9IGZpbHRlcihsYW1iZGEgKG5hbWUsIG1vZHVsZSk6IG1vZHVsZSBpcyBub3QgTm9uZSwgbW9kdWxlaXRlbXMpCisgICAgbW9kdWxlcyA9IG1hcChsYW1iZGEgKG5hbWUsIG1vZHVsZSk6IG5hbWUsIG1vZHVsZWl0ZW1zKQorICAgIG1vZHVsZXMgPSBQeUJyb3dzZXIuY2FzZWxlc3Nzb3J0KG1vZHVsZXMpCisgICAgZWRpdG1vZHVsZXMgPSBbXQorICAgIHN5c21vZHVsZXMgPSBzeXMubW9kdWxlcworICAgIG1vZHVsZXNhcHBlbmQgPSBlZGl0bW9kdWxlcy5hcHBlbmQKKyAgICBmb3IgbSBpbiBtb2R1bGVzOgorICAgICAgICBtb2R1bGUgPSBzeXNtb2R1bGVzW21dCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHN5c21vZHVsZXNbbV0uX19maWxlX19bLTM6XSA9PSAnLnB5JyBvciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzbW9kdWxlc1ttXS5fX2ZpbGVfX1stNDpdIGluIFsnLnB5YycsICcucHlvJ106CisgICAgICAgICAgICAgICAgbW9kdWxlc2FwcGVuZCgxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtb2R1bGVzYXBwZW5kKDApCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIG1vZHVsZXNhcHBlbmQoMCkKKyAgICByZXR1cm4gZWRpdG1vZHVsZXMsIG1vZHVsZXMKKworCiAKIF9icm93c2VyID0gTm9uZQogCiBkZWYgTW9kdWxlQnJvd3NlcigpOgotCWdsb2JhbCBfYnJvd3NlcgotCWlmIF9icm93c2VyIGlzIG5vdCBOb25lOgotCQlfYnJvd3Nlci53aW5kb3cuc2VsZWN0KCkKLQllbHNlOgotCQlfYnJvd3NlciA9IF9tb2R1bGVicm93c2VyKCkKKyAgICBnbG9iYWwgX2Jyb3dzZXIKKyAgICBpZiBfYnJvd3NlciBpcyBub3QgTm9uZToKKyAgICAgICAgX2Jyb3dzZXIud2luZG93LnNlbGVjdCgpCisgICAgZWxzZToKKyAgICAgICAgX2Jyb3dzZXIgPSBfbW9kdWxlYnJvd3NlcigpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1BhY2thZ2VNYW5hZ2VyLnB5IGIvTWFjL1Rvb2xzL0lERS9QYWNrYWdlTWFuYWdlci5weQppbmRleCBlZTYzNTViLi4wMDQxYTE3IDEwMDc1NQotLS0gYS9NYWMvVG9vbHMvSURFL1BhY2thZ2VNYW5hZ2VyLnB5CisrKyBiL01hYy9Ub29scy9JREUvUGFja2FnZU1hbmFnZXIucHkKQEAgLTEsMzcgKzEsMzcgQEAKICMgUHJlbHVkZSB0byBhbGxvdyBydW5uaW5nIHRoaXMgYXMgYSBtYWluIHByb2dyYW0KIGRlZiBfaW5pdCgpOgotCWltcG9ydCBtYWNyZXNvdXJjZQotCWltcG9ydCBzeXMsIG9zCi0JbWFjcmVzb3VyY2UubmVlZCgnRElUTCcsIDQ2OCwgIlB5dGhvbklERS5yc3JjIikKLQl3aWRnZXRyZXNwYXRoc2VncyA9IFtzeXMuZXhlY19wcmVmaXgsICJNYWMiLCAiVG9vbHMiLCAiSURFIiwgIldpZGdldHMucnNyYyJdCi0Jd2lkZ2V0cmVzZmlsZSA9IG9zLnBhdGguam9pbigqd2lkZ2V0cmVzcGF0aHNlZ3MpCi0JaWYgbm90IG9zLnBhdGguZXhpc3RzKHdpZGdldHJlc2ZpbGUpOgotCQl3aWRnZXRyZXNwYXRoc2VncyA9IFtvcy5wYXJkaXIsICJUb29scyIsICJJREUiLCAiV2lkZ2V0cy5yc3JjIl0KLQkJd2lkZ2V0cmVzZmlsZSA9IG9zLnBhdGguam9pbigqd2lkZ2V0cmVzcGF0aHNlZ3MpCi0JcmVmbm8gPSBtYWNyZXNvdXJjZS5uZWVkKCdDVVJTJywgNDY4LCB3aWRnZXRyZXNmaWxlKQotCWlmIG9zLmVudmlyb24uaGFzX2tleSgnUFlUSE9OSURFUEFUSCcpOgotCQkjIEZvciBkZXZlbG9wbWVudCBzZXQgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZQotCQlpZGVfcGF0aCA9IG9zLmVudmlyb25bJ1BZVEhPTklERVBBVEgnXQotCWVsaWYgcmVmbm86Ci0JCSMgV2UncmUgbm90IGEgZnVsbGJsb3duIGFwcGxpY2F0aW9uCi0JCWlkZXBhdGhzZWdzID0gW3N5cy5leGVjX3ByZWZpeCwgIk1hYyIsICJUb29scyIsICJJREUiXQotCQlpZGVfcGF0aCA9IG9zLnBhdGguam9pbigqaWRlcGF0aHNlZ3MpCi0JCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpZGVfcGF0aCk6Ci0JCQlpZGVwYXRoc2VncyA9IFtvcy5wYXJkaXIsICJUb29scyIsICJJREUiXQotCQkJZm9yIHAgaW4gc3lzLnBhdGg6Ci0JCQkJaWRlX3BhdGggPSBvcy5wYXRoLmpvaW4oKihbcF0raWRlcGF0aHNlZ3MpKQotCQkJCWlmIG9zLnBhdGguZXhpc3RzKGlkZV9wYXRoKToKLQkJCQkJYnJlYWsKLQkJCi0JZWxzZToKLQkJIyBXZSBhcmUgYSBmdWxseSBmcm96ZW4gYXBwbGljYXRpb24KLQkJaWRlX3BhdGggPSBzeXMuYXJndlswXQotCWlmIGlkZV9wYXRoIG5vdCBpbiBzeXMucGF0aDoKLQkJc3lzLnBhdGguaW5zZXJ0KDAsIGlkZV9wYXRoKQotCQkKKyAgICBpbXBvcnQgbWFjcmVzb3VyY2UKKyAgICBpbXBvcnQgc3lzLCBvcworICAgIG1hY3Jlc291cmNlLm5lZWQoJ0RJVEwnLCA0NjgsICJQeXRob25JREUucnNyYyIpCisgICAgd2lkZ2V0cmVzcGF0aHNlZ3MgPSBbc3lzLmV4ZWNfcHJlZml4LCAiTWFjIiwgIlRvb2xzIiwgIklERSIsICJXaWRnZXRzLnJzcmMiXQorICAgIHdpZGdldHJlc2ZpbGUgPSBvcy5wYXRoLmpvaW4oKndpZGdldHJlc3BhdGhzZWdzKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh3aWRnZXRyZXNmaWxlKToKKyAgICAgICAgd2lkZ2V0cmVzcGF0aHNlZ3MgPSBbb3MucGFyZGlyLCAiVG9vbHMiLCAiSURFIiwgIldpZGdldHMucnNyYyJdCisgICAgICAgIHdpZGdldHJlc2ZpbGUgPSBvcy5wYXRoLmpvaW4oKndpZGdldHJlc3BhdGhzZWdzKQorICAgIHJlZm5vID0gbWFjcmVzb3VyY2UubmVlZCgnQ1VSUycsIDQ2OCwgd2lkZ2V0cmVzZmlsZSkKKyAgICBpZiBvcy5lbnZpcm9uLmhhc19rZXkoJ1BZVEhPTklERVBBVEgnKToKKyAgICAgICAgIyBGb3IgZGV2ZWxvcG1lbnQgc2V0IHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgaWRlX3BhdGggPSBvcy5lbnZpcm9uWydQWVRIT05JREVQQVRIJ10KKyAgICBlbGlmIHJlZm5vOgorICAgICAgICAjIFdlJ3JlIG5vdCBhIGZ1bGxibG93biBhcHBsaWNhdGlvbgorICAgICAgICBpZGVwYXRoc2VncyA9IFtzeXMuZXhlY19wcmVmaXgsICJNYWMiLCAiVG9vbHMiLCAiSURFIl0KKyAgICAgICAgaWRlX3BhdGggPSBvcy5wYXRoLmpvaW4oKmlkZXBhdGhzZWdzKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaWRlX3BhdGgpOgorICAgICAgICAgICAgaWRlcGF0aHNlZ3MgPSBbb3MucGFyZGlyLCAiVG9vbHMiLCAiSURFIl0KKyAgICAgICAgICAgIGZvciBwIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgICAgIGlkZV9wYXRoID0gb3MucGF0aC5qb2luKCooW3BdK2lkZXBhdGhzZWdzKSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpZGVfcGF0aCk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBlbHNlOgorICAgICAgICAjIFdlIGFyZSBhIGZ1bGx5IGZyb3plbiBhcHBsaWNhdGlvbgorICAgICAgICBpZGVfcGF0aCA9IHN5cy5hcmd2WzBdCisgICAgaWYgaWRlX3BhdGggbm90IGluIHN5cy5wYXRoOgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgaWRlX3BhdGgpCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JX2luaXQoKQotCQorICAgIF9pbml0KCkKKwogaW1wb3J0IFcKIGltcG9ydCBXYXBwbGljYXRpb24KIGZyb20gQ2FyYm9uIGltcG9ydCBFdnQKQEAgLTQ4LDQyNCArNDgsNDI0IEBACiBQQUNLTUFOX0hPTUVQQUdFPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvcGFja21hbiIKIAogRUxJUFNFUyA9ICcuLi4nCi0JCQorCiBVU0VSX0lOU1RBTExfRElSID0gb3MucGF0aC5qb2luKG9zLmVudmlyb24uZ2V0KCdIT01FJywgJycpLAotCQkJCQkJCQknTGlicmFyeScsCi0JCQkJCQkJCSdQeXRob24nLAotCQkJCQkJCQlzeXMudmVyc2lvbls6M10sCi0JCQkJCQkJCSdzaXRlLXBhY2thZ2VzJykKLQkJCQkJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpYnJhcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQeXRob24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uWzozXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycpCisKIGNsYXNzIFBhY2thZ2VNYW5hZ2VyTWFpbihXYXBwbGljYXRpb24uQXBwbGljYXRpb24pOgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJc2VsZi5wcmVmZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oIlB5dGhvbiIsICJQYWNrYWdlIEluc3RhbGwgTWFuYWdlciBQcmVmcyIpCi0JCVdhcHBsaWNhdGlvbi5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmLCAnUGltcCcpCi0JCWZyb20gQ2FyYm9uIGltcG9ydCBBRQotCQlmcm9tIENhcmJvbiBpbXBvcnQgQXBwbGVFdmVudHMKLQkJc2VsZi5kZWZhdWx0dXJsID0gIiIKLQkJCi0JCUFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRU9wZW5BcHBsaWNhdGlvbiwgCi0JCQkJc2VsZi5pZ25vcmVldmVudCkKLQkJQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFUmVvcGVuQXBwbGljYXRpb24sIAotCQkJCXNlbGYuaWdub3JlZXZlbnQpCi0JCUFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRVByaW50RG9jdW1lbnRzLCAKLQkJCQlzZWxmLmlnbm9yZWV2ZW50KQotCQlBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVRdWl0QXBwbGljYXRpb24sIAotCQkJCXNlbGYucXVpdGV2ZW50KQotCQlpZiAxOgotCQkJaW1wb3J0IFB5Q29uc29sZQotCQkJIyBXaXRoIC1EIG9wdGlvbiAoT1NYIGNvbW1hbmQgbGluZSBvbmx5KSBrZWVwIHN0ZGVyciwgZm9yIGRlYnVnZ2luZyB0aGUgSURFCi0JCQkjIGl0c2VsZi4KLQkJCWRlYnVnX3N0ZGVyciA9IE5vbmUKLQkJCWlmIGxlbihzeXMuYXJndikgPj0gMiBhbmQgc3lzLmFyZ3ZbMV0gPT0gJy1EJzoKLQkJCQlkZWJ1Z19zdGRlcnIgPSBzeXMuc3RkZXJyCi0JCQkJZGVsIHN5cy5hcmd2WzFdCi0JCQlQeUNvbnNvbGUuaW5zdGFsbG91dHB1dCgpCi0JCQlpZiBkZWJ1Z19zdGRlcnI6Ci0JCQkJc3lzLnN0ZGVyciA9IGRlYnVnX3N0ZGVycgotCQlzZWxmLmRvbWVudV9vcGVuc3RhbmRhcmQoKQotCQlzZWxmLm1haW5sb29wKCkKLQkJCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCW0gPSBXYXBwbGljYXRpb24uTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJbmV3aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3BlbiBTdGFuZGFyZCBEYXRhYmFzZSIsICJOIiwgJ29wZW5zdGFuZGFyZCcpCi0JCW5ld2V4cGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk9wZW4gRXhwZXJpbWVudGFsIERhdGFiYXNlIiwgTm9uZSwgJ29wZW5leHBlcmltZW50YWwnKQotCQluZXdleHBpdGVtLmVuYWJsZShwaW1wLlBJTVBfVkVSU0lPTiA+PSAiMC40IikKLQkJb3Blbml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk9wZW4iK0VMSVBTRVMsICJPIiwgJ29wZW4nKQotCQlvcGVuVVJMaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3BlbiBVUkwiK0VMSVBTRVMsICJEIiwgJ29wZW5VUkwnKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCW1vcmVpbmZvaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTW9yZSBEYXRhYmFzZXMiLCBOb25lLCAnb3BlbmRhdGFiYXNlcGFnZScpCi0JCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJY2xvc2VpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgJ2Nsb3NlJykKLSMjCQlzYXZlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgJ3NhdmUnKQotIyMJCXNhdmVhc2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNhdmUgYXMiK0VMSVBTRVMsIE5vbmUsICdzYXZlX2FzJykKLSMjCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCQotCQltID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCi0JCXVuZG9pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJVbmRvIiwgJ1onLCAidW5kbyIpCi0JCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJY3V0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiQ3V0IiwgJ1gnLCAiY3V0IikKLQkJY29weWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkNvcHkiLCAiQyIsICJjb3B5IikKLQkJcGFzdGVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgInBhc3RlIikKLQkJRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDbGVhciIsIE5vbmUsICAiY2xlYXIiKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCXNlbGFsbGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNlbGVjdCBhbGwiLCAiQSIsICJzZWxlY3RhbGwiKQotCQkKLQkJbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIlBhY2thZ2UiKQotCQlydW5pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJJbnN0YWxsIiwgIkkiLCAnaW5zdGFsbCcpCi0JCWhvbWVwYWdlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiVmlzaXQgSG9tZXBhZ2UiLCBOb25lLCAnaG9tZXBhZ2UnKQotCQkKLQkJc2VsZi5vcGVud2luZG93c21lbnUgPSBXYXBwbGljYXRpb24uTWVudShzZWxmLm1lbnViYXIsICdXaW5kb3dzJykKLQkJc2VsZi5tYWtlb3BlbndpbmRvd3NtZW51KCkKLQkJc2VsZi5tYWtlaGVscG1lbnUoKQotCQlzZWxmLl9tZW51c3RvY2hlY2sgPSBbY2xvc2VpdGVtLCAKLQkJCQl1bmRvaXRlbSwgY3V0aXRlbSwgY29weWl0ZW0sIHBhc3RlaXRlbSwgCi0JCQkJc2VsYWxsaXRlbSwKLQkJCQlydW5pdGVtLCBob21lcGFnZWl0ZW1dCi0JCQkKLQlkZWYgbWFrZWhlbHBtZW51KHNlbGYpOgotCQlweXRob25fYXBwID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdSZXNvdXJjZXMvUHl0aG9uLmFwcCcpCi0JCWhlbHBfc291cmNlID0gb3MucGF0aC5qb2luKHB5dGhvbl9hcHAsICdDb250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9Eb2N1bWVudGF0aW9uJykKLQkJaGFzaGVscCA9IG9zLnBhdGguaXNkaXIoaGVscF9zb3VyY2UpCiAKLQkJc2VsZi5oZWxwbWVudSA9IG0gPSBzZWxmLmdldGhlbHBtZW51KCkKLQkJaGVscGl0ZW0xID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQYWNrYWdlTWFuYWdlciBIZWxwIiwgTm9uZSwgc2VsZi5kb21lbnVfcGFja21hbmhlbHApCi0JCWhlbHBpdGVtMS5lbmFibGUoaGFzaGVscCkKLQkJaGVscGl0ZW0yID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJNYWNQeXRob24gSGVscCIsIE5vbmUsIHNlbGYuZG9tZW51X3B5dGhvbmhlbHApCi0JCWhlbHBpdGVtMi5lbmFibGUoaGFzaGVscCkKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucHJlZmZpbGVwYXRoID0gb3MucGF0aC5qb2luKCJQeXRob24iLCAiUGFja2FnZSBJbnN0YWxsIE1hbmFnZXIgUHJlZnMiKQorICAgICAgICBXYXBwbGljYXRpb24uQXBwbGljYXRpb24uX19pbml0X18oc2VsZiwgJ1BpbXAnKQorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgQUUKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFwcGxlRXZlbnRzCisgICAgICAgIHNlbGYuZGVmYXVsdHVybCA9ICIiCiAKLQlkZWYgcXVpdGV2ZW50KHNlbGYsIHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5KToKLQkJc2VsZi5fcXVpdCgpCi0JCQotCWRlZiBpZ25vcmVldmVudChzZWxmLCB0aGVBcHBsZUV2ZW50LCB0aGVSZXBseSk6Ci0JCXBhc3MKLQkKLQlkZWYgb3BlbmRvY3NldmVudChzZWxmLCB0aGVBcHBsZUV2ZW50LCB0aGVSZXBseSk6Ci0JCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JCWltcG9ydCBhZXRvb2xzCi0JCXBhcmFtZXRlcnMsIGFyZ3MgPSBhZXRvb2xzLnVucGFja2V2ZW50KHRoZUFwcGxlRXZlbnQpCi0JCWRvY3MgPSBwYXJhbWV0ZXJzWyctLS0tJ10KLQkJaWYgdHlwZShkb2NzKSA8PiB0eXBlKFtdKToKLQkJCWRvY3MgPSBbZG9jc10KLQkJZm9yIGRvYyBpbiBkb2NzOgotCQkJZnNyLCBhID0gZG9jLkZTUmVzb2x2ZUFsaWFzKE5vbmUpCi0JCQlwYXRoID0gZnNyLmFzX3BhdGhuYW1lKCkKLQkJCXBhdGggPSB1cmxsaWIucGF0aG5hbWUydXJsKHBhdGgpCi0JCQlzZWxmLm9wZW5kb2MocGF0aCkKLQkKLQlkZWYgb3BlbmRvYyhzZWxmLCB1cmwpOgotCQlpZiB1cmw6Ci0JCQlzZWxmLmRlZmF1bHR1cmwgPSB1cmwKLQkJUGFja2FnZUJyb3dzZXIodXJsKQotCQotCWRlZiBnZXRhYm91dHRleHQoc2VsZik6Ci0JCXJldHVybiAiQWJvdXQgUGFja2FnZSBNYW5hZ2VyIitFTElQU0VTCi0JCi0JZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKLQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiUGFja2FnZSBJbnN0YWxsIE1hbmFnZXIgZm9yIFB5dGhvblxuUGFja01hbiBlbmdpbmUgKHBpbXApIHZlcnNpb246ICVzIiAlCi0JCQlwaW1wLlBJTVBfVkVSU0lPTikKLQkKLQlkZWYgZG9tZW51X29wZW5zdGFuZGFyZChzZWxmLCAqYXJncyk6Ci0JCWlmIHBpbXAuUElNUF9WRVJTSU9OID49ICIwLjQiOgotCQkJdXJsID0gcGltcC5nZXREZWZhdWx0RGF0YWJhc2UoKQotCQllbHNlOgotCQkJIyAwLjMgY29tcGF0aWJpbGl0eQotCQkJdXJsID0gTm9uZQotCQlzZWxmLm9wZW5kb2ModXJsKQotCQkKLQlkZWYgZG9tZW51X29wZW5leHBlcmltZW50YWwoc2VsZiwgKmFyZ3MpOgotCQlkYXRhYmFzZSA9IHBpbXAuZ2V0RGVmYXVsdERhdGFiYXNlKGV4cGVyaW1lbnRhbD1UcnVlKQotCQlzZWxmLm9wZW5kb2MoZGF0YWJhc2UpCi0JCQotCWRlZiBkb21lbnVfb3BlbihzZWxmLCAqYXJncyk6Ci0JCWZpbGVuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4odHlwZUxpc3Q9KCJURVhUIiwpKQotCQlpZiBmaWxlbmFtZToKLQkJCWZpbGVuYW1lID0gdXJsbGliLnBhdGhuYW1lMnVybChmaWxlbmFtZSkKLQkJCXNlbGYub3BlbmRvYyhmaWxlbmFtZSkKLQkJCQotCWRlZiBkb21lbnVfb3BlblVSTChzZWxmLCAqYXJncyk6Ci0JCW9rID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoCi0JCQkiV2FybmluZzogYnkgb3BlbmluZyBhIG5vbi1zdGFuZGFyZCBkYXRhYmFzZSAiCi0JCQkieW91IGFyZSB0cnVzdGluZyB0aGUgbWFpbnRhaW5lciBvZiBpdCAiCi0JCQkidG8gcnVuIGFyYml0cmFyeSBjb2RlIG9uIHlvdXIgbWFjaGluZS4iLAotCQkJeWVzPSJPSyIsIG5vPSIiKQotCQlpZiBvayA8PSAwOiByZXR1cm4KLQkJdXJsID0gRWFzeURpYWxvZ3MuQXNrU3RyaW5nKCJVUkwgb2YgZGF0YWJhc2UgdG8gb3BlbjoiLCAKLQkJCWRlZmF1bHQ9c2VsZi5kZWZhdWx0dXJsLCBvaz0iT3BlbiIpCi0JCWlmIHVybDoKLQkJCXNlbGYub3BlbmRvYyh1cmwpCi0JCi0JZGVmIGRvbWVudV9vcGVuZGF0YWJhc2VwYWdlKHNlbGYpOgotCQlpbXBvcnQgaWMKLQkJCQotCQlpY3IgPSBpYy5JQygpCi0JCWljci5sYXVuY2h1cmwoUEFDS01BTl9IT01FUEFHRSkKLQlkZWYgbWFrZW9wZW53aW5kb3dzbWVudShzZWxmKToKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYub3BlbndpbmRvd3NtZW51Lml0ZW1zKSk6Ci0JCQlzZWxmLm9wZW53aW5kb3dzbWVudS5tZW51LkRlbGV0ZU1lbnVJdGVtKDEpCi0JCQlzZWxmLm9wZW53aW5kb3dzbWVudS5pdGVtcyA9IFtdCi0JCXdpbmRvd3MgPSBbXQotCQlzZWxmLl9vcGVud2luZG93cyA9IHt9Ci0JCWZvciB3aW5kb3cgaW4gc2VsZi5fd2luZG93cy5rZXlzKCk6Ci0JCQl0aXRsZSA9IHdpbmRvdy5HZXRXVGl0bGUoKQotCQkJaWYgbm90IHRpdGxlOgotCQkJCXRpdGxlID0gIjxubyB0aXRsZT4iCi0JCQl3aW5kb3dzLmFwcGVuZCgodGl0bGUsIHdpbmRvdykpCi0JCXdpbmRvd3Muc29ydCgpCi0JCWZvciB0aXRsZSwgd2luZG93IGluIHdpbmRvd3M6Ci0JCQlzaG9ydGN1dCA9IE5vbmUKLQkJCWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0oc2VsZi5vcGVud2luZG93c21lbnUsIHRpdGxlLCBzaG9ydGN1dCwgY2FsbGJhY2sgPSBzZWxmLmRvbWVudV9vcGVud2luZG93cykKLQkJCXNlbGYuX29wZW53aW5kb3dzW2l0ZW0uaXRlbV0gPSB3aW5kb3cKLQkJc2VsZi5fb3BlbndpbmRvd3NjaGVja21hcmsgPSAwCi0JCXNlbGYuY2hlY2tvcGVud2luZG93c21lbnUoKQotCQkKLQlkZWYgZG9tZW51X29wZW53aW5kb3dzKHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKLQkJdyA9IHNlbGYuX29wZW53aW5kb3dzW2l0ZW1dCi0JCXcuU2hvd1dpbmRvdygpCi0JCXcuU2VsZWN0V2luZG93KCkKLQkKLQlkZWYgZG9tZW51X3F1aXQoc2VsZik6Ci0JCXNlbGYuX3F1aXQoKQotCQotCWRlZiBkb21lbnVfc2F2ZShzZWxmLCAqYXJncyk6Ci0JCXByaW50ICJTYXZlIgotCQotCWRlZiBkb21lbnVfcHl0aG9uaGVscChzZWxmLCAqYXJncyk6Ci0JCWZyb20gQ2FyYm9uIGltcG9ydCBBSAotCQlBSC5BSEdvdG9QYWdlKCJNYWNQeXRob24gSGVscCIsIE5vbmUsIE5vbmUpCi0JCQotCWRlZiBkb21lbnVfcGFja21hbmhlbHAoc2VsZiwgKmFyZ3MpOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgQUgKLQkJQUguQUhHb3RvUGFnZSgiTWFjUHl0aG9uIEhlbHAiLCAicGFja21hbi5odG1sIiwgTm9uZSkKLQkJCi0JZGVmIF9xdWl0KHNlbGYpOgotIyMJCWltcG9ydCBQeUNvbnNvbGUsIFB5RWRpdAotCQlmb3Igd2luZG93IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6Ci0JCQl0cnk6Ci0JCQkJcnYgPSB3aW5kb3cuY2xvc2UoKSAjIGlnbm9yZSBhbnkgZXJyb3JzIHdoaWxlIHF1aXR0aW5nCi0JCQlleGNlcHQ6Ci0JCQkJcnYgPSAwCSAjIChvdGhlcndpc2UsIHdlIGNhbiBnZXQgc3R1Y2shKQotCQkJaWYgcnYgYW5kIHJ2ID4gMDoKLQkJCQlyZXR1cm4KLSMjCQl0cnk6Ci0jIwkJCVB5Q29uc29sZS5jb25zb2xlLndyaXRlcHJlZnMoKQotIyMJCQlQeUNvbnNvbGUub3V0cHV0LndyaXRlcHJlZnMoKQotIyMJCQlQeUVkaXQuc2VhcmNoZW5naW5lLndyaXRlcHJlZnMoKQotIyMJCWV4Y2VwdDoKLSMjCQkJIyBXcml0ZSB0byBfX3N0ZGVycl9fIHNvIHRoZSBtc2cgZW5kIHVwIGluIENvbnNvbGUuYXBwIGFuZCBoYXMKLSMjCQkJIyBhdCBsZWFzdCBfc29tZV8gY2hhbmNlIG9mIGdldHRpbmcgcmVhZC4uLgotIyMJCQkjIEJ1dDogdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHdheSBtb3JlIHNlcmlvdXMgcHJvYmxlbXMgd2l0aAotIyMJCQkjIHRoZSBQeXRob24gMi4yIEphZ3VhciBhZGRvbi4KLSMjCQkJc3lzLl9fc3RkZXJyX18ud3JpdGUoIioqKiBQeXRob25JREU6IENhbid0IHdyaXRlIHByZWZlcmVuY2VzICoqKlxuIikKLQkJc2VsZi5xdWl0dGluZyA9IDEKLQkJCisgICAgICAgIEFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRU9wZW5BcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlZXZlbnQpCisgICAgICAgIEFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRVJlb3BlbkFwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVldmVudCkKKyAgICAgICAgQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFUHJpbnREb2N1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZWV2ZW50KQorICAgICAgICBBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVRdWl0QXBwbGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1aXRldmVudCkKKyAgICAgICAgaWYgMToKKyAgICAgICAgICAgIGltcG9ydCBQeUNvbnNvbGUKKyAgICAgICAgICAgICMgV2l0aCAtRCBvcHRpb24gKE9TWCBjb21tYW5kIGxpbmUgb25seSkga2VlcCBzdGRlcnIsIGZvciBkZWJ1Z2dpbmcgdGhlIElERQorICAgICAgICAgICAgIyBpdHNlbGYuCisgICAgICAgICAgICBkZWJ1Z19zdGRlcnIgPSBOb25lCisgICAgICAgICAgICBpZiBsZW4oc3lzLmFyZ3YpID49IDIgYW5kIHN5cy5hcmd2WzFdID09ICctRCc6CisgICAgICAgICAgICAgICAgZGVidWdfc3RkZXJyID0gc3lzLnN0ZGVycgorICAgICAgICAgICAgICAgIGRlbCBzeXMuYXJndlsxXQorICAgICAgICAgICAgUHlDb25zb2xlLmluc3RhbGxvdXRwdXQoKQorICAgICAgICAgICAgaWYgZGVidWdfc3RkZXJyOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBkZWJ1Z19zdGRlcnIKKyAgICAgICAgc2VsZi5kb21lbnVfb3BlbnN0YW5kYXJkKCkKKyAgICAgICAgc2VsZi5tYWlubG9vcCgpCisKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQorICAgICAgICBuZXdpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJPcGVuIFN0YW5kYXJkIERhdGFiYXNlIiwgIk4iLCAnb3BlbnN0YW5kYXJkJykKKyAgICAgICAgbmV3ZXhwaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3BlbiBFeHBlcmltZW50YWwgRGF0YWJhc2UiLCBOb25lLCAnb3BlbmV4cGVyaW1lbnRhbCcpCisgICAgICAgIG5ld2V4cGl0ZW0uZW5hYmxlKHBpbXAuUElNUF9WRVJTSU9OID49ICIwLjQiKQorICAgICAgICBvcGVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3BlbiIrRUxJUFNFUywgIk8iLCAnb3BlbicpCisgICAgICAgIG9wZW5VUkxpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJPcGVuIFVSTCIrRUxJUFNFUywgIkQiLCAnb3BlblVSTCcpCisgICAgICAgIEZyYW1lV29yay5TZXBhcmF0b3IobSkKKyAgICAgICAgbW9yZWluZm9pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJNb3JlIERhdGFiYXNlcyIsIE5vbmUsICdvcGVuZGF0YWJhc2VwYWdlJykKKyAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICBjbG9zZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkNsb3NlIiwgIlciLCAnY2xvc2UnKQorIyMgICAgICAgICAgICAgIHNhdmVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTYXZlIiwgIlMiLCAnc2F2ZScpCisjIyAgICAgICAgICAgICAgc2F2ZWFzaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2F2ZSBhcyIrRUxJUFNFUywgTm9uZSwgJ3NhdmVfYXMnKQorIyMgICAgICAgICAgICAgIEZyYW1lV29yay5TZXBhcmF0b3IobSkKKworICAgICAgICBtID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCisgICAgICAgIHVuZG9pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJVbmRvIiwgJ1onLCAidW5kbyIpCisgICAgICAgIEZyYW1lV29yay5TZXBhcmF0b3IobSkKKyAgICAgICAgY3V0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiQ3V0IiwgJ1gnLCAiY3V0IikKKyAgICAgICAgY29weWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkNvcHkiLCAiQyIsICJjb3B5IikKKyAgICAgICAgcGFzdGVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgInBhc3RlIikKKyAgICAgICAgRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDbGVhciIsIE5vbmUsICAiY2xlYXIiKQorICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgIHNlbGFsbGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNlbGVjdCBhbGwiLCAiQSIsICJzZWxlY3RhbGwiKQorCisgICAgICAgIG0gPSBXYXBwbGljYXRpb24uTWVudShzZWxmLm1lbnViYXIsICJQYWNrYWdlIikKKyAgICAgICAgcnVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiSW5zdGFsbCIsICJJIiwgJ2luc3RhbGwnKQorICAgICAgICBob21lcGFnZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlZpc2l0IEhvbWVwYWdlIiwgTm9uZSwgJ2hvbWVwYWdlJykKKworICAgICAgICBzZWxmLm9wZW53aW5kb3dzbWVudSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgJ1dpbmRvd3MnKQorICAgICAgICBzZWxmLm1ha2VvcGVud2luZG93c21lbnUoKQorICAgICAgICBzZWxmLm1ha2VoZWxwbWVudSgpCisgICAgICAgIHNlbGYuX21lbnVzdG9jaGVjayA9IFtjbG9zZWl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmRvaXRlbSwgY3V0aXRlbSwgY29weWl0ZW0sIHBhc3RlaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGFsbGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBydW5pdGVtLCBob21lcGFnZWl0ZW1dCisKKyAgICBkZWYgbWFrZWhlbHBtZW51KHNlbGYpOgorICAgICAgICBweXRob25fYXBwID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdSZXNvdXJjZXMvUHl0aG9uLmFwcCcpCisgICAgICAgIGhlbHBfc291cmNlID0gb3MucGF0aC5qb2luKHB5dGhvbl9hcHAsICdDb250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9Eb2N1bWVudGF0aW9uJykKKyAgICAgICAgaGFzaGVscCA9IG9zLnBhdGguaXNkaXIoaGVscF9zb3VyY2UpCisKKyAgICAgICAgc2VsZi5oZWxwbWVudSA9IG0gPSBzZWxmLmdldGhlbHBtZW51KCkKKyAgICAgICAgaGVscGl0ZW0xID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQYWNrYWdlTWFuYWdlciBIZWxwIiwgTm9uZSwgc2VsZi5kb21lbnVfcGFja21hbmhlbHApCisgICAgICAgIGhlbHBpdGVtMS5lbmFibGUoaGFzaGVscCkKKyAgICAgICAgaGVscGl0ZW0yID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJNYWNQeXRob24gSGVscCIsIE5vbmUsIHNlbGYuZG9tZW51X3B5dGhvbmhlbHApCisgICAgICAgIGhlbHBpdGVtMi5lbmFibGUoaGFzaGVscCkKKworICAgIGRlZiBxdWl0ZXZlbnQoc2VsZiwgdGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgIGRlZiBpZ25vcmVldmVudChzZWxmLCB0aGVBcHBsZUV2ZW50LCB0aGVSZXBseSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBvcGVuZG9jc2V2ZW50KHNlbGYsIHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5KToKKyAgICAgICAgVy5TZXRDdXJzb3IoJ3dhdGNoJykKKyAgICAgICAgaW1wb3J0IGFldG9vbHMKKyAgICAgICAgcGFyYW1ldGVycywgYXJncyA9IGFldG9vbHMudW5wYWNrZXZlbnQodGhlQXBwbGVFdmVudCkKKyAgICAgICAgZG9jcyA9IHBhcmFtZXRlcnNbJy0tLS0nXQorICAgICAgICBpZiB0eXBlKGRvY3MpIDw+IHR5cGUoW10pOgorICAgICAgICAgICAgZG9jcyA9IFtkb2NzXQorICAgICAgICBmb3IgZG9jIGluIGRvY3M6CisgICAgICAgICAgICBmc3IsIGEgPSBkb2MuRlNSZXNvbHZlQWxpYXMoTm9uZSkKKyAgICAgICAgICAgIHBhdGggPSBmc3IuYXNfcGF0aG5hbWUoKQorICAgICAgICAgICAgcGF0aCA9IHVybGxpYi5wYXRobmFtZTJ1cmwocGF0aCkKKyAgICAgICAgICAgIHNlbGYub3BlbmRvYyhwYXRoKQorCisgICAgZGVmIG9wZW5kb2Moc2VsZiwgdXJsKToKKyAgICAgICAgaWYgdXJsOgorICAgICAgICAgICAgc2VsZi5kZWZhdWx0dXJsID0gdXJsCisgICAgICAgIFBhY2thZ2VCcm93c2VyKHVybCkKKworICAgIGRlZiBnZXRhYm91dHRleHQoc2VsZik6CisgICAgICAgIHJldHVybiAiQWJvdXQgUGFja2FnZSBNYW5hZ2VyIitFTElQU0VTCisKKyAgICBkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJQYWNrYWdlIEluc3RhbGwgTWFuYWdlciBmb3IgUHl0aG9uXG5QYWNrTWFuIGVuZ2luZSAocGltcCkgdmVyc2lvbjogJXMiICUKKyAgICAgICAgICAgICAgICBwaW1wLlBJTVBfVkVSU0lPTikKKworICAgIGRlZiBkb21lbnVfb3BlbnN0YW5kYXJkKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgcGltcC5QSU1QX1ZFUlNJT04gPj0gIjAuNCI6CisgICAgICAgICAgICB1cmwgPSBwaW1wLmdldERlZmF1bHREYXRhYmFzZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIDAuMyBjb21wYXRpYmlsaXR5CisgICAgICAgICAgICB1cmwgPSBOb25lCisgICAgICAgIHNlbGYub3BlbmRvYyh1cmwpCisKKyAgICBkZWYgZG9tZW51X29wZW5leHBlcmltZW50YWwoc2VsZiwgKmFyZ3MpOgorICAgICAgICBkYXRhYmFzZSA9IHBpbXAuZ2V0RGVmYXVsdERhdGFiYXNlKGV4cGVyaW1lbnRhbD1UcnVlKQorICAgICAgICBzZWxmLm9wZW5kb2MoZGF0YWJhc2UpCisKKyAgICBkZWYgZG9tZW51X29wZW4oc2VsZiwgKmFyZ3MpOgorICAgICAgICBmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgiVEVYVCIsKSkKKyAgICAgICAgaWYgZmlsZW5hbWU6CisgICAgICAgICAgICBmaWxlbmFtZSA9IHVybGxpYi5wYXRobmFtZTJ1cmwoZmlsZW5hbWUpCisgICAgICAgICAgICBzZWxmLm9wZW5kb2MoZmlsZW5hbWUpCisKKyAgICBkZWYgZG9tZW51X29wZW5VUkwoc2VsZiwgKmFyZ3MpOgorICAgICAgICBvayA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKAorICAgICAgICAgICAgICAgICJXYXJuaW5nOiBieSBvcGVuaW5nIGEgbm9uLXN0YW5kYXJkIGRhdGFiYXNlICIKKyAgICAgICAgICAgICAgICAieW91IGFyZSB0cnVzdGluZyB0aGUgbWFpbnRhaW5lciBvZiBpdCAiCisgICAgICAgICAgICAgICAgInRvIHJ1biBhcmJpdHJhcnkgY29kZSBvbiB5b3VyIG1hY2hpbmUuIiwKKyAgICAgICAgICAgICAgICB5ZXM9Ik9LIiwgbm89IiIpCisgICAgICAgIGlmIG9rIDw9IDA6IHJldHVybgorICAgICAgICB1cmwgPSBFYXN5RGlhbG9ncy5Bc2tTdHJpbmcoIlVSTCBvZiBkYXRhYmFzZSB0byBvcGVuOiIsCisgICAgICAgICAgICAgICAgZGVmYXVsdD1zZWxmLmRlZmF1bHR1cmwsIG9rPSJPcGVuIikKKyAgICAgICAgaWYgdXJsOgorICAgICAgICAgICAgc2VsZi5vcGVuZG9jKHVybCkKKworICAgIGRlZiBkb21lbnVfb3BlbmRhdGFiYXNlcGFnZShzZWxmKToKKyAgICAgICAgaW1wb3J0IGljCisKKyAgICAgICAgaWNyID0gaWMuSUMoKQorICAgICAgICBpY3IubGF1bmNodXJsKFBBQ0tNQU5fSE9NRVBBR0UpCisgICAgZGVmIG1ha2VvcGVud2luZG93c21lbnUoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLm9wZW53aW5kb3dzbWVudS5pdGVtcykpOgorICAgICAgICAgICAgc2VsZi5vcGVud2luZG93c21lbnUubWVudS5EZWxldGVNZW51SXRlbSgxKQorICAgICAgICAgICAgc2VsZi5vcGVud2luZG93c21lbnUuaXRlbXMgPSBbXQorICAgICAgICB3aW5kb3dzID0gW10KKyAgICAgICAgc2VsZi5fb3BlbndpbmRvd3MgPSB7fQorICAgICAgICBmb3Igd2luZG93IGluIHNlbGYuX3dpbmRvd3Mua2V5cygpOgorICAgICAgICAgICAgdGl0bGUgPSB3aW5kb3cuR2V0V1RpdGxlKCkKKyAgICAgICAgICAgIGlmIG5vdCB0aXRsZToKKyAgICAgICAgICAgICAgICB0aXRsZSA9ICI8bm8gdGl0bGU+IgorICAgICAgICAgICAgd2luZG93cy5hcHBlbmQoKHRpdGxlLCB3aW5kb3cpKQorICAgICAgICB3aW5kb3dzLnNvcnQoKQorICAgICAgICBmb3IgdGl0bGUsIHdpbmRvdyBpbiB3aW5kb3dzOgorICAgICAgICAgICAgc2hvcnRjdXQgPSBOb25lCisgICAgICAgICAgICBpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKHNlbGYub3BlbndpbmRvd3NtZW51LCB0aXRsZSwgc2hvcnRjdXQsIGNhbGxiYWNrID0gc2VsZi5kb21lbnVfb3BlbndpbmRvd3MpCisgICAgICAgICAgICBzZWxmLl9vcGVud2luZG93c1tpdGVtLml0ZW1dID0gd2luZG93CisgICAgICAgIHNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrID0gMAorICAgICAgICBzZWxmLmNoZWNrb3BlbndpbmRvd3NtZW51KCkKKworICAgIGRlZiBkb21lbnVfb3BlbndpbmRvd3Moc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICB3ID0gc2VsZi5fb3BlbndpbmRvd3NbaXRlbV0KKyAgICAgICAgdy5TaG93V2luZG93KCkKKyAgICAgICAgdy5TZWxlY3RXaW5kb3coKQorCisgICAgZGVmIGRvbWVudV9xdWl0KHNlbGYpOgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgIGRlZiBkb21lbnVfc2F2ZShzZWxmLCAqYXJncyk6CisgICAgICAgIHByaW50ICJTYXZlIgorCisgICAgZGVmIGRvbWVudV9weXRob25oZWxwKHNlbGYsICphcmdzKToKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFICisgICAgICAgIEFILkFIR290b1BhZ2UoIk1hY1B5dGhvbiBIZWxwIiwgTm9uZSwgTm9uZSkKKworICAgIGRlZiBkb21lbnVfcGFja21hbmhlbHAoc2VsZiwgKmFyZ3MpOgorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgQUgKKyAgICAgICAgQUguQUhHb3RvUGFnZSgiTWFjUHl0aG9uIEhlbHAiLCAicGFja21hbi5odG1sIiwgTm9uZSkKKworICAgIGRlZiBfcXVpdChzZWxmKToKKyMjICAgICAgICAgICAgICBpbXBvcnQgUHlDb25zb2xlLCBQeUVkaXQKKyAgICAgICAgZm9yIHdpbmRvdyBpbiBzZWxmLl93aW5kb3dzLnZhbHVlcygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJ2ID0gd2luZG93LmNsb3NlKCkgIyBpZ25vcmUgYW55IGVycm9ycyB3aGlsZSBxdWl0dGluZworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJ2ID0gMCAgICMgKG90aGVyd2lzZSwgd2UgY2FuIGdldCBzdHVjayEpCisgICAgICAgICAgICBpZiBydiBhbmQgcnYgPiAwOgorICAgICAgICAgICAgICAgIHJldHVybgorIyMgICAgICAgICAgICAgIHRyeToKKyMjICAgICAgICAgICAgICAgICAgICAgIFB5Q29uc29sZS5jb25zb2xlLndyaXRlcHJlZnMoKQorIyMgICAgICAgICAgICAgICAgICAgICAgUHlDb25zb2xlLm91dHB1dC53cml0ZXByZWZzKCkKKyMjICAgICAgICAgICAgICAgICAgICAgIFB5RWRpdC5zZWFyY2hlbmdpbmUud3JpdGVwcmVmcygpCisjIyAgICAgICAgICAgICAgZXhjZXB0OgorIyMgICAgICAgICAgICAgICAgICAgICAgIyBXcml0ZSB0byBfX3N0ZGVycl9fIHNvIHRoZSBtc2cgZW5kIHVwIGluIENvbnNvbGUuYXBwIGFuZCBoYXMKKyMjICAgICAgICAgICAgICAgICAgICAgICMgYXQgbGVhc3QgX3NvbWVfIGNoYW5jZSBvZiBnZXR0aW5nIHJlYWQuLi4KKyMjICAgICAgICAgICAgICAgICAgICAgICMgQnV0OiB0aGlzIGlzIGEgd29ya2Fyb3VuZCBmb3Igd2F5IG1vcmUgc2VyaW91cyBwcm9ibGVtcyB3aXRoCisjIyAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBQeXRob24gMi4yIEphZ3VhciBhZGRvbi4KKyMjICAgICAgICAgICAgICAgICAgICAgIHN5cy5fX3N0ZGVycl9fLndyaXRlKCIqKiogUHl0aG9uSURFOiBDYW4ndCB3cml0ZSBwcmVmZXJlbmNlcyAqKipcbiIpCisgICAgICAgIHNlbGYucXVpdHRpbmcgPSAxCisKIGNsYXNzIFBpbXBJbnRlcmZhY2U6CiAKLQlkZWYgc2V0dXBwaW1wKHNlbGYsIHVybCk6Ci0JCXNlbGYucGltcHByZWZzID0gcGltcC5QaW1wUHJlZmVyZW5jZXMoKQotCQlzZWxmLnBpbXBkYiA9IHBpbXAuUGltcERhdGFiYXNlKHNlbGYucGltcHByZWZzKQotCQlpZiBub3QgdXJsOgotCQkJdXJsID0gc2VsZi5waW1wcHJlZnMucGltcERhdGFiYXNlCi0JCXRyeToKLQkJCXNlbGYucGltcGRiLmFwcGVuZFVSTCh1cmwpCi0JCWV4Y2VwdCBJT0Vycm9yLCBhcmc6Ci0JCQlydiA9ICJDYW5ub3Qgb3BlbiAlczogJXNcbiIgJSAodXJsLCBhcmcpCi0JCQlydiArPSAiXG5TZWUgTWFjUHl0aG9uIFBhY2thZ2UgTWFuYWdlciBoZWxwIHBhZ2UuIgotCQkJcmV0dXJuIHJ2Ci0JCWV4Y2VwdDoKLQkJCXJ2ID0gIlVuc3BlY2lmaWVkIGVycm9yIHdoaWxlIHBhcnNpbmcgZGF0YWJhc2U6ICVzXG4iICUgdXJsCi0JCQlydiArPSAiVXN1YWxseSwgdGhpcyBtZWFucyB0aGUgZGF0YWJhc2UgaXMgbm90IGNvcnJlY3RseSBmb3JtYXR0ZWQuXG4iCi0JCQlydiArPSAiXG5TZWUgTWFjUHl0aG9uIFBhY2thZ2UgTWFuYWdlciBoZWxwIHBhZ2UuIgotCQkJcmV0dXJuIHJ2Ci0JCSMgQ2hlY2sgd2hldGhlciB3ZSBjYW4gd3JpdGUgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0JCSMgSWYgbm90LCBzZXQgdG8gdGhlIHBlci11c2VyIGRpcmVjdG9yeSwgcG9zc2libHkKLQkJIyBjcmVhdGluZyBpdCwgaWYgbmVlZGVkLgotCQlpbnN0YWxsRGlyID0gc2VsZi5waW1wcHJlZnMuaW5zdGFsbERpcgotCQlpZiBub3Qgb3MuYWNjZXNzKGluc3RhbGxEaXIsIG9zLlJfT0t8b3MuV19PS3xvcy5YX09LKToKLQkJCXJ2ID0gc2VsZi5zZXR1c2VyaW5zdGFsbCgxKQotCQkJaWYgcnY6IHJldHVybiBydgotCQlyZXR1cm4gc2VsZi5waW1wcHJlZnMuY2hlY2soKQotCQkKLQlkZWYgY2xvc2VwaW1wKHNlbGYpOgotCQlzZWxmLnBpbXBkYi5jbG9zZSgpCi0JCXNlbGYucGltcHByZWZzID0gTm9uZQotCQlzZWxmLnBpbXBkYiA9IE5vbmUKLQkJc2VsZi5wYWNrYWdlcyA9IFtdCisgICAgZGVmIHNldHVwcGltcChzZWxmLCB1cmwpOgorICAgICAgICBzZWxmLnBpbXBwcmVmcyA9IHBpbXAuUGltcFByZWZlcmVuY2VzKCkKKyAgICAgICAgc2VsZi5waW1wZGIgPSBwaW1wLlBpbXBEYXRhYmFzZShzZWxmLnBpbXBwcmVmcykKKyAgICAgICAgaWYgbm90IHVybDoKKyAgICAgICAgICAgIHVybCA9IHNlbGYucGltcHByZWZzLnBpbXBEYXRhYmFzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnBpbXBkYi5hcHBlbmRVUkwodXJsKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgYXJnOgorICAgICAgICAgICAgcnYgPSAiQ2Fubm90IG9wZW4gJXM6ICVzXG4iICUgKHVybCwgYXJnKQorICAgICAgICAgICAgcnYgKz0gIlxuU2VlIE1hY1B5dGhvbiBQYWNrYWdlIE1hbmFnZXIgaGVscCBwYWdlLiIKKyAgICAgICAgICAgIHJldHVybiBydgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBydiA9ICJVbnNwZWNpZmllZCBlcnJvciB3aGlsZSBwYXJzaW5nIGRhdGFiYXNlOiAlc1xuIiAlIHVybAorICAgICAgICAgICAgcnYgKz0gIlVzdWFsbHksIHRoaXMgbWVhbnMgdGhlIGRhdGFiYXNlIGlzIG5vdCBjb3JyZWN0bHkgZm9ybWF0dGVkLlxuIgorICAgICAgICAgICAgcnYgKz0gIlxuU2VlIE1hY1B5dGhvbiBQYWNrYWdlIE1hbmFnZXIgaGVscCBwYWdlLiIKKyAgICAgICAgICAgIHJldHVybiBydgorICAgICAgICAjIENoZWNrIHdoZXRoZXIgd2UgY2FuIHdyaXRlIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorICAgICAgICAjIElmIG5vdCwgc2V0IHRvIHRoZSBwZXItdXNlciBkaXJlY3RvcnksIHBvc3NpYmx5CisgICAgICAgICMgY3JlYXRpbmcgaXQsIGlmIG5lZWRlZC4KKyAgICAgICAgaW5zdGFsbERpciA9IHNlbGYucGltcHByZWZzLmluc3RhbGxEaXIKKyAgICAgICAgaWYgbm90IG9zLmFjY2VzcyhpbnN0YWxsRGlyLCBvcy5SX09LfG9zLldfT0t8b3MuWF9PSyk6CisgICAgICAgICAgICBydiA9IHNlbGYuc2V0dXNlcmluc3RhbGwoMSkKKyAgICAgICAgICAgIGlmIHJ2OiByZXR1cm4gcnYKKyAgICAgICAgcmV0dXJuIHNlbGYucGltcHByZWZzLmNoZWNrKCkKIAotCWRlZiBzZXR1c2VyaW5zdGFsbChzZWxmLCBvbm9mZik6Ci0JCXJ2ID0gIiIKLQkJaWYgb25vZmY6Ci0JCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoVVNFUl9JTlNUQUxMX0RJUik6Ci0JCQkJdHJ5OgotCQkJCQlvcy5tYWtlZGlycyhVU0VSX0lOU1RBTExfRElSKQotCQkJCWV4Y2VwdCBPU0Vycm9yLCBhcmc6Ci0JCQkJCXJ2ID0gcnYgKyBhcmcgKyAiXG4iCi0JCQlpZiBub3QgVVNFUl9JTlNUQUxMX0RJUiBpbiBzeXMucGF0aDoKLQkJCQlpbXBvcnQgc2l0ZQotCQkJCXJlbG9hZChzaXRlKQotCQkJc2VsZi5waW1wcHJlZnMuc2V0SW5zdGFsbERpcihVU0VSX0lOU1RBTExfRElSKQotCQllbHNlOgotCQkJc2VsZi5waW1wcHJlZnMuc2V0SW5zdGFsbERpcihOb25lKQotCQlydiA9IHJ2ICsgc2VsZi5waW1wcHJlZnMuY2hlY2soKQotCQlyZXR1cm4gcnYKLQkJCi0JZGVmIGdldHVzZXJpbnN0YWxsKHNlbGYpOgotCQlyZXR1cm4gc2VsZi5waW1wcHJlZnMuaW5zdGFsbERpciA9PSBVU0VSX0lOU1RBTExfRElSCi0JCQkKLQlkZWYgZ2V0YnJvd3NlcmRhdGEoc2VsZiwgc2hvd19oaWRkZW49MSk6Ci0JCXBhY2thZ2VzID0gc2VsZi5waW1wZGIubGlzdCgpCi0JCWlmIHNob3dfaGlkZGVuOgotCQkJc2VsZi5wYWNrYWdlcyA9IHBhY2thZ2VzCi0JCWVsc2U6Ci0JCQlzZWxmLnBhY2thZ2VzID0gW10KLQkJCWZvciBwa2cgaW4gcGFja2FnZXM6Ci0JCQkJbmFtZSA9IHBrZy5mdWxsbmFtZSgpCi0JCQkJaWYgbmFtZVswXSA9PSAnKCcgYW5kIG5hbWVbLTFdID09ICcpJyBhbmQgbm90IHNob3dfaGlkZGVuOgotCQkJCQljb250aW51ZQotCQkJCXNlbGYucGFja2FnZXMuYXBwZW5kKHBrZykJCQkKLQkJcnYgPSBbXQotCQlmb3IgcGtnIGluIHNlbGYucGFja2FnZXM6Ci0JCQluYW1lID0gcGtnLmZ1bGxuYW1lKCkKLQkJCXN0YXR1cywgXyA9IHBrZy5pbnN0YWxsZWQoKQotCQkJZGVzY3JpcHRpb24gPSBwa2cuZGVzY3JpcHRpb24oKQotCQkJZGVzY3JpcHRpb25fbGluZTEgPSBkZXNjcmlwdGlvbi5zcGxpdCgnXG4nKVswXQotCQkJcnYuYXBwZW5kKChzdGF0dXMsIG5hbWUsIGRlc2NyaXB0aW9uX2xpbmUxKSkKLQkJcmV0dXJuIHJ2Ci0JCQotCWRlZiBnZXRzdGF0dXMoc2VsZiwgbnVtYmVyKToKLQkJcGtnID0gc2VsZi5wYWNrYWdlc1tudW1iZXJdCi0JCXJldHVybiBwa2cuaW5zdGFsbGVkKCkKLQkJCi0JZGVmIGluc3RhbGxwYWNrYWdlKHNlbGYsIHNlbCwgb3V0cHV0LCByZWN1cnNpdmUsIGZvcmNlKToKLQkJcGtnID0gc2VsZi5wYWNrYWdlc1tzZWxdCi0JCXBpbXBpbnN0YWxsZXIgPSBwaW1wLlBpbXBJbnN0YWxsZXIoc2VsZi5waW1wZGIpCi0JCWxpc3QsIG1lc3NhZ2VzID0gcGltcGluc3RhbGxlci5wcmVwYXJlSW5zdGFsbChwa2csIGZvcmNlLCByZWN1cnNpdmUpCi0JCWlmIG1lc3NhZ2VzOgotCQkJcmV0dXJuIG1lc3NhZ2VzCi0JCW1lc3NhZ2VzID0gcGltcGluc3RhbGxlci5pbnN0YWxsKGxpc3QsIG91dHB1dCkKLQkJcmV0dXJuIG1lc3NhZ2VzCi0JCQkKKyAgICBkZWYgY2xvc2VwaW1wKHNlbGYpOgorICAgICAgICBzZWxmLnBpbXBkYi5jbG9zZSgpCisgICAgICAgIHNlbGYucGltcHByZWZzID0gTm9uZQorICAgICAgICBzZWxmLnBpbXBkYiA9IE5vbmUKKyAgICAgICAgc2VsZi5wYWNrYWdlcyA9IFtdCisKKyAgICBkZWYgc2V0dXNlcmluc3RhbGwoc2VsZiwgb25vZmYpOgorICAgICAgICBydiA9ICIiCisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKFVTRVJfSU5TVEFMTF9ESVIpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoVVNFUl9JTlNUQUxMX0RJUikKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgYXJnOgorICAgICAgICAgICAgICAgICAgICBydiA9IHJ2ICsgYXJnICsgIlxuIgorICAgICAgICAgICAgaWYgbm90IFVTRVJfSU5TVEFMTF9ESVIgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICAgICAgaW1wb3J0IHNpdGUKKyAgICAgICAgICAgICAgICByZWxvYWQoc2l0ZSkKKyAgICAgICAgICAgIHNlbGYucGltcHByZWZzLnNldEluc3RhbGxEaXIoVVNFUl9JTlNUQUxMX0RJUikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucGltcHByZWZzLnNldEluc3RhbGxEaXIoTm9uZSkKKyAgICAgICAgcnYgPSBydiArIHNlbGYucGltcHByZWZzLmNoZWNrKCkKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgZ2V0dXNlcmluc3RhbGwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBpbXBwcmVmcy5pbnN0YWxsRGlyID09IFVTRVJfSU5TVEFMTF9ESVIKKworICAgIGRlZiBnZXRicm93c2VyZGF0YShzZWxmLCBzaG93X2hpZGRlbj0xKToKKyAgICAgICAgcGFja2FnZXMgPSBzZWxmLnBpbXBkYi5saXN0KCkKKyAgICAgICAgaWYgc2hvd19oaWRkZW46CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VzID0gcGFja2FnZXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucGFja2FnZXMgPSBbXQorICAgICAgICAgICAgZm9yIHBrZyBpbiBwYWNrYWdlczoKKyAgICAgICAgICAgICAgICBuYW1lID0gcGtnLmZ1bGxuYW1lKCkKKyAgICAgICAgICAgICAgICBpZiBuYW1lWzBdID09ICcoJyBhbmQgbmFtZVstMV0gPT0gJyknIGFuZCBub3Qgc2hvd19oaWRkZW46CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlcy5hcHBlbmQocGtnKQorICAgICAgICBydiA9IFtdCisgICAgICAgIGZvciBwa2cgaW4gc2VsZi5wYWNrYWdlczoKKyAgICAgICAgICAgIG5hbWUgPSBwa2cuZnVsbG5hbWUoKQorICAgICAgICAgICAgc3RhdHVzLCBfID0gcGtnLmluc3RhbGxlZCgpCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHBrZy5kZXNjcmlwdGlvbigpCisgICAgICAgICAgICBkZXNjcmlwdGlvbl9saW5lMSA9IGRlc2NyaXB0aW9uLnNwbGl0KCdcbicpWzBdCisgICAgICAgICAgICBydi5hcHBlbmQoKHN0YXR1cywgbmFtZSwgZGVzY3JpcHRpb25fbGluZTEpKQorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBnZXRzdGF0dXMoc2VsZiwgbnVtYmVyKToKKyAgICAgICAgcGtnID0gc2VsZi5wYWNrYWdlc1tudW1iZXJdCisgICAgICAgIHJldHVybiBwa2cuaW5zdGFsbGVkKCkKKworICAgIGRlZiBpbnN0YWxscGFja2FnZShzZWxmLCBzZWwsIG91dHB1dCwgcmVjdXJzaXZlLCBmb3JjZSk6CisgICAgICAgIHBrZyA9IHNlbGYucGFja2FnZXNbc2VsXQorICAgICAgICBwaW1waW5zdGFsbGVyID0gcGltcC5QaW1wSW5zdGFsbGVyKHNlbGYucGltcGRiKQorICAgICAgICBsaXN0LCBtZXNzYWdlcyA9IHBpbXBpbnN0YWxsZXIucHJlcGFyZUluc3RhbGwocGtnLCBmb3JjZSwgcmVjdXJzaXZlKQorICAgICAgICBpZiBtZXNzYWdlczoKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlcworICAgICAgICBtZXNzYWdlcyA9IHBpbXBpbnN0YWxsZXIuaW5zdGFsbChsaXN0LCBvdXRwdXQpCisgICAgICAgIHJldHVybiBtZXNzYWdlcworCiBjbGFzcyBQYWNrYWdlQnJvd3NlcihQaW1wSW50ZXJmYWNlKToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgdXJsID0gTm9uZSk6Ci0JCXNlbGYuaWMgPSBOb25lCi0JCW1lc3NhZ2VzID0gc2VsZi5zZXR1cHBpbXAodXJsKQotCQlzZWxmLnNldHVwd2lkZ2V0cygpCi0JCXNlbGYudXBkYXRlc3RhdHVzKCkKLQkJc2VsZi5zaG93bWVzc2FnZXMobWVzc2FnZXMpCi0JCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5jbG9zZXBpbXAoKQotCQotCWRlZiBzZXR1cHdpZGdldHMoc2VsZik6Ci0JCURFU0NSSVBUSU9OX0hFSUdIVCA9IDE0MAotCQlJTlNUQUxMX1BPUyA9IC0zMAotCQlTVEFUVVNfUE9TID0gSU5TVEFMTF9QT1MgLSAoNzAgKyBERVNDUklQVElPTl9IRUlHSFQpCi0JCXNlbGYudyA9IFcuV2luZG93KCg1ODAsIDYwMCksICJQeXRob24gSW5zdGFsbCBNYW5hZ2VyIiwgbWluc2l6ZSA9ICg0MDAsIDQwMCksIHRhYmJhYmxlID0gMCkKLQkJc2VsZi53LnRpdGxlYmFyID0gVy5UZXh0Qm94KCg0LCA4LCA2MCwgMTgpLCAnUGFja2FnZXM6JykKLQkJc2VsZi53LmhpZGRlbl9idXR0b24gPSBXLkNoZWNrQm94KCgtMTAwLCA0LCAwLCAxOCksICdTaG93IEhpZGRlbicsIHNlbGYudXBkYXRlc3RhdHVzKQotCQlkYXRhID0gc2VsZi5nZXRicm93c2VyZGF0YSgpCi0JCXNlbGYudy5wYWNrYWdlYnJvd3NlciA9IFcuTXVsdGlMaXN0KCg0LCAyNCwgMCwgU1RBVFVTX1BPUy0yKSwgZGF0YSwgc2VsZi5saXN0aGl0LCBjb2xzPTMpCi0JCQotCQlzZWxmLncuaW5zdGFsbGVkX2wgPSBXLlRleHRCb3goKDQsIFNUQVRVU19QT1MsIDcwLCAxMiksICdJbnN0YWxsZWQ6JykKLQkJc2VsZi53Lmluc3RhbGxlZCA9IFcuVGV4dEJveCgoNzQsIFNUQVRVU19QT1MsIDAsIDEyKSwgJycpCi0JCXNlbGYudy5tZXNzYWdlX2wgPSBXLlRleHRCb3goKDQsIFNUQVRVU19QT1MrMjAsIDcwLCAxMiksICdTdGF0dXM6JykKLQkJc2VsZi53Lm1lc3NhZ2UgPSBXLlRleHRCb3goKDc0LCBTVEFUVVNfUE9TKzIwLCAwLCAxMiksICcnKQotCQlzZWxmLncuaG9tZXBhZ2VfYnV0dG9uID0gVy5CdXR0b24oKDQsIFNUQVRVU19QT1MrNDAsIDk2LCAxOCksICdWaWV3IGhvbWVwYWdlJywgc2VsZi5kb19ob21lcGFnZSkKLQkJc2VsZi53LmRlc2NyaXB0aW9uX2wgPSBXLlRleHRCb3goKDQsIFNUQVRVU19QT1MrNzAsIDcwLCAxMiksICdEZXNjcmlwdGlvbjonKQotCQlzZWxmLncuZGVzY3JpcHRpb24gPSBXLkVkaXRUZXh0KCg3NCwgU1RBVFVTX1BPUys3MCwgMCwgREVTQ1JJUFRJT05fSEVJR0hULTQpKQotCQkKLQkJc2VsZi53LmRpdmxpbmUgPSBXLkhvcml6b250YWxMaW5lKCgwLCBJTlNUQUxMX1BPUy00LCAwLCAwKSkKLQkJc2VsZi53LnZlcmJvc2VfYnV0dG9uID0gVy5DaGVja0JveCgoODQsIElOU1RBTExfUE9TKzQsIDYwLCAxOCksICdWZXJib3NlJykKLQkJc2VsZi53LnJlY3Vyc2l2ZV9idXR0b24gPSBXLkNoZWNrQm94KCgxNDYsIElOU1RBTExfUE9TKzQsIDEyMCwgMTgpLCAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLCBzZWxmLnVwZGF0ZXN0YXR1cykKLQkJc2VsZi53LnJlY3Vyc2l2ZV9idXR0b24uc2V0KDEpCi0JCXNlbGYudy5mb3JjZV9idXR0b24gPSBXLkNoZWNrQm94KCgyNjgsIElOU1RBTExfUE9TKzQsIDcwLCAxOCksICdPdmVyd3JpdGUnLCBzZWxmLnVwZGF0ZXN0YXR1cykKLQkJc2VsZi53LnVzZXJfYnV0dG9uID0gVy5DaGVja0JveCgoMzQwLCBJTlNUQUxMX1BPUys0LCAxNDAsIDE4KSwgJ0ZvciBDdXJyZW50IFVzZXIgT25seScsIHNlbGYuZG9fdXNlcikKLQkJc2VsZi53Lmluc3RhbGxfYnV0dG9uID0gVy5CdXR0b24oKDQsIElOU1RBTExfUE9TKzQsIDU2LCAxOCksICdJbnN0YWxsOicsIHNlbGYuZG9faW5zdGFsbCkKLQkJc2VsZi53Lm9wZW4oKQotCQlzZWxmLncuZGVzY3JpcHRpb24uZW5hYmxlKDApCi0JCQotCWRlZiB1cGRhdGVzdGF0dXMoc2VsZik6Ci0JCXRvcGNlbGwgPSBzZWxmLncucGFja2FnZWJyb3dzZXIuZ2V0dG9wY2VsbCgpCi0JCXNlbCA9IHNlbGYudy5wYWNrYWdlYnJvd3Nlci5nZXRzZWxlY3Rpb24oKQotCQlkYXRhID0gc2VsZi5nZXRicm93c2VyZGF0YShzZWxmLncuaGlkZGVuX2J1dHRvbi5nZXQoKSkKLQkJc2VsZi53LnBhY2thZ2Vicm93c2VyLnNldGl0ZW1zKGRhdGEpCi0JCXNlbGYudy51c2VyX2J1dHRvbi5zZXQoc2VsZi5nZXR1c2VyaW5zdGFsbCgpKQotCQlpZiBsZW4oc2VsKSAhPSAxOgotCQkJc2VsZi53Lmluc3RhbGxlZC5zZXQoJycpCi0JCQlzZWxmLncubWVzc2FnZS5zZXQoJycpCi0JCQlzZWxmLncuaW5zdGFsbF9idXR0b24uZW5hYmxlKDApCi0JCQlzZWxmLncuaG9tZXBhZ2VfYnV0dG9uLmVuYWJsZSgwKQotCQkJc2VsZi53LmRlc2NyaXB0aW9uLnNldCgnJykKLQkJCXNlbGYudy52ZXJib3NlX2J1dHRvbi5lbmFibGUoMCkKLQkJCXNlbGYudy5yZWN1cnNpdmVfYnV0dG9uLmVuYWJsZSgwKQotCQkJc2VsZi53LmZvcmNlX2J1dHRvbi5lbmFibGUoMCkKLQkJCXNlbGYudy51c2VyX2J1dHRvbi5lbmFibGUoMCkKLQkJZWxzZToKLQkJCXNlbCA9IHNlbFswXQotCQkJaWYgc2VsID49IGxlbihzZWxmLnBhY2thZ2VzKToKLQkJCQlzZWwgPSAwCi0JCQlzZWxmLncucGFja2FnZWJyb3dzZXIuc2V0c2VsZWN0aW9uKFtzZWxdKQotCQkJaW5zdGFsbGVkLCBtZXNzYWdlID0gc2VsZi5nZXRzdGF0dXMoc2VsKQotCQkJc2VsZi53Lmluc3RhbGxlZC5zZXQoaW5zdGFsbGVkKQotCQkJc2VsZi53Lm1lc3NhZ2Uuc2V0KG1lc3NhZ2UpCi0JCQlzZWxmLncuaW5zdGFsbF9idXR0b24uZW5hYmxlKGluc3RhbGxlZCAhPSAieWVzIiBvciBzZWxmLncuZm9yY2VfYnV0dG9uLmdldCgpKQotCQkJc2VsZi53LmhvbWVwYWdlX2J1dHRvbi5lbmFibGUobm90IG5vdCBzZWxmLnBhY2thZ2VzW3NlbF0uaG9tZXBhZ2UoKSkKLQkJCWRlc2NyaXB0aW9uID0gc2VsZi5wYWNrYWdlc1tzZWxdLmRlc2NyaXB0aW9uKCkKLQkJCWRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uc3BsaXRsaW5lcygpCi0JCQlkZXNjcmlwdGlvbiA9ICdccicuam9pbihkZXNjcmlwdGlvbikKLQkJCXNlbGYudy5kZXNjcmlwdGlvbi5zZXQoZGVzY3JpcHRpb24pCi0JCQlzZWxmLncudmVyYm9zZV9idXR0b24uZW5hYmxlKDEpCi0JCQlzZWxmLncucmVjdXJzaXZlX2J1dHRvbi5lbmFibGUoMSkKLQkJCXNlbGYudy5mb3JjZV9idXR0b24uZW5hYmxlKDEpCi0JCQlzZWxmLncudXNlcl9idXR0b24uZW5hYmxlKDEpCi0JCXNlbGYudy5wYWNrYWdlYnJvd3Nlci5zZXR0b3BjZWxsKHRvcGNlbGwpCi0JCQotCWRlZiBsaXN0aGl0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0JCXNlbGYudXBkYXRlc3RhdHVzKCkKLQkJCi0JZGVmIGRvX2luc3RhbGwoc2VsZik6Ci0JCXNlbCA9IHNlbGYudy5wYWNrYWdlYnJvd3Nlci5nZXRzZWxlY3Rpb24oKVswXQotCQlpZiBzZWxmLncudmVyYm9zZV9idXR0b24uZ2V0KCk6Ci0JCQlvdXRwdXQgPSBzeXMuc3Rkb3V0Ci0JCWVsc2U6Ci0JCQlvdXRwdXQgPSBOb25lCi0JCXJlY3Vyc2l2ZSA9IHNlbGYudy5yZWN1cnNpdmVfYnV0dG9uLmdldCgpCi0JCWZvcmNlID0gc2VsZi53LmZvcmNlX2J1dHRvbi5nZXQoKQotCQltZXNzYWdlcyA9IHNlbGYuaW5zdGFsbHBhY2thZ2Uoc2VsLCBvdXRwdXQsIHJlY3Vyc2l2ZSwgZm9yY2UpCi0JCQotCQkjIFJlLXJlYWQgLnB0aCBmaWxlcwotCQlpbXBvcnQgc2l0ZQotCQlyZWxvYWQoc2l0ZSkKLQkJCi0JCXNlbGYudXBkYXRlc3RhdHVzKCkKLQkJc2VsZi5zaG93bWVzc2FnZXMobWVzc2FnZXMpCi0JCQotCWRlZiBzaG93bWVzc2FnZXMoc2VsZiwgbWVzc2FnZXMpOgotCQlpZiBtZXNzYWdlczoKLQkJCSMgVG8gYmUgb24gdGhlIHNhZmUgc2lkZSB3ZSBhbHdheXMgc2hvdyB0aGUgaGlkZGVuIHBhY2thZ2VzLAotCQkJIyB0aGV5IG1heSBiZSByZWZlcnJlZCB0byBpbiB0aGUgZXJyb3IgbWVzc2FnZXMuCi0JCQlpZiBub3Qgc2VsZi53LmhpZGRlbl9idXR0b24uZ2V0KCk6Ci0JCQkJc2VsZi53LmhpZGRlbl9idXR0b24uc2V0KDEpCi0JCQkJc2VsZi51cGRhdGVzdGF0dXMoKQotCQkJaWYgdHlwZShtZXNzYWdlcykgPT0gbGlzdDoKLQkJCQltZXNzYWdlcyA9ICdcbicuam9pbihtZXNzYWdlcykKLQkJCWlmIHNlbGYudy52ZXJib3NlX2J1dHRvbi5nZXQoKToKLQkJCQlzeXMuc3Rkb3V0LndyaXRlKG1lc3NhZ2VzICsgJ1xuJykKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UobWVzc2FnZXMpCi0JCQotCWRlZiBkb19ob21lcGFnZShzZWxmKToKLQkJc2VsID0gc2VsZi53LnBhY2thZ2Vicm93c2VyLmdldHNlbGVjdGlvbigpWzBdCi0JCWlmIG5vdCBzZWxmLmljOgotCQkJaW1wb3J0IGljCi0JCQkKLQkJCXNlbGYuaWMgPSBpYy5JQygpCi0JCXNlbGYuaWMubGF1bmNodXJsKHNlbGYucGFja2FnZXNbc2VsXS5ob21lcGFnZSgpKQotCQkKLQlkZWYgZG9fdXNlcihzZWxmKToKLQkJbWVzc2FnZXMgPSBzZWxmLnNldHVzZXJpbnN0YWxsKHNlbGYudy51c2VyX2J1dHRvbi5nZXQoKSkKLQkJc2VsZi51cGRhdGVzdGF0dXMoKQotCQlzZWxmLnNob3dtZXNzYWdlcyhtZXNzYWdlcykKLQkJCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsID0gTm9uZSk6CisgICAgICAgIHNlbGYuaWMgPSBOb25lCisgICAgICAgIG1lc3NhZ2VzID0gc2VsZi5zZXR1cHBpbXAodXJsKQorICAgICAgICBzZWxmLnNldHVwd2lkZ2V0cygpCisgICAgICAgIHNlbGYudXBkYXRlc3RhdHVzKCkKKyAgICAgICAgc2VsZi5zaG93bWVzc2FnZXMobWVzc2FnZXMpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2VwaW1wKCkKKworICAgIGRlZiBzZXR1cHdpZGdldHMoc2VsZik6CisgICAgICAgIERFU0NSSVBUSU9OX0hFSUdIVCA9IDE0MAorICAgICAgICBJTlNUQUxMX1BPUyA9IC0zMAorICAgICAgICBTVEFUVVNfUE9TID0gSU5TVEFMTF9QT1MgLSAoNzAgKyBERVNDUklQVElPTl9IRUlHSFQpCisgICAgICAgIHNlbGYudyA9IFcuV2luZG93KCg1ODAsIDYwMCksICJQeXRob24gSW5zdGFsbCBNYW5hZ2VyIiwgbWluc2l6ZSA9ICg0MDAsIDQwMCksIHRhYmJhYmxlID0gMCkKKyAgICAgICAgc2VsZi53LnRpdGxlYmFyID0gVy5UZXh0Qm94KCg0LCA4LCA2MCwgMTgpLCAnUGFja2FnZXM6JykKKyAgICAgICAgc2VsZi53LmhpZGRlbl9idXR0b24gPSBXLkNoZWNrQm94KCgtMTAwLCA0LCAwLCAxOCksICdTaG93IEhpZGRlbicsIHNlbGYudXBkYXRlc3RhdHVzKQorICAgICAgICBkYXRhID0gc2VsZi5nZXRicm93c2VyZGF0YSgpCisgICAgICAgIHNlbGYudy5wYWNrYWdlYnJvd3NlciA9IFcuTXVsdGlMaXN0KCg0LCAyNCwgMCwgU1RBVFVTX1BPUy0yKSwgZGF0YSwgc2VsZi5saXN0aGl0LCBjb2xzPTMpCisKKyAgICAgICAgc2VsZi53Lmluc3RhbGxlZF9sID0gVy5UZXh0Qm94KCg0LCBTVEFUVVNfUE9TLCA3MCwgMTIpLCAnSW5zdGFsbGVkOicpCisgICAgICAgIHNlbGYudy5pbnN0YWxsZWQgPSBXLlRleHRCb3goKDc0LCBTVEFUVVNfUE9TLCAwLCAxMiksICcnKQorICAgICAgICBzZWxmLncubWVzc2FnZV9sID0gVy5UZXh0Qm94KCg0LCBTVEFUVVNfUE9TKzIwLCA3MCwgMTIpLCAnU3RhdHVzOicpCisgICAgICAgIHNlbGYudy5tZXNzYWdlID0gVy5UZXh0Qm94KCg3NCwgU1RBVFVTX1BPUysyMCwgMCwgMTIpLCAnJykKKyAgICAgICAgc2VsZi53LmhvbWVwYWdlX2J1dHRvbiA9IFcuQnV0dG9uKCg0LCBTVEFUVVNfUE9TKzQwLCA5NiwgMTgpLCAnVmlldyBob21lcGFnZScsIHNlbGYuZG9faG9tZXBhZ2UpCisgICAgICAgIHNlbGYudy5kZXNjcmlwdGlvbl9sID0gVy5UZXh0Qm94KCg0LCBTVEFUVVNfUE9TKzcwLCA3MCwgMTIpLCAnRGVzY3JpcHRpb246JykKKyAgICAgICAgc2VsZi53LmRlc2NyaXB0aW9uID0gVy5FZGl0VGV4dCgoNzQsIFNUQVRVU19QT1MrNzAsIDAsIERFU0NSSVBUSU9OX0hFSUdIVC00KSkKKworICAgICAgICBzZWxmLncuZGl2bGluZSA9IFcuSG9yaXpvbnRhbExpbmUoKDAsIElOU1RBTExfUE9TLTQsIDAsIDApKQorICAgICAgICBzZWxmLncudmVyYm9zZV9idXR0b24gPSBXLkNoZWNrQm94KCg4NCwgSU5TVEFMTF9QT1MrNCwgNjAsIDE4KSwgJ1ZlcmJvc2UnKQorICAgICAgICBzZWxmLncucmVjdXJzaXZlX2J1dHRvbiA9IFcuQ2hlY2tCb3goKDE0NiwgSU5TVEFMTF9QT1MrNCwgMTIwLCAxOCksICdJbnN0YWxsIGRlcGVuZGVuY2llcycsIHNlbGYudXBkYXRlc3RhdHVzKQorICAgICAgICBzZWxmLncucmVjdXJzaXZlX2J1dHRvbi5zZXQoMSkKKyAgICAgICAgc2VsZi53LmZvcmNlX2J1dHRvbiA9IFcuQ2hlY2tCb3goKDI2OCwgSU5TVEFMTF9QT1MrNCwgNzAsIDE4KSwgJ092ZXJ3cml0ZScsIHNlbGYudXBkYXRlc3RhdHVzKQorICAgICAgICBzZWxmLncudXNlcl9idXR0b24gPSBXLkNoZWNrQm94KCgzNDAsIElOU1RBTExfUE9TKzQsIDE0MCwgMTgpLCAnRm9yIEN1cnJlbnQgVXNlciBPbmx5Jywgc2VsZi5kb191c2VyKQorICAgICAgICBzZWxmLncuaW5zdGFsbF9idXR0b24gPSBXLkJ1dHRvbigoNCwgSU5TVEFMTF9QT1MrNCwgNTYsIDE4KSwgJ0luc3RhbGw6Jywgc2VsZi5kb19pbnN0YWxsKQorICAgICAgICBzZWxmLncub3BlbigpCisgICAgICAgIHNlbGYudy5kZXNjcmlwdGlvbi5lbmFibGUoMCkKKworICAgIGRlZiB1cGRhdGVzdGF0dXMoc2VsZik6CisgICAgICAgIHRvcGNlbGwgPSBzZWxmLncucGFja2FnZWJyb3dzZXIuZ2V0dG9wY2VsbCgpCisgICAgICAgIHNlbCA9IHNlbGYudy5wYWNrYWdlYnJvd3Nlci5nZXRzZWxlY3Rpb24oKQorICAgICAgICBkYXRhID0gc2VsZi5nZXRicm93c2VyZGF0YShzZWxmLncuaGlkZGVuX2J1dHRvbi5nZXQoKSkKKyAgICAgICAgc2VsZi53LnBhY2thZ2Vicm93c2VyLnNldGl0ZW1zKGRhdGEpCisgICAgICAgIHNlbGYudy51c2VyX2J1dHRvbi5zZXQoc2VsZi5nZXR1c2VyaW5zdGFsbCgpKQorICAgICAgICBpZiBsZW4oc2VsKSAhPSAxOgorICAgICAgICAgICAgc2VsZi53Lmluc3RhbGxlZC5zZXQoJycpCisgICAgICAgICAgICBzZWxmLncubWVzc2FnZS5zZXQoJycpCisgICAgICAgICAgICBzZWxmLncuaW5zdGFsbF9idXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBzZWxmLncuaG9tZXBhZ2VfYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgc2VsZi53LmRlc2NyaXB0aW9uLnNldCgnJykKKyAgICAgICAgICAgIHNlbGYudy52ZXJib3NlX2J1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIHNlbGYudy5yZWN1cnNpdmVfYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgc2VsZi53LmZvcmNlX2J1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIHNlbGYudy51c2VyX2J1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbCA9IHNlbFswXQorICAgICAgICAgICAgaWYgc2VsID49IGxlbihzZWxmLnBhY2thZ2VzKToKKyAgICAgICAgICAgICAgICBzZWwgPSAwCisgICAgICAgICAgICBzZWxmLncucGFja2FnZWJyb3dzZXIuc2V0c2VsZWN0aW9uKFtzZWxdKQorICAgICAgICAgICAgaW5zdGFsbGVkLCBtZXNzYWdlID0gc2VsZi5nZXRzdGF0dXMoc2VsKQorICAgICAgICAgICAgc2VsZi53Lmluc3RhbGxlZC5zZXQoaW5zdGFsbGVkKQorICAgICAgICAgICAgc2VsZi53Lm1lc3NhZ2Uuc2V0KG1lc3NhZ2UpCisgICAgICAgICAgICBzZWxmLncuaW5zdGFsbF9idXR0b24uZW5hYmxlKGluc3RhbGxlZCAhPSAieWVzIiBvciBzZWxmLncuZm9yY2VfYnV0dG9uLmdldCgpKQorICAgICAgICAgICAgc2VsZi53LmhvbWVwYWdlX2J1dHRvbi5lbmFibGUobm90IG5vdCBzZWxmLnBhY2thZ2VzW3NlbF0uaG9tZXBhZ2UoKSkKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gc2VsZi5wYWNrYWdlc1tzZWxdLmRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uc3BsaXRsaW5lcygpCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICdccicuam9pbihkZXNjcmlwdGlvbikKKyAgICAgICAgICAgIHNlbGYudy5kZXNjcmlwdGlvbi5zZXQoZGVzY3JpcHRpb24pCisgICAgICAgICAgICBzZWxmLncudmVyYm9zZV9idXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBzZWxmLncucmVjdXJzaXZlX2J1dHRvbi5lbmFibGUoMSkKKyAgICAgICAgICAgIHNlbGYudy5mb3JjZV9idXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBzZWxmLncudXNlcl9idXR0b24uZW5hYmxlKDEpCisgICAgICAgIHNlbGYudy5wYWNrYWdlYnJvd3Nlci5zZXR0b3BjZWxsKHRvcGNlbGwpCisKKyAgICBkZWYgbGlzdGhpdChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLnVwZGF0ZXN0YXR1cygpCisKKyAgICBkZWYgZG9faW5zdGFsbChzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi53LnBhY2thZ2Vicm93c2VyLmdldHNlbGVjdGlvbigpWzBdCisgICAgICAgIGlmIHNlbGYudy52ZXJib3NlX2J1dHRvbi5nZXQoKToKKyAgICAgICAgICAgIG91dHB1dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dHB1dCA9IE5vbmUKKyAgICAgICAgcmVjdXJzaXZlID0gc2VsZi53LnJlY3Vyc2l2ZV9idXR0b24uZ2V0KCkKKyAgICAgICAgZm9yY2UgPSBzZWxmLncuZm9yY2VfYnV0dG9uLmdldCgpCisgICAgICAgIG1lc3NhZ2VzID0gc2VsZi5pbnN0YWxscGFja2FnZShzZWwsIG91dHB1dCwgcmVjdXJzaXZlLCBmb3JjZSkKKworICAgICAgICAjIFJlLXJlYWQgLnB0aCBmaWxlcworICAgICAgICBpbXBvcnQgc2l0ZQorICAgICAgICByZWxvYWQoc2l0ZSkKKworICAgICAgICBzZWxmLnVwZGF0ZXN0YXR1cygpCisgICAgICAgIHNlbGYuc2hvd21lc3NhZ2VzKG1lc3NhZ2VzKQorCisgICAgZGVmIHNob3dtZXNzYWdlcyhzZWxmLCBtZXNzYWdlcyk6CisgICAgICAgIGlmIG1lc3NhZ2VzOgorICAgICAgICAgICAgIyBUbyBiZSBvbiB0aGUgc2FmZSBzaWRlIHdlIGFsd2F5cyBzaG93IHRoZSBoaWRkZW4gcGFja2FnZXMsCisgICAgICAgICAgICAjIHRoZXkgbWF5IGJlIHJlZmVycmVkIHRvIGluIHRoZSBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLncuaGlkZGVuX2J1dHRvbi5nZXQoKToKKyAgICAgICAgICAgICAgICBzZWxmLncuaGlkZGVuX2J1dHRvbi5zZXQoMSkKKyAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZXN0YXR1cygpCisgICAgICAgICAgICBpZiB0eXBlKG1lc3NhZ2VzKSA9PSBsaXN0OgorICAgICAgICAgICAgICAgIG1lc3NhZ2VzID0gJ1xuJy5qb2luKG1lc3NhZ2VzKQorICAgICAgICAgICAgaWYgc2VsZi53LnZlcmJvc2VfYnV0dG9uLmdldCgpOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUobWVzc2FnZXMgKyAnXG4nKQorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZShtZXNzYWdlcykKKworICAgIGRlZiBkb19ob21lcGFnZShzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi53LnBhY2thZ2Vicm93c2VyLmdldHNlbGVjdGlvbigpWzBdCisgICAgICAgIGlmIG5vdCBzZWxmLmljOgorICAgICAgICAgICAgaW1wb3J0IGljCisKKyAgICAgICAgICAgIHNlbGYuaWMgPSBpYy5JQygpCisgICAgICAgIHNlbGYuaWMubGF1bmNodXJsKHNlbGYucGFja2FnZXNbc2VsXS5ob21lcGFnZSgpKQorCisgICAgZGVmIGRvX3VzZXIoc2VsZik6CisgICAgICAgIG1lc3NhZ2VzID0gc2VsZi5zZXR1c2VyaW5zdGFsbChzZWxmLncudXNlcl9idXR0b24uZ2V0KCkpCisgICAgICAgIHNlbGYudXBkYXRlc3RhdHVzKCkKKyAgICAgICAgc2VsZi5zaG93bWVzc2FnZXMobWVzc2FnZXMpCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JUGFja2FnZU1hbmFnZXJNYWluKCkKKyAgICBQYWNrYWdlTWFuYWdlck1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9Qcm9maWxlQnJvd3Nlci5weSBiL01hYy9Ub29scy9JREUvUHJvZmlsZUJyb3dzZXIucHkKaW5kZXggYTE5NjQxYy4uYTJkYWZkZCAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9Qcm9maWxlQnJvd3Nlci5weQorKysgYi9NYWMvVG9vbHMvSURFL1Byb2ZpbGVCcm93c2VyLnB5CkBAIC05LDg0ICs5LDg0IEBACiAKICMgaW5jcmVhc2UgcHJlY2lzaW9uCiBkZWYgZjgoeCk6Ci0JcmV0dXJuIHN0cmluZy5yanVzdChmcGZvcm1hdC5maXgoeCwgNCksIDgpCisgICAgcmV0dXJuIHN0cmluZy5yanVzdChmcGZvcm1hdC5maXgoeCwgNCksIDgpCiBwc3RhdHMuZjggPSBmOAogCiAjIGhhY2tpbmcgYXJvdW5kIGEgaGFjawogaWYgc3lzLnZlcnNpb25bOjNdID4gJzEuNCc6Ci0JdGltZXIgPSBFdnQuVGlja0NvdW50CisgICAgdGltZXIgPSBFdnQuVGlja0NvdW50CiBlbHNlOgotCWRlZiB0aW1lcihUaWNrQ291bnQgPSBFdnQuVGlja0NvdW50KToKLQkJcmV0dXJuIFRpY2tDb3VudCgpIC8gNjAuMAorICAgIGRlZiB0aW1lcihUaWNrQ291bnQgPSBFdnQuVGlja0NvdW50KToKKyAgICAgICAgcmV0dXJuIFRpY2tDb3VudCgpIC8gNjAuMAogCiBjbGFzcyBQcm9maWxlQnJvd3NlcjoKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgc3RhdHMgPSBOb25lKToKLQkJc2VsZi5zb3J0a2V5cyA9ICgnY2FsbHMnLCkKLQkJc2VsZi5zZXR1cHdpZGdldHMoKQotCQlzZWxmLnNldHN0YXRzKHN0YXRzKQotCQotCWRlZiBzZXR1cHdpZGdldHMoc2VsZik6IAotCQlzZWxmLncgPSBXLldpbmRvdygoNTgwLCA0MDApLCAiUHJvZmlsZSBTdGF0aXN0aWNzIiwgbWluc2l6ZSA9ICgyMDAsIDEwMCksIHRhYmJhYmxlID0gMCkKLQkJc2VsZi53LmRpdmxpbmUgPSBXLkhvcml6b250YWxMaW5lKCgwLCAyMCwgMCwgMCkpCi0JCXNlbGYudy50aXRsZWJhciA9IFcuVGV4dEJveCgoNCwgNCwgNDAsIDEyKSwgJ1NvcnQgYnk6JykKLQkJc2VsZi5idXR0b25zID0gW10KLQkJeCA9IDU0Ci0JCXdpZHRoMSA9IDUwCi0JCXdpZHRoMiA9IDc1Ci0JCWZvciBuYW1lIGluIFsiY2FsbHMiLCAidGltZSIsICJjdW11bGF0aXZlIiwgInN0ZG5hbWUiLCAiZmlsZSIsICJsaW5lIiwgIm5hbWUiXToKLQkJCWlmIGxlbihuYW1lKSA+IDY6Ci0JCQkJd2lkdGggPSB3aWR0aDIKLQkJCWVsc2U6Ci0JCQkJd2lkdGggPSB3aWR0aDEKLQkJCXNlbGYud1siYnV0dG9uXyIgKyBuYW1lXSA9IFcuUmFkaW9CdXR0b24oKHgsIDQsIHdpZHRoLCAxMiksIG5hbWUsIHNlbGYuYnV0dG9ucywgc2VsZi5zZXRzb3J0KQotCQkJeCArPSB3aWR0aCArIDEwCi0JCXNlbGYudy5idXR0b25fY2FsbHMuc2V0KDEpCi0JCXNlbGYudy50ZXh0ID0gVy5UZXh0RWRpdG9yKCgwLCAyMSwgLTE1LCAtMTUpLCBpbnNldCA9ICg2LCA1KSwgCi0JCQkJcmVhZG9ubHkgPSAxLCB3cmFwID0gMCwgZm9udHNldHRpbmdzID0gKCdNb25hY28nLCAwLCA5LCAoMCwgMCwgMCkpKQotCQlzZWxmLncuX2JhcnkgPSBXLlNjcm9sbGJhcigoLTE1LCAyMCwgMTYsIC0xNCksIHNlbGYudy50ZXh0LnZzY3JvbGwsIG1heCA9IDMyNzY3KQotCQlzZWxmLncuX2JhcnggPSBXLlNjcm9sbGJhcigoLTEsIC0xNSwgLTE0LCAxNiksIHNlbGYudy50ZXh0LmhzY3JvbGwsIG1heCA9IDMyNzY3KQotCQlzZWxmLncub3BlbigpCi0JCi0JZGVmIHNldHN0YXRzKHNlbGYsIHN0YXRzKToKLQkJc2VsZi5zdGF0cyA9IHN0YXRzCi0JCXNlbGYuc3RhdHMuc3RyaXBfZGlycygpCi0JCXNlbGYuZGlzcGxheXN0YXRzKCkKLQkKLQlkZWYgc2V0c29ydChzZWxmKToKLQkJIyBHcm1wZi4gVGhlIGNhbGxiYWNrIGRvZXNuJ3QgZ2l2ZSB1cyB0aGUgYnV0dG9uOi0oCi0JCWZvciBiIGluIHNlbGYuYnV0dG9uczoKLQkJCWlmIGIuZ2V0KCk6Ci0JCQkJaWYgYi5fdGl0bGUgPT0gc2VsZi5zb3J0a2V5c1swXToKLQkJCQkJcmV0dXJuCi0JCQkJc2VsZi5zb3J0a2V5cyA9IChiLl90aXRsZSwpICsgc2VsZi5zb3J0a2V5c1s6M10KLQkJCQlicmVhawotCQlzZWxmLmRpc3BsYXlzdGF0cygpCi0JCi0JZGVmIGRpc3BsYXlzdGF0cyhzZWxmKToKLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJYXBwbHkoc2VsZi5zdGF0cy5zb3J0X3N0YXRzLCBzZWxmLnNvcnRrZXlzKQotCQlzYXZlb3V0ID0gc3lzLnN0ZG91dAotCQl0cnk6Ci0JCQlzID0gc3lzLnN0ZG91dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKLQkJCXNlbGYuc3RhdHMucHJpbnRfc3RhdHMoKQotCQlmaW5hbGx5OgotCQkJc3lzLnN0ZG91dCA9IHNhdmVvdXQKLQkJdGV4dCA9IHN0cmluZy5qb2luKHN0cmluZy5zcGxpdChzLmdldHZhbHVlKCksICdcbicpLCAnXHInKQotCQlzZWxmLncudGV4dC5zZXQodGV4dCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGF0cyA9IE5vbmUpOgorICAgICAgICBzZWxmLnNvcnRrZXlzID0gKCdjYWxscycsKQorICAgICAgICBzZWxmLnNldHVwd2lkZ2V0cygpCisgICAgICAgIHNlbGYuc2V0c3RhdHMoc3RhdHMpCisKKyAgICBkZWYgc2V0dXB3aWRnZXRzKHNlbGYpOgorICAgICAgICBzZWxmLncgPSBXLldpbmRvdygoNTgwLCA0MDApLCAiUHJvZmlsZSBTdGF0aXN0aWNzIiwgbWluc2l6ZSA9ICgyMDAsIDEwMCksIHRhYmJhYmxlID0gMCkKKyAgICAgICAgc2VsZi53LmRpdmxpbmUgPSBXLkhvcml6b250YWxMaW5lKCgwLCAyMCwgMCwgMCkpCisgICAgICAgIHNlbGYudy50aXRsZWJhciA9IFcuVGV4dEJveCgoNCwgNCwgNDAsIDEyKSwgJ1NvcnQgYnk6JykKKyAgICAgICAgc2VsZi5idXR0b25zID0gW10KKyAgICAgICAgeCA9IDU0CisgICAgICAgIHdpZHRoMSA9IDUwCisgICAgICAgIHdpZHRoMiA9IDc1CisgICAgICAgIGZvciBuYW1lIGluIFsiY2FsbHMiLCAidGltZSIsICJjdW11bGF0aXZlIiwgInN0ZG5hbWUiLCAiZmlsZSIsICJsaW5lIiwgIm5hbWUiXToKKyAgICAgICAgICAgIGlmIGxlbihuYW1lKSA+IDY6CisgICAgICAgICAgICAgICAgd2lkdGggPSB3aWR0aDIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd2lkdGggPSB3aWR0aDEKKyAgICAgICAgICAgIHNlbGYud1siYnV0dG9uXyIgKyBuYW1lXSA9IFcuUmFkaW9CdXR0b24oKHgsIDQsIHdpZHRoLCAxMiksIG5hbWUsIHNlbGYuYnV0dG9ucywgc2VsZi5zZXRzb3J0KQorICAgICAgICAgICAgeCArPSB3aWR0aCArIDEwCisgICAgICAgIHNlbGYudy5idXR0b25fY2FsbHMuc2V0KDEpCisgICAgICAgIHNlbGYudy50ZXh0ID0gVy5UZXh0RWRpdG9yKCgwLCAyMSwgLTE1LCAtMTUpLCBpbnNldCA9ICg2LCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5ID0gMSwgd3JhcCA9IDAsIGZvbnRzZXR0aW5ncyA9ICgnTW9uYWNvJywgMCwgOSwgKDAsIDAsIDApKSkKKyAgICAgICAgc2VsZi53Ll9iYXJ5ID0gVy5TY3JvbGxiYXIoKC0xNSwgMjAsIDE2LCAtMTQpLCBzZWxmLncudGV4dC52c2Nyb2xsLCBtYXggPSAzMjc2NykKKyAgICAgICAgc2VsZi53Ll9iYXJ4ID0gVy5TY3JvbGxiYXIoKC0xLCAtMTUsIC0xNCwgMTYpLCBzZWxmLncudGV4dC5oc2Nyb2xsLCBtYXggPSAzMjc2NykKKyAgICAgICAgc2VsZi53Lm9wZW4oKQorCisgICAgZGVmIHNldHN0YXRzKHNlbGYsIHN0YXRzKToKKyAgICAgICAgc2VsZi5zdGF0cyA9IHN0YXRzCisgICAgICAgIHNlbGYuc3RhdHMuc3RyaXBfZGlycygpCisgICAgICAgIHNlbGYuZGlzcGxheXN0YXRzKCkKKworICAgIGRlZiBzZXRzb3J0KHNlbGYpOgorICAgICAgICAjIEdybXBmLiBUaGUgY2FsbGJhY2sgZG9lc24ndCBnaXZlIHVzIHRoZSBidXR0b246LSgKKyAgICAgICAgZm9yIGIgaW4gc2VsZi5idXR0b25zOgorICAgICAgICAgICAgaWYgYi5nZXQoKToKKyAgICAgICAgICAgICAgICBpZiBiLl90aXRsZSA9PSBzZWxmLnNvcnRrZXlzWzBdOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBzZWxmLnNvcnRrZXlzID0gKGIuX3RpdGxlLCkgKyBzZWxmLnNvcnRrZXlzWzozXQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuZGlzcGxheXN0YXRzKCkKKworICAgIGRlZiBkaXNwbGF5c3RhdHMoc2VsZik6CisgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgIGFwcGx5KHNlbGYuc3RhdHMuc29ydF9zdGF0cywgc2VsZi5zb3J0a2V5cykKKyAgICAgICAgc2F2ZW91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcyA9IHN5cy5zdGRvdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBzZWxmLnN0YXRzLnByaW50X3N0YXRzKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlb3V0CisgICAgICAgIHRleHQgPSBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQocy5nZXR2YWx1ZSgpLCAnXG4nKSwgJ1xyJykKKyAgICAgICAgc2VsZi53LnRleHQuc2V0KHRleHQpCiAKIAogZGVmIG1haW4oKToKLQlpbXBvcnQgcHN0YXRzCi0JYXJncyA9IHN5cy5hcmd2WzE6XQotCWZvciBpIGluIGFyZ3M6Ci0JCXN0YXRzID0gcHN0YXRzLlN0YXRzKGkpCi0JCWJyb3dzZXIgPSBQcm9maWxlQnJvd3NlcihzdGF0cykKLQllbHNlOgotCQlmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9J1Byb2ZpbGVyIGRhdGEnKQotCQlpZiBub3QgZmlsZW5hbWU6IHN5cy5leGl0KDApCi0JCXN0YXRzID0gcHN0YXRzLlN0YXRzKGZpbGVuYW1lKQotCQlicm93c2VyID0gUHJvZmlsZUJyb3dzZXIoc3RhdHMpCisgICAgaW1wb3J0IHBzdGF0cworICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBmb3IgaSBpbiBhcmdzOgorICAgICAgICBzdGF0cyA9IHBzdGF0cy5TdGF0cyhpKQorICAgICAgICBicm93c2VyID0gUHJvZmlsZUJyb3dzZXIoc3RhdHMpCisgICAgZWxzZToKKyAgICAgICAgZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSdQcm9maWxlciBkYXRhJykKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOiBzeXMuZXhpdCgwKQorICAgICAgICBzdGF0cyA9IHBzdGF0cy5TdGF0cyhmaWxlbmFtZSkKKyAgICAgICAgYnJvd3NlciA9IFByb2ZpbGVCcm93c2VyKHN0YXRzKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9QeUJyb3dzZXIucHkgYi9NYWMvVG9vbHMvSURFL1B5QnJvd3Nlci5weQppbmRleCAzOTczNDdlLi4wYWQzYTlhIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1B5QnJvd3Nlci5weQorKysgYi9NYWMvVG9vbHMvSURFL1B5QnJvd3Nlci5weQpAQCAtMTgsNjAwICsxOCw1OTkgQEAKIAogaGFzX2N0bGNoYXJzUkUgPSByZS5jb21waWxlKHInW1wwMDAtXDAzN1wxNzctXDM3N10nKQogZGVmIGN0bGNoYXJzUkVzZWFyY2goc3RyKToKLQlpZiBoYXNfY3RsY2hhcnNSRS5zZWFyY2goc3RyKSBpcyBOb25lOgotCQlyZXR1cm4gLTEKLQlyZXR1cm4gMQotCQotZGVmIGRvdWJsZV9yZXByKGtleSwgdmFsdWUsIHRydW5jdmFsdWUgPSAwLCAKLQkJCXR5cGUgPSB0eXBlLCBTdHJpbmdUeXBlID0gdHlwZXMuU3RyaW5nVHlwZSwKLQkJCWhhc19jdGxjaGFycyA9IGN0bGNoYXJzUkVzZWFyY2gsIF9yZXByID0gcmVwciwgc3RyID0gc3RyKToKLQlpZiB0eXBlKGtleSkgPT0gU3RyaW5nVHlwZSBhbmQgaGFzX2N0bGNoYXJzKGtleSkgPCAwOgotCQlrZXkgPSBzdHIoa2V5KQotCWVsc2U6Ci0JCWtleSA9IF9yZXByKGtleSkKLQlpZiBrZXkgPT0gJ19fYnVpbHRpbnNfXyc6Ci0JCXZhbHVlID0gIjwiICsgdHlwZSh2YWx1ZSkuX19uYW1lX18gKyAiICdfX2J1aWx0aW5fXyc+IgotCWVsaWYga2V5ID09ICdfX3JldHVybl9fJzoKLQkJIyBibGVoLCB3aGVuIHJldHVybmluZyBmcm9tIGEgY2xhc3MgY29kZWJsb2NrIHdlIGdldCBpbmZpbml0ZSByZWN1cnNpb24gaW4gcmVwci4gCi0JCSMgVXNlIHNhZmUgcmVwciBpbnN0ZWFkLgotCQlpbXBvcnQgcmVwcgotCQl2YWx1ZSA9IHJlcHIucmVwcih2YWx1ZSkKLQllbHNlOgotCQl0cnk6Ci0JCQl2YWx1ZSA9IF9yZXByKHZhbHVlKQotCQkJJycgKyB2YWx1ZQkjIHRlc3QgdG8gc2VlIGlmIGl0IGlzIGEgc3RyaW5nLCBpbiBjYXNlIGEgX19yZXByX18gbWV0aG9kIGlzIGJ1Z2d5Ci0JCWV4Y2VwdDoKLQkJCXZhbHVlID0gJ1x4YTVceGE1XHhhNSBleGNlcHRpb24gaW4gcmVwcigpJwotCWlmIHRydW5jdmFsdWU6Ci0JCXJldHVybiBrZXkgKyAnXHQnICsgdmFsdWVbOjI1NV0KLQlyZXR1cm4ga2V5ICsgJ1x0JyArIHZhbHVlCisgICAgaWYgaGFzX2N0bGNoYXJzUkUuc2VhcmNoKHN0cikgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIC0xCisgICAgcmV0dXJuIDEKKworZGVmIGRvdWJsZV9yZXByKGtleSwgdmFsdWUsIHRydW5jdmFsdWUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUsIFN0cmluZ1R5cGUgPSB0eXBlcy5TdHJpbmdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2N0bGNoYXJzID0gY3RsY2hhcnNSRXNlYXJjaCwgX3JlcHIgPSByZXByLCBzdHIgPSBzdHIpOgorICAgIGlmIHR5cGUoa2V5KSA9PSBTdHJpbmdUeXBlIGFuZCBoYXNfY3RsY2hhcnMoa2V5KSA8IDA6CisgICAgICAgIGtleSA9IHN0cihrZXkpCisgICAgZWxzZToKKyAgICAgICAga2V5ID0gX3JlcHIoa2V5KQorICAgIGlmIGtleSA9PSAnX19idWlsdGluc19fJzoKKyAgICAgICAgdmFsdWUgPSAiPCIgKyB0eXBlKHZhbHVlKS5fX25hbWVfXyArICIgJ19fYnVpbHRpbl9fJz4iCisgICAgZWxpZiBrZXkgPT0gJ19fcmV0dXJuX18nOgorICAgICAgICAjIGJsZWgsIHdoZW4gcmV0dXJuaW5nIGZyb20gYSBjbGFzcyBjb2RlYmxvY2sgd2UgZ2V0IGluZmluaXRlIHJlY3Vyc2lvbiBpbiByZXByLgorICAgICAgICAjIFVzZSBzYWZlIHJlcHIgaW5zdGVhZC4KKyAgICAgICAgaW1wb3J0IHJlcHIKKyAgICAgICAgdmFsdWUgPSByZXByLnJlcHIodmFsdWUpCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBfcmVwcih2YWx1ZSkKKyAgICAgICAgICAgICcnICsgdmFsdWUgICAgICAjIHRlc3QgdG8gc2VlIGlmIGl0IGlzIGEgc3RyaW5nLCBpbiBjYXNlIGEgX19yZXByX18gbWV0aG9kIGlzIGJ1Z2d5CisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHZhbHVlID0gJ1x4YTVceGE1XHhhNSBleGNlcHRpb24gaW4gcmVwcigpJworICAgIGlmIHRydW5jdmFsdWU6CisgICAgICAgIHJldHVybiBrZXkgKyAnXHQnICsgdmFsdWVbOjI1NV0KKyAgICByZXR1cm4ga2V5ICsgJ1x0JyArIHZhbHVlCiAKIAogZGVmIHRydW5jU3RyaW5nKHMsIG1heHdpZCk6Ci0JaWYgbWF4d2lkIDwgMToKLQkJcmV0dXJuIDEsICIiCi0Jc3RybGVuID0gbGVuKHMpCi0Jc3Ryd2lkID0gUWQuVGV4dFdpZHRoKHMsIDAsIHN0cmxlbik7Ci0JaWYgc3Ryd2lkIDw9IG1heHdpZDoKLQkJcmV0dXJuIDAsIHMKLQkKLQlRZC5UZXh0RmFjZShRdWlja0RyYXcuY29uZGVuc2UpCi0Jc3Ryd2lkID0gUWQuVGV4dFdpZHRoKHMsIDAsIHN0cmxlbikKLQllbGxpcHNpcyA9IFFkLlN0cmluZ1dpZHRoKCdceGM5JykKLQkKLQlpZiBzdHJ3aWQgPD0gbWF4d2lkOgotCQlRZC5UZXh0RmFjZSgwKQotCQlyZXR1cm4gMSwgcwotCWlmIHN0cndpZCA8IDE6Ci0JCVFkLlRleHRGYWNlKDApCi0JCXJldHVybiAxLCAiIgotCQotCW1pZCA9IGludChzdHJsZW4gKiBtYXh3aWQgLyBzdHJ3aWQpCi0Jd2hpbGUgMToKLQkJaWYgbWlkIDw9IDA6Ci0JCQltaWQgPSAwCi0JCQlicmVhawotCQlzdHJ3aWQgPSBRZC5UZXh0V2lkdGgocywgMCwgbWlkKSArIGVsbGlwc2lzCi0JCXN0cndpZDIgPSBRZC5UZXh0V2lkdGgocywgMCwgbWlkICsgMSkgKyBlbGxpcHNpcwotCQlpZiBzdHJ3aWQgPD0gbWF4d2lkIGFuZCBtYXh3aWQgPD0gc3Ryd2lkMjoKLQkJCWlmIG1heHdpZCA9PSBzdHJ3aWQyOgotCQkJCW1pZCArPSAxCi0JCQlicmVhawotCQlpZiBzdHJ3aWQgPiBtYXh3aWQ6Ci0JCQltaWQgLT0gMQotCQkJaWYgbWlkIDw9IDA6Ci0JCQkJbWlkID0gMAotCQkJCWJyZWFrCi0JCWVsaWYgc3Ryd2lkMiA8IG1heHdpZDoKLQkJCW1pZCArPSAxCi0JUWQuVGV4dEZhY2UoMCkKLQlyZXR1cm4gMSwgc1s6bWlkXSArICdceGM5JworICAgIGlmIG1heHdpZCA8IDE6CisgICAgICAgIHJldHVybiAxLCAiIgorICAgIHN0cmxlbiA9IGxlbihzKQorICAgIHN0cndpZCA9IFFkLlRleHRXaWR0aChzLCAwLCBzdHJsZW4pOworICAgIGlmIHN0cndpZCA8PSBtYXh3aWQ6CisgICAgICAgIHJldHVybiAwLCBzCisKKyAgICBRZC5UZXh0RmFjZShRdWlja0RyYXcuY29uZGVuc2UpCisgICAgc3Ryd2lkID0gUWQuVGV4dFdpZHRoKHMsIDAsIHN0cmxlbikKKyAgICBlbGxpcHNpcyA9IFFkLlN0cmluZ1dpZHRoKCdceGM5JykKKworICAgIGlmIHN0cndpZCA8PSBtYXh3aWQ6CisgICAgICAgIFFkLlRleHRGYWNlKDApCisgICAgICAgIHJldHVybiAxLCBzCisgICAgaWYgc3Ryd2lkIDwgMToKKyAgICAgICAgUWQuVGV4dEZhY2UoMCkKKyAgICAgICAgcmV0dXJuIDEsICIiCisKKyAgICBtaWQgPSBpbnQoc3RybGVuICogbWF4d2lkIC8gc3Ryd2lkKQorICAgIHdoaWxlIDE6CisgICAgICAgIGlmIG1pZCA8PSAwOgorICAgICAgICAgICAgbWlkID0gMAorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc3Ryd2lkID0gUWQuVGV4dFdpZHRoKHMsIDAsIG1pZCkgKyBlbGxpcHNpcworICAgICAgICBzdHJ3aWQyID0gUWQuVGV4dFdpZHRoKHMsIDAsIG1pZCArIDEpICsgZWxsaXBzaXMKKyAgICAgICAgaWYgc3Ryd2lkIDw9IG1heHdpZCBhbmQgbWF4d2lkIDw9IHN0cndpZDI6CisgICAgICAgICAgICBpZiBtYXh3aWQgPT0gc3Ryd2lkMjoKKyAgICAgICAgICAgICAgICBtaWQgKz0gMQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgc3Ryd2lkID4gbWF4d2lkOgorICAgICAgICAgICAgbWlkIC09IDEKKyAgICAgICAgICAgIGlmIG1pZCA8PSAwOgorICAgICAgICAgICAgICAgIG1pZCA9IDAKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbGlmIHN0cndpZDIgPCBtYXh3aWQ6CisgICAgICAgICAgICBtaWQgKz0gMQorICAgIFFkLlRleHRGYWNlKDApCisgICAgcmV0dXJuIDEsIHNbOm1pZF0gKyAnXHhjOScKIAogCiBkZWYgZHJhd1RleHRDZWxsKHRleHQsIGNlbGxSZWN0LCBhc2NlbnQsIHRoZUxpc3QpOgotCWwsIHQsIHIsIGIgPSBjZWxsUmVjdAotCWNlbGx3aWR0aCA9IHIgLSBsCi0JUWQuTW92ZVRvKGludChsICsgMiksIGludCh0ICsgYXNjZW50KSkKLQljb25kZW5zZSwgdGV4dCA9IHRydW5jU3RyaW5nKHRleHQsIGNlbGx3aWR0aCAtIDMpCi0JaWYgY29uZGVuc2U6Ci0JCVFkLlRleHRGYWNlKFF1aWNrRHJhdy5jb25kZW5zZSkKLQlRZC5EcmF3VGV4dCh0ZXh0LCAwLCBsZW4odGV4dCkpCi0JUWQuVGV4dEZhY2UoMCkKKyAgICBsLCB0LCByLCBiID0gY2VsbFJlY3QKKyAgICBjZWxsd2lkdGggPSByIC0gbAorICAgIFFkLk1vdmVUbyhpbnQobCArIDIpLCBpbnQodCArIGFzY2VudCkpCisgICAgY29uZGVuc2UsIHRleHQgPSB0cnVuY1N0cmluZyh0ZXh0LCBjZWxsd2lkdGggLSAzKQorICAgIGlmIGNvbmRlbnNlOgorICAgICAgICBRZC5UZXh0RmFjZShRdWlja0RyYXcuY29uZGVuc2UpCisgICAgUWQuRHJhd1RleHQodGV4dCwgMCwgbGVuKHRleHQpKQorICAgIFFkLlRleHRGYWNlKDApCiAKIAogUElDVFdJRFRIID0gMTYKIAogCiBjbGFzcyBCcm93c2VyV2lkZ2V0KFcuQ3VzdG9tTGlzdCk6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIG9iamVjdCA9IE5vbmUsIGNvbCA9IDEwMCwgY2xvc2VjaGlsZHJlbiA9IDApOgotCQlXLkxpc3QuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgY2FsbGJhY2sgPSBzZWxmLmxpc3RoaXQpCi0JCXNlbGYub2JqZWN0ID0gKE5vbmUsKQotCQlzZWxmLmluZGVudCA9IDE2Ci0JCXNlbGYubGFzdG1heGluZGVudCA9IDAKLQkJc2VsZi5jbG9zZWNoaWxkcmVuID0gY2xvc2VjaGlsZHJlbgotCQlzZWxmLmNoaWxkcmVuID0gW10KLQkJc2VsZi5taW5jb2wgPSA2NAotCQlzZWxmLnNldGNvbHVtbihjb2wpCi0JCXNlbGYuYmluZCgncmV0dXJuJywgc2VsZi5vcGVuc2VsZWN0aW9uKQotCQlzZWxmLmJpbmQoJ2VudGVyJywgc2VsZi5vcGVuc2VsZWN0aW9uKQotCQlpZiBvYmplY3QgaXMgbm90IE5vbmU6Ci0JCQlzZWxmLnNldChvYmplY3QpCi0JCi0JZGVmIHNldChzZWxmLCBvYmplY3QpOgotCQlpZiBzZWxmLm9iamVjdFswXSBpcyBub3Qgb2JqZWN0OgotCQkJc2VsZi5vYmplY3QgPSBvYmplY3QsCi0JCQlzZWxmWzpdID0gc2VsZi51bnBhY2sob2JqZWN0LCAwKQotCQllbGlmIHNlbGYuX3BhcmVudHdpbmRvdyBpcyBub3QgTm9uZSBhbmQgc2VsZi5fcGFyZW50d2luZG93LndpZDoKLQkJCXNlbGYudXBkYXRlKCkKLQkKLQlkZWYgdW5wYWNrKHNlbGYsIG9iamVjdCwgaW5kZW50KToKLQkJcmV0dXJuIHVucGFja19vYmplY3Qob2JqZWN0LCBpbmRlbnQpCi0JCi0JZGVmIHVwZGF0ZShzZWxmKToKLQkJIyBmb3Igbm93Li4uCi0JCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JCXNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKLQkJc2VsID0gc2VsZi5nZXRzZWxlY3RlZG9iamVjdHMoKQotCQlmb2xkID0gc2VsZi5nZXR1bmZvbGRlZG9iamVjdHMoKQotCQl0b3BjZWxsID0gc2VsZi5nZXR0b3BjZWxsKCkKLQkJc2VsZls6XSA9IHNlbGYudW5wYWNrKHNlbGYub2JqZWN0WzBdLCAwKQotCQlzZWxmLnVuZm9sZG9iamVjdHMoZm9sZCkKLQkJc2VsZi5zZXRzZWxlY3RlZG9iamVjdHMoc2VsKQotCQlzZWxmLnNldHRvcGNlbGwodG9wY2VsbCkKLQkJc2VsZi5zZXRkcmF3aW5nbW9kZSgxKQotCQotCWRlZiBzZXRjb2x1bW4oc2VsZiwgY29sKToKLQkJc2VsZi5jb2wgPSBjb2wKLQkJc2VsZi5jb2xzdHIgPSBzdHJ1Y3QucGFjaygnaCcsIGNvbCkKLQkJaWYgc2VsZi5fbGlzdDoKLQkJCXNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJCXNlbGYuc2V0aXRlbXMoc2VsZi5pdGVtcykKLQkJCXNlbGYuc2V0c2VsZWN0aW9uKHNlbCkKLQkKLQlkZWYga2V5KHNlbGYsIGNoYXIsIGV2ZW50KToKLQkJaWYgY2hhciBpbiAoV2tleXMubGVmdGFycm93a2V5LCBXa2V5cy5yaWdodGFycm93a2V5KToKLQkJCXNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJCXNlbC5yZXZlcnNlKCkKLQkJCXNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKLQkJCWZvciBpbmRleCBpbiBzZWw6Ci0JCQkJc2VsZi5mb2xkKGluZGV4LCBjaGFyID09IFdrZXlzLnJpZ2h0YXJyb3drZXkpCi0JCQlzZWxmLnNldGRyYXdpbmdtb2RlKDEpCi0JCWVsc2U6Ci0JCQlXLkxpc3Qua2V5KHNlbGYsIGNoYXIsIGV2ZW50KQotCQotCWRlZiByb2xsb3ZlcihzZWxmLCAoeCwgeSksIG9ub2ZmKToKLQkJaWYgb25vZmY6Ci0JCQlpZiBzZWxmLmluY29sdW1uKCh4LCB5KSk6Ci0JCQkJVy5TZXRDdXJzb3IoJ2htb3ZlcicpCi0JCQllbHNlOgotCQkJCVcuU2V0Q3Vyc29yKCdhcnJvdycpCi0JCi0JZGVmIGluYXJyb3coc2VsZiwgKHgsIHkpKToKLQkJY2wsIGN0LCBjciwgY2IgPSBzZWxmLl9saXN0LkxSZWN0KCgwLCAwKSkKLQkJbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcwotCQlpZiAoeCAtIGNsKSA8IDE2OgotCQkJY2VsbGhlaWdodCA9IGNiIC0gY3QKLQkJCWluZGV4ID0gKHkgLSBjdCkgLyBjZWxsaGVpZ2h0Ci0JCQlpZiBpbmRleCA8IGxlbihzZWxmLml0ZW1zKToKLQkJCQlyZXR1cm4gMSwgaW5kZXgKLQkJcmV0dXJuIE5vbmUsIE5vbmUKLQkKLQlkZWYgaW5jb2x1bW4oc2VsZiwgKHgsIHkpKToKLQkJbCwgdCwgciwgYiA9IHNlbGYuX2xpc3QuTFJlY3QoKDAsIDApKQotCQlhYnNjb2wgPSBsICsgc2VsZi5jb2wKLQkJcmV0dXJuIGFicyhhYnNjb2wgLSB4KSA8IDMKLQkKLQlkZWYgdHJhY2tjb2x1bW4oc2VsZiwgKHgsIHkpKToKLQkJZnJvbSBDYXJib24gaW1wb3J0IFFkLCBRdWlja0RyYXcsIEV2dAotCQlzZWxmLlNldFBvcnQoKQotCQlsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCi0JCWJvdW5kcyA9IGwsIHQsIHIsIGIgPSBsICsgMSwgdCArIDEsIHIgLSAxNiwgYiAtIDEKLQkJYWJzY29sID0gbCArIHNlbGYuY29sCi0JCW1pbmNvbCA9IGwgKyBzZWxmLm1pbmNvbAotCQltYXhjb2wgPSByIC0gMTAKLQkJZGlmZiA9IGFic2NvbCAtIHgKLQkJUWQuUGVuUGF0KCdcMDAwXDM3N1wwMDBcMzc3XDAwMFwzNzdcMDAwXDM3NycpCi0JCVFkLlBlbk1vZGUoUXVpY2tEcmF3LnNyY1hvcikKLQkJcmVjdCA9IGFic2NvbCAtIDEsIHQsIGFic2NvbCwgYgotCQlRZC5QYWludFJlY3QocmVjdCkKLQkJbGFzdHBvaW50ID0gKHgsIHkpCi0JCW5ld2NvbCA9IC0xCi0JCSNXLlNldEN1cnNvcignZmlzdCcpCi0JCXdoaWxlIEV2dC5CdXR0b24oKToKLQkJCUV2dC5XYWl0TmV4dEV2ZW50KDAsIDEsIE5vbmUpICAjIG5lZWRlZCBmb3IgT1NYCi0JCQkoeCwgeSkgPSBFdnQuR2V0TW91c2UoKQotCQkJaWYgKHgsIHkpIDw+IGxhc3Rwb2ludDoKLQkJCQluZXdjb2wgPSB4ICsgZGlmZgotCQkJCW5ld2NvbCA9IG1heChuZXdjb2wsIG1pbmNvbCkKLQkJCQluZXdjb2wgPSBtaW4obmV3Y29sLCBtYXhjb2wpCi0JCQkJUWQuUGFpbnRSZWN0KHJlY3QpCi0JCQkJcmVjdCA9IG5ld2NvbCAtIDEsIHQsIG5ld2NvbCwgYgotCQkJCVFkLlBhaW50UmVjdChyZWN0KQotCQkJCWxhc3Rwb2ludCA9ICh4LCB5KQotCQlRZC5QYWludFJlY3QocmVjdCkKLQkJUWQuUGVuUGF0KFFkLkdldFFER2xvYmFsc0JsYWNrKCkpCi0JCVFkLlBlbk5vcm1hbCgpCi0JCWlmIG5ld2NvbCA+IDAgYW5kIG5ld2NvbCA8PiBhYnNjb2w6Ci0JCQlzZWxmLnNldGNvbHVtbihuZXdjb2wgLSBsKQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgcG9pbnQgPT0gKC0xLCAtMSk6CSMgZ3Jvc3MuCi0JCQlXLkxpc3QuY2xpY2soc2VsZiwgcG9pbnQgLG1vZGlmaWVycykKLQkJCXJldHVybgotCQloaXQsIGluZGV4ID0gc2VsZi5pbmFycm93KHBvaW50KQotCQlpZiBoaXQ6Ci0JCQkoa2V5LCB2YWx1ZSwgYXJyb3csIGluZGVudCkgPSBzZWxmLml0ZW1zW2luZGV4XQotCQkJc2VsZi5mb2xkKGluZGV4LCBhcnJvdyA9PSAxKQotCQllbGlmIHNlbGYuaW5jb2x1bW4ocG9pbnQpOgotCQkJc2VsZi50cmFja2NvbHVtbihwb2ludCkKLQkJZWxzZToKLQkJCVcuTGlzdC5jbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKQotCQotCSMgZm9yIFcuTGlzdC5rZXkKLQlkZWYgZmluZG1hdGNoKHNlbGYsIHRhZyk6Ci0JCWxvd2VyID0gc3RyaW5nLmxvd2VyCi0JCWl0ZW1zID0gc2VsZi5pdGVtcwotCQl0YWdsZW4gPSBsZW4odGFnKQotCQltYXRjaCA9ICdcMzc3JyAqIDEwMAotCQltYXRjaF9pID0gLTEKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKGl0ZW1zKSk6Ci0JCQlpdGVtID0gbG93ZXIoc3RyKGl0ZW1zW2ldWzBdKSkKLQkJCWlmIHRhZyA8PSBpdGVtIDwgbWF0Y2g6Ci0JCQkJbWF0Y2ggPSBpdGVtCi0JCQkJbWF0Y2hfaSA9IGkKLQkJaWYgbWF0Y2hfaSA+PSAwOgotCQkJcmV0dXJuIG1hdGNoX2kKLQkJZWxzZToKLQkJCXJldHVybiBsZW4oaXRlbXMpIC0gMQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgc2VsZi5jbG9zZWNoaWxkcmVuOgotCQkJZm9yIHdpbmRvdyBpbiBzZWxmLmNoaWxkcmVuOgotCQkJCXdpbmRvdy5jbG9zZSgpCi0JCXNlbGYuY2hpbGRyZW4gPSBbXQotCQlXLkxpc3QuY2xvc2Uoc2VsZikKLQkKLQlkZWYgZm9sZChzZWxmLCBpbmRleCwgb25vZmYpOgotCQkoa2V5LCB2YWx1ZSwgYXJyb3csIGluZGVudCkgPSBzZWxmLml0ZW1zW2luZGV4XQotCQlpZiBhcnJvdyA9PSAwIG9yIChvbm9mZiBhbmQgYXJyb3cgPT0gMikgb3IgKG5vdCBvbm9mZiBhbmQgYXJyb3cgPT0gMSk6Ci0JCQlyZXR1cm4KLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJdG9wY2VsbCA9IHNlbGYuZ2V0dG9wY2VsbCgpCi0JCWlmIG9ub2ZmOgotCQkJc2VsZltpbmRleF0gPSAoa2V5LCB2YWx1ZSwgNCwgaW5kZW50KQotCQkJc2VsZi5zZXRkcmF3aW5nbW9kZSgwKQotCQkJc2VsZltpbmRleCsxOmluZGV4KzFdID0gc2VsZi51bnBhY2sodmFsdWUsIGluZGVudCArIDEpCi0JCQlzZWxmW2luZGV4XSA9IChrZXksIHZhbHVlLCAyLCBpbmRlbnQpCi0JCWVsc2U6Ci0JCQlzZWxmW2luZGV4XSA9IChrZXksIHZhbHVlLCAzLCBpbmRlbnQpCi0JCQlzZWxmLnNldGRyYXdpbmdtb2RlKDApCi0JCQljb3VudCA9IDAKLQkJCWZvciBpIGluIHJhbmdlKGluZGV4ICsgMSwgbGVuKHNlbGYuaXRlbXMpKToKLQkJCQkoZHVtbXksIGR1bW15LCBkdW1teSwgc3ViaW5kZW50KSA9IHNlbGYuaXRlbXNbaV0KLQkJCQlpZiBzdWJpbmRlbnQgPD0gaW5kZW50OgotCQkJCQlicmVhawotCQkJCWNvdW50ID0gY291bnQgKyAxCi0JCQlzZWxmW2luZGV4KzE6aW5kZXgrMStjb3VudF0gPSBbXQotCQkJc2VsZltpbmRleF0gPSAoa2V5LCB2YWx1ZSwgMSwgaW5kZW50KQotCQltYXhpbmRlbnQgPSBzZWxmLmdldG1heGluZGVudCgpCi0JCWlmIG1heGluZGVudCA8PiBzZWxmLmxhc3RtYXhpbmRlbnQ6Ci0JCQluZXdhYnNpbmRlbnQgPSBzZWxmLmNvbCArIChtYXhpbmRlbnQgLSBzZWxmLmxhc3RtYXhpbmRlbnQpICogc2VsZi5pbmRlbnQKLQkJCWlmIG5ld2Fic2luZGVudCA+PSBzZWxmLm1pbmNvbDoKLQkJCQlzZWxmLnNldGNvbHVtbihuZXdhYnNpbmRlbnQpCi0JCQlzZWxmLmxhc3RtYXhpbmRlbnQgPSBtYXhpbmRlbnQKLQkJc2VsZi5zZXR0b3BjZWxsKHRvcGNlbGwpCi0JCXNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKLQkKLQlkZWYgdW5mb2xkb2JqZWN0cyhzZWxmLCBvYmplY3RzKToKLQkJZm9yIG9iaiBpbiBvYmplY3RzOgotCQkJdHJ5OgotCQkJCWluZGV4ID0gc2VsZi5pdGVtcy5pbmRleChvYmopCi0JCQlleGNlcHQgVmFsdWVFcnJvcjoKLQkJCQlwYXNzCi0JCQllbHNlOgotCQkJCXNlbGYuZm9sZChpbmRleCwgMSkKLQkKLQlkZWYgZ2V0dW5mb2xkZWRvYmplY3RzKHNlbGYpOgotCQljdXJpbmRlbnQgPSAwCi0JCW9iamVjdHMgPSBbXQotCQlmb3IgaW5kZXggaW4gcmFuZ2UobGVuKHNlbGYuaXRlbXMpKToKLQkJCShrZXksIHZhbHVlLCBhcnJvdywgaW5kZW50KSA9IHNlbGYuaXRlbXNbaW5kZXhdCi0JCQlpZiBpbmRlbnQgPiBjdXJpbmRlbnQ6Ci0JCQkJKGssIHYsIGEsIGkpID0gc2VsZi5pdGVtc1tpbmRleCAtIDFdCi0JCQkJb2JqZWN0cy5hcHBlbmQoKGssIHYsIDEsIGkpKQotCQkJCWN1cmluZGVudCA9IGluZGVudAotCQkJZWxpZiBpbmRlbnQgPCBjdXJpbmRlbnQ6Ci0JCQkJY3VyaW5kZW50ID0gaW5kZW50Ci0JCXJldHVybiBvYmplY3RzCi0JCi0JZGVmIGxpc3RoaXQoc2VsZiwgaXNkYmwpOgotCQlpZiBpc2RibDoKLQkJCXNlbGYub3BlbnNlbGVjdGlvbigpCi0JCi0JZGVmIG9wZW5zZWxlY3Rpb24oc2VsZik6Ci0JCWltcG9ydCBvcwotCQlzZWwgPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCWZvciBpbmRleCBpbiBzZWw6Ci0JCQkoa2V5LCB2YWx1ZSwgYXJyb3csIGluZGVudCkgPSBzZWxmW2luZGV4XQotCQkJaWYgYXJyb3c6Ci0JCQkJc2VsZi5jaGlsZHJlbi5hcHBlbmQoQnJvd3Nlcih2YWx1ZSkpCi0JCQllbGlmIHR5cGUodmFsdWUpID09IHR5cGVzLlN0cmluZ1R5cGUgYW5kICdcMCcgbm90IGluIHZhbHVlOgotCQkJCWVkaXRvciA9IHNlbGYuX3BhcmVudHdpbmRvdy5wYXJlbnQuZ2V0c2NyaXB0KHZhbHVlKQotCQkJCWlmIGVkaXRvcjoKLQkJCQkJZWRpdG9yLnNlbGVjdCgpCi0JCQkJCXJldHVybgotCQkJCWVsaWYgb3MucGF0aC5leGlzdHModmFsdWUpIGFuZCBvcy5wYXRoLmlzZmlsZSh2YWx1ZSk6Ci0JCQkJCWlmIE1hY09TLkdldENyZWF0b3JBbmRUeXBlKHZhbHVlKVsxXSBpbiAoJ1RFWFQnLCAnXDBcMFwwXDAnKToKLQkJCQkJCVcuZ2V0YXBwbGljYXRpb24oKS5vcGVuc2NyaXB0KHZhbHVlKQotCQotCWRlZiBpdGVtcmVwcihzZWxmLCAoa2V5LCB2YWx1ZSwgYXJyb3csIGluZGVudCksIHN0ciA9IHN0ciwgZG91YmxlX3JlcHIgPSBkb3VibGVfcmVwciwgCi0JCQlhcnJvd3MgPSBhcnJvd3MsIHBhY2sgPSBzdHJ1Y3QucGFjayk6Ci0JCWFycm93ID0gYXJyb3dzW2Fycm93XQotCQlyZXR1cm4gYXJyb3cgKyBwYWNrKCdoJywgc2VsZi5pbmRlbnQgKiBpbmRlbnQpICsgc2VsZi5jb2xzdHIgKyBcCi0JCQkJZG91YmxlX3JlcHIoa2V5LCB2YWx1ZSwgMSkKLQkKLQlkZWYgZ2V0bWF4aW5kZW50KHNlbGYsIG1heCA9IG1heCk6Ci0JCW1heGluZGVudCA9IDAKLQkJZm9yIGl0ZW0gaW4gc2VsZi5pdGVtczoKLQkJCW1heGluZGVudCA9IG1heChtYXhpbmRlbnQsIGl0ZW1bM10pCi0JCXJldHVybiBtYXhpbmRlbnQKLQkKLQlkZWYgZG9tZW51X2NvcHkoc2VsZiwgKmFyZ3MpOgotCQlzZWwgPSBzZWxmLmdldHNlbGVjdGVkb2JqZWN0cygpCi0JCXNlbGl0ZW1zID0gW10KLQkJZm9yIGtleSwgdmFsdWUsIGR1bW15LCBkdW1teSBpbiBzZWw6Ci0JCQlzZWxpdGVtcy5hcHBlbmQoZG91YmxlX3JlcHIoa2V5LCB2YWx1ZSkpCi0JCXRleHQgPSBzdHJpbmcuam9pbihzZWxpdGVtcywgJ1xyJykKLQkJaWYgdGV4dDoKLQkJCWZyb20gQ2FyYm9uIGltcG9ydCBTY3JhcAotCQkJaWYgaGFzYXR0cihTY3JhcCwgJ1B1dFNjcmFwJyk6Ci0JCQkJU2NyYXAuWmVyb1NjcmFwKCkKLQkJCQlTY3JhcC5QdXRTY3JhcCgnVEVYVCcsIHRleHQpCi0JCQllbHNlOgotCQkJCVNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKLQkJCQlzYyA9IFNjcmFwLkdldEN1cnJlbnRTY3JhcCgpCi0JCQkJc2MuUHV0U2NyYXBGbGF2b3IoJ1RFWFQnLCAwLCB0ZXh0KQogCi0JZGVmIGxpc3REZWZEcmF3KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwgCi0JCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKLQkJc2VsZi5teURyYXdDZWxsKDAsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwgCi0JCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KQotCQotCWRlZiBsaXN0RGVmSGlnaGxpZ2h0KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwgCi0JCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKLQkJc2VsZi5teURyYXdDZWxsKDEsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwgCi0JCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KQotCQotCWRlZiBteURyYXdDZWxsKHNlbGYsIG9ubHlIaWxpdGUsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwgCi0JCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKLQkJc2F2ZWRQb3J0ID0gUWQuR2V0UG9ydCgpCi0JCVFkLlNldFBvcnQodGhlTGlzdC5HZXRMaXN0UG9ydCgpKQotCQlzYXZlZENsaXAgPSBRZC5OZXdSZ24oKQotCQlRZC5HZXRDbGlwKHNhdmVkQ2xpcCkKLQkJUWQuQ2xpcFJlY3QoY2VsbFJlY3QpCi0JCXNhdmVkUGVuU3RhdGUgPSBRZC5HZXRQZW5TdGF0ZSgpCi0JCVFkLlBlbk5vcm1hbCgpCi0JCQotCQlsLCB0LCByLCBiID0gY2VsbFJlY3QKLQkJCi0JCWlmIG5vdCBvbmx5SGlsaXRlOgotCQkJUWQuRXJhc2VSZWN0KGNlbGxSZWN0KQotCQkJCi0JCQlhc2NlbnQsIGRlc2NlbnQsIGxlYWRpbmcsIHNpemUsIGhtID0gRm0uRm9udE1ldHJpY3MoKQotCQkJbGluZWZlZWQgPSBhc2NlbnQgKyBkZXNjZW50ICsgbGVhZGluZwotCQkJCi0JCQlpZiBkYXRhTGVuID49IDY6Ci0JCQkJZGF0YSA9IHRoZUxpc3QuTEdldENlbGwoZGF0YUxlbiwgdGhlQ2VsbCkKLQkJCQlpY29uSWQsIGluZGVudCwgdGFiID0gc3RydWN0LnVucGFjaygiaGhoIiwgZGF0YVs6Nl0pCi0JCQkJdHJ5OgotCQkJCQlrZXksIHZhbHVlID0gZGF0YVs2Ol0uc3BsaXQoIlx0IiwgMSkKLQkJCQlleGNlcHQgVmFsdWVFcnJvcjoKLQkJCQkJIyBib2d1cyBkYXRhLCBhdCBsZWFzdCBkb24ndCBjcmFzaC4KLQkJCQkJaW5kZW50ID0gMAotCQkJCQl0YWIgPSAwCi0JCQkJCWljb25JZCA9IDAKLQkJCQkJa2V5ID0gIiIKLQkJCQkJdmFsdWUgPSBkYXRhWzY6XQotCQkJCQotCQkJCWlmIGljb25JZDoKLQkJCQkJdHJ5OgotCQkJCQkJdGhlSWNvbiA9IEljbi5HZXRDSWNvbihpY29uSWQpCi0JCQkJCWV4Y2VwdCBJY24uRXJyb3I6Ci0JCQkJCQlwYXNzCi0JCQkJCWVsc2U6Ci0JCQkJCQlyZWN0ID0gKDAsIDAsIDE2LCAxNikKLQkJCQkJCXJlY3QgPSBRZC5PZmZzZXRSZWN0KHJlY3QsIGwsIHQpCi0JCQkJCQlyZWN0ID0gUWQuT2Zmc2V0UmVjdChyZWN0LCAwLCAodGhlTGlzdC5jZWxsU2l6ZVsxXSAtIChyZWN0WzNdIC0gcmVjdFsxXSkpIC8gMikKLQkJCQkJCUljbi5QbG90Q0ljb24ocmVjdCwgdGhlSWNvbikKLQkJCQkKLQkJCQlpZiBsZW4oa2V5KSA+PSAwOgotCQkJCQljbCwgY3QsIGNyLCBjYiA9IGNlbGxSZWN0Ci0JCQkJCXZsLCB2dCwgdnIsIHZiID0gc2VsZi5fdmlld2JvdW5kcwotCQkJCQljbCA9IHZsICsgUElDVFdJRFRIICsgaW5kZW50Ci0JCQkJCWNyID0gdmwgKyB0YWIKLQkJCQkJaWYgY3IgPiB2cjoKLQkJCQkJCWNyID0gdnIKLQkJCQkJaWYgY2wgPCBjcjoKLQkJCQkJCWRyYXdUZXh0Q2VsbChrZXksIChjbCwgY3QsIGNyLCBjYiksIGFzY2VudCwgdGhlTGlzdCkKLQkJCQkJY2wgPSB2bCArIHRhYgotCQkJCQljciA9IHZyCi0JCQkJCWlmIGNsIDwgY3I6Ci0JCQkJCQlkcmF3VGV4dENlbGwodmFsdWUsIChjbCwgY3QsIGNyLCBjYiksIGFzY2VudCwgdGhlTGlzdCkKLQkJCSNlbGlmIGRhdGFMZW4gIT0gMDoKLQkJCSMJZHJhd1RleHRDZWxsKCI/Pz8iLCAzLCBjZWxsUmVjdCwgYXNjZW50LCB0aGVMaXN0KQotCQkJZWxzZToKLQkJCQlyZXR1cm4gICMgd2UgaGF2ZSBib2d1cyBkYXRhCi0JCQkKLQkJCSMgZHJhdyBuaWNlIGRvdHRlZCBsaW5lCi0JCQlsLCB0LCByLCBiID0gY2VsbFJlY3QKLQkJCWwgPSBzZWxmLl92aWV3Ym91bmRzWzBdICsgdGFiCi0JCQlyID0gbCArIDE7Ci0JCQlpZiBub3QgKHRoZUxpc3QuY2VsbFNpemVbMV0gJiAweDAxKSBvciAodCAmIDB4MDEpOgotCQkJCW15UGF0ID0gIlx4ZmZceDAwXHhmZlx4MDBceGZmXHgwMFx4ZmZceDAwIgotCQkJZWxzZToKLQkJCQlteVBhdCA9ICJceDAwXHhmZlx4MDBceGZmXHgwMFx4ZmZceDAwXHhmZiIKLQkJCVFkLlBlblBhdChteVBhdCkKLQkJCVFkLlBlbk1vZGUoUXVpY2tEcmF3LnNyY0NvcHkpCi0JCQlRZC5QYWludFJlY3QoKGwsIHQsIHIsIGIpKQotCQkJUWQuUGVuTm9ybWFsKCkKLQkJCi0JCWlmIHNlbGVjdGVkIG9yIG9ubHlIaWxpdGU6Ci0JCQlsLCB0LCByLCBiID0gY2VsbFJlY3QKLQkJCWwgPSBzZWxmLl92aWV3Ym91bmRzWzBdICsgUElDVFdJRFRICi0JCQlyID0gc2VsZi5fdmlld2JvdW5kc1syXQotCQkJUWQuUGVuTW9kZShoaWxpdGV0cmFuc2Zlcm1vZGUpCi0JCQlRZC5QYWludFJlY3QoKGwsIHQsIHIsIGIpKQotCQkKLQkJIyByZXN0b3JlIGdyYXBoaWNzIGVudmlyb25tZW50Ci0JCVFkLlNldFBvcnQoc2F2ZWRQb3J0KQotCQlRZC5TZXRDbGlwKHNhdmVkQ2xpcCkKLQkJUWQuRGlzcG9zZVJnbihzYXZlZENsaXApCi0JCVFkLlNldFBlblN0YXRlKHNhdmVkUGVuU3RhdGUpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIG9iamVjdCA9IE5vbmUsIGNvbCA9IDEwMCwgY2xvc2VjaGlsZHJlbiA9IDApOgorICAgICAgICBXLkxpc3QuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgY2FsbGJhY2sgPSBzZWxmLmxpc3RoaXQpCisgICAgICAgIHNlbGYub2JqZWN0ID0gKE5vbmUsKQorICAgICAgICBzZWxmLmluZGVudCA9IDE2CisgICAgICAgIHNlbGYubGFzdG1heGluZGVudCA9IDAKKyAgICAgICAgc2VsZi5jbG9zZWNoaWxkcmVuID0gY2xvc2VjaGlsZHJlbgorICAgICAgICBzZWxmLmNoaWxkcmVuID0gW10KKyAgICAgICAgc2VsZi5taW5jb2wgPSA2NAorICAgICAgICBzZWxmLnNldGNvbHVtbihjb2wpCisgICAgICAgIHNlbGYuYmluZCgncmV0dXJuJywgc2VsZi5vcGVuc2VsZWN0aW9uKQorICAgICAgICBzZWxmLmJpbmQoJ2VudGVyJywgc2VsZi5vcGVuc2VsZWN0aW9uKQorICAgICAgICBpZiBvYmplY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnNldChvYmplY3QpCisKKyAgICBkZWYgc2V0KHNlbGYsIG9iamVjdCk6CisgICAgICAgIGlmIHNlbGYub2JqZWN0WzBdIGlzIG5vdCBvYmplY3Q6CisgICAgICAgICAgICBzZWxmLm9iamVjdCA9IG9iamVjdCwKKyAgICAgICAgICAgIHNlbGZbOl0gPSBzZWxmLnVucGFjayhvYmplY3QsIDApCisgICAgICAgIGVsaWYgc2VsZi5fcGFyZW50d2luZG93IGlzIG5vdCBOb25lIGFuZCBzZWxmLl9wYXJlbnR3aW5kb3cud2lkOgorICAgICAgICAgICAgc2VsZi51cGRhdGUoKQorCisgICAgZGVmIHVucGFjayhzZWxmLCBvYmplY3QsIGluZGVudCk6CisgICAgICAgIHJldHVybiB1bnBhY2tfb2JqZWN0KG9iamVjdCwgaW5kZW50KQorCisgICAgZGVmIHVwZGF0ZShzZWxmKToKKyAgICAgICAgIyBmb3Igbm93Li4uCisgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKKyAgICAgICAgc2VsID0gc2VsZi5nZXRzZWxlY3RlZG9iamVjdHMoKQorICAgICAgICBmb2xkID0gc2VsZi5nZXR1bmZvbGRlZG9iamVjdHMoKQorICAgICAgICB0b3BjZWxsID0gc2VsZi5nZXR0b3BjZWxsKCkKKyAgICAgICAgc2VsZls6XSA9IHNlbGYudW5wYWNrKHNlbGYub2JqZWN0WzBdLCAwKQorICAgICAgICBzZWxmLnVuZm9sZG9iamVjdHMoZm9sZCkKKyAgICAgICAgc2VsZi5zZXRzZWxlY3RlZG9iamVjdHMoc2VsKQorICAgICAgICBzZWxmLnNldHRvcGNlbGwodG9wY2VsbCkKKyAgICAgICAgc2VsZi5zZXRkcmF3aW5nbW9kZSgxKQorCisgICAgZGVmIHNldGNvbHVtbihzZWxmLCBjb2wpOgorICAgICAgICBzZWxmLmNvbCA9IGNvbAorICAgICAgICBzZWxmLmNvbHN0ciA9IHN0cnVjdC5wYWNrKCdoJywgY29sKQorICAgICAgICBpZiBzZWxmLl9saXN0OgorICAgICAgICAgICAgc2VsID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICAgICAgc2VsZi5zZXRpdGVtcyhzZWxmLml0ZW1zKQorICAgICAgICAgICAgc2VsZi5zZXRzZWxlY3Rpb24oc2VsKQorCisgICAgZGVmIGtleShzZWxmLCBjaGFyLCBldmVudCk6CisgICAgICAgIGlmIGNoYXIgaW4gKFdrZXlzLmxlZnRhcnJvd2tleSwgV2tleXMucmlnaHRhcnJvd2tleSk6CisgICAgICAgICAgICBzZWwgPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgICAgICBzZWwucmV2ZXJzZSgpCisgICAgICAgICAgICBzZWxmLnNldGRyYXdpbmdtb2RlKDApCisgICAgICAgICAgICBmb3IgaW5kZXggaW4gc2VsOgorICAgICAgICAgICAgICAgIHNlbGYuZm9sZChpbmRleCwgY2hhciA9PSBXa2V5cy5yaWdodGFycm93a2V5KQorICAgICAgICAgICAgc2VsZi5zZXRkcmF3aW5nbW9kZSgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgVy5MaXN0LmtleShzZWxmLCBjaGFyLCBldmVudCkKKworICAgIGRlZiByb2xsb3ZlcihzZWxmLCAoeCwgeSksIG9ub2ZmKToKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBpZiBzZWxmLmluY29sdW1uKCh4LCB5KSk6CisgICAgICAgICAgICAgICAgVy5TZXRDdXJzb3IoJ2htb3ZlcicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFcuU2V0Q3Vyc29yKCdhcnJvdycpCisKKyAgICBkZWYgaW5hcnJvdyhzZWxmLCAoeCwgeSkpOgorICAgICAgICBjbCwgY3QsIGNyLCBjYiA9IHNlbGYuX2xpc3QuTFJlY3QoKDAsIDApKQorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIGlmICh4IC0gY2wpIDwgMTY6CisgICAgICAgICAgICBjZWxsaGVpZ2h0ID0gY2IgLSBjdAorICAgICAgICAgICAgaW5kZXggPSAoeSAtIGN0KSAvIGNlbGxoZWlnaHQKKyAgICAgICAgICAgIGlmIGluZGV4IDwgbGVuKHNlbGYuaXRlbXMpOgorICAgICAgICAgICAgICAgIHJldHVybiAxLCBpbmRleAorICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorCisgICAgZGVmIGluY29sdW1uKHNlbGYsICh4LCB5KSk6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9saXN0LkxSZWN0KCgwLCAwKSkKKyAgICAgICAgYWJzY29sID0gbCArIHNlbGYuY29sCisgICAgICAgIHJldHVybiBhYnMoYWJzY29sIC0geCkgPCAzCisKKyAgICBkZWYgdHJhY2tjb2x1bW4oc2VsZiwgKHgsIHkpKToKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IFFkLCBRdWlja0RyYXcsIEV2dAorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIGJvdW5kcyA9IGwsIHQsIHIsIGIgPSBsICsgMSwgdCArIDEsIHIgLSAxNiwgYiAtIDEKKyAgICAgICAgYWJzY29sID0gbCArIHNlbGYuY29sCisgICAgICAgIG1pbmNvbCA9IGwgKyBzZWxmLm1pbmNvbAorICAgICAgICBtYXhjb2wgPSByIC0gMTAKKyAgICAgICAgZGlmZiA9IGFic2NvbCAtIHgKKyAgICAgICAgUWQuUGVuUGF0KCdcMDAwXDM3N1wwMDBcMzc3XDAwMFwzNzdcMDAwXDM3NycpCisgICAgICAgIFFkLlBlbk1vZGUoUXVpY2tEcmF3LnNyY1hvcikKKyAgICAgICAgcmVjdCA9IGFic2NvbCAtIDEsIHQsIGFic2NvbCwgYgorICAgICAgICBRZC5QYWludFJlY3QocmVjdCkKKyAgICAgICAgbGFzdHBvaW50ID0gKHgsIHkpCisgICAgICAgIG5ld2NvbCA9IC0xCisgICAgICAgICNXLlNldEN1cnNvcignZmlzdCcpCisgICAgICAgIHdoaWxlIEV2dC5CdXR0b24oKToKKyAgICAgICAgICAgIEV2dC5XYWl0TmV4dEV2ZW50KDAsIDEsIE5vbmUpICAjIG5lZWRlZCBmb3IgT1NYCisgICAgICAgICAgICAoeCwgeSkgPSBFdnQuR2V0TW91c2UoKQorICAgICAgICAgICAgaWYgKHgsIHkpIDw+IGxhc3Rwb2ludDoKKyAgICAgICAgICAgICAgICBuZXdjb2wgPSB4ICsgZGlmZgorICAgICAgICAgICAgICAgIG5ld2NvbCA9IG1heChuZXdjb2wsIG1pbmNvbCkKKyAgICAgICAgICAgICAgICBuZXdjb2wgPSBtaW4obmV3Y29sLCBtYXhjb2wpCisgICAgICAgICAgICAgICAgUWQuUGFpbnRSZWN0KHJlY3QpCisgICAgICAgICAgICAgICAgcmVjdCA9IG5ld2NvbCAtIDEsIHQsIG5ld2NvbCwgYgorICAgICAgICAgICAgICAgIFFkLlBhaW50UmVjdChyZWN0KQorICAgICAgICAgICAgICAgIGxhc3Rwb2ludCA9ICh4LCB5KQorICAgICAgICBRZC5QYWludFJlY3QocmVjdCkKKyAgICAgICAgUWQuUGVuUGF0KFFkLkdldFFER2xvYmFsc0JsYWNrKCkpCisgICAgICAgIFFkLlBlbk5vcm1hbCgpCisgICAgICAgIGlmIG5ld2NvbCA+IDAgYW5kIG5ld2NvbCA8PiBhYnNjb2w6CisgICAgICAgICAgICBzZWxmLnNldGNvbHVtbihuZXdjb2wgLSBsKQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBwb2ludCA9PSAoLTEsIC0xKTogICAjIGdyb3NzLgorICAgICAgICAgICAgVy5MaXN0LmNsaWNrKHNlbGYsIHBvaW50ICxtb2RpZmllcnMpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaGl0LCBpbmRleCA9IHNlbGYuaW5hcnJvdyhwb2ludCkKKyAgICAgICAgaWYgaGl0OgorICAgICAgICAgICAgKGtleSwgdmFsdWUsIGFycm93LCBpbmRlbnQpID0gc2VsZi5pdGVtc1tpbmRleF0KKyAgICAgICAgICAgIHNlbGYuZm9sZChpbmRleCwgYXJyb3cgPT0gMSkKKyAgICAgICAgZWxpZiBzZWxmLmluY29sdW1uKHBvaW50KToKKyAgICAgICAgICAgIHNlbGYudHJhY2tjb2x1bW4ocG9pbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBXLkxpc3QuY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycykKKworICAgICMgZm9yIFcuTGlzdC5rZXkKKyAgICBkZWYgZmluZG1hdGNoKHNlbGYsIHRhZyk6CisgICAgICAgIGxvd2VyID0gc3RyaW5nLmxvd2VyCisgICAgICAgIGl0ZW1zID0gc2VsZi5pdGVtcworICAgICAgICB0YWdsZW4gPSBsZW4odGFnKQorICAgICAgICBtYXRjaCA9ICdcMzc3JyAqIDEwMAorICAgICAgICBtYXRjaF9pID0gLTEKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGl0ZW1zKSk6CisgICAgICAgICAgICBpdGVtID0gbG93ZXIoc3RyKGl0ZW1zW2ldWzBdKSkKKyAgICAgICAgICAgIGlmIHRhZyA8PSBpdGVtIDwgbWF0Y2g6CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBpdGVtCisgICAgICAgICAgICAgICAgbWF0Y2hfaSA9IGkKKyAgICAgICAgaWYgbWF0Y2hfaSA+PSAwOgorICAgICAgICAgICAgcmV0dXJuIG1hdGNoX2kKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBsZW4oaXRlbXMpIC0gMQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlY2hpbGRyZW46CisgICAgICAgICAgICBmb3Igd2luZG93IGluIHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICAgICAgd2luZG93LmNsb3NlKCkKKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCisgICAgICAgIFcuTGlzdC5jbG9zZShzZWxmKQorCisgICAgZGVmIGZvbGQoc2VsZiwgaW5kZXgsIG9ub2ZmKToKKyAgICAgICAgKGtleSwgdmFsdWUsIGFycm93LCBpbmRlbnQpID0gc2VsZi5pdGVtc1tpbmRleF0KKyAgICAgICAgaWYgYXJyb3cgPT0gMCBvciAob25vZmYgYW5kIGFycm93ID09IDIpIG9yIChub3Qgb25vZmYgYW5kIGFycm93ID09IDEpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgIHRvcGNlbGwgPSBzZWxmLmdldHRvcGNlbGwoKQorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGZbaW5kZXhdID0gKGtleSwgdmFsdWUsIDQsIGluZGVudCkKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKKyAgICAgICAgICAgIHNlbGZbaW5kZXgrMTppbmRleCsxXSA9IHNlbGYudW5wYWNrKHZhbHVlLCBpbmRlbnQgKyAxKQorICAgICAgICAgICAgc2VsZltpbmRleF0gPSAoa2V5LCB2YWx1ZSwgMiwgaW5kZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZltpbmRleF0gPSAoa2V5LCB2YWx1ZSwgMywgaW5kZW50KQorICAgICAgICAgICAgc2VsZi5zZXRkcmF3aW5nbW9kZSgwKQorICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShpbmRleCArIDEsIGxlbihzZWxmLml0ZW1zKSk6CisgICAgICAgICAgICAgICAgKGR1bW15LCBkdW1teSwgZHVtbXksIHN1YmluZGVudCkgPSBzZWxmLml0ZW1zW2ldCisgICAgICAgICAgICAgICAgaWYgc3ViaW5kZW50IDw9IGluZGVudDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgc2VsZltpbmRleCsxOmluZGV4KzErY291bnRdID0gW10KKyAgICAgICAgICAgIHNlbGZbaW5kZXhdID0gKGtleSwgdmFsdWUsIDEsIGluZGVudCkKKyAgICAgICAgbWF4aW5kZW50ID0gc2VsZi5nZXRtYXhpbmRlbnQoKQorICAgICAgICBpZiBtYXhpbmRlbnQgPD4gc2VsZi5sYXN0bWF4aW5kZW50OgorICAgICAgICAgICAgbmV3YWJzaW5kZW50ID0gc2VsZi5jb2wgKyAobWF4aW5kZW50IC0gc2VsZi5sYXN0bWF4aW5kZW50KSAqIHNlbGYuaW5kZW50CisgICAgICAgICAgICBpZiBuZXdhYnNpbmRlbnQgPj0gc2VsZi5taW5jb2w6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRjb2x1bW4obmV3YWJzaW5kZW50KQorICAgICAgICAgICAgc2VsZi5sYXN0bWF4aW5kZW50ID0gbWF4aW5kZW50CisgICAgICAgIHNlbGYuc2V0dG9wY2VsbCh0b3BjZWxsKQorICAgICAgICBzZWxmLnNldGRyYXdpbmdtb2RlKDEpCisKKyAgICBkZWYgdW5mb2xkb2JqZWN0cyhzZWxmLCBvYmplY3RzKToKKyAgICAgICAgZm9yIG9iaiBpbiBvYmplY3RzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGluZGV4ID0gc2VsZi5pdGVtcy5pbmRleChvYmopCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZm9sZChpbmRleCwgMSkKKworICAgIGRlZiBnZXR1bmZvbGRlZG9iamVjdHMoc2VsZik6CisgICAgICAgIGN1cmluZGVudCA9IDAKKyAgICAgICAgb2JqZWN0cyA9IFtdCisgICAgICAgIGZvciBpbmRleCBpbiByYW5nZShsZW4oc2VsZi5pdGVtcykpOgorICAgICAgICAgICAgKGtleSwgdmFsdWUsIGFycm93LCBpbmRlbnQpID0gc2VsZi5pdGVtc1tpbmRleF0KKyAgICAgICAgICAgIGlmIGluZGVudCA+IGN1cmluZGVudDoKKyAgICAgICAgICAgICAgICAoaywgdiwgYSwgaSkgPSBzZWxmLml0ZW1zW2luZGV4IC0gMV0KKyAgICAgICAgICAgICAgICBvYmplY3RzLmFwcGVuZCgoaywgdiwgMSwgaSkpCisgICAgICAgICAgICAgICAgY3VyaW5kZW50ID0gaW5kZW50CisgICAgICAgICAgICBlbGlmIGluZGVudCA8IGN1cmluZGVudDoKKyAgICAgICAgICAgICAgICBjdXJpbmRlbnQgPSBpbmRlbnQKKyAgICAgICAgcmV0dXJuIG9iamVjdHMKKworICAgIGRlZiBsaXN0aGl0KHNlbGYsIGlzZGJsKToKKyAgICAgICAgaWYgaXNkYmw6CisgICAgICAgICAgICBzZWxmLm9wZW5zZWxlY3Rpb24oKQorCisgICAgZGVmIG9wZW5zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBzZWwgPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIGZvciBpbmRleCBpbiBzZWw6CisgICAgICAgICAgICAoa2V5LCB2YWx1ZSwgYXJyb3csIGluZGVudCkgPSBzZWxmW2luZGV4XQorICAgICAgICAgICAgaWYgYXJyb3c6CisgICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQoQnJvd3Nlcih2YWx1ZSkpCisgICAgICAgICAgICBlbGlmIHR5cGUodmFsdWUpID09IHR5cGVzLlN0cmluZ1R5cGUgYW5kICdcMCcgbm90IGluIHZhbHVlOgorICAgICAgICAgICAgICAgIGVkaXRvciA9IHNlbGYuX3BhcmVudHdpbmRvdy5wYXJlbnQuZ2V0c2NyaXB0KHZhbHVlKQorICAgICAgICAgICAgICAgIGlmIGVkaXRvcjoKKyAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNlbGVjdCgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHModmFsdWUpIGFuZCBvcy5wYXRoLmlzZmlsZSh2YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgIGlmIE1hY09TLkdldENyZWF0b3JBbmRUeXBlKHZhbHVlKVsxXSBpbiAoJ1RFWFQnLCAnXDBcMFwwXDAnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIFcuZ2V0YXBwbGljYXRpb24oKS5vcGVuc2NyaXB0KHZhbHVlKQorCisgICAgZGVmIGl0ZW1yZXByKHNlbGYsIChrZXksIHZhbHVlLCBhcnJvdywgaW5kZW50KSwgc3RyID0gc3RyLCBkb3VibGVfcmVwciA9IGRvdWJsZV9yZXByLAorICAgICAgICAgICAgICAgICAgICBhcnJvd3MgPSBhcnJvd3MsIHBhY2sgPSBzdHJ1Y3QucGFjayk6CisgICAgICAgIGFycm93ID0gYXJyb3dzW2Fycm93XQorICAgICAgICByZXR1cm4gYXJyb3cgKyBwYWNrKCdoJywgc2VsZi5pbmRlbnQgKiBpbmRlbnQpICsgc2VsZi5jb2xzdHIgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVfcmVwcihrZXksIHZhbHVlLCAxKQorCisgICAgZGVmIGdldG1heGluZGVudChzZWxmLCBtYXggPSBtYXgpOgorICAgICAgICBtYXhpbmRlbnQgPSAwCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYuaXRlbXM6CisgICAgICAgICAgICBtYXhpbmRlbnQgPSBtYXgobWF4aW5kZW50LCBpdGVtWzNdKQorICAgICAgICByZXR1cm4gbWF4aW5kZW50CisKKyAgICBkZWYgZG9tZW51X2NvcHkoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWwgPSBzZWxmLmdldHNlbGVjdGVkb2JqZWN0cygpCisgICAgICAgIHNlbGl0ZW1zID0gW10KKyAgICAgICAgZm9yIGtleSwgdmFsdWUsIGR1bW15LCBkdW1teSBpbiBzZWw6CisgICAgICAgICAgICBzZWxpdGVtcy5hcHBlbmQoZG91YmxlX3JlcHIoa2V5LCB2YWx1ZSkpCisgICAgICAgIHRleHQgPSBzdHJpbmcuam9pbihzZWxpdGVtcywgJ1xyJykKKyAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBTY3JhcAorICAgICAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ1B1dFNjcmFwJyk6CisgICAgICAgICAgICAgICAgU2NyYXAuWmVyb1NjcmFwKCkKKyAgICAgICAgICAgICAgICBTY3JhcC5QdXRTY3JhcCgnVEVYVCcsIHRleHQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKKyAgICAgICAgICAgICAgICBzYyA9IFNjcmFwLkdldEN1cnJlbnRTY3JhcCgpCisgICAgICAgICAgICAgICAgc2MuUHV0U2NyYXBGbGF2b3IoJ1RFWFQnLCAwLCB0ZXh0KQorCisgICAgZGVmIGxpc3REZWZEcmF3KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6CisgICAgICAgIHNlbGYubXlEcmF3Q2VsbCgwLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCkKKworICAgIGRlZiBsaXN0RGVmSGlnaGxpZ2h0KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6CisgICAgICAgIHNlbGYubXlEcmF3Q2VsbCgxLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCkKKworICAgIGRlZiBteURyYXdDZWxsKHNlbGYsIG9ubHlIaWxpdGUsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6CisgICAgICAgIHNhdmVkUG9ydCA9IFFkLkdldFBvcnQoKQorICAgICAgICBRZC5TZXRQb3J0KHRoZUxpc3QuR2V0TGlzdFBvcnQoKSkKKyAgICAgICAgc2F2ZWRDbGlwID0gUWQuTmV3UmduKCkKKyAgICAgICAgUWQuR2V0Q2xpcChzYXZlZENsaXApCisgICAgICAgIFFkLkNsaXBSZWN0KGNlbGxSZWN0KQorICAgICAgICBzYXZlZFBlblN0YXRlID0gUWQuR2V0UGVuU3RhdGUoKQorICAgICAgICBRZC5QZW5Ob3JtYWwoKQorCisgICAgICAgIGwsIHQsIHIsIGIgPSBjZWxsUmVjdAorCisgICAgICAgIGlmIG5vdCBvbmx5SGlsaXRlOgorICAgICAgICAgICAgUWQuRXJhc2VSZWN0KGNlbGxSZWN0KQorCisgICAgICAgICAgICBhc2NlbnQsIGRlc2NlbnQsIGxlYWRpbmcsIHNpemUsIGhtID0gRm0uRm9udE1ldHJpY3MoKQorICAgICAgICAgICAgbGluZWZlZWQgPSBhc2NlbnQgKyBkZXNjZW50ICsgbGVhZGluZworCisgICAgICAgICAgICBpZiBkYXRhTGVuID49IDY6CisgICAgICAgICAgICAgICAgZGF0YSA9IHRoZUxpc3QuTEdldENlbGwoZGF0YUxlbiwgdGhlQ2VsbCkKKyAgICAgICAgICAgICAgICBpY29uSWQsIGluZGVudCwgdGFiID0gc3RydWN0LnVucGFjaygiaGhoIiwgZGF0YVs6Nl0pCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlID0gZGF0YVs2Ol0uc3BsaXQoIlx0IiwgMSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBib2d1cyBkYXRhLCBhdCBsZWFzdCBkb24ndCBjcmFzaC4KKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gMAorICAgICAgICAgICAgICAgICAgICB0YWIgPSAwCisgICAgICAgICAgICAgICAgICAgIGljb25JZCA9IDAKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gIiIKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhWzY6XQorCisgICAgICAgICAgICAgICAgaWYgaWNvbklkOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uID0gSWNuLkdldENJY29uKGljb25JZCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEljbi5FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QgPSAoMCwgMCwgMTYsIDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgcmVjdCA9IFFkLk9mZnNldFJlY3QocmVjdCwgbCwgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QgPSBRZC5PZmZzZXRSZWN0KHJlY3QsIDAsICh0aGVMaXN0LmNlbGxTaXplWzFdIC0gKHJlY3RbM10gLSByZWN0WzFdKSkgLyAyKQorICAgICAgICAgICAgICAgICAgICAgICAgSWNuLlBsb3RDSWNvbihyZWN0LCB0aGVJY29uKQorCisgICAgICAgICAgICAgICAgaWYgbGVuKGtleSkgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgY2wsIGN0LCBjciwgY2IgPSBjZWxsUmVjdAorICAgICAgICAgICAgICAgICAgICB2bCwgdnQsIHZyLCB2YiA9IHNlbGYuX3ZpZXdib3VuZHMKKyAgICAgICAgICAgICAgICAgICAgY2wgPSB2bCArIFBJQ1RXSURUSCArIGluZGVudAorICAgICAgICAgICAgICAgICAgICBjciA9IHZsICsgdGFiCisgICAgICAgICAgICAgICAgICAgIGlmIGNyID4gdnI6CisgICAgICAgICAgICAgICAgICAgICAgICBjciA9IHZyCisgICAgICAgICAgICAgICAgICAgIGlmIGNsIDwgY3I6CisgICAgICAgICAgICAgICAgICAgICAgICBkcmF3VGV4dENlbGwoa2V5LCAoY2wsIGN0LCBjciwgY2IpLCBhc2NlbnQsIHRoZUxpc3QpCisgICAgICAgICAgICAgICAgICAgIGNsID0gdmwgKyB0YWIKKyAgICAgICAgICAgICAgICAgICAgY3IgPSB2cgorICAgICAgICAgICAgICAgICAgICBpZiBjbCA8IGNyOgorICAgICAgICAgICAgICAgICAgICAgICAgZHJhd1RleHRDZWxsKHZhbHVlLCAoY2wsIGN0LCBjciwgY2IpLCBhc2NlbnQsIHRoZUxpc3QpCisgICAgICAgICAgICAjZWxpZiBkYXRhTGVuICE9IDA6CisgICAgICAgICAgICAjICAgICAgIGRyYXdUZXh0Q2VsbCgiPz8/IiwgMywgY2VsbFJlY3QsIGFzY2VudCwgdGhlTGlzdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICAjIHdlIGhhdmUgYm9ndXMgZGF0YQorCisgICAgICAgICAgICAjIGRyYXcgbmljZSBkb3R0ZWQgbGluZQorICAgICAgICAgICAgbCwgdCwgciwgYiA9IGNlbGxSZWN0CisgICAgICAgICAgICBsID0gc2VsZi5fdmlld2JvdW5kc1swXSArIHRhYgorICAgICAgICAgICAgciA9IGwgKyAxOworICAgICAgICAgICAgaWYgbm90ICh0aGVMaXN0LmNlbGxTaXplWzFdICYgMHgwMSkgb3IgKHQgJiAweDAxKToKKyAgICAgICAgICAgICAgICBteVBhdCA9ICJceGZmXHgwMFx4ZmZceDAwXHhmZlx4MDBceGZmXHgwMCIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbXlQYXQgPSAiXHgwMFx4ZmZceDAwXHhmZlx4MDBceGZmXHgwMFx4ZmYiCisgICAgICAgICAgICBRZC5QZW5QYXQobXlQYXQpCisgICAgICAgICAgICBRZC5QZW5Nb2RlKFF1aWNrRHJhdy5zcmNDb3B5KQorICAgICAgICAgICAgUWQuUGFpbnRSZWN0KChsLCB0LCByLCBiKSkKKyAgICAgICAgICAgIFFkLlBlbk5vcm1hbCgpCisKKyAgICAgICAgaWYgc2VsZWN0ZWQgb3Igb25seUhpbGl0ZToKKyAgICAgICAgICAgIGwsIHQsIHIsIGIgPSBjZWxsUmVjdAorICAgICAgICAgICAgbCA9IHNlbGYuX3ZpZXdib3VuZHNbMF0gKyBQSUNUV0lEVEgKKyAgICAgICAgICAgIHIgPSBzZWxmLl92aWV3Ym91bmRzWzJdCisgICAgICAgICAgICBRZC5QZW5Nb2RlKGhpbGl0ZXRyYW5zZmVybW9kZSkKKyAgICAgICAgICAgIFFkLlBhaW50UmVjdCgobCwgdCwgciwgYikpCisKKyAgICAgICAgIyByZXN0b3JlIGdyYXBoaWNzIGVudmlyb25tZW50CisgICAgICAgIFFkLlNldFBvcnQoc2F2ZWRQb3J0KQorICAgICAgICBRZC5TZXRDbGlwKHNhdmVkQ2xpcCkKKyAgICAgICAgUWQuRGlzcG9zZVJnbihzYXZlZENsaXApCisgICAgICAgIFFkLlNldFBlblN0YXRlKHNhdmVkUGVuU3RhdGUpCiAKIAogCiBjbGFzcyBCcm93c2VyOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBvYmplY3QgPSBOb25lLCB0aXRsZSA9IE5vbmUsIGNsb3NlY2hpbGRyZW4gPSAwKToKLQkJaWYgaGFzYXR0cihvYmplY3QsICdfX25hbWVfXycpOgotCQkJbmFtZSA9IG9iamVjdC5fX25hbWVfXwotCQllbHNlOgotCQkJbmFtZSA9ICcnCi0JCWlmIHRpdGxlIGlzIE5vbmU6Ci0JCQl0aXRsZSA9ICdPYmplY3QgYnJvd3NlcicKLQkJCWlmIG5hbWU6Ci0JCQkJdGl0bGUgPSB0aXRsZSArICc6ICcgKyBuYW1lCi0JCXNlbGYudyA9IHcgPSBXLldpbmRvdygoMzAwLCA0MDApLCB0aXRsZSwgbWluc2l6ZSA9ICgxMDAsIDEwMCkpCi0JCXcuaW5mbyA9IFcuVGV4dEJveCgoMTgsIDgsIC03MCwgMTUpKQotCQl3LnVwZGF0ZWJ1dHRvbiA9IFcuQmV2ZWxCdXR0b24oKC02NCwgNCwgNTAsIDE2KSwgJ1VwZGF0ZScsIHNlbGYudXBkYXRlKQotCQl3LmJyb3dzZXIgPSBCcm93c2VyV2lkZ2V0KCgtMSwgMjQsIDEsIC0xNCksIE5vbmUpCi0JCXcuYmluZCgnY21kdScsIHcudXBkYXRlYnV0dG9uLnB1c2gpCi0JCXcub3BlbigpCi0JCXNlbGYuc2V0KG9iamVjdCwgbmFtZSkKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCWlmIHNlbGYudy53aWQ6Ci0JCQlzZWxmLncuY2xvc2UoKQotCQotCWRlZiBzZXQoc2VsZiwgb2JqZWN0LCBuYW1lID0gJycpOgotCQlXLlNldEN1cnNvcignd2F0Y2gnKQotCQl0cCA9IHR5cGUob2JqZWN0KS5fX25hbWVfXwotCQl0cnk6Ci0JCQlsZW5ndGggPSBsZW4ob2JqZWN0KQotCQlleGNlcHQ6Ci0JCQlsZW5ndGggPSAtMQotCQlpZiBub3QgbmFtZSBhbmQgaGFzYXR0cihvYmplY3QsICdfX25hbWVfXycpOgotCQkJbmFtZSA9IG9iamVjdC5fX25hbWVfXwotCQlpZiBuYW1lOgotCQkJaW5mbyA9IG5hbWUgKyAnOiAnICsgdHAKLQkJZWxzZToKLQkJCWluZm8gPSB0cAotCQlpZiBsZW5ndGggPj0gMDoKLQkJCWlmIGxlbmd0aCA9PSAxOgotCQkJCWluZm8gPSBpbmZvICsgJyAoJWQgZWxlbWVudCknICUgbGVuZ3RoCi0JCQllbHNlOgotCQkJCWluZm8gPSBpbmZvICsgJyAoJWQgZWxlbWVudHMpJyAlIGxlbmd0aAotCQlzZWxmLncuaW5mby5zZXQoaW5mbykKLQkJc2VsZi53LmJyb3dzZXIuc2V0KG9iamVjdCkKLQkKLQlkZWYgdXBkYXRlKHNlbGYpOgotCQlzZWxmLncuYnJvd3Nlci51cGRhdGUoKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iamVjdCA9IE5vbmUsIHRpdGxlID0gTm9uZSwgY2xvc2VjaGlsZHJlbiA9IDApOgorICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fbmFtZV9fJyk6CisgICAgICAgICAgICBuYW1lID0gb2JqZWN0Ll9fbmFtZV9fCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lID0gJycKKyAgICAgICAgaWYgdGl0bGUgaXMgTm9uZToKKyAgICAgICAgICAgIHRpdGxlID0gJ09iamVjdCBicm93c2VyJworICAgICAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlICsgJzogJyArIG5hbWUKKyAgICAgICAgc2VsZi53ID0gdyA9IFcuV2luZG93KCgzMDAsIDQwMCksIHRpdGxlLCBtaW5zaXplID0gKDEwMCwgMTAwKSkKKyAgICAgICAgdy5pbmZvID0gVy5UZXh0Qm94KCgxOCwgOCwgLTcwLCAxNSkpCisgICAgICAgIHcudXBkYXRlYnV0dG9uID0gVy5CZXZlbEJ1dHRvbigoLTY0LCA0LCA1MCwgMTYpLCAnVXBkYXRlJywgc2VsZi51cGRhdGUpCisgICAgICAgIHcuYnJvd3NlciA9IEJyb3dzZXJXaWRnZXQoKC0xLCAyNCwgMSwgLTE0KSwgTm9uZSkKKyAgICAgICAgdy5iaW5kKCdjbWR1Jywgdy51cGRhdGVidXR0b24ucHVzaCkKKyAgICAgICAgdy5vcGVuKCkKKyAgICAgICAgc2VsZi5zZXQob2JqZWN0LCBuYW1lKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLncud2lkOgorICAgICAgICAgICAgc2VsZi53LmNsb3NlKCkKKworICAgIGRlZiBzZXQoc2VsZiwgb2JqZWN0LCBuYW1lID0gJycpOgorICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICB0cCA9IHR5cGUob2JqZWN0KS5fX25hbWVfXworICAgICAgICB0cnk6CisgICAgICAgICAgICBsZW5ndGggPSBsZW4ob2JqZWN0KQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBsZW5ndGggPSAtMQorICAgICAgICBpZiBub3QgbmFtZSBhbmQgaGFzYXR0cihvYmplY3QsICdfX25hbWVfXycpOgorICAgICAgICAgICAgbmFtZSA9IG9iamVjdC5fX25hbWVfXworICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgaW5mbyA9IG5hbWUgKyAnOiAnICsgdHAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluZm8gPSB0cAorICAgICAgICBpZiBsZW5ndGggPj0gMDoKKyAgICAgICAgICAgIGlmIGxlbmd0aCA9PSAxOgorICAgICAgICAgICAgICAgIGluZm8gPSBpbmZvICsgJyAoJWQgZWxlbWVudCknICUgbGVuZ3RoCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGluZm8gPSBpbmZvICsgJyAoJWQgZWxlbWVudHMpJyAlIGxlbmd0aAorICAgICAgICBzZWxmLncuaW5mby5zZXQoaW5mbykKKyAgICAgICAgc2VsZi53LmJyb3dzZXIuc2V0KG9iamVjdCkKKworICAgIGRlZiB1cGRhdGUoc2VsZik6CisgICAgICAgIHNlbGYudy5icm93c2VyLnVwZGF0ZSgpCiAKIAogU0lNUExFX1RZUEVTID0gKAotCXR5cGUoTm9uZSksCi0JaW50LAotCWxvbmcsCi0JZmxvYXQsCi0JY29tcGxleCwKLQlzdHIsCi0JdW5pY29kZSwKKyAgICAgICAgdHlwZShOb25lKSwKKyAgICAgICAgaW50LAorICAgICAgICBsb25nLAorICAgICAgICBmbG9hdCwKKyAgICAgICAgY29tcGxleCwKKyAgICAgICAgc3RyLAorICAgICAgICB1bmljb2RlLAogKQogCiBkZWYgZ2V0X2l2YXJzKG9iaik6Ci0JIiIiUmV0dXJuIGEgbGlzdCB0aGUgbmFtZXMgb2YgYWxsIChwb3RlbnRpYWwpIGluc3RhbmNlIHZhcmlhYmxlcy4iIiIKLQkjIF9fbXJvX18gcmVjaXBlIGZyb20gR3VpZG8KLQlzbG90cyA9IHt9Ci0JIyBvbGQtc3R5bGUgQyBvYmplY3RzCi0JaWYgaGFzYXR0cihvYmosICJfX21lbWJlcnNfXyIpOgotCQlmb3IgbmFtZSBpbiBvYmouX19tZW1iZXJzX186Ci0JCQlzbG90c1tuYW1lXSA9IE5vbmUKLQlpZiBoYXNhdHRyKG9iaiwgIl9fbWV0aG9kc19fIik6Ci0JCWZvciBuYW1lIGluIG9iai5fX21ldGhvZHNfXzoKLQkJCXNsb3RzW25hbWVdID0gTm9uZQotCSMgZ2VuZXJpYyB0eXBlCi0JaWYgaGFzYXR0cihvYmosICJfX2RpY3RfXyIpOgotCQlzbG90cy51cGRhdGUob2JqLl9fZGljdF9fKQotCWNscyA9IHR5cGUob2JqKQotCWlmIGhhc2F0dHIoY2xzLCAiX19tcm9fXyIpOgotCQkjIG5ldy1zdHlsZSBjbGFzcywgdXNlIGRlc2NyaXB0b3JzCi0JCWZvciBiYXNlIGluIGNscy5fX21yb19fOgotCQkJZm9yIG5hbWUsIHZhbHVlIGluIGJhc2UuX19kaWN0X18uaXRlbXMoKToKLQkJCQkjIFhYWCB1c2luZyBjYWxsYWJsZSgpIGlzIGEgaGV1cmlzdGljIHdoaWNoIGlzbid0IDEwMCUKLQkJCQkjIGZvb2xwcm9vZi4KLQkJCQlpZiBoYXNhdHRyKHZhbHVlLCAiX19nZXRfXyIpIGFuZCBub3QgY2FsbGFibGUodmFsdWUpOgotCQkJCQlzbG90c1tuYW1lXSA9IE5vbmUKLQlpZiAiX19kaWN0X18iIGluIHNsb3RzOgotCQlkZWwgc2xvdHNbIl9fZGljdF9fIl0KLQlzbG90cyA9IHNsb3RzLmtleXMoKQotCXNsb3RzLnNvcnQoKQotCXJldHVybiBzbG90cworICAgICIiIlJldHVybiBhIGxpc3QgdGhlIG5hbWVzIG9mIGFsbCAocG90ZW50aWFsKSBpbnN0YW5jZSB2YXJpYWJsZXMuIiIiCisgICAgIyBfX21yb19fIHJlY2lwZSBmcm9tIEd1aWRvCisgICAgc2xvdHMgPSB7fQorICAgICMgb2xkLXN0eWxlIEMgb2JqZWN0cworICAgIGlmIGhhc2F0dHIob2JqLCAiX19tZW1iZXJzX18iKToKKyAgICAgICAgZm9yIG5hbWUgaW4gb2JqLl9fbWVtYmVyc19fOgorICAgICAgICAgICAgc2xvdHNbbmFtZV0gPSBOb25lCisgICAgaWYgaGFzYXR0cihvYmosICJfX21ldGhvZHNfXyIpOgorICAgICAgICBmb3IgbmFtZSBpbiBvYmouX19tZXRob2RzX186CisgICAgICAgICAgICBzbG90c1tuYW1lXSA9IE5vbmUKKyAgICAjIGdlbmVyaWMgdHlwZQorICAgIGlmIGhhc2F0dHIob2JqLCAiX19kaWN0X18iKToKKyAgICAgICAgc2xvdHMudXBkYXRlKG9iai5fX2RpY3RfXykKKyAgICBjbHMgPSB0eXBlKG9iaikKKyAgICBpZiBoYXNhdHRyKGNscywgIl9fbXJvX18iKToKKyAgICAgICAgIyBuZXctc3R5bGUgY2xhc3MsIHVzZSBkZXNjcmlwdG9ycworICAgICAgICBmb3IgYmFzZSBpbiBjbHMuX19tcm9fXzoKKyAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBiYXNlLl9fZGljdF9fLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgIyBYWFggdXNpbmcgY2FsbGFibGUoKSBpcyBhIGhldXJpc3RpYyB3aGljaCBpc24ndCAxMDAlCisgICAgICAgICAgICAgICAgIyBmb29scHJvb2YuCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cih2YWx1ZSwgIl9fZ2V0X18iKSBhbmQgbm90IGNhbGxhYmxlKHZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgc2xvdHNbbmFtZV0gPSBOb25lCisgICAgaWYgIl9fZGljdF9fIiBpbiBzbG90czoKKyAgICAgICAgZGVsIHNsb3RzWyJfX2RpY3RfXyJdCisgICAgc2xvdHMgPSBzbG90cy5rZXlzKCkKKyAgICBzbG90cy5zb3J0KCkKKyAgICByZXR1cm4gc2xvdHMKIAogZGVmIHVucGFja19vYmplY3Qob2JqZWN0LCBpbmRlbnQgPSAwKToKLQl0cCA9IHR5cGUob2JqZWN0KQotCWlmIGlzaW5zdGFuY2Uob2JqZWN0LCBTSU1QTEVfVFlQRVMpIGFuZCBvYmplY3QgaXMgbm90IE5vbmU6Ci0JCXJhaXNlIFR5cGVFcnJvciwgImNhbid0IGJyb3dzZSBzaW1wbGUgdHlwZTogJXMiICUgdHAuX19uYW1lX18KLQllbGlmIGlzaW5zdGFuY2Uob2JqZWN0LCBkaWN0KToKLQkJcmV0dXJuIHVucGFja19kaWN0KG9iamVjdCwgaW5kZW50KQotCWVsaWYgaXNpbnN0YW5jZShvYmplY3QsICh0dXBsZSwgbGlzdCkpOgotCQlyZXR1cm4gdW5wYWNrX3NlcXVlbmNlKG9iamVjdCwgaW5kZW50KQotCWVsaWYgaXNpbnN0YW5jZShvYmplY3QsIHR5cGVzLk1vZHVsZVR5cGUpOgotCQlyZXR1cm4gdW5wYWNrX2RpY3Qob2JqZWN0Ll9fZGljdF9fLCBpbmRlbnQpCi0JZWxzZToKLQkJcmV0dXJuIHVucGFja19vdGhlcihvYmplY3QsIGluZGVudCkKKyAgICB0cCA9IHR5cGUob2JqZWN0KQorICAgIGlmIGlzaW5zdGFuY2Uob2JqZWN0LCBTSU1QTEVfVFlQRVMpIGFuZCBvYmplY3QgaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbid0IGJyb3dzZSBzaW1wbGUgdHlwZTogJXMiICUgdHAuX19uYW1lX18KKyAgICBlbGlmIGlzaW5zdGFuY2Uob2JqZWN0LCBkaWN0KToKKyAgICAgICAgcmV0dXJuIHVucGFja19kaWN0KG9iamVjdCwgaW5kZW50KQorICAgIGVsaWYgaXNpbnN0YW5jZShvYmplY3QsICh0dXBsZSwgbGlzdCkpOgorICAgICAgICByZXR1cm4gdW5wYWNrX3NlcXVlbmNlKG9iamVjdCwgaW5kZW50KQorICAgIGVsaWYgaXNpbnN0YW5jZShvYmplY3QsIHR5cGVzLk1vZHVsZVR5cGUpOgorICAgICAgICByZXR1cm4gdW5wYWNrX2RpY3Qob2JqZWN0Ll9fZGljdF9fLCBpbmRlbnQpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHVucGFja19vdGhlcihvYmplY3QsIGluZGVudCkKIAogZGVmIHVucGFja19zZXF1ZW5jZShzZXEsIGluZGVudCA9IDApOgotCXJldHVybiBbKGksIHYsIG5vdCBpc2luc3RhbmNlKHYsIFNJTVBMRV9UWVBFUyksIGluZGVudCkKLQkgICAgICAgICBmb3IgaSwgdiBpbiBlbnVtZXJhdGUoc2VxKV0KKyAgICByZXR1cm4gWyhpLCB2LCBub3QgaXNpbnN0YW5jZSh2LCBTSU1QTEVfVFlQRVMpLCBpbmRlbnQpCisgICAgICAgICAgICAgZm9yIGksIHYgaW4gZW51bWVyYXRlKHNlcSldCiAKIGRlZiB1bnBhY2tfZGljdChkaWN0LCBpbmRlbnQgPSAwKToKLQlpdGVtcyA9IGRpY3QuaXRlbXMoKQotCXJldHVybiBwYWNrX2l0ZW1zKGl0ZW1zLCBpbmRlbnQpCisgICAgaXRlbXMgPSBkaWN0Lml0ZW1zKCkKKyAgICByZXR1cm4gcGFja19pdGVtcyhpdGVtcywgaW5kZW50KQogCiBkZWYgdW5wYWNrX2luc3RhbmNlKGluc3QsIGluZGVudCA9IDApOgotCWlmIGhhc2F0dHIoaW5zdCwgJ19fcHlicm93c2VfdW5wYWNrX18nKToKLQkJcmV0dXJuIHVucGFja19vYmplY3QoaW5zdC5fX3B5YnJvd3NlX3VucGFja19fKCksIGluZGVudCkKLQllbHNlOgotCQlpdGVtcyA9IFsoJ19fY2xhc3NfXycsIGluc3QuX19jbGFzc19fKV0gKyBpbnN0Ll9fZGljdF9fLml0ZW1zKCkKLQkJcmV0dXJuIHBhY2tfaXRlbXMoaXRlbXMsIGluZGVudCkKKyAgICBpZiBoYXNhdHRyKGluc3QsICdfX3B5YnJvd3NlX3VucGFja19fJyk6CisgICAgICAgIHJldHVybiB1bnBhY2tfb2JqZWN0KGluc3QuX19weWJyb3dzZV91bnBhY2tfXygpLCBpbmRlbnQpCisgICAgZWxzZToKKyAgICAgICAgaXRlbXMgPSBbKCdfX2NsYXNzX18nLCBpbnN0Ll9fY2xhc3NfXyldICsgaW5zdC5fX2RpY3RfXy5pdGVtcygpCisgICAgICAgIHJldHVybiBwYWNrX2l0ZW1zKGl0ZW1zLCBpbmRlbnQpCiAKIGRlZiB1bnBhY2tfY2xhc3MoY2xzcywgaW5kZW50ID0gMCk6Ci0JaXRlbXMgPSBbKCdfX2Jhc2VzX18nLCBjbHNzLl9fYmFzZXNfXyksICgnX19uYW1lX18nLCBjbHNzLl9fbmFtZV9fKV0gKyBjbHNzLl9fZGljdF9fLml0ZW1zKCkKLQlyZXR1cm4gcGFja19pdGVtcyhpdGVtcywgaW5kZW50KQorICAgIGl0ZW1zID0gWygnX19iYXNlc19fJywgY2xzcy5fX2Jhc2VzX18pLCAoJ19fbmFtZV9fJywgY2xzcy5fX25hbWVfXyldICsgY2xzcy5fX2RpY3RfXy5pdGVtcygpCisgICAgcmV0dXJuIHBhY2tfaXRlbXMoaXRlbXMsIGluZGVudCkKIAogZGVmIHVucGFja19vdGhlcihvYmplY3QsIGluZGVudCA9IDApOgotCWF0dHJzID0gZ2V0X2l2YXJzKG9iamVjdCkKLQlpdGVtcyA9IFtdCi0JZm9yIGF0dHIgaW4gYXR0cnM6Ci0JCXRyeToKLQkJCXZhbHVlID0gZ2V0YXR0cihvYmplY3QsIGF0dHIpCi0JCWV4Y2VwdDoKLQkJCXBhc3MKLQkJZWxzZToKLQkJCWl0ZW1zLmFwcGVuZCgoYXR0ciwgdmFsdWUpKQotCXJldHVybiBwYWNrX2l0ZW1zKGl0ZW1zLCBpbmRlbnQpCisgICAgYXR0cnMgPSBnZXRfaXZhcnMob2JqZWN0KQorICAgIGl0ZW1zID0gW10KKyAgICBmb3IgYXR0ciBpbiBhdHRyczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG9iamVjdCwgYXR0cikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChhdHRyLCB2YWx1ZSkpCisgICAgcmV0dXJuIHBhY2tfaXRlbXMoaXRlbXMsIGluZGVudCkKIAogZGVmIHBhY2tfaXRlbXMoaXRlbXMsIGluZGVudCA9IDApOgotCWl0ZW1zID0gWyhrLCB2LCBub3QgaXNpbnN0YW5jZSh2LCBTSU1QTEVfVFlQRVMpLCBpbmRlbnQpCi0JICAgICAgICAgZm9yIGssIHYgaW4gaXRlbXNdCi0JcmV0dXJuIHR1cGxlX2Nhc2VsZXNzc29ydChpdGVtcykKKyAgICBpdGVtcyA9IFsoaywgdiwgbm90IGlzaW5zdGFuY2UodiwgU0lNUExFX1RZUEVTKSwgaW5kZW50KQorICAgICAgICAgICAgIGZvciBrLCB2IGluIGl0ZW1zXQorICAgIHJldHVybiB0dXBsZV9jYXNlbGVzc3NvcnQoaXRlbXMpCiAKIGRlZiBjYXNlbGVzc3NvcnQoYWxpc3QpOgotCSIiIlJldHVybiBhIHNvcnRlZCBjb3B5IG9mIGEgbGlzdC4gSWYgdGhlcmUgYXJlIG9ubHkgc3RyaW5ncyBpbiB0aGUgbGlzdCwgCi0JaXQgd2lsbCBub3QgY29uc2lkZXIgY2FzZSIiIgotCQotCXRyeToKLQkJIyB0dXJuIFsnRk9PJywgICdhYUJjJywgJ0FCY0QnXSBpbnRvIFsoJ2ZvbycsICdGT08nKSwgKCdhYWJjJywgJ2FhQmMnKSwgKCdhYmNkJywgJ0FCY0QnKV0sIGlmIHBvc3NpYmxlCi0JCXR1cGxlZGxpc3QgPSBtYXAobGFtYmRhIGl0ZW0sIGxvd2VyID0gc3RyaW5nLmxvd2VyOiAobG93ZXIoaXRlbSksIGl0ZW0pLCBhbGlzdCkKLQlleGNlcHQgVHlwZUVycm9yOgotCQkjIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIGFsaXN0IGlzIG5vdCBhIHN0cmluZywgcHJvY2VlZCB0aGUgbm9ybWFsIHdheS4uLgotCQlhbGlzdCA9IGFsaXN0WzpdCi0JCWFsaXN0LnNvcnQoKQotCQlyZXR1cm4gYWxpc3QKLQllbHNlOgotCQl0dXBsZWRsaXN0LnNvcnQoKQotCQkjIHR1cm4gWygnYWFiYycsICdhYUJjJyksICgnYWJjZCcsICdBQmNEJyksICgnZm9vJywgJ0ZPTycpXSBpbnRvIFsnYWFCYycsICdBQmNEJywgJ0ZPTyddCi0JCXJldHVybiBtYXAobGFtYmRhIHg6IHhbMV0sIHR1cGxlZGxpc3QpCisgICAgIiIiUmV0dXJuIGEgc29ydGVkIGNvcHkgb2YgYSBsaXN0LiBJZiB0aGVyZSBhcmUgb25seSBzdHJpbmdzIGluIHRoZSBsaXN0LAorICAgIGl0IHdpbGwgbm90IGNvbnNpZGVyIGNhc2UiIiIKKworICAgIHRyeToKKyAgICAgICAgIyB0dXJuIFsnRk9PJywgICdhYUJjJywgJ0FCY0QnXSBpbnRvIFsoJ2ZvbycsICdGT08nKSwgKCdhYWJjJywgJ2FhQmMnKSwgKCdhYmNkJywgJ0FCY0QnKV0sIGlmIHBvc3NpYmxlCisgICAgICAgIHR1cGxlZGxpc3QgPSBtYXAobGFtYmRhIGl0ZW0sIGxvd2VyID0gc3RyaW5nLmxvd2VyOiAobG93ZXIoaXRlbSksIGl0ZW0pLCBhbGlzdCkKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAjIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIGFsaXN0IGlzIG5vdCBhIHN0cmluZywgcHJvY2VlZCB0aGUgbm9ybWFsIHdheS4uLgorICAgICAgICBhbGlzdCA9IGFsaXN0WzpdCisgICAgICAgIGFsaXN0LnNvcnQoKQorICAgICAgICByZXR1cm4gYWxpc3QKKyAgICBlbHNlOgorICAgICAgICB0dXBsZWRsaXN0LnNvcnQoKQorICAgICAgICAjIHR1cm4gWygnYWFiYycsICdhYUJjJyksICgnYWJjZCcsICdBQmNEJyksICgnZm9vJywgJ0ZPTycpXSBpbnRvIFsnYWFCYycsICdBQmNEJywgJ0ZPTyddCisgICAgICAgIHJldHVybiBtYXAobGFtYmRhIHg6IHhbMV0sIHR1cGxlZGxpc3QpCiAKIGRlZiB0dXBsZV9jYXNlbGVzc3NvcnQoaXRlbXMpOgotCXRyeToKLQkJdHVwbGVkbGlzdCA9IG1hcChsYW1iZGEgdHVwbGUsIGxvd2VyID0gc3RyaW5nLmxvd2VyOiAobG93ZXIodHVwbGVbMF0pLCB0dXBsZSksIGl0ZW1zKQotCWV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6Ci0JCWl0ZW1zID0gaXRlbXNbOl0KLQkJaXRlbXMuc29ydCgpCi0JCXJldHVybiBpdGVtcwotCWVsc2U6Ci0JCXR1cGxlZGxpc3Quc29ydCgpCi0JCXJldHVybiBtYXAobGFtYmRhIChsb3csIHR1cGxlKTogdHVwbGUsIHR1cGxlZGxpc3QpCi0KKyAgICB0cnk6CisgICAgICAgIHR1cGxlZGxpc3QgPSBtYXAobGFtYmRhIHR1cGxlLCBsb3dlciA9IHN0cmluZy5sb3dlcjogKGxvd2VyKHR1cGxlWzBdKSwgdHVwbGUpLCBpdGVtcykKKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICBpdGVtcyA9IGl0ZW1zWzpdCisgICAgICAgIGl0ZW1zLnNvcnQoKQorICAgICAgICByZXR1cm4gaXRlbXMKKyAgICBlbHNlOgorICAgICAgICB0dXBsZWRsaXN0LnNvcnQoKQorICAgICAgICByZXR1cm4gbWFwKGxhbWJkYSAobG93LCB0dXBsZSk6IHR1cGxlLCB0dXBsZWRsaXN0KQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9QeUNvbnNvbGUucHkgYi9NYWMvVG9vbHMvSURFL1B5Q29uc29sZS5weQppbmRleCA2ZjM5OGQxLi5iOGQ2NDg5IDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1B5Q29uc29sZS5weQorKysgYi9NYWMvVG9vbHMvSURFL1B5Q29uc29sZS5weQpAQCAtMTQsNDI0ICsxNCw0MjQgQEAKIGltcG9ydCBQeUludGVyYWN0aXZlCiAKIGlmIG5vdCBoYXNhdHRyKHN5cywgJ3BzMScpOgotCXN5cy5wczEgPSAnPj4+ICcKKyAgICBzeXMucHMxID0gJz4+PiAnCiBpZiBub3QgaGFzYXR0cihzeXMsICdwczInKToKLQlzeXMucHMyID0gJy4uLiAnCisgICAgc3lzLnBzMiA9ICcuLi4gJwogCi1kZWYgaW5zcGVjdChmb28pOgkJCSMgSkpTIDEvMjUvOTkKLQkiTGF1bmNoIHRoZSBicm93c2VyIG9uIHRoZSBnaXZlbiBvYmplY3QuICBUaGlzIGlzIGEgZ2VuZXJhbCBidWlsdC1pbiBmdW5jdGlvbi4iCi0JaW1wb3J0IFB5QnJvd3NlcgotCVB5QnJvd3Nlci5Ccm93c2VyKGZvbykKK2RlZiBpbnNwZWN0KGZvbyk6ICAgICAgICAgICAgICAgICAgICAgICAjIEpKUyAxLzI1Lzk5CisgICAgIkxhdW5jaCB0aGUgYnJvd3NlciBvbiB0aGUgZ2l2ZW4gb2JqZWN0LiAgVGhpcyBpcyBhIGdlbmVyYWwgYnVpbHQtaW4gZnVuY3Rpb24uIgorICAgIGltcG9ydCBQeUJyb3dzZXIKKyAgICBQeUJyb3dzZXIuQnJvd3Nlcihmb28pCiAKIGNsYXNzIENvbnNvbGVUZXh0V2lkZ2V0KFcuRWRpdFRleHQpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotCQlhcHBseShXLkVkaXRUZXh0Ll9faW5pdF9fLCAoc2VsZiwpICsgYXJncywga3dhcmdzKQotCQlzZWxmLl9pbnB1dHN0YXJ0ID0gMAotCQlzZWxmLl9idWYgPSAnJwotCQlzZWxmLnB5aW50ZXJhY3RpdmUgPSBQeUludGVyYWN0aXZlLlB5SW50ZXJhY3RpdmUoKQotCQotCQlpbXBvcnQgX19tYWluX18KLQkJc2VsZi5fbmFtZXNwYWNlID0gX19tYWluX18uX19kaWN0X18KLQkJc2VsZi5fbmFtZXNwYWNlWydpbnNwZWN0J10gPSBpbnNwZWN0CQkJIyBKSlMgMS8yNS85OQotCQotCWRlZiBpbnNlcnQoc2VsZiwgdGV4dCk6Ci0JCXNlbGYuY2hlY2tzZWxlY3Rpb24oKQotCQlzZWxmLnRlZC5XRUluc2VydCh0ZXh0LCBOb25lLCBOb25lKQotCQlzZWxmLmNoYW5nZWQgPSAxCi0JCXNlbGYuc2VsY2hhbmdlZCA9IDEKLQkKLQlkZWYgc2V0X25hbWVzcGFjZShzZWxmLCBkaWN0KToKLQkJaWYgdHlwZShkaWN0KSA8PiBEaWN0aW9uYXJ5VHlwZToKLQkJCXJhaXNlIFR5cGVFcnJvciwgIlRoZSBuYW1lc3BhY2UgbmVlZHMgdG8gYmUgYSBkaWN0aW9uYXJ5IgotCQlpZiAnaW5zcGVjdCcgbm90IGluIGRpY3Qua2V5cygpOiBkaWN0WydpbnNwZWN0J10gPSBpbnNwZWN0CQkJIyBKSlMgMS8yNS85OQotCQlzZWxmLl9uYW1lc3BhY2UgPSBkaWN0Ci0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCWltcG9ydCBfX21haW5fXwotCQlXLkVkaXRUZXh0Lm9wZW4oc2VsZikKLQkJc2VsZi53cml0ZSgnUHl0aG9uICVzXG4nICUgc3lzLnZlcnNpb24pCi0JCXNlbGYud3JpdGUoJ1R5cGUgImNvcHlyaWdodCIsICJjcmVkaXRzIiBvciAibGljZW5zZSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nKQotCQlzZWxmLndyaXRlKCdNYWNQeXRob24gSURFICVzXG4nICUgX19tYWluX18uX192ZXJzaW9uX18pCi0JCXNlbGYud3JpdGUoc3lzLnBzMSkKLQkJc2VsZi5mbHVzaCgpCi0JCi0JZGVmIGtleShzZWxmLCBjaGFyLCBldmVudCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCWlmIHNlbGYuX2VuYWJsZWQgYW5kIG5vdCBtb2RpZmllcnMgJiBFdmVudHMuY21kS2V5IG9yIGNoYXIgaW4gV2tleXMuYXJyb3drZXlzOgotCQkJaWYgY2hhciBub3QgaW4gV2tleXMubmF2aWdhdGlvbmtleXM6Ci0JCQkJc2VsZi5jaGVja3NlbGVjdGlvbigpCi0JCQlpZiBjaGFyID09IFdrZXlzLmVudGVya2V5OgotCQkJCWNoYXIgPSBXa2V5cy5yZXR1cm5rZXkKLQkJCXNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCQlpZiBjaGFyID09IFdrZXlzLmJhY2tzcGFjZWtleToKLQkJCQlpZiBzZWxzdGFydCA8PSAoc2VsZi5faW5wdXRzdGFydCAtIChzZWxzdGFydCA8PiBzZWxlbmQpKToKLQkJCQkJcmV0dXJuCi0JCQlzZWxmLnRlZC5XRUtleShvcmQoY2hhciksIG1vZGlmaWVycykKLQkJCWlmIGNoYXIgbm90IGluIFdrZXlzLm5hdmlnYXRpb25rZXlzOgotCQkJCXNlbGYuY2hhbmdlZCA9IDEKLQkJCWlmIGNoYXIgbm90IGluIFdrZXlzLnNjcm9sbGtleXM6Ci0JCQkJc2VsZi5zZWxjaGFuZ2VkID0gMQotCQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJCWlmIGNoYXIgPT0gV2tleXMucmV0dXJua2V5OgotCQkJCXRleHQgPSBzZWxmLmdldCgpW3NlbGYuX2lucHV0c3RhcnQ6c2Vsc3RhcnRdCi0JCQkJdGV4dCA9IHN0cmluZy5qb2luKHN0cmluZy5zcGxpdCh0ZXh0LCAiXHIiKSwgIlxuIikKLQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCXNhdmV5aWVsZCA9IE1hY09TLkVuYWJsZUFwcHN3aXRjaCgwKQotCQkJCXNlbGYuX3NjcmlwdERvbmUgPSBGYWxzZQotCQkJCWlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKLQkJCQkJIyBzZWUgaWRlbnRpY2FsIGNvbnN0cnVjdCBpbiBQeUVkaXQucHkKLQkJCQkJZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZAotCQkJCQl0ID0gVGhyZWFkKHRhcmdldD1zZWxmLl91c2VyQ2FuY2VsbGVkTW9uaXRvciwKLQkJCQkJCQluYW1lPSJVc2VyQ2FuY2VsbGVkTW9uaXRvciIpCi0JCQkJCXQuc3RhcnQoKQotCQkJCXRyeToKLQkJCQkJc2VsZi5weWludGVyYWN0aXZlLmV4ZWN1dGVsaW5lKHRleHQsIHNlbGYsIHNlbGYuX25hbWVzcGFjZSkKLQkJCQlmaW5hbGx5OgotCQkJCQlzZWxmLl9zY3JpcHREb25lID0gVHJ1ZQotCQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQkJTWFjT1MuRW5hYmxlQXBwc3dpdGNoKHNhdmV5aWVsZCkKLQkJCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQkJCXNlbGYuX2lucHV0c3RhcnQgPSBzZWxzdGFydAotCQotCWRlZiBfdXNlckNhbmNlbGxlZE1vbml0b3Ioc2VsZik6Ci0JCSMgWFhYIGR1cGxpY2F0ZSBjb2RlIGZyb20gUHlFZGl0LnB5Ci0JCWltcG9ydCB0aW1lLCBvcwotCQlmcm9tIHNpZ25hbCBpbXBvcnQgU0lHSU5UCi0JCWZyb20gQ2FyYm9uIGltcG9ydCBFdnQKLQkJd2hpbGUgbm90IHNlbGYuX3NjcmlwdERvbmU6Ci0JCQlpZiBFdnQuQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCgpOgotCQkJCSMgU2VuZCBhIFNJR0lOVCBzaWduYWwgdG8gb3Vyc2VsdmVzLgotCQkJCSMgVGhpcyBnZXRzIGRlbGl2ZXJlZCB0byB0aGUgbWFpbiB0aHJlYWQsCi0JCQkJIyBjYW5jZWxsaW5nIHRoZSBydW5uaW5nIHNjcmlwdC4KLQkJCQlvcy5raWxsKG9zLmdldHBpZCgpLCBTSUdJTlQpCi0JCQkJYnJlYWsKLQkJCXRpbWUuc2xlZXAoMC4yNSkKLQkKLQlkZWYgZG9tZW51X3NhdmVfYXMoc2VsZiwgKmFyZ3MpOgotCQlmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgY29uc29sZSB0ZXh0IGFzOicsIAotCQkJc2F2ZWRGaWxlTmFtZT0nY29uc29sZS50eHQnKQotCQlpZiBub3QgZmlsZW5hbWU6Ci0JCQlyZXR1cm4KLQkJZiA9IG9wZW4oZmlsZW5hbWUsICd3YicpCi0JCWYud3JpdGUoc2VsZi5nZXQoKSkKLQkJZi5jbG9zZSgpCi0JCU1hY09TLlNldENyZWF0b3JBbmRUeXBlKGZpbGVuYW1lLCBXLl9zaWduYXR1cmUsICdURVhUJykKLQkKLQlkZWYgd3JpdGUoc2VsZiwgdGV4dCk6Ci0JCXNlbGYuX2J1ZiA9IHNlbGYuX2J1ZiArIHRleHQKLQkJaWYgJ1xuJyBpbiBzZWxmLl9idWY6Ci0JCQlzZWxmLmZsdXNoKCkKLQkKLQlkZWYgZmx1c2goc2VsZik6Ci0JCXN0dWZmID0gc3RyaW5nLnNwbGl0KHNlbGYuX2J1ZiwgJ1xuJykKLQkJc3R1ZmYgPSBzdHJpbmcuam9pbihzdHVmZiwgJ1xyJykKLQkJc2VsZi5zZXRzZWxlY3Rpb25fYXRfZW5kKCkKLQkJdHJ5OgotCQkJc2VsZi50ZWQuV0VJbnNlcnQoc3R1ZmYsIE5vbmUsIE5vbmUpCi0JCWZpbmFsbHk6Ci0JCQlzZWxmLl9idWYgPSAiIgotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQlzZWxmLl9pbnB1dHN0YXJ0ID0gc2Vsc3RhcnQKLQkJc2VsZi50ZWQuV0VDbGVhclVuZG8oKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlpZiBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS5RRElzUG9ydEJ1ZmZlcmVkKCk6Ci0JCQlzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS5RREZsdXNoUG9ydEJ1ZmZlcihOb25lKQotCQotCWRlZiBzZWxlY3Rpb25fb2soc2VsZik6Ci0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCXJldHVybiBub3QgKHNlbHN0YXJ0IDwgc2VsZi5faW5wdXRzdGFydCBvciBzZWxlbmQgPCBzZWxmLl9pbnB1dHN0YXJ0KQotCQotCWRlZiBjaGVja3NlbGVjdGlvbihzZWxmKToKLQkJaWYgbm90IHNlbGYuc2VsZWN0aW9uX29rKCk6Ci0JCQlzZWxmLnNldHNlbGVjdGlvbl9hdF9lbmQoKQotCQotCWRlZiBzZXRzZWxlY3Rpb25fYXRfZW5kKHNlbGYpOgotCQllbmQgPSBzZWxmLnRlZC5XRUdldFRleHRMZW5ndGgoKQotCQlzZWxmLnNldHNlbGVjdGlvbihlbmQsIGVuZCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJCi0JZGVmIGRvbWVudV9jdXQoc2VsZiwgKmFyZ3MpOgotCQlpZiBub3Qgc2VsZi5zZWxlY3Rpb25fb2soKToKLQkJCXJldHVybgotCQlXLkVkaXRUZXh0LmRvbWVudV9jdXQoc2VsZikKLQkKLQlkZWYgZG9tZW51X3Bhc3RlKHNlbGYsICphcmdzKToKLQkJaWYgbm90IHNlbGYuc2VsZWN0aW9uX29rKCk6Ci0JCQlzZWxmLnNldHNlbGVjdGlvbl9hdF9lbmQoKQotCQlXLkVkaXRUZXh0LmRvbWVudV9wYXN0ZShzZWxmKQotCQotCWRlZiBkb21lbnVfY2xlYXIoc2VsZiwgKmFyZ3MpOgotCQlpZiBub3Qgc2VsZi5zZWxlY3Rpb25fb2soKToKLQkJCXJldHVybgotCQlXLkVkaXRUZXh0LmRvbWVudV9jbGVhcihzZWxmKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGFwcGx5KFcuRWRpdFRleHQuX19pbml0X18sIChzZWxmLCkgKyBhcmdzLCBrd2FyZ3MpCisgICAgICAgIHNlbGYuX2lucHV0c3RhcnQgPSAwCisgICAgICAgIHNlbGYuX2J1ZiA9ICcnCisgICAgICAgIHNlbGYucHlpbnRlcmFjdGl2ZSA9IFB5SW50ZXJhY3RpdmUuUHlJbnRlcmFjdGl2ZSgpCisKKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgIHNlbGYuX25hbWVzcGFjZSA9IF9fbWFpbl9fLl9fZGljdF9fCisgICAgICAgIHNlbGYuX25hbWVzcGFjZVsnaW5zcGVjdCddID0gaW5zcGVjdCAgICAgICAgICAgICAgICAgICAgIyBKSlMgMS8yNS85OQorCisgICAgZGVmIGluc2VydChzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi5jaGVja3NlbGVjdGlvbigpCisgICAgICAgIHNlbGYudGVkLldFSW5zZXJ0KHRleHQsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKKyAgICAgICAgc2VsZi5zZWxjaGFuZ2VkID0gMQorCisgICAgZGVmIHNldF9uYW1lc3BhY2Uoc2VsZiwgZGljdCk6CisgICAgICAgIGlmIHR5cGUoZGljdCkgPD4gRGljdGlvbmFyeVR5cGU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJUaGUgbmFtZXNwYWNlIG5lZWRzIHRvIGJlIGEgZGljdGlvbmFyeSIKKyAgICAgICAgaWYgJ2luc3BlY3QnIG5vdCBpbiBkaWN0LmtleXMoKTogZGljdFsnaW5zcGVjdCddID0gaW5zcGVjdCAgICAgICAgICAgICAgICAgICAgICAjIEpKUyAxLzI1Lzk5CisgICAgICAgIHNlbGYuX25hbWVzcGFjZSA9IGRpY3QKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpbXBvcnQgX19tYWluX18KKyAgICAgICAgVy5FZGl0VGV4dC5vcGVuKHNlbGYpCisgICAgICAgIHNlbGYud3JpdGUoJ1B5dGhvbiAlc1xuJyAlIHN5cy52ZXJzaW9uKQorICAgICAgICBzZWxmLndyaXRlKCdUeXBlICJjb3B5cmlnaHQiLCAiY3JlZGl0cyIgb3IgImxpY2Vuc2UiIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJykKKyAgICAgICAgc2VsZi53cml0ZSgnTWFjUHl0aG9uIElERSAlc1xuJyAlIF9fbWFpbl9fLl9fdmVyc2lvbl9fKQorICAgICAgICBzZWxmLndyaXRlKHN5cy5wczEpCisgICAgICAgIHNlbGYuZmx1c2goKQorCisgICAgZGVmIGtleShzZWxmLCBjaGFyLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIGlmIHNlbGYuX2VuYWJsZWQgYW5kIG5vdCBtb2RpZmllcnMgJiBFdmVudHMuY21kS2V5IG9yIGNoYXIgaW4gV2tleXMuYXJyb3drZXlzOgorICAgICAgICAgICAgaWYgY2hhciBub3QgaW4gV2tleXMubmF2aWdhdGlvbmtleXM6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja3NlbGVjdGlvbigpCisgICAgICAgICAgICBpZiBjaGFyID09IFdrZXlzLmVudGVya2V5OgorICAgICAgICAgICAgICAgIGNoYXIgPSBXa2V5cy5yZXR1cm5rZXkKKyAgICAgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgICAgICBpZiBjaGFyID09IFdrZXlzLmJhY2tzcGFjZWtleToKKyAgICAgICAgICAgICAgICBpZiBzZWxzdGFydCA8PSAoc2VsZi5faW5wdXRzdGFydCAtIChzZWxzdGFydCA8PiBzZWxlbmQpKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnRlZC5XRUtleShvcmQoY2hhciksIG1vZGlmaWVycykKKyAgICAgICAgICAgIGlmIGNoYXIgbm90IGluIFdrZXlzLm5hdmlnYXRpb25rZXlzOgorICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKKyAgICAgICAgICAgIGlmIGNoYXIgbm90IGluIFdrZXlzLnNjcm9sbGtleXM6CisgICAgICAgICAgICAgICAgc2VsZi5zZWxjaGFuZ2VkID0gMQorICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgICAgIGlmIGNoYXIgPT0gV2tleXMucmV0dXJua2V5OgorICAgICAgICAgICAgICAgIHRleHQgPSBzZWxmLmdldCgpW3NlbGYuX2lucHV0c3RhcnQ6c2Vsc3RhcnRdCisgICAgICAgICAgICAgICAgdGV4dCA9IHN0cmluZy5qb2luKHN0cmluZy5zcGxpdCh0ZXh0LCAiXHIiKSwgIlxuIikKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICAgICAgICAgIHNhdmV5aWVsZCA9IE1hY09TLkVuYWJsZUFwcHN3aXRjaCgwKQorICAgICAgICAgICAgICAgIHNlbGYuX3NjcmlwdERvbmUgPSBGYWxzZQorICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgICAgICAgICAgIyBzZWUgaWRlbnRpY2FsIGNvbnN0cnVjdCBpbiBQeUVkaXQucHkKKyAgICAgICAgICAgICAgICAgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZAorICAgICAgICAgICAgICAgICAgICB0ID0gVGhyZWFkKHRhcmdldD1zZWxmLl91c2VyQ2FuY2VsbGVkTW9uaXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlVzZXJDYW5jZWxsZWRNb25pdG9yIikKKyAgICAgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnB5aW50ZXJhY3RpdmUuZXhlY3V0ZWxpbmUodGV4dCwgc2VsZiwgc2VsZi5fbmFtZXNwYWNlKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NjcmlwdERvbmUgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goc2F2ZXlpZWxkKQorICAgICAgICAgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgICAgICAgICAgc2VsZi5faW5wdXRzdGFydCA9IHNlbHN0YXJ0CisKKyAgICBkZWYgX3VzZXJDYW5jZWxsZWRNb25pdG9yKHNlbGYpOgorICAgICAgICAjIFhYWCBkdXBsaWNhdGUgY29kZSBmcm9tIFB5RWRpdC5weQorICAgICAgICBpbXBvcnQgdGltZSwgb3MKKyAgICAgICAgZnJvbSBzaWduYWwgaW1wb3J0IFNJR0lOVAorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgRXZ0CisgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9zY3JpcHREb25lOgorICAgICAgICAgICAgaWYgRXZ0LkNoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwoKToKKyAgICAgICAgICAgICAgICAjIFNlbmQgYSBTSUdJTlQgc2lnbmFsIHRvIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAjIFRoaXMgZ2V0cyBkZWxpdmVyZWQgdG8gdGhlIG1haW4gdGhyZWFkLAorICAgICAgICAgICAgICAgICMgY2FuY2VsbGluZyB0aGUgcnVubmluZyBzY3JpcHQuCisgICAgICAgICAgICAgICAgb3Mua2lsbChvcy5nZXRwaWQoKSwgU0lHSU5UKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMjUpCisKKyAgICBkZWYgZG9tZW51X3NhdmVfYXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgY29uc29sZSB0ZXh0IGFzOicsCisgICAgICAgICAgICAgICAgc2F2ZWRGaWxlTmFtZT0nY29uc29sZS50eHQnKQorICAgICAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3YicpCisgICAgICAgIGYud3JpdGUoc2VsZi5nZXQoKSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIE1hY09TLlNldENyZWF0b3JBbmRUeXBlKGZpbGVuYW1lLCBXLl9zaWduYXR1cmUsICdURVhUJykKKworICAgIGRlZiB3cml0ZShzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi5fYnVmID0gc2VsZi5fYnVmICsgdGV4dAorICAgICAgICBpZiAnXG4nIGluIHNlbGYuX2J1ZjoKKyAgICAgICAgICAgIHNlbGYuZmx1c2goKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBzdHVmZiA9IHN0cmluZy5zcGxpdChzZWxmLl9idWYsICdcbicpCisgICAgICAgIHN0dWZmID0gc3RyaW5nLmpvaW4oc3R1ZmYsICdccicpCisgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uX2F0X2VuZCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGVkLldFSW5zZXJ0KHN0dWZmLCBOb25lLCBOb25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fYnVmID0gIiIKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgc2VsZi5faW5wdXRzdGFydCA9IHNlbHN0YXJ0CisgICAgICAgIHNlbGYudGVkLldFQ2xlYXJVbmRvKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkuUURJc1BvcnRCdWZmZXJlZCgpOgorICAgICAgICAgICAgc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkuUURGbHVzaFBvcnRCdWZmZXIoTm9uZSkKKworICAgIGRlZiBzZWxlY3Rpb25fb2soc2VsZik6CisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIHJldHVybiBub3QgKHNlbHN0YXJ0IDwgc2VsZi5faW5wdXRzdGFydCBvciBzZWxlbmQgPCBzZWxmLl9pbnB1dHN0YXJ0KQorCisgICAgZGVmIGNoZWNrc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5zZWxlY3Rpb25fb2soKToKKyAgICAgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uX2F0X2VuZCgpCisKKyAgICBkZWYgc2V0c2VsZWN0aW9uX2F0X2VuZChzZWxmKToKKyAgICAgICAgZW5kID0gc2VsZi50ZWQuV0VHZXRUZXh0TGVuZ3RoKCkKKyAgICAgICAgc2VsZi5zZXRzZWxlY3Rpb24oZW5kLCBlbmQpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgZG9tZW51X2N1dChzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnNlbGVjdGlvbl9vaygpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIFcuRWRpdFRleHQuZG9tZW51X2N1dChzZWxmKQorCisgICAgZGVmIGRvbWVudV9wYXN0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnNlbGVjdGlvbl9vaygpOgorICAgICAgICAgICAgc2VsZi5zZXRzZWxlY3Rpb25fYXRfZW5kKCkKKyAgICAgICAgVy5FZGl0VGV4dC5kb21lbnVfcGFzdGUoc2VsZikKKworICAgIGRlZiBkb21lbnVfY2xlYXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBub3Qgc2VsZi5zZWxlY3Rpb25fb2soKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBXLkVkaXRUZXh0LmRvbWVudV9jbGVhcihzZWxmKQogCiAKIGNsYXNzIFB5Q29uc29sZShXLldpbmRvdyk6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIGJvdW5kcywgc2hvdyA9IDEsIGZvbnRzZXR0aW5ncyA9ICgiTW9uYWNvIiwgMCwgOSwgKDAsIDAsIDApKSwgCi0JCQl0YWJzZXR0aW5ncyA9ICgzMiwgMCksIHVuY2xvc2FibGUgPSAwKToKLQkJVy5XaW5kb3cuX19pbml0X18oc2VsZiwKLQkJCQkJYm91bmRzLCAKLQkJCQkJIlB5dGhvbiBJbnRlcmFjdGl2ZSIsIAotCQkJCQltaW5zaXplID0gKDIwMCwgMTAwKSwgCi0JCQkJCXRhYmJhYmxlID0gMCwgCi0JCQkJCXNob3cgPSBzaG93KQotCQkKLQkJc2VsZi5fdW5jbG9zYWJsZSA9IHVuY2xvc2FibGUKLQkJY29uc29sZXRleHQgPSBDb25zb2xlVGV4dFdpZGdldCgoLTEsIC0xLCAtMTQsIDEpLCBpbnNldCA9ICg2LCA1KSwgCi0JCQkJZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHRhYnNldHRpbmdzKQotCQlzZWxmLl9iYXJ5ID0gVy5TY3JvbGxiYXIoKC0xNSwgMTQsIDE2LCAtMTQpLCBjb25zb2xldGV4dC52c2Nyb2xsLCBtYXggPSAzMjc2NykKLQkJc2VsZi5jb25zb2xldGV4dCA9IGNvbnNvbGV0ZXh0Ci0JCXNlbGYubmFtZXNwYWNlbWVudSA9IFcuUG9wdXBNZW51KCgtMTUsIC0xLCAxNiwgMTYpLCBbXSwgc2VsZi5jb25zb2xldGV4dC5zZXRfbmFtZXNwYWNlKQotCQlzZWxmLm5hbWVzcGFjZW1lbnUuYmluZCgnPGNsaWNrPicsIHNlbGYubWFrZW5hbWVzcGFjZW1lbnUpCi0JCXNlbGYub3BlbigpCi0JCi0JZGVmIG1ha2VuYW1lc3BhY2VtZW51KHNlbGYsICphcmdzKToKLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJbmFtZXNwYWNlbGlzdCA9IHNlbGYuZ2V0bmFtZXNwYWNlbGlzdCgpCi0JCXNlbGYubmFtZXNwYWNlbWVudS5zZXQoWygiQ2xlYXIgd2luZG93Iiwgc2VsZi5jbGVhcmJ1ZmZlciksICgiRm9udCBzZXR0aW5nc1x4YzkiLCBzZWxmLmRvZm9udHNldHRpbmdzKSwgCi0JCQkJWyJOYW1lc3BhY2UiXSArIG5hbWVzcGFjZWxpc3QsICgiQnJvd3NlIG5hbWVzcGFjZVx4YzkiLCBzZWxmLmJyb3dzZW5hbWVzcGFjZSldKQotCQljdXJyZW50bmFtZSA9IHNlbGYuY29uc29sZXRleHQuX25hbWVzcGFjZVsiX19uYW1lX18iXQotCQlmb3IgaSBpbiByYW5nZShsZW4obmFtZXNwYWNlbGlzdCkpOgotCQkJaWYgbmFtZXNwYWNlbGlzdFtpXVswXSA9PSBjdXJyZW50bmFtZToKLQkJCQlicmVhawotCQllbHNlOgotCQkJcmV0dXJuCi0JCSMgWFhYIHRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgZ2VuZXJhbGx5IGF2YWlsYWJsZSBpbiBXbWVudXMKLQkJc3VibWVudWlkID0gc2VsZi5uYW1lc3BhY2VtZW51Lm1lbnUubWVudS5HZXRJdGVtTWFyaygzKQotCQltZW51ID0gc2VsZi5uYW1lc3BhY2VtZW51Lm1lbnUuYmFyLm1lbnVzW3N1Ym1lbnVpZF0KLQkJbWVudS5tZW51LkNoZWNrTWVudUl0ZW0oaSArIDEsIDEpCi0JCi0JZGVmIGJyb3dzZW5hbWVzcGFjZShzZWxmKToKLQkJaW1wb3J0IFB5QnJvd3NlciwgVwotCQlXLlNldEN1cnNvcignd2F0Y2gnKQotCQlQeUJyb3dzZXIuQnJvd3NlcihzZWxmLmNvbnNvbGV0ZXh0Ll9uYW1lc3BhY2UsIHNlbGYuY29uc29sZXRleHQuX25hbWVzcGFjZVsiX19uYW1lX18iXSkKLQkKLQlkZWYgY2xlYXJidWZmZXIoc2VsZik6Ci0JCWZyb20gQ2FyYm9uIGltcG9ydCBSZXMKLQkJc2VsZi5jb25zb2xldGV4dC50ZWQuV0VVc2VUZXh0KFJlcy5SZXNvdXJjZSgnJykpCi0JCXNlbGYuY29uc29sZXRleHQud3JpdGUoc3lzLnBzMSkKLQkJc2VsZi5jb25zb2xldGV4dC5mbHVzaCgpCi0JCi0JZGVmIGdldG5hbWVzcGFjZWxpc3Qoc2VsZik6Ci0JCWltcG9ydCBvcwotCQlpbXBvcnQgX19tYWluX18KLQkJZWRpdG9ycyA9IGZpbHRlcihsYW1iZGEgeDogeC5fX2NsYXNzX18uX19uYW1lX18gPT0gIkVkaXRvciIsIHNlbGYucGFyZW50Ll93aW5kb3dzLnZhbHVlcygpKQotCQkKLQkJbmFtZXNwYWNlcyA9IFsgKCJfX21haW5fXyIsX19tYWluX18uX19kaWN0X18pIF0KLQkJZm9yIGVkIGluIGVkaXRvcnM6Ci0JCQltb2RuYW1lID0gb3MucGF0aC5zcGxpdGV4dChlZC50aXRsZSlbMF0KLQkJCWlmIHN5cy5tb2R1bGVzLmhhc19rZXkobW9kbmFtZSk6Ci0JCQkJbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kbmFtZV0gCi0JCQkJbmFtZXNwYWNlcy5hcHBlbmQoKG1vZG5hbWUsIG1vZHVsZS5fX2RpY3RfXykpCi0JCQllbHNlOgotCQkJCWlmIGVkLnRpdGxlWy0zOl0gPT0gJy5weSc6Ci0JCQkJCW1vZG5hbWUgPSBlZC50aXRsZVs6LTNdCi0JCQkJZWxzZToKLQkJCQkJbW9kbmFtZSA9IGVkLnRpdGxlCi0JCQkJZWQuZ2xvYmFsc1siX19uYW1lX18iXSA9IG1vZG5hbWUKLQkJCQluYW1lc3BhY2VzLmFwcGVuZCgobW9kbmFtZSwgZWQuZ2xvYmFscykpCi0JCXJldHVybiBuYW1lc3BhY2VzCi0JCi0JZGVmIGRvZm9udHNldHRpbmdzKHNlbGYpOgotCQlpbXBvcnQgRm9udFNldHRpbmdzCi0JCXNldHRpbmdzID0gRm9udFNldHRpbmdzLkZvbnREaWFsb2coc2VsZi5jb25zb2xldGV4dC5nZXRmb250c2V0dGluZ3MoKSwKLQkJCQlzZWxmLmNvbnNvbGV0ZXh0LmdldHRhYnNldHRpbmdzKCkpCi0JCWlmIHNldHRpbmdzOgotCQkJZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHNldHRpbmdzCi0JCQlzZWxmLmNvbnNvbGV0ZXh0LnNldGZvbnRzZXR0aW5ncyhmb250c2V0dGluZ3MpCi0JCQlzZWxmLmNvbnNvbGV0ZXh0LnNldHRhYnNldHRpbmdzKHRhYnNldHRpbmdzKQotCQotCWRlZiBzaG93KHNlbGYsIG9ub2ZmID0gMSk6Ci0JCVcuV2luZG93LnNob3coc2VsZiwgb25vZmYpCi0JCWlmIG9ub2ZmOgotCQkJc2VsZi5zZWxlY3QoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgc2VsZi5fdW5jbG9zYWJsZToKLQkJCXNlbGYuc2hvdygwKQotCQkJcmV0dXJuIC0xCi0JCVcuV2luZG93LmNsb3NlKHNlbGYpCi0JCi0JZGVmIHdyaXRlcHJlZnMoc2VsZik6Ci0JCXByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKLQkJcHJlZnMuY29uc29sZS5zaG93ID0gc2VsZi5pc3Zpc2libGUoKQotCQlwcmVmcy5jb25zb2xlLndpbmRvd2JvdW5kcyA9IHNlbGYuZ2V0Ym91bmRzKCkKLQkJcHJlZnMuY29uc29sZS5mb250c2V0dGluZ3MgPSBzZWxmLmNvbnNvbGV0ZXh0LmdldGZvbnRzZXR0aW5ncygpCi0JCXByZWZzLmNvbnNvbGUudGFic2V0dGluZ3MgPSBzZWxmLmNvbnNvbGV0ZXh0LmdldHRhYnNldHRpbmdzKCkKLQkJcHJlZnMuc2F2ZSgpCiAKLQlkZWYgZ2V0c2VsZWN0ZWR0ZXh0KHNlbGYpOgotCQlyZXR1cm4gc2VsZi5jb25zb2xldGV4dC5nZXRzZWxlY3RlZHRleHQoKQotCQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBib3VuZHMsIHNob3cgPSAxLCBmb250c2V0dGluZ3MgPSAoIk1vbmFjbyIsIDAsIDksICgwLCAwLCAwKSksCisgICAgICAgICAgICAgICAgICAgIHRhYnNldHRpbmdzID0gKDMyLCAwKSwgdW5jbG9zYWJsZSA9IDApOgorICAgICAgICBXLldpbmRvdy5fX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gSW50ZXJhY3RpdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaXplID0gKDIwMCwgMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiYmFibGUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93ID0gc2hvdykKKworICAgICAgICBzZWxmLl91bmNsb3NhYmxlID0gdW5jbG9zYWJsZQorICAgICAgICBjb25zb2xldGV4dCA9IENvbnNvbGVUZXh0V2lkZ2V0KCgtMSwgLTEsIC0xNCwgMSksIGluc2V0ID0gKDYsIDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHRhYnNldHRpbmdzKQorICAgICAgICBzZWxmLl9iYXJ5ID0gVy5TY3JvbGxiYXIoKC0xNSwgMTQsIDE2LCAtMTQpLCBjb25zb2xldGV4dC52c2Nyb2xsLCBtYXggPSAzMjc2NykKKyAgICAgICAgc2VsZi5jb25zb2xldGV4dCA9IGNvbnNvbGV0ZXh0CisgICAgICAgIHNlbGYubmFtZXNwYWNlbWVudSA9IFcuUG9wdXBNZW51KCgtMTUsIC0xLCAxNiwgMTYpLCBbXSwgc2VsZi5jb25zb2xldGV4dC5zZXRfbmFtZXNwYWNlKQorICAgICAgICBzZWxmLm5hbWVzcGFjZW1lbnUuYmluZCgnPGNsaWNrPicsIHNlbGYubWFrZW5hbWVzcGFjZW1lbnUpCisgICAgICAgIHNlbGYub3BlbigpCisKKyAgICBkZWYgbWFrZW5hbWVzcGFjZW1lbnUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBuYW1lc3BhY2VsaXN0ID0gc2VsZi5nZXRuYW1lc3BhY2VsaXN0KCkKKyAgICAgICAgc2VsZi5uYW1lc3BhY2VtZW51LnNldChbKCJDbGVhciB3aW5kb3ciLCBzZWxmLmNsZWFyYnVmZmVyKSwgKCJGb250IHNldHRpbmdzXHhjOSIsIHNlbGYuZG9mb250c2V0dGluZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyJOYW1lc3BhY2UiXSArIG5hbWVzcGFjZWxpc3QsICgiQnJvd3NlIG5hbWVzcGFjZVx4YzkiLCBzZWxmLmJyb3dzZW5hbWVzcGFjZSldKQorICAgICAgICBjdXJyZW50bmFtZSA9IHNlbGYuY29uc29sZXRleHQuX25hbWVzcGFjZVsiX19uYW1lX18iXQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obmFtZXNwYWNlbGlzdCkpOgorICAgICAgICAgICAgaWYgbmFtZXNwYWNlbGlzdFtpXVswXSA9PSBjdXJyZW50bmFtZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgWFhYIHRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgZ2VuZXJhbGx5IGF2YWlsYWJsZSBpbiBXbWVudXMKKyAgICAgICAgc3VibWVudWlkID0gc2VsZi5uYW1lc3BhY2VtZW51Lm1lbnUubWVudS5HZXRJdGVtTWFyaygzKQorICAgICAgICBtZW51ID0gc2VsZi5uYW1lc3BhY2VtZW51Lm1lbnUuYmFyLm1lbnVzW3N1Ym1lbnVpZF0KKyAgICAgICAgbWVudS5tZW51LkNoZWNrTWVudUl0ZW0oaSArIDEsIDEpCisKKyAgICBkZWYgYnJvd3NlbmFtZXNwYWNlKHNlbGYpOgorICAgICAgICBpbXBvcnQgUHlCcm93c2VyLCBXCisgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgIFB5QnJvd3Nlci5Ccm93c2VyKHNlbGYuY29uc29sZXRleHQuX25hbWVzcGFjZSwgc2VsZi5jb25zb2xldGV4dC5fbmFtZXNwYWNlWyJfX25hbWVfXyJdKQorCisgICAgZGVmIGNsZWFyYnVmZmVyKHNlbGYpOgorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgUmVzCisgICAgICAgIHNlbGYuY29uc29sZXRleHQudGVkLldFVXNlVGV4dChSZXMuUmVzb3VyY2UoJycpKQorICAgICAgICBzZWxmLmNvbnNvbGV0ZXh0LndyaXRlKHN5cy5wczEpCisgICAgICAgIHNlbGYuY29uc29sZXRleHQuZmx1c2goKQorCisgICAgZGVmIGdldG5hbWVzcGFjZWxpc3Qoc2VsZik6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpbXBvcnQgX19tYWluX18KKyAgICAgICAgZWRpdG9ycyA9IGZpbHRlcihsYW1iZGEgeDogeC5fX2NsYXNzX18uX19uYW1lX18gPT0gIkVkaXRvciIsIHNlbGYucGFyZW50Ll93aW5kb3dzLnZhbHVlcygpKQorCisgICAgICAgIG5hbWVzcGFjZXMgPSBbICgiX19tYWluX18iLF9fbWFpbl9fLl9fZGljdF9fKSBdCisgICAgICAgIGZvciBlZCBpbiBlZGl0b3JzOgorICAgICAgICAgICAgbW9kbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoZWQudGl0bGUpWzBdCisgICAgICAgICAgICBpZiBzeXMubW9kdWxlcy5oYXNfa2V5KG1vZG5hbWUpOgorICAgICAgICAgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZG5hbWVdCisgICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5hcHBlbmQoKG1vZG5hbWUsIG1vZHVsZS5fX2RpY3RfXykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGVkLnRpdGxlWy0zOl0gPT0gJy5weSc6CisgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBlZC50aXRsZVs6LTNdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSA9IGVkLnRpdGxlCisgICAgICAgICAgICAgICAgZWQuZ2xvYmFsc1siX19uYW1lX18iXSA9IG1vZG5hbWUKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLmFwcGVuZCgobW9kbmFtZSwgZWQuZ2xvYmFscykpCisgICAgICAgIHJldHVybiBuYW1lc3BhY2VzCisKKyAgICBkZWYgZG9mb250c2V0dGluZ3Moc2VsZik6CisgICAgICAgIGltcG9ydCBGb250U2V0dGluZ3MKKyAgICAgICAgc2V0dGluZ3MgPSBGb250U2V0dGluZ3MuRm9udERpYWxvZyhzZWxmLmNvbnNvbGV0ZXh0LmdldGZvbnRzZXR0aW5ncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25zb2xldGV4dC5nZXR0YWJzZXR0aW5ncygpKQorICAgICAgICBpZiBzZXR0aW5nczoKKyAgICAgICAgICAgIGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MgPSBzZXR0aW5ncworICAgICAgICAgICAgc2VsZi5jb25zb2xldGV4dC5zZXRmb250c2V0dGluZ3MoZm9udHNldHRpbmdzKQorICAgICAgICAgICAgc2VsZi5jb25zb2xldGV4dC5zZXR0YWJzZXR0aW5ncyh0YWJzZXR0aW5ncykKKworICAgIGRlZiBzaG93KHNlbGYsIG9ub2ZmID0gMSk6CisgICAgICAgIFcuV2luZG93LnNob3coc2VsZiwgb25vZmYpCisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgc2VsZi5zZWxlY3QoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl91bmNsb3NhYmxlOgorICAgICAgICAgICAgc2VsZi5zaG93KDApCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgVy5XaW5kb3cuY2xvc2Uoc2VsZikKKworICAgIGRlZiB3cml0ZXByZWZzKHNlbGYpOgorICAgICAgICBwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCisgICAgICAgIHByZWZzLmNvbnNvbGUuc2hvdyA9IHNlbGYuaXN2aXNpYmxlKCkKKyAgICAgICAgcHJlZnMuY29uc29sZS53aW5kb3dib3VuZHMgPSBzZWxmLmdldGJvdW5kcygpCisgICAgICAgIHByZWZzLmNvbnNvbGUuZm9udHNldHRpbmdzID0gc2VsZi5jb25zb2xldGV4dC5nZXRmb250c2V0dGluZ3MoKQorICAgICAgICBwcmVmcy5jb25zb2xlLnRhYnNldHRpbmdzID0gc2VsZi5jb25zb2xldGV4dC5nZXR0YWJzZXR0aW5ncygpCisgICAgICAgIHByZWZzLnNhdmUoKQorCisgICAgZGVmIGdldHNlbGVjdGVkdGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29uc29sZXRleHQuZ2V0c2VsZWN0ZWR0ZXh0KCkKKwogY2xhc3MgT3V0cHV0VGV4dFdpZGdldChXLkVkaXRUZXh0KToKLQkKLQlkZWYgZG9tZW51X3NhdmVfYXMoc2VsZiwgKmFyZ3MpOgotCQl0aXRsZSA9IHNlbGYuX3BhcmVudHdpbmRvdy5nZXR0aXRsZSgpCi0JCWZpbGVuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSAlcyB0ZXh0IGFzOicgJSB0aXRsZSwgCi0JCQlzYXZlZEZpbGVOYW1lPXRpdGxlICsgJy50eHQnKQotCQlpZiBub3QgZmlsZW5hbWU6Ci0JCQlyZXR1cm4KLQkJZiA9IG9wZW4oZmlsZW5hbWUsICd3YicpCi0JCWYud3JpdGUoc2VsZi5nZXQoKSkKLQkJZi5jbG9zZSgpCi0JCU1hY09TLlNldENyZWF0b3JBbmRUeXBlKGZpbGVuYW1lLCBXLl9zaWduYXR1cmUsICdURVhUJykKLQkKLQlkZWYgZG9tZW51X2N1dChzZWxmLCAqYXJncyk6Ci0JCXNlbGYuZG9tZW51X2NvcHkoKmFyZ3MpCi0JCi0JZGVmIGRvbWVudV9jbGVhcihzZWxmLCAqYXJncyk6Ci0JCXNlbGYuc2V0KCcnKQorCisgICAgZGVmIGRvbWVudV9zYXZlX2FzKHNlbGYsICphcmdzKToKKyAgICAgICAgdGl0bGUgPSBzZWxmLl9wYXJlbnR3aW5kb3cuZ2V0dGl0bGUoKQorICAgICAgICBmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgJXMgdGV4dCBhczonICUgdGl0bGUsCisgICAgICAgICAgICAgICAgc2F2ZWRGaWxlTmFtZT10aXRsZSArICcudHh0JykKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnd2InKQorICAgICAgICBmLndyaXRlKHNlbGYuZ2V0KCkpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShmaWxlbmFtZSwgVy5fc2lnbmF0dXJlLCAnVEVYVCcpCisKKyAgICBkZWYgZG9tZW51X2N1dChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuZG9tZW51X2NvcHkoKmFyZ3MpCisKKyAgICBkZWYgZG9tZW51X2NsZWFyKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5zZXQoJycpCiAKIAogY2xhc3MgUHlPdXRwdXQ6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIGJvdW5kcywgc2hvdyA9IDEsIGZvbnRzZXR0aW5ncyA9ICgiTW9uYWNvIiwgMCwgOSwgKDAsIDAsIDApKSwgdGFic2V0dGluZ3MgPSAoMzIsIDApKToKLQkJc2VsZi5ib3VuZHMgPSBib3VuZHMKLQkJc2VsZi5mb250c2V0dGluZ3MgPSBmb250c2V0dGluZ3MKLQkJc2VsZi50YWJzZXR0aW5ncyA9IHRhYnNldHRpbmdzCi0JCXNlbGYudyA9IE5vbmUKLQkJc2VsZi5jbG9zZWQgPSAxCi0JCXNlbGYuX2J1ZiA9ICcnCi0JCSMgc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoaXMKLQkJc2VsZi5zYXZlc3Rkb3V0LCBzZWxmLnNhdmVzdGRlcnIgPSBzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyCi0JCXN5cy5zdGRlcnIgPSBzeXMuc3Rkb3V0ID0gc2VsZgotCQlpZiBzaG93OgotCQkJc2VsZi5zaG93KCkKLQkKLQlkZWYgc2V0dXB3aWRnZXRzKHNlbGYpOgotCQlzZWxmLncgPSBXLldpbmRvdyhzZWxmLmJvdW5kcywgIk91dHB1dCIsIAotCQkJCW1pbnNpemUgPSAoMjAwLCAxMDApLCAKLQkJCQl0YWJiYWJsZSA9IDApCi0JCXNlbGYudy5vdXRwdXR0ZXh0ID0gT3V0cHV0VGV4dFdpZGdldCgoLTEsIC0xLCAtMTQsIDEpLCBpbnNldCA9ICg2LCA1KSwgCi0JCQkJZm9udHNldHRpbmdzID0gc2VsZi5mb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gc2VsZi50YWJzZXR0aW5ncywgcmVhZG9ubHkgPSAxKQotCQltZW51aXRlbXMgPSBbKCJDbGVhciB3aW5kb3ciLCBzZWxmLmNsZWFyYnVmZmVyKSwgKCJGb250IHNldHRpbmdzXHhjOSIsIHNlbGYuZG9mb250c2V0dGluZ3MpXQotCQlzZWxmLncucG9wdXBtZW51ID0gVy5Qb3B1cE1lbnUoKC0xNSwgLTEsIDE2LCAxNiksIG1lbnVpdGVtcykKLQkJCi0JCXNlbGYudy5fYmFyeSA9IFcuU2Nyb2xsYmFyKCgtMTUsIDE0LCAxNiwgLTE0KSwgc2VsZi53Lm91dHB1dHRleHQudnNjcm9sbCwgbWF4ID0gMzI3NjcpCi0JCXNlbGYudy5iaW5kKCI8Y2xvc2U+Iiwgc2VsZi5jbG9zZSkKLQkJc2VsZi53LmJpbmQoIjxhY3RpdmF0ZT4iLCBzZWxmLmFjdGl2YXRlKQotCQotCWRlZiB3cml0ZShzZWxmLCB0ZXh0KToKLQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJb2xkeWllbGQgPSBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCi0JCXRyeToKLQkJCXNlbGYuX2J1ZiA9IHNlbGYuX2J1ZiArIHRleHQKLQkJCWlmICdcbicgaW4gc2VsZi5fYnVmOgotCQkJCXNlbGYuZmx1c2goKQotCQlmaW5hbGx5OgotCQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaChvbGR5aWVsZCkKLQkKLQlkZWYgZmx1c2goc2VsZik6Ci0JCXNlbGYuc2hvdygpCi0JCXN0dWZmID0gc3RyaW5nLnNwbGl0KHNlbGYuX2J1ZiwgJ1xuJykKLQkJc3R1ZmYgPSBzdHJpbmcuam9pbihzdHVmZiwgJ1xyJykKLQkJZW5kID0gc2VsZi53Lm91dHB1dHRleHQudGVkLldFR2V0VGV4dExlbmd0aCgpCi0JCXNlbGYudy5vdXRwdXR0ZXh0LnNldHNlbGVjdGlvbihlbmQsIGVuZCkKLQkJc2VsZi53Lm91dHB1dHRleHQudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMCkKLQkJdHJ5OgotCQkJc2VsZi53Lm91dHB1dHRleHQudGVkLldFSW5zZXJ0KHN0dWZmLCBOb25lLCBOb25lKQotCQlmaW5hbGx5OgotCQkJc2VsZi5fYnVmID0gIiIKLQkJc2VsZi53Lm91dHB1dHRleHQudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYudy5vdXRwdXR0ZXh0LnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGUmVhZE9ubHksIDEpCi0JCWlmIHNlbGYudy53aWQuR2V0V2luZG93UG9ydCgpLlFESXNQb3J0QnVmZmVyZWQoKToKLQkJCXNlbGYudy53aWQuR2V0V2luZG93UG9ydCgpLlFERmx1c2hQb3J0QnVmZmVyKE5vbmUpCi0JCi0JZGVmIHNob3coc2VsZik6Ci0JCWlmIHNlbGYuY2xvc2VkOgotCQkJaWYgbm90IHNlbGYudzoKLQkJCQlzZWxmLnNldHVwd2lkZ2V0cygpCi0JCQkJc2VsZi53Lm9wZW4oKQotCQkJCXNlbGYudy5vdXRwdXR0ZXh0LnVwZGF0ZXNjcm9sbGJhcnMoKQotCQkJCXNlbGYuY2xvc2VkID0gMAotCQkJZWxzZToKLQkJCQlzZWxmLncuc2hvdygxKQotCQkJCXNlbGYuY2xvc2VkID0gMAotCQkJCXNlbGYudy5zZWxlY3QoKQotCQotCWRlZiB3cml0ZXByZWZzKHNlbGYpOgotCQlpZiBzZWxmLncgaXMgbm90IE5vbmU6Ci0JCQlwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCi0JCQlwcmVmcy5vdXRwdXQuc2hvdyA9IHNlbGYudy5pc3Zpc2libGUoKQotCQkJcHJlZnMub3V0cHV0LndpbmRvd2JvdW5kcyA9IHNlbGYudy5nZXRib3VuZHMoKQotCQkJcHJlZnMub3V0cHV0LmZvbnRzZXR0aW5ncyA9IHNlbGYudy5vdXRwdXR0ZXh0LmdldGZvbnRzZXR0aW5ncygpCi0JCQlwcmVmcy5vdXRwdXQudGFic2V0dGluZ3MgPSBzZWxmLncub3V0cHV0dGV4dC5nZXR0YWJzZXR0aW5ncygpCi0JCQlwcmVmcy5zYXZlKCkKLQkKLQlkZWYgZG9mb250c2V0dGluZ3Moc2VsZik6Ci0JCWltcG9ydCBGb250U2V0dGluZ3MKLQkJc2V0dGluZ3MgPSBGb250U2V0dGluZ3MuRm9udERpYWxvZyhzZWxmLncub3V0cHV0dGV4dC5nZXRmb250c2V0dGluZ3MoKSwKLQkJCQlzZWxmLncub3V0cHV0dGV4dC5nZXR0YWJzZXR0aW5ncygpKQotCQlpZiBzZXR0aW5nczoKLQkJCWZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MgPSBzZXR0aW5ncwotCQkJc2VsZi53Lm91dHB1dHRleHQuc2V0Zm9udHNldHRpbmdzKGZvbnRzZXR0aW5ncykKLQkJCXNlbGYudy5vdXRwdXR0ZXh0LnNldHRhYnNldHRpbmdzKHRhYnNldHRpbmdzKQotCQotCWRlZiBjbGVhcmJ1ZmZlcihzZWxmKToKLQkJZnJvbSBDYXJib24gaW1wb3J0IFJlcwotCQlzZWxmLncub3V0cHV0dGV4dC5zZXQoJycpCi0JCi0JZGVmIGFjdGl2YXRlKHNlbGYsIG9ub2ZmKToKLQkJaWYgb25vZmY6Ci0JCQlzZWxmLmNsb3NlZCA9IDAKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYudy5zaG93KDApCi0JCXNlbGYuY2xvc2VkID0gMQotCQlyZXR1cm4gLTEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBib3VuZHMsIHNob3cgPSAxLCBmb250c2V0dGluZ3MgPSAoIk1vbmFjbyIsIDAsIDksICgwLCAwLCAwKSksIHRhYnNldHRpbmdzID0gKDMyLCAwKSk6CisgICAgICAgIHNlbGYuYm91bmRzID0gYm91bmRzCisgICAgICAgIHNlbGYuZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCisgICAgICAgIHNlbGYudGFic2V0dGluZ3MgPSB0YWJzZXR0aW5ncworICAgICAgICBzZWxmLncgPSBOb25lCisgICAgICAgIHNlbGYuY2xvc2VkID0gMQorICAgICAgICBzZWxmLl9idWYgPSAnJworICAgICAgICAjIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGlzCisgICAgICAgIHNlbGYuc2F2ZXN0ZG91dCwgc2VsZi5zYXZlc3RkZXJyID0gc3lzLnN0ZG91dCwgc3lzLnN0ZGVycgorICAgICAgICBzeXMuc3RkZXJyID0gc3lzLnN0ZG91dCA9IHNlbGYKKyAgICAgICAgaWYgc2hvdzoKKyAgICAgICAgICAgIHNlbGYuc2hvdygpCisKKyAgICBkZWYgc2V0dXB3aWRnZXRzKHNlbGYpOgorICAgICAgICBzZWxmLncgPSBXLldpbmRvdyhzZWxmLmJvdW5kcywgIk91dHB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5zaXplID0gKDIwMCwgMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmJhYmxlID0gMCkKKyAgICAgICAgc2VsZi53Lm91dHB1dHRleHQgPSBPdXRwdXRUZXh0V2lkZ2V0KCgtMSwgLTEsIC0xNCwgMSksIGluc2V0ID0gKDYsIDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9udHNldHRpbmdzID0gc2VsZi5mb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gc2VsZi50YWJzZXR0aW5ncywgcmVhZG9ubHkgPSAxKQorICAgICAgICBtZW51aXRlbXMgPSBbKCJDbGVhciB3aW5kb3ciLCBzZWxmLmNsZWFyYnVmZmVyKSwgKCJGb250IHNldHRpbmdzXHhjOSIsIHNlbGYuZG9mb250c2V0dGluZ3MpXQorICAgICAgICBzZWxmLncucG9wdXBtZW51ID0gVy5Qb3B1cE1lbnUoKC0xNSwgLTEsIDE2LCAxNiksIG1lbnVpdGVtcykKKworICAgICAgICBzZWxmLncuX2JhcnkgPSBXLlNjcm9sbGJhcigoLTE1LCAxNCwgMTYsIC0xNCksIHNlbGYudy5vdXRwdXR0ZXh0LnZzY3JvbGwsIG1heCA9IDMyNzY3KQorICAgICAgICBzZWxmLncuYmluZCgiPGNsb3NlPiIsIHNlbGYuY2xvc2UpCisgICAgICAgIHNlbGYudy5iaW5kKCI8YWN0aXZhdGU+Iiwgc2VsZi5hY3RpdmF0ZSkKKworICAgIGRlZiB3cml0ZShzZWxmLCB0ZXh0KToKKyAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgb2xkeWllbGQgPSBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2J1ZiA9IHNlbGYuX2J1ZiArIHRleHQKKyAgICAgICAgICAgIGlmICdcbicgaW4gc2VsZi5fYnVmOgorICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaChvbGR5aWVsZCkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5zaG93KCkKKyAgICAgICAgc3R1ZmYgPSBzdHJpbmcuc3BsaXQoc2VsZi5fYnVmLCAnXG4nKQorICAgICAgICBzdHVmZiA9IHN0cmluZy5qb2luKHN0dWZmLCAnXHInKQorICAgICAgICBlbmQgPSBzZWxmLncub3V0cHV0dGV4dC50ZWQuV0VHZXRUZXh0TGVuZ3RoKCkKKyAgICAgICAgc2VsZi53Lm91dHB1dHRleHQuc2V0c2VsZWN0aW9uKGVuZCwgZW5kKQorICAgICAgICBzZWxmLncub3V0cHV0dGV4dC50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRlJlYWRPbmx5LCAwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLncub3V0cHV0dGV4dC50ZWQuV0VJbnNlcnQoc3R1ZmYsIE5vbmUsIE5vbmUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9idWYgPSAiIgorICAgICAgICBzZWxmLncub3V0cHV0dGV4dC51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi53Lm91dHB1dHRleHQudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMSkKKyAgICAgICAgaWYgc2VsZi53LndpZC5HZXRXaW5kb3dQb3J0KCkuUURJc1BvcnRCdWZmZXJlZCgpOgorICAgICAgICAgICAgc2VsZi53LndpZC5HZXRXaW5kb3dQb3J0KCkuUURGbHVzaFBvcnRCdWZmZXIoTm9uZSkKKworICAgIGRlZiBzaG93KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnc6CisgICAgICAgICAgICAgICAgc2VsZi5zZXR1cHdpZGdldHMoKQorICAgICAgICAgICAgICAgIHNlbGYudy5vcGVuKCkKKyAgICAgICAgICAgICAgICBzZWxmLncub3V0cHV0dGV4dC51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53LnNob3coMSkKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IDAKKyAgICAgICAgICAgICAgICBzZWxmLncuc2VsZWN0KCkKKworICAgIGRlZiB3cml0ZXByZWZzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLncgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCisgICAgICAgICAgICBwcmVmcy5vdXRwdXQuc2hvdyA9IHNlbGYudy5pc3Zpc2libGUoKQorICAgICAgICAgICAgcHJlZnMub3V0cHV0LndpbmRvd2JvdW5kcyA9IHNlbGYudy5nZXRib3VuZHMoKQorICAgICAgICAgICAgcHJlZnMub3V0cHV0LmZvbnRzZXR0aW5ncyA9IHNlbGYudy5vdXRwdXR0ZXh0LmdldGZvbnRzZXR0aW5ncygpCisgICAgICAgICAgICBwcmVmcy5vdXRwdXQudGFic2V0dGluZ3MgPSBzZWxmLncub3V0cHV0dGV4dC5nZXR0YWJzZXR0aW5ncygpCisgICAgICAgICAgICBwcmVmcy5zYXZlKCkKKworICAgIGRlZiBkb2ZvbnRzZXR0aW5ncyhzZWxmKToKKyAgICAgICAgaW1wb3J0IEZvbnRTZXR0aW5ncworICAgICAgICBzZXR0aW5ncyA9IEZvbnRTZXR0aW5ncy5Gb250RGlhbG9nKHNlbGYudy5vdXRwdXR0ZXh0LmdldGZvbnRzZXR0aW5ncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53Lm91dHB1dHRleHQuZ2V0dGFic2V0dGluZ3MoKSkKKyAgICAgICAgaWYgc2V0dGluZ3M6CisgICAgICAgICAgICBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gc2V0dGluZ3MKKyAgICAgICAgICAgIHNlbGYudy5vdXRwdXR0ZXh0LnNldGZvbnRzZXR0aW5ncyhmb250c2V0dGluZ3MpCisgICAgICAgICAgICBzZWxmLncub3V0cHV0dGV4dC5zZXR0YWJzZXR0aW5ncyh0YWJzZXR0aW5ncykKKworICAgIGRlZiBjbGVhcmJ1ZmZlcihzZWxmKToKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IFJlcworICAgICAgICBzZWxmLncub3V0cHV0dGV4dC5zZXQoJycpCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gMAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLncuc2hvdygwKQorICAgICAgICBzZWxmLmNsb3NlZCA9IDEKKyAgICAgICAgcmV0dXJuIC0xCiAKIAogY2xhc3MgU2ltcGxlU3RkaW46Ci0JCi0JZGVmIHJlYWRsaW5lKHNlbGYpOgotCQlpbXBvcnQgRWFzeURpYWxvZ3MKLQkJIyBBIHRyaWNrIHRvIG1ha2UgdGhlIGlucHV0IGRpYWxvZyBib3ggYSBiaXQgbW9yZSBwYWxhdGFibGUKLQkJaWYgaGFzYXR0cihzeXMuc3Rkb3V0LCAnX2J1ZicpOgotCQkJcHJvbXB0ID0gc3lzLnN0ZG91dC5fYnVmCi0JCWVsc2U6Ci0JCQlwcm9tcHQgPSAiIgotCQlpZiBub3QgcHJvbXB0OgotCQkJcHJvbXB0ID0gIlN0ZGluIGlucHV0OiIKLQkJc3lzLnN0ZG91dC5mbHVzaCgpCi0JCXJ2ID0gRWFzeURpYWxvZ3MuQXNrU3RyaW5nKHByb21wdCkKLQkJaWYgcnYgaXMgTm9uZToKLQkJCXJldHVybiAiIgotCQlydiA9IHJ2ICsgIlxuIiAgIyByZWFkbGluZSBzaG91bGQgaW5jbHVkZSBsaW5lIHRlcm1pbmF0b3IKLQkJc3lzLnN0ZG91dC53cml0ZShydikgICMgZWNobyB1c2VyJ3MgcmVwbHkKLQkJcmV0dXJuIHJ2CisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIGltcG9ydCBFYXN5RGlhbG9ncworICAgICAgICAjIEEgdHJpY2sgdG8gbWFrZSB0aGUgaW5wdXQgZGlhbG9nIGJveCBhIGJpdCBtb3JlIHBhbGF0YWJsZQorICAgICAgICBpZiBoYXNhdHRyKHN5cy5zdGRvdXQsICdfYnVmJyk6CisgICAgICAgICAgICBwcm9tcHQgPSBzeXMuc3Rkb3V0Ll9idWYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByb21wdCA9ICIiCisgICAgICAgIGlmIG5vdCBwcm9tcHQ6CisgICAgICAgICAgICBwcm9tcHQgPSAiU3RkaW4gaW5wdXQ6IgorICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgcnYgPSBFYXN5RGlhbG9ncy5Bc2tTdHJpbmcocHJvbXB0KQorICAgICAgICBpZiBydiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIHJ2ID0gcnYgKyAiXG4iICAjIHJlYWRsaW5lIHNob3VsZCBpbmNsdWRlIGxpbmUgdGVybWluYXRvcgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHJ2KSAgIyBlY2hvIHVzZXIncyByZXBseQorICAgICAgICByZXR1cm4gcnYKIAogCiBkZWYgaW5zdGFsbGNvbnNvbGUoZGVmYXVsdHNob3cgPSAxKToKLQlnbG9iYWwgY29uc29sZQotCXByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKLQlpZiBub3QgcHJlZnMuY29uc29sZSBvciBub3QgaGFzYXR0cihwcmVmcy5jb25zb2xlLCAnc2hvdycpOgotCQlwcmVmcy5jb25zb2xlLnNob3cgPSBkZWZhdWx0c2hvdwotCWlmIG5vdCBoYXNhdHRyKHByZWZzLmNvbnNvbGUsICJ3aW5kb3dib3VuZHMiKToKLQkJcHJlZnMuY29uc29sZS53aW5kb3dib3VuZHMgPSAoNDUwLCAyNTApCi0JaWYgbm90IGhhc2F0dHIocHJlZnMuY29uc29sZSwgImZvbnRzZXR0aW5ncyIpOgotCQlwcmVmcy5jb25zb2xlLmZvbnRzZXR0aW5ncyA9ICgiTW9uYWNvIiwgMCwgOSwgKDAsIDAsIDApKQotCWlmIG5vdCBoYXNhdHRyKHByZWZzLmNvbnNvbGUsICJ0YWJzZXR0aW5ncyIpOgotCQlwcmVmcy5jb25zb2xlLnRhYnNldHRpbmdzID0gKDMyLCAwKQotCWNvbnNvbGUgPSBQeUNvbnNvbGUocHJlZnMuY29uc29sZS53aW5kb3dib3VuZHMsIHByZWZzLmNvbnNvbGUuc2hvdywgCi0JCQlwcmVmcy5jb25zb2xlLmZvbnRzZXR0aW5ncywgcHJlZnMuY29uc29sZS50YWJzZXR0aW5ncywgMSkKKyAgICBnbG9iYWwgY29uc29sZQorICAgIHByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKKyAgICBpZiBub3QgcHJlZnMuY29uc29sZSBvciBub3QgaGFzYXR0cihwcmVmcy5jb25zb2xlLCAnc2hvdycpOgorICAgICAgICBwcmVmcy5jb25zb2xlLnNob3cgPSBkZWZhdWx0c2hvdworICAgIGlmIG5vdCBoYXNhdHRyKHByZWZzLmNvbnNvbGUsICJ3aW5kb3dib3VuZHMiKToKKyAgICAgICAgcHJlZnMuY29uc29sZS53aW5kb3dib3VuZHMgPSAoNDUwLCAyNTApCisgICAgaWYgbm90IGhhc2F0dHIocHJlZnMuY29uc29sZSwgImZvbnRzZXR0aW5ncyIpOgorICAgICAgICBwcmVmcy5jb25zb2xlLmZvbnRzZXR0aW5ncyA9ICgiTW9uYWNvIiwgMCwgOSwgKDAsIDAsIDApKQorICAgIGlmIG5vdCBoYXNhdHRyKHByZWZzLmNvbnNvbGUsICJ0YWJzZXR0aW5ncyIpOgorICAgICAgICBwcmVmcy5jb25zb2xlLnRhYnNldHRpbmdzID0gKDMyLCAwKQorICAgIGNvbnNvbGUgPSBQeUNvbnNvbGUocHJlZnMuY29uc29sZS53aW5kb3dib3VuZHMsIHByZWZzLmNvbnNvbGUuc2hvdywKKyAgICAgICAgICAgICAgICAgICAgcHJlZnMuY29uc29sZS5mb250c2V0dGluZ3MsIHByZWZzLmNvbnNvbGUudGFic2V0dGluZ3MsIDEpCiAKIGRlZiBpbnN0YWxsb3V0cHV0KGRlZmF1bHRzaG93ID0gMCwgT3V0UHV0V2luZG93ID0gUHlPdXRwdXQpOgotCWdsb2JhbCBvdXRwdXQKLQkKLQkjIHF1aWNrICduJyBkaXJ0eSBzdGQgaW4gZW11bGF0aW9uCi0Jc3lzLnN0ZGluID0gU2ltcGxlU3RkaW4oKQotCQotCXByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKLQlpZiBub3QgcHJlZnMub3V0cHV0IG9yIG5vdCBoYXNhdHRyKHByZWZzLm91dHB1dCwgJ3Nob3cnKToKLQkJcHJlZnMub3V0cHV0LnNob3cgPSBkZWZhdWx0c2hvdwotCWlmIG5vdCBoYXNhdHRyKHByZWZzLm91dHB1dCwgIndpbmRvd2JvdW5kcyIpOgotCQlwcmVmcy5vdXRwdXQud2luZG93Ym91bmRzID0gKDQ1MCwgMjUwKQotCWlmIG5vdCBoYXNhdHRyKHByZWZzLm91dHB1dCwgImZvbnRzZXR0aW5ncyIpOgotCQlwcmVmcy5vdXRwdXQuZm9udHNldHRpbmdzID0gKCJNb25hY28iLCAwLCA5LCAoMCwgMCwgMCkpCi0JaWYgbm90IGhhc2F0dHIocHJlZnMub3V0cHV0LCAidGFic2V0dGluZ3MiKToKLQkJcHJlZnMub3V0cHV0LnRhYnNldHRpbmdzID0gKDMyLCAwKQotCW91dHB1dCA9IE91dFB1dFdpbmRvdyhwcmVmcy5vdXRwdXQud2luZG93Ym91bmRzLCBwcmVmcy5vdXRwdXQuc2hvdywgCi0JCQlwcmVmcy5vdXRwdXQuZm9udHNldHRpbmdzLCBwcmVmcy5vdXRwdXQudGFic2V0dGluZ3MpCisgICAgZ2xvYmFsIG91dHB1dAorCisgICAgIyBxdWljayAnbicgZGlydHkgc3RkIGluIGVtdWxhdGlvbgorICAgIHN5cy5zdGRpbiA9IFNpbXBsZVN0ZGluKCkKKworICAgIHByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKKyAgICBpZiBub3QgcHJlZnMub3V0cHV0IG9yIG5vdCBoYXNhdHRyKHByZWZzLm91dHB1dCwgJ3Nob3cnKToKKyAgICAgICAgcHJlZnMub3V0cHV0LnNob3cgPSBkZWZhdWx0c2hvdworICAgIGlmIG5vdCBoYXNhdHRyKHByZWZzLm91dHB1dCwgIndpbmRvd2JvdW5kcyIpOgorICAgICAgICBwcmVmcy5vdXRwdXQud2luZG93Ym91bmRzID0gKDQ1MCwgMjUwKQorICAgIGlmIG5vdCBoYXNhdHRyKHByZWZzLm91dHB1dCwgImZvbnRzZXR0aW5ncyIpOgorICAgICAgICBwcmVmcy5vdXRwdXQuZm9udHNldHRpbmdzID0gKCJNb25hY28iLCAwLCA5LCAoMCwgMCwgMCkpCisgICAgaWYgbm90IGhhc2F0dHIocHJlZnMub3V0cHV0LCAidGFic2V0dGluZ3MiKToKKyAgICAgICAgcHJlZnMub3V0cHV0LnRhYnNldHRpbmdzID0gKDMyLCAwKQorICAgIG91dHB1dCA9IE91dFB1dFdpbmRvdyhwcmVmcy5vdXRwdXQud2luZG93Ym91bmRzLCBwcmVmcy5vdXRwdXQuc2hvdywKKyAgICAgICAgICAgICAgICAgICAgcHJlZnMub3V0cHV0LmZvbnRzZXR0aW5ncywgcHJlZnMub3V0cHV0LnRhYnNldHRpbmdzKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9QeURlYnVnZ2VyLnB5IGIvTWFjL1Rvb2xzL0lERS9QeURlYnVnZ2VyLnB5CmluZGV4IDUxYmE3NTMuLjVlZTkyZDUgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvUHlEZWJ1Z2dlci5weQorKysgYi9NYWMvVG9vbHMvSURFL1B5RGVidWdnZXIucHkKQEAgLTEzLDg4MiArMTMsODgyIEBACiBfZmlsZW5hbWVzID0ge30KIAogU0lNUExFX1RZUEVTID0gKAotCXR5cGVzLk5vbmVUeXBlLAotCXR5cGVzLkludFR5cGUsCi0JdHlwZXMuTG9uZ1R5cGUsCi0JdHlwZXMuRmxvYXRUeXBlLAotCXR5cGVzLkNvbXBsZXhUeXBlLAotCXR5cGVzLlN0cmluZ1R5cGUKKyAgICAgICAgdHlwZXMuTm9uZVR5cGUsCisgICAgICAgIHR5cGVzLkludFR5cGUsCisgICAgICAgIHR5cGVzLkxvbmdUeXBlLAorICAgICAgICB0eXBlcy5GbG9hdFR5cGUsCisgICAgICAgIHR5cGVzLkNvbXBsZXhUeXBlLAorICAgICAgICB0eXBlcy5TdHJpbmdUeXBlCiApCiAKIAogY2xhc3MgRGVidWdnZXIoYmRiLkJkYik6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHRpdGxlID0gJ0RlYnVnZ2VyJyk6Ci0JCWJkYi5CZGIuX19pbml0X18oc2VsZikKLQkJc2VsZi5jbG9zZWQgPSAxCi0JCXNlbGYudGl0bGUgPSB0aXRsZQotCQlzZWxmLmJyZWFrc3ZpZXdlciA9IE5vbmUKLQkJc2VsZi5yZXNldCgpCi0JCXNlbGYudHJhY2luZyA9IDAKLQkJc2VsZi50cmFjaW5nbW9uaXRvcnRpbWUgPSBFdnQuVGlja0NvdW50KCkKLQkJc2VsZi5lZGl0b3JzID0ge30KLQkJCi0JCXByZWZzID0gVy5nZXRhcHBsaWNhdGlvbigpLmdldHByZWZzKCkKLQkJaWYgcHJlZnMuZGVidWdnZXI6Ci0JCQlmb3IgZmlsZSwgYnJlYWtzIGluIHByZWZzLmRlYnVnZ2VyLmJyZWFrcy5pdGVtcygpOgotCQkJCWZvciBiIGluIGJyZWFrczoKLQkJCQkJc2VsZi5zZXRfYnJlYWsoZmlsZSwgYikKLQkJCXNlbGYuYm91bmRzLCBzZWxmLmhvcnBhbmVzLCBzZWxmLnZlcnBhbmVzID0gcHJlZnMuZGVidWdnZXIud2luZG93c2V0dGluZ3MKLQkJCXNlbGYudHJhY2VtYWdpYyA9IHByZWZzLmRlYnVnZ2VyLnRyYWNlbWFnaWMKLQkJZWxzZToKLQkJCXNlbGYuYnJlYWtzID0ge30KLQkJCXNlbGYuaG9ycGFuZXMgPSAoMC40LCAwLjYpCi0JCQlzZWxmLnZlcnBhbmVzID0gKDAuMywgMC4zNSwgMC4zNSkKLQkJCXNlbGYuYm91bmRzID0gKDYwMCwgNDAwKQotCQkJc2VsZi50cmFjZW1hZ2ljID0gMAotCQlzZWxmLmxhc3RzdGFja3NlbCA9IE5vbmUKLQkKLQlkZWYgY2Fub25pYyhzZWxmLCBmaWxlbmFtZSk6Ci0JCSMgb3ZlcnJpZGU6IHRoZSBwcm92aWRlZCBjYW5vbmljKCkgbWV0aG9kIGJyZWFrcyBvdXIKLQkJIyBmaWxlLWxlc3MgVW50aXRsZWQgd2luZG93cwotCQlyZXR1cm4gZmlsZW5hbWUKLQkKLQlkZWYgcmVzZXQoc2VsZik6Ci0JCXNlbGYuY3VycmVudGZyYW1lID0gTm9uZQotCQlzZWxmLmZpbGUgPSBOb25lCi0JCXNlbGYubGFzdHN0YWNrID0gTm9uZQotCQlzZWxmLnJlYXNvbiA9ICdOb3QgcnVubmluZycKLQkJc2VsZi5jb250aW51ZXdpdGhvdXRkZWJ1Z2dlciA9IDAKLQkJYmRiLkJkYi5yZXNldChzZWxmKQotCQlzZWxmLmZvcmdldCgpCi0JCi0JZGVmIHN0YXJ0KHNlbGYsIGJvdHRvbWZyYW1lID0gTm9uZSwgcnVubmluZyA9IDApOgotCQlXLmdldGFwcGxpY2F0aW9uKCkuRGVidWdnZXJRdWl0ID0gYmRiLkJkYlF1aXQKLQkJZnJvbSBDYXJib24gaW1wb3J0IE1lbnUKLQkJTWVudS5IaWxpdGVNZW51KDApCi0JCWlmIHNlbGYuY2xvc2VkOgotCQkJc2VsZi5zZXR1cHdpZGdldHMoc2VsZi50aXRsZSkKLQkJCXNlbGYuY2xvc2VkID0gMAotCQlpZiBub3Qgc2VsZi53LnBhcmVudC5kZWJ1Z2dlcl9xdWl0dGluZzoKLQkJCXNlbGYudy5zZWxlY3QoKQotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAnVGhlcmUgaXMgYW5vdGhlciBkZWJ1Z2dlciBzZXNzaW9uIGJ1c3kuJwotCQlzZWxmLnJlc2V0KCkKLQkJc2VsZi5ib3RmcmFtZSA9IGJvdHRvbWZyYW1lCi0JCWlmIHJ1bm5pbmc6Ci0JCQlzZWxmLnNldF9jb250aW51ZSgpCi0JCQlzZWxmLnJlYXNvbiA9ICdSdW5uaW5nXHhjOScKLQkJCXNlbGYuc2V0c3RhdGUoJ3J1bm5pbmcnKQotCQllbHNlOgotCQkJc2VsZi5zZXRfc3RlcCgpCi0JCQlzZWxmLnJlYXNvbiA9ICdzdG9wcGVkJwotCQkJc2VsZi5zZXRzdGF0ZSgnc3RvcHBlZCcpCi0JCXN5cy5zZXR0cmFjZShzZWxmLnRyYWNlX2Rpc3BhdGNoKQotCQotCWRlZiBzdG9wKHNlbGYpOgotCQlzZWxmLnNldF9xdWl0KCkKLQkJaWYgc2VsZi53LnBhcmVudDoKLQkJCXNlbGYuZXhpdF9tYWlubG9vcCgpCi0JCQlzZWxmLnJlc2V0d2lkZ2V0cygpCi0JCi0JZGVmIHNldF9jb250aW51ZV93aXRob3V0X2RlYnVnZ2VyKHNlbGYpOgotCQlzeXMuc2V0dHJhY2UoTm9uZSkKLQkJc2VsZi5zZXRfcXVpdCgpCi0JCXNlbGYuY2xlYXJfdHJhY2VmdW5jcygpCi0JCXNlbGYuY29udGludWV3aXRob3V0ZGVidWdnZXIgPSAxCi0JCWlmIGhhc2F0dHIoc2VsZiwgInciKSBhbmQgc2VsZi53LnBhcmVudDoKLQkJCXNlbGYuZXhpdF9tYWlubG9vcCgpCi0JCQlzZWxmLnJlc2V0d2lkZ2V0cygpCi0JCi0JZGVmIGNsZWFyX3RyYWNlZnVuY3Moc2VsZik6Ci0JCXRyeToKLQkJCXJhaXNlICdzcGFtJwotCQlleGNlcHQ6Ci0JCQlwYXNzCi0JCWZyYW1lID0gc3lzLmV4Y190cmFjZWJhY2sudGJfZnJhbWUKLQkJd2hpbGUgZnJhbWUgaXMgbm90IE5vbmU6Ci0JCQlkZWwgZnJhbWUuZl90cmFjZQotCQkJZnJhbWUgPSBmcmFtZS5mX2JhY2sKLQkKLQlkZWYgcG9zdG1vcnRlbShzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOgotCQlpZiBzZWxmLmNsb3NlZDoKLQkJCXNlbGYuc2V0dXB3aWRnZXRzKHNlbGYudGl0bGUpCi0JCQlzZWxmLmNsb3NlZCA9IDAKLQkJaWYgbm90IHNlbGYudy5wYXJlbnQuZGVidWdnZXJfcXVpdHRpbmc6Ci0JCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICdUaGVyZSBpcyBhbm90aGVyIGRlYnVnZ2VyIHNlc3Npb24gYnVzeS4nCi0JCXNlbGYucmVzZXQoKQotCQlpZiB0cmFjZWJhY2s6Ci0JCQlzZWxmLmJvdGZyYW1lID0gdHJhY2ViYWNrLnRiX2ZyYW1lCi0JCQl3aGlsZSB0cmFjZWJhY2sudGJfbmV4dCA8PiBOb25lOgotCQkJCXRyYWNlYmFjayA9IHRyYWNlYmFjay50Yl9uZXh0Ci0JCQlmcmFtZSA9IHRyYWNlYmFjay50Yl9mcmFtZQotCQllbHNlOgotCQkJc2VsZi5ib3RmcmFtZSA9IE5vbmUKLQkJCWZyYW1lID0gTm9uZQotCQlzZWxmLncucGFuZXMuYm90dG9tLmJ1dHRvbnMua2lsbGJ1dHRvbi5lbmFibGUoMSkKLQkJc2VsZi5yZWFzb24gPSAnKGRlYWQpICcgKyBzZWxmLmZvcm1hdGV4Y2VwdGlvbihleGNfdHlwZSwgZXhjX3ZhbHVlKQotCQlzZWxmLncuc2VsZWN0KCkKLQkJc2VsZi5zZXR1cChmcmFtZSwgdHJhY2ViYWNrKQotCQlzZWxmLnNldHN0YXRlKCdkZWFkJykKLQkJc2VsZi5zaG93c3RhY2soc2VsZi5jdXJpbmRleCkKLQkJc2VsZi5zaG93ZnJhbWUoc2VsZi5jdXJpbmRleCkKLQkKLQlkZWYgc2V0dXB3aWRnZXRzKHNlbGYsIHRpdGxlKToKLQkJc2VsZi53ID0gdyA9IFcuV2luZG93KHNlbGYuYm91bmRzLCB0aXRsZSwgbWluc2l6ZSA9ICg1MDAsIDMwMCkpCi0JCQotCQl3LnBhbmVzID0gVy5Ib3Jpem9udGFsUGFuZXMoKDgsIDQsIC04LCAtOCksIHNlbGYuaG9ycGFuZXMpCi0JCQotCQl3LnBhbmVzLmJyb3dzZXJwYW5lcyA9IGJyb3dzZXJwYW5lcyA9IFcuVmVydGljYWxQYW5lcyhOb25lLCBzZWxmLnZlcnBhbmVzKQotCQkKLQkJYnJvd3NlcnBhbmVzLnN0YWNrbGlzdCA9IFcuR3JvdXAoTm9uZSkKLQkJYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC50aXRsZSA9IFcuVGV4dEJveCgoNCwgMCwgMCwgMTIpLCAnU3RhY2snKQotCQlicm93c2VycGFuZXMuc3RhY2tsaXN0LnN0YWNrID0gVy5MaXN0KCgwLCAxNiwgMCwgMCksIGNhbGxiYWNrID0gc2VsZi5kb19zdGFjaywgZmxhZ3MgPSBMaXN0cy5sT25seU9uZSkKLQkJCi0JCWJyb3dzZXJwYW5lcy5sb2NhbHMgPSBXLkdyb3VwKE5vbmUpCi0JCWJyb3dzZXJwYW5lcy5sb2NhbHMudGl0bGUgPSBXLlRleHRCb3goKDQsIDAsIDAsIDEyKSwgJ0xvY2FsIHZhcmlhYmxlcycpCi0JCWJyb3dzZXJwYW5lcy5sb2NhbHMuYnJvd3NlciA9IFB5QnJvd3Nlci5Ccm93c2VyV2lkZ2V0KCgwLCAxNiwgMCwgMCkpCi0JCQotCQlicm93c2VycGFuZXMuZ2xvYmFscyA9IFcuR3JvdXAoTm9uZSkKLQkJYnJvd3NlcnBhbmVzLmdsb2JhbHMudGl0bGUgPSBXLlRleHRCb3goKDQsIDAsIDAsIDEyKSwgJ0dsb2JhbCB2YXJpYWJsZXMnKQotCQlicm93c2VycGFuZXMuZ2xvYmFscy5icm93c2VyID0gUHlCcm93c2VyLkJyb3dzZXJXaWRnZXQoKDAsIDE2LCAwLCAwKSkKLQkJCi0JCXcucGFuZXMuYm90dG9tID0gYm90dG9tID0gVy5Hcm91cChOb25lKQotCQlib3R0b20uc3JjID0gc3JjID0gVy5Hcm91cCgoMCwgNjQsIDAsIDApKQotCQlzb3VyY2UgPSBTb3VyY2VWaWV3ZXIoKDEsIDEsIC0xNSwgLTE1KSwgcmVhZG9ubHkgPSAxLCBkZWJ1Z2dlciA9IHNlbGYpCi0JCXNyYy5vcHRpb25zbWVudSA9IFcuUG9wdXBNZW51KCgtMTYsIDAsIDE2LCAxNiksIFtdKQotCQlzcmMub3B0aW9uc21lbnUuYmluZCgnPGNsaWNrPicsIHNlbGYubWFrZW9wdGlvbnNtZW51KQotCQkKLQkJc3JjLl9iYXJ4ID0gVy5TY3JvbGxiYXIoKDAsIC0xNiwgLTE1LCAxNiksIHNvdXJjZS5oc2Nyb2xsLCBtYXggPSAzMjc2NykKLQkJc3JjLl9iYXJ5ID0gVy5TY3JvbGxiYXIoKC0xNiwgMTUsIDE2LCAtMTUpLCBzb3VyY2UudnNjcm9sbCwgbWF4ID0gMzI3NjcpCi0JCXNyYy5zb3VyY2UgPSBzb3VyY2UKLQkJc3JjLmZyYW1lID0gVy5GcmFtZSgoMCwgMCwgLTE1LCAtMTUpKQotCQkKLQkJYm90dG9tLnRyYWNpbmdtb25pdG9yID0gVHJhY2luZ01vbml0b3IoKDAsIDIzLCA2LCA2KSkKLQkJYm90dG9tLnN0YXRlID0gVy5UZXh0Qm94KCgxMiwgMjQsIDAsIDE2KSwgc2VsZi5yZWFzb24pCi0JCQotCQlib3R0b20uc3JjdGl0bGUgPSBXLlRleHRCb3goKDEyLCA0NCwgMCwgMTYpKQotCQlib3R0b20uYnV0dG9ucyA9IGJ1dHRvbnMgPSBXLkdyb3VwKCgxMiwgMCwgMCwgMjApKQotCQkKLQkJYnV0dG9ucy5ydW5idXR0b24gPSBXLkJ1dHRvbigoMCwgMCwgNTAsIDE2KSwgIlJ1biIsIHNlbGYuZG9fcnVuKQotCQlidXR0b25zLnN0b3BidXR0b24gPSBXLkJ1dHRvbigoNTgsIDAsIDUwLCAxNiksICJTdG9wIiwgc2VsZi5kb19zdG9wKQotCQlidXR0b25zLmtpbGxidXR0b24gPSBXLkJ1dHRvbigoMTE2LCAwLCA1MCwgMTYpLCAiS2lsbCIsIHNlbGYuZG9fa2lsbCkKLQkJYnV0dG9ucy5saW5lID0gVy5WZXJ0aWNhbExpbmUoKDE3MywgMCwgMCwgMCkpCi0JCWJ1dHRvbnMuc3RlcGJ1dHRvbiA9IFcuQnV0dG9uKCgxODEsIDAsIDYwLCAxNiksICJTdGVwIiwgc2VsZi5kb19zdGVwKQotCQlidXR0b25zLnN0ZXBpbmJ1dHRvbiA9IFcuQnV0dG9uKCgyNDksIDAsIDYwLCAxNiksICJTdGVwIGluIiwgc2VsZi5kb19zdGVwaW4pCi0JCWJ1dHRvbnMuc3RlcG91dGJ1dHRvbiA9IFcuQnV0dG9uKCgzMTcsIDAsIDYwLCAxNiksICJTdGVwIG91dCIsIHNlbGYuZG9fc3RlcG91dCkKLQkJCi0JCXcuYmluZCgnY21kcicsIGJ1dHRvbnMucnVuYnV0dG9uLnB1c2gpCi0JCXcuYmluZCgnY21kLicsIGJ1dHRvbnMuc3RvcGJ1dHRvbi5wdXNoKQotCQl3LmJpbmQoJ2NtZGsnLCBidXR0b25zLmtpbGxidXR0b24ucHVzaCkKLQkJdy5iaW5kKCdjbWRzJywgYnV0dG9ucy5zdGVwYnV0dG9uLnB1c2gpCi0JCXcuYmluZCgnY21kdCcsIGJ1dHRvbnMuc3RlcGluYnV0dG9uLnB1c2gpCi0JCXcuYmluZCgnY21kdScsIGJ1dHRvbnMuc3RlcG91dGJ1dHRvbi5wdXNoKQotCQkKLQkJdy5iaW5kKCc8Y2xvc2U+Jywgc2VsZi5jbG9zZSkKLQkJCi0JCXcub3BlbigpCi0JCXcueHh4X19fc2VsZWN0KHcucGFuZXMuYm90dG9tLnNyYy5zb3VyY2UpCi0JCi0JZGVmIG1ha2VvcHRpb25zbWVudShzZWxmKToKLQkJb3B0aW9ucyA9IFsoJ0NsZWFyIGJyZWFrcG9pbnRzJywgc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLmNsZWFyYnJlYWtwb2ludHMpLCAKLQkJCQkoJ0NsZWFyIGFsbCBicmVha3BvaW50cycsIHNlbGYuY2xlYXJfYWxsX2JyZWFrcyksCi0JCQkJKCdFZGl0IGJyZWFrcG9pbnRzXHhjOScsIHNlbGYuZWRpdF9icmVha3MpLCAnLScsCi0JCQkJKHNlbGYudHJhY2VtYWdpYyBhbmQgCi0JCQkJCSdEaXNhYmxlIF9fbWFnaWNfXyB0cmFjaW5nJyBvciAnRW5hYmxlIF9fbWFnaWNfXyB0cmFjaW5nJywgc2VsZi50b2dnbGVtYWdpYyldCi0JCXNlbGYudy5wYW5lcy5ib3R0b20uc3JjLm9wdGlvbnNtZW51LnNldChvcHRpb25zKQotCQotCWRlZiBlZGl0X2JyZWFrcyhzZWxmKToKLQkJaWYgc2VsZi5icmVha3N2aWV3ZXI6Ci0JCQlzZWxmLmJyZWFrc3ZpZXdlci5zZWxlY3QoKQotCQllbHNlOgotCQkJc2VsZi5icmVha3N2aWV3ZXIgPSBCcmVha3BvaW50c1ZpZXdlcihzZWxmKQotCQotCWRlZiB0b2dnbGVtYWdpYyhzZWxmKToKLQkJc2VsZi50cmFjZW1hZ2ljID0gbm90IHNlbGYudHJhY2VtYWdpYwotCQotCWRlZiBzZXRzdGF0ZShzZWxmLCBzdGF0ZSk6Ci0JCXNlbGYudy5wYW5lcy5ib3R0b20udHJhY2luZ21vbml0b3IucmVzZXQoKQotCQlzZWxmLncucGFuZXMuYm90dG9tLnN0YXRlLnNldChzZWxmLnJlYXNvbikKLQkJYnV0dG9ucyA9IHNlbGYudy5wYW5lcy5ib3R0b20uYnV0dG9ucwotCQlpZiBzdGF0ZSA9PSAnc3RvcHBlZCc6Ci0JCQlidXR0b25zLnJ1bmJ1dHRvbi5lbmFibGUoMSkKLQkJCWJ1dHRvbnMuc3RvcGJ1dHRvbi5lbmFibGUoMCkKLQkJCWJ1dHRvbnMua2lsbGJ1dHRvbi5lbmFibGUoMSkKLQkJCWJ1dHRvbnMuc3RlcGJ1dHRvbi5lbmFibGUoMSkKLQkJCWJ1dHRvbnMuc3RlcGluYnV0dG9uLmVuYWJsZSgxKQotCQkJYnV0dG9ucy5zdGVwb3V0YnV0dG9uLmVuYWJsZSgxKQotCQllbGlmIHN0YXRlID09ICdydW5uaW5nJzoKLQkJCWJ1dHRvbnMucnVuYnV0dG9uLmVuYWJsZSgwKQotCQkJYnV0dG9ucy5zdG9wYnV0dG9uLmVuYWJsZSgxKQotCQkJYnV0dG9ucy5raWxsYnV0dG9uLmVuYWJsZSgxKQotCQkJYnV0dG9ucy5zdGVwYnV0dG9uLmVuYWJsZSgwKQotCQkJYnV0dG9ucy5zdGVwaW5idXR0b24uZW5hYmxlKDApCi0JCQlidXR0b25zLnN0ZXBvdXRidXR0b24uZW5hYmxlKDApCi0JCWVsaWYgc3RhdGUgPT0gJ2lkbGUnOgotCQkJYnV0dG9ucy5ydW5idXR0b24uZW5hYmxlKDApCi0JCQlidXR0b25zLnN0b3BidXR0b24uZW5hYmxlKDApCi0JCQlidXR0b25zLmtpbGxidXR0b24uZW5hYmxlKDApCi0JCQlidXR0b25zLnN0ZXBidXR0b24uZW5hYmxlKDApCi0JCQlidXR0b25zLnN0ZXBpbmJ1dHRvbi5lbmFibGUoMCkKLQkJCWJ1dHRvbnMuc3RlcG91dGJ1dHRvbi5lbmFibGUoMCkKLQkJZWxpZiBzdGF0ZSA9PSAnZGVhZCc6Ci0JCQlidXR0b25zLnJ1bmJ1dHRvbi5lbmFibGUoMCkKLQkJCWJ1dHRvbnMuc3RvcGJ1dHRvbi5lbmFibGUoMCkKLQkJCWJ1dHRvbnMua2lsbGJ1dHRvbi5lbmFibGUoMSkKLQkJCWJ1dHRvbnMuc3RlcGJ1dHRvbi5lbmFibGUoMCkKLQkJCWJ1dHRvbnMuc3RlcGluYnV0dG9uLmVuYWJsZSgwKQotCQkJYnV0dG9ucy5zdGVwb3V0YnV0dG9uLmVuYWJsZSgwKQotCQllbHNlOgotCQkJcHJpbnQgJ3Vua25vd24gc3RhdGU6Jywgc3RhdGUKLQkKLQlkZWYgcmVzZXR3aWRnZXRzKHNlbGYpOgotCQlzZWxmLnJlYXNvbiA9ICcnCi0JCXNlbGYudy5wYW5lcy5ib3R0b20uc3JjdGl0bGUuc2V0KCcnKQotCQlzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0KCcnKQotCQlzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC5zdGFjay5zZXQoW10pCi0JCXNlbGYudy5wYW5lcy5icm93c2VycGFuZXMubG9jYWxzLmJyb3dzZXIuc2V0KHt9KQotCQlzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLmdsb2JhbHMuYnJvd3Nlci5zZXQoe30pCi0JCXNlbGYuc2V0c3RhdGUoJ2lkbGUnKQotCQotCSMgVyBjYWxsYmFja3MKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYuc2V0X3F1aXQoKQotCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQlzZWxmLmNsb3NlZCA9IDEKLQkJCi0JCXNlbGYudW5yZWdpc3Rlcl9lZGl0b3Ioc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLCAKLQkJCQlzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2UuZmlsZSkKLQkJc2VsZi5ob3JwYW5lcyA9IHNlbGYudy5wYW5lcy5nZXRwYW5lc2l6ZXMoKQotCQlzZWxmLnZlcnBhbmVzID0gc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5nZXRwYW5lc2l6ZXMoKQotCQlzZWxmLmJvdW5kcyA9IHNlbGYudy5nZXRib3VuZHMoKQotCQlwcmVmcyA9IFcuZ2V0YXBwbGljYXRpb24oKS5nZXRwcmVmcygpCi0JCXByZWZzLmRlYnVnZ2VyLmJyZWFrcyA9IHNlbGYuYnJlYWtzCi0JCXByZWZzLmRlYnVnZ2VyLndpbmRvd3NldHRpbmdzID0gc2VsZi5ib3VuZHMsIHNlbGYuaG9ycGFuZXMsIHNlbGYudmVycGFuZXMKLQkJcHJlZnMuZGVidWdnZXIudHJhY2VtYWdpYyA9IHNlbGYudHJhY2VtYWdpYwotCQlwcmVmcy5zYXZlKCkKLQkKLQkjIHN0YWNrIGxpc3QgY2FsbGJhY2sKLQkKLQlkZWYgZG9fc3RhY2soc2VsZiwgaXNkYmwpOgotCQlzZWwgPSBzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC5zdGFjay5nZXRzZWxlY3Rpb24oKQotCQlpZiBpc2RibDoKLQkJCWlmIHNlbDoKLQkJCQlmcmFtZSwgbGluZW5vID0gc2VsZi5zdGFja1tzZWxbMF0gKyAxXQotCQkJCWZpbGVuYW1lID0gZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCi0JCQkJZWRpdG9yID0gc2VsZi53Ll9wYXJlbnR3aW5kb3cucGFyZW50Lm9wZW5zY3JpcHQoZmlsZW5hbWUsIGxpbmVubykKLQkJCQlpZiBzZWxmLmJyZWFrcy5oYXNfa2V5KGZpbGVuYW1lKToKLQkJCQkJZWRpdG9yLnNob3dicmVha3BvaW50cygxKQotCQllbHNlOgotCQkJaWYgc2VsIGFuZCBzZWwgPD4gc2VsZi5sYXN0c3RhY2tzZWw6Ci0JCQkJc2VsZi5zaG93ZnJhbWUoc2VsWzBdICsgMSkKLQkJCXNlbGYubGFzdHN0YWNrc2VsID0gc2VsCi0JCi0JZGVmIGdldGVkaXRvcihzZWxmLCBmaWxlbmFtZSk6Ci0JCWlmIGZpbGVuYW1lWzoxXSA9PSAnPCcgYW5kIGZpbGVuYW1lWy0xOl0gPT0gJz4nOgotCQkJZWRpdG9yID0gVy5nZXRhcHBsaWNhdGlvbigpLmdldHNjcmlwdChmaWxlbmFtZVsxOi0xXSkKLQkJZWxzZToKLQkJCWVkaXRvciA9IFcuZ2V0YXBwbGljYXRpb24oKS5nZXRzY3JpcHQoZmlsZW5hbWUpCi0JCXJldHVybiBlZGl0b3IKLQkKLQkjIGJ1dHRvbiBjYWxsYmFja3MKLQkKLQlkZWYgZG9fcnVuKHNlbGYpOgotCQlzZWxmLnJ1bm5pbmcoKQotCQlzZWxmLnNldF9jb250aW51ZSgpCi0JCXNlbGYuZXhpdF9tYWlubG9vcCgpCi0JCi0JZGVmIGRvX3N0b3Aoc2VsZik6Ci0JCXNlbGYuc2V0X3N0ZXAoKQotCQotCWRlZiBkb19raWxsKHNlbGYpOgotCQlzZWxmLnNldF9xdWl0KCkKLQkJc2VsZi5leGl0X21haW5sb29wKCkKLQkJc2VsZi5yZXNldHdpZGdldHMoKQotCQotCWRlZiBkb19zdGVwKHNlbGYpOgotCQlzZWxmLnJ1bm5pbmcoKQotCQlzZWxmLnNldF9uZXh0KHNlbGYuY3VyZnJhbWUpCi0JCXNlbGYuZXhpdF9tYWlubG9vcCgpCi0JCi0JZGVmIGRvX3N0ZXBpbihzZWxmKToKLQkJc2VsZi5ydW5uaW5nKCkKLQkJc2VsZi5zZXRfc3RlcCgpCi0JCXNlbGYuZXhpdF9tYWlubG9vcCgpCi0JCi0JZGVmIGRvX3N0ZXBvdXQoc2VsZik6Ci0JCXNlbGYucnVubmluZygpCi0JCXNlbGYuc2V0X3JldHVybihzZWxmLmN1cmZyYW1lKQotCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQotCWRlZiBydW5uaW5nKHNlbGYpOgotCQlXLlNldEN1cnNvcignd2F0Y2gnKQotCQlzZWxmLnJlYXNvbiA9ICdSdW5uaW5nXHhjOScKLQkJc2VsZi5zZXRzdGF0ZSgncnVubmluZycpCi0JCSNzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0KCcnKQotCQkjc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5zdGFja2xpc3Quc3RhY2suc2V0KFtdKQotCQkjc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5sb2NhbHMuYnJvd3Nlci5zZXQoe30pCi0JCSNzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLmdsb2JhbHMuYnJvd3Nlci5zZXQoe30pCi0JCi0JZGVmIGV4aXRfbWFpbmxvb3Aoc2VsZik6Ci0JCXNlbGYudy5wYXJlbnQuZGVidWdnZXJfcXVpdHRpbmcgPSAxCi0JCi0JIwotCQotCWRlZiBzaG93ZnJhbWUoc2VsZiwgc3RhY2tpbmRleCk6Ci0JCShmcmFtZSwgbGluZW5vKSA9IHNlbGYuc3RhY2tbc3RhY2tpbmRleF0KLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJZmlsZW5hbWUgPSBmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKLQkJaWYgZmlsZW5hbWUgPD4gc2VsZi5maWxlOgotCQkJZWRpdG9yID0gc2VsZi5nZXRlZGl0b3IoZmlsZW5hbWUpCi0JCQlpZiBlZGl0b3I6Ci0JCQkJc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldChlZGl0b3IuZ2V0KCksIGZpbGVuYW1lKQotCQkJZWxzZToKLQkJCQl0cnk6Ci0JCQkJCWYgPSBvcGVuKGZpbGVuYW1lLCAnclUnKQotCQkJCQlkYXRhID0gZi5yZWFkKCkKLQkJCQkJZi5jbG9zZSgpCi0JCQkJZXhjZXB0IElPRXJyb3I6Ci0JCQkJCWlmIGZpbGVuYW1lWy0zOl0gPT0gJy5weSc6Ci0JCQkJCQlpbXBvcnQgaW1wCi0JCQkJCQltb2RuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSlbOi0zXQotCQkJCQkJdHJ5OgotCQkJCQkJCWYsIGZpbGVuYW1lLCAoc3VmZiwgbW9kZSwgZHVtbXkpID0gaW1wLmZpbmRfbW9kdWxlKG1vZG5hbWUpCi0JCQkJCQlleGNlcHQgSW1wb3J0RXJyb3I6Ci0JCQkJCQkJc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldCgiY2FuJ3QgZmluZCBmaWxlIikKLQkJCQkJCWVsc2U6Ci0JCQkJCQkJaWYgZjoKLQkJCQkJCQkJZi5jbG9zZSgpCi0JCQkJCQkJaWYgZiBhbmQgc3VmZiA9PSAnLnB5JzoKLQkJCQkJCQkJZiA9IG9wZW4oZmlsZW5hbWUsICdyVScpCi0JCQkJCQkJCWRhdGEgPSBmLnJlYWQoKQotCQkJCQkJCQlmLmNsb3NlKCkKLQkJCQkJCQkJc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldChkYXRhLCBmaWxlbmFtZSkKLQkJCQkJCQllbHNlOgotCQkJCQkJCQlzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0KCJjYW4ndCBmaW5kIGZpbGUiKQotCQkJCQllbHNlOgotCQkJCQkJc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldCgiY2FuJ3QgZmluZCBmaWxlIikKLQkJCQllbHNlOgotCQkJCQlkYXRhID0gZGF0YS5yZXBsYWNlKCdcbicsICdccicpCi0JCQkJCXNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoZGF0YSwgZmlsZW5hbWUpCi0JCQlzZWxmLmZpbGUgPSBmaWxlbmFtZQotCQlzZWxmLncucGFuZXMuYm90dG9tLnNyY3RpdGxlLnNldCgnU291cmNlOiAnICsgZmlsZW5hbWUgKyAoKGxpbmVubyA+IDApIGFuZCAoJyAobGluZSAlZCknICUgbGluZW5vKSBvciAnICcpKQotCQlzZWxmLmdvdG9fbGluZShsaW5lbm8pCi0JCXNlbGYubGluZW5vID0gbGluZW5vCi0JCXNlbGYuc2hvd3ZhcnMoKGZyYW1lLCBsaW5lbm8pKQotCQotCWRlZiBzaG93dmFycyhzZWxmLCAoZnJhbWUsIGxpbmVubykpOgotCQlpZiBmcmFtZS5mX2xvY2FscyBpcyBub3QgZnJhbWUuZl9nbG9iYWxzOgotCQkJbG9jYWxzID0gZnJhbWUuZl9sb2NhbHMKLQkJZWxzZToKLQkJCWxvY2FscyA9IHsnU2FtZSBhcyBHbG9iYWxzJzonJ30KLQkJZmlsdGVyZWRsb2NhbHMgPSB7fQotCQlmb3Iga2V5LCB2YWx1ZSBpbiBsb2NhbHMuaXRlbXMoKToKLQkJCSMgZW1wdHkga2V5IGlzIG1hZ2ljIGZvciBQeXRob24gMS40OyAnLicgaXMgbWFnaWMgZm9yIDEuNS4uLgotCQkJaWYgbm90IGtleSBvciBrZXlbMF0gPD4gJy4nOgotCQkJCWZpbHRlcmVkbG9jYWxzW2tleV0gPSB2YWx1ZQotCQlzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLmxvY2Fscy5icm93c2VyLnNldChmaWx0ZXJlZGxvY2FscykKLQkJc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5nbG9iYWxzLmJyb3dzZXIuc2V0KGZyYW1lLmZfZ2xvYmFscykKLQkKLQlkZWYgc2hvd3N0YWNrKHNlbGYsIHN0YWNraW5kZXgpOgotCQlzdGFjayA9IFtdCi0JCWZvciBmcmFtZSwgbGluZW5vIGluIHNlbGYuc3RhY2tbMTpdOgotCQkJZmlsZW5hbWUgPSBmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKLQkJCXRyeToKLQkJCQlmaWxlbmFtZSA9IF9maWxlbmFtZXNbZmlsZW5hbWVdCi0JCQlleGNlcHQgS2V5RXJyb3I6Ci0JCQkJaWYgZmlsZW5hbWVbOjFdICsgZmlsZW5hbWVbLTE6XSA8PiAnPD4nOgotCQkJCQlmaWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCi0JCQkJX2ZpbGVuYW1lc1tmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWVdID0gZmlsZW5hbWUKLQkJCWZ1bmNuYW1lID0gZnJhbWUuZl9jb2RlLmNvX25hbWUKLQkJCWlmIGZ1bmNuYW1lID09ICc/JzoKLQkJCQlmdW5jbmFtZSA9ICc8dG9wbGV2ZWw+JwotCQkJc3RhY2suYXBwZW5kKGZpbGVuYW1lICsgJzogJyArIGZ1bmNuYW1lKQotCQlpZiBzdGFjayA8PiBzZWxmLmxhc3RzdGFjazoKLQkJCXNlbGYudy5wYW5lcy5icm93c2VycGFuZXMuc3RhY2tsaXN0LnN0YWNrLnNldChzdGFjaykKLQkJCXNlbGYubGFzdHN0YWNrID0gc3RhY2sKLQkJc2VsID0gW3N0YWNraW5kZXggLSAxXQotCQlzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC5zdGFjay5zZXRzZWxlY3Rpb24oc2VsKQotCQlzZWxmLmxhc3RzdGFja3NlbCA9IHNlbAotCQotCWRlZiBnb3RvX2xpbmUoc2VsZiwgbGluZW5vKToKLQkJaWYgbGluZW5vID4gMDoKLQkJCXNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZWxlY3RsaW5lKGxpbmVubyAtIDEpCi0JCWVsc2U6Ci0JCQlzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0c2VsZWN0aW9uKDAsIDApCi0JCi0JIyBiZGIgZW50cnkgcG9pbnRzCi0JCi0jCWRlZiB1c2VyX2NhbGwoc2VsZiwgZnJhbWUsIGFyZ3VtZW50X2xpc3QpOgotIwkJc2VsZi5yZWFzb24gPSAnQ2FsbGluZycKLSMJCXNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIE5vbmUpCi0JCi0JZGVmIHVzZXJfbGluZShzZWxmLCBmcmFtZSk6Ci0JCSMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBzdG9wIG9yIGJyZWFrIGF0IHRoaXMgbGluZQotCQlzZWxmLnJlYXNvbiA9ICdTdG9wcGVkJwotCQlzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lKQotCQotCWRlZiB1c2VyX3JldHVybihzZWxmLCBmcmFtZSwgcmV0dXJuX3ZhbHVlKToKLQkJIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcmV0dXJuIHRyYXAgaXMgc2V0IGhlcmUKLQkJZm5hbWUgPSBmcmFtZS5mX2NvZGUuY29fbmFtZQotCQlpZiBmbmFtZSA8PiAnPyc6Ci0JCQlzZWxmLnJlYXNvbiA9ICdSZXR1cm5pbmcgZnJvbSAlcygpJyAlIGZyYW1lLmZfY29kZS5jb19uYW1lCi0JCQlmcmFtZS5mX2xvY2Fsc1snX19yZXR1cm5fXyddID0gcmV0dXJuX3ZhbHVlCi0JCWVsaWYgZnJhbWUuZl9iYWNrIGlzIHNlbGYuYm90ZnJhbWU6Ci0JCQlzZWxmLnJlYXNvbiA9ICdEb25lJwotCQllbHNlOgotCQkJc2VsZi5yZWFzb24gPSAnUmV0dXJuaW5nJwotCQlzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lLCAxKQotCQotCWRlZiB1c2VyX2V4Y2VwdGlvbihzZWxmLCBmcmFtZSwgKGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190cmFjZWJhY2spKToKLQkJIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHN0b3Agb3IgYnJlYWsgYXQgdGhpcyBsaW5lCi0JCXNlbGYucmVhc29uID0gc2VsZi5mb3JtYXRleGNlcHRpb24oZXhjX3R5cGUsIGV4Y192YWx1ZSkKLQkJc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgZXhjX3RyYWNlYmFjaykKLQkKLQlkZWYgZm9ybWF0ZXhjZXB0aW9uKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUpOgotCQlpZiBleGNfdHlwZSA9PSBTeW50YXhFcnJvcjoKLQkJCXRyeToKLQkJCQl2YWx1ZSwgKGZpbGVuYW1lLCBsaW5lbm8sIGNoYXJubywgbGluZSkgPSBleGNfdmFsdWUKLQkJCWV4Y2VwdDoKLQkJCQlwYXNzCi0JCQllbHNlOgotCQkJCXJldHVybiBzdHIoZXhjX3R5cGUpICsgJzogJyArIHN0cih2YWx1ZSkKLQkJaWYgdHlwZShleGNfdHlwZSkgPT0gdHlwZXMuQ2xhc3NUeXBlOgotCQkJbmljZSA9IGV4Y190eXBlLl9fbmFtZV9fCi0JCWVsc2U6Ci0JCQluaWNlID0gc3RyKGV4Y190eXBlKQotCQl2YWx1ZSA9IHN0cihleGNfdmFsdWUpCi0JCWlmIGV4Y192YWx1ZSBhbmQgdmFsdWU6Ci0JCQluaWNlID0gbmljZSArICI6ICIgKyB2YWx1ZQotCQlyZXR1cm4gbmljZQotCQotCWRlZiBmb3JnZXQoc2VsZik6Ci0JCXNlbGYuc3RhY2sgPSBbXQotCQlzZWxmLmN1cmluZGV4ID0gMAotCQlzZWxmLmN1cmZyYW1lID0gTm9uZQotCQotCWRlZiBzZXR1cChzZWxmLCBmLCB0LCBpc3JldHVybmluZyA9IDApOgotCQlzZWxmLmZvcmdldCgpCi0JCXNlbGYuc3RhY2ssIHNlbGYuY3VyaW5kZXggPSBzZWxmLmdldF9zdGFjayhmLCB0KQotCQlzZWxmLmN1cmZyYW1lID0gc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4IC0gaXNyZXR1cm5pbmddWzBdCi0JCi0JZGVmIGludGVyYWN0aW9uKHNlbGYsIGZyYW1lLCB0cmFjZWJhY2ssIGlzcmV0dXJuaW5nID0gMCk6Ci0JCXNhdmVwb3J0ID0gUWQuR2V0UG9ydCgpCi0JCXNlbGYudy5zZWxlY3QoKQotCQl0cnk6Ci0JCQlzZWxmLnNldHVwKGZyYW1lLCB0cmFjZWJhY2ssIGlzcmV0dXJuaW5nKQotCQkJc2VsZi5zZXRzdGF0ZSgnc3RvcHBlZCcpCi0JCQlzdGFja2luZGV4ID0gc2VsZi5jdXJpbmRleAotCQkJaWYgaXNyZXR1cm5pbmc6Ci0JCQkJaWYgZnJhbWUuZl9iYWNrIGlzIG5vdCBzZWxmLmJvdGZyYW1lOgotCQkJCQlzdGFja2luZGV4ID0gc3RhY2tpbmRleCAtIDEKLQkJCXNlbGYuc2hvd3N0YWNrKHN0YWNraW5kZXgpCi0JCQlzZWxmLnNob3dmcmFtZShzdGFja2luZGV4KQotCQkJc2VsZi53LnBhcmVudC5kZWJ1Z2dlcl9tYWlubG9vcCgpCi0JCQlzZWxmLmZvcmdldCgpCi0JCWZpbmFsbHk6Ci0JCQlRZC5TZXRQb3J0KHNhdmVwb3J0KQotCQotCSMgYmRiIGN1c3RvbWl6YXRpb24KLQkKLQlkZWYgdHJhY2VfZGlzcGF0Y2goc2VsZiwgZnJhbWUsIGV2ZW50LCBhcmcsIFRpY2tDb3VudCA9IEV2dC5UaWNrQ291bnQpOgotCQlpZiBUaWNrQ291bnQoKSAtIHNlbGYudHJhY2luZ21vbml0b3J0aW1lID4gMTU6Ci0JCQlzZWxmLnRyYWNpbmdtb25pdG9ydGltZSA9IFRpY2tDb3VudCgpCi0JCQlzZWxmLncucGFuZXMuYm90dG9tLnRyYWNpbmdtb25pdG9yLnRvZ2dsZSgpCi0JCXRyeToKLQkJCXRyeToKLQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgwKQotCQkJCWlmIHNlbGYucXVpdHRpbmc6Ci0JCQkJCSMgcmV0dXJuaW5nIE5vbmUgaXMgbm90IGVub3VnaCwgYSBmb3JtZXIgQmRiUXVpdCBleGNlcHRpb24KLQkJCQkJIyBtaWdodCBoYXZlIGJlZW4gZWF0ZW4gYnkgdGhlIHByaW50IHN0YXRlbWVudAotCQkJCQlyYWlzZSBiZGIuQmRiUXVpdAotCQkJCWlmIGV2ZW50ID09ICdsaW5lJzoKLQkJCQkJcmV0dXJuIHNlbGYuZGlzcGF0Y2hfbGluZShmcmFtZSkKLQkJCQlpZiBldmVudCA9PSAnY2FsbCc6Ci0JCQkJCXJldHVybiBzZWxmLmRpc3BhdGNoX2NhbGwoZnJhbWUsIGFyZykKLQkJCQlpZiBldmVudCA9PSAncmV0dXJuJzoKLQkJCQkJcmV0dXJuIHNlbGYuZGlzcGF0Y2hfcmV0dXJuKGZyYW1lLCBhcmcpCi0JCQkJaWYgZXZlbnQgPT0gJ2V4Y2VwdGlvbic6Ci0JCQkJCXJldHVybiBzZWxmLmRpc3BhdGNoX2V4Y2VwdGlvbihmcmFtZSwgYXJnKQotCQkJCXByaW50ICdiZGIuQmRiLmRpc3BhdGNoOiB1bmtub3duIGRlYnVnZ2luZyBldmVudDonLCByZXByKGV2ZW50KQotCQkJCXJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCi0JCQlmaW5hbGx5OgotCQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQkJTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQotCQlleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0JCQlzZWxmLnNldF9zdGVwKCkKLQkJCXJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCi0JCWV4Y2VwdCBiZGIuQmRiUXVpdDoKLQkJCWlmIHNlbGYuY29udGludWV3aXRob3V0ZGVidWdnZXI6Ci0JCQkJc2VsZi5jbGVhcl90cmFjZWZ1bmNzKCkKLQkJCQlyZXR1cm4KLQkJCWVsc2U6Ci0JCQkJcmFpc2UgYmRiLkJkYlF1aXQKLQkJZXhjZXB0OgotCQkJcHJpbnQgJ1hYWCBFeGNlcHRpb24gZHVyaW5nIGRlYnVnZ2VyIGludGVyYWN0aW9uLicsIFwKLQkJCQkJc2VsZi5mb3JtYXRleGNlcHRpb24oc3lzLmV4Y190eXBlLCBzeXMuZXhjX3ZhbHVlKQotCQkJaW1wb3J0IHRyYWNlYmFjawotCQkJdHJhY2ViYWNrLnByaW50X2V4YygpCi0JCQlyZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAotCQotCWRlZiBkaXNwYXRjaF9jYWxsKHNlbGYsIGZyYW1lLCBhcmcpOgotCQlpZiBub3Qgc2VsZi50cmFjZW1hZ2ljIGFuZCBcCi0JCQkJZnJhbWUuZl9jb2RlLmNvX25hbWVbOjJdID09ICdfXycgPT0gZnJhbWUuZl9jb2RlLmNvX25hbWVbLTI6XSBhbmQgXAotCQkJCWZyYW1lLmZfY29kZS5jb19uYW1lIDw+ICdfX2luaXRfXyc6Ci0JCQlyZXR1cm4KLQkJaWYgc2VsZi5ib3RmcmFtZSBpcyBOb25lOgotCQkJIyBGaXJzdCBjYWxsIG9mIGRpc3BhdGNoIHNpbmNlIHJlc2V0KCkKLQkJCXNlbGYuYm90ZnJhbWUgPSBmcmFtZS5mX2JhY2sJIyB4eHggISEhIGFkZGVkIGZfYmFjawotCQkJcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKLQkJaWYgbm90IChzZWxmLnN0b3BfaGVyZShmcmFtZSkgb3Igc2VsZi5icmVha19hbnl3aGVyZShmcmFtZSkpOgotCQkJIyBObyBuZWVkIHRvIHRyYWNlIHRoaXMgZnVuY3Rpb24KLQkJCXJldHVybiAjIE5vbmUKLQkJc2VsZi51c2VyX2NhbGwoZnJhbWUsIGFyZykKLQkJaWYgc2VsZi5xdWl0dGluZzoKLQkJCXJhaXNlIGJkYi5CZGJRdWl0Ci0JCXJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCi0JCi0JZGVmIHNldF9jb250aW51ZShzZWxmKToKLQkJIyBEb24ndCBzdG9wIGV4Y2VwdCBhdCBicmVha3BvaW50cyBvciB3aGVuIGZpbmlzaGVkCi0JCXNlbGYuc3RvcGZyYW1lID0gc2VsZi5ib3RmcmFtZQotCQlzZWxmLnJldHVybmZyYW1lID0gTm9uZQotCQlzZWxmLnF1aXR0aW5nID0gMAotCQkjIHVubGlrZSBpbiBiZGIvcGRiLCB0aGVyZSdzIGEgY2hhbmNlIHRoYXQgYnJlYWtwb2ludHMgY2hhbmdlIAotCQkjICp3aGlsZSogYSBwcm9ncmFtICh0aGlzIHByb2dyYW0gOy0pIGlzIHJ1bm5pbmcuIEl0J3MgYWN0dWFsbHkgcXVpdGUgbGlrZWx5LgotCQkjIFNvIHdlIGRvbid0IGRlbGV0ZSBmcmFtZS5mX3RyYWNlIHVudGlsIHRoZSBib3R0b20gZnJhbWUgaWYgdGhlcmUgYXJlIG5vIGJyZWFrcG9pbnRzLgotCQotCWRlZiBzZXRfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6Ci0JCWlmIG5vdCBzZWxmLmJyZWFrcy5oYXNfa2V5KGZpbGVuYW1lKToKLQkJCXNlbGYuYnJlYWtzW2ZpbGVuYW1lXSA9IFtdCi0JCWxpc3QgPSBzZWxmLmJyZWFrc1tmaWxlbmFtZV0KLQkJaWYgbGluZW5vIGluIGxpc3Q6Ci0JCQlyZXR1cm4gJ1RoZXJlIGlzIGFscmVhZHkgYSBicmVha3BvaW50IHRoZXJlIScKLQkJbGlzdC5hcHBlbmQobGluZW5vKQotCQlsaXN0LnNvcnQoKQkjIEkgd2FudCB0byBrZWVwIHRoZW0gbmVhdGx5IHNvcnRlZDsgZWFzaWVyIGZvciBkcmF3aW5nCi0JCWlmIGhhc2F0dHIoYmRiLCAiQnJlYWtwb2ludCIpOgotCQkJIyAxLjUuMmIxIHNwZWNpZmljCi0JCQlicCA9IGJkYi5CcmVha3BvaW50KGZpbGVuYW1lLCBsaW5lbm8sIDAsIE5vbmUpCi0JCXNlbGYudXBkYXRlX2JyZWFrcyhmaWxlbmFtZSkKLQkKLQlkZWYgY2xlYXJfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6Ci0JCWJkYi5CZGIuY2xlYXJfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubykKLQkJc2VsZi51cGRhdGVfYnJlYWtzKGZpbGVuYW1lKQotCQotCWRlZiBjbGVhcl9hbGxfZmlsZV9icmVha3Moc2VsZiwgZmlsZW5hbWUpOgotCQliZGIuQmRiLmNsZWFyX2FsbF9maWxlX2JyZWFrcyhzZWxmLCBmaWxlbmFtZSkKLQkJc2VsZi51cGRhdGVfYnJlYWtzKGZpbGVuYW1lKQotCQotCWRlZiBjbGVhcl9hbGxfYnJlYWtzKHNlbGYpOgotCQliZGIuQmRiLmNsZWFyX2FsbF9icmVha3Moc2VsZikKLQkJZm9yIGVkaXRvcnMgaW4gc2VsZi5lZGl0b3JzLnZhbHVlcygpOgotCQkJZm9yIGVkaXRvciBpbiBlZGl0b3JzOgotCQkJCWVkaXRvci5kcmF3YnJlYWtwb2ludHMoKQotCQotCSMgc3BlY2lhbAotCQotCWRlZiB0b2dnbGVfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6Ci0JCWlmIHNlbGYuZ2V0X2JyZWFrKGZpbGVuYW1lLCBsaW5lbm8pOgotCQkJc2VsZi5jbGVhcl9icmVhayhmaWxlbmFtZSwgbGluZW5vKQotCQllbHNlOgotCQkJc2VsZi5zZXRfYnJlYWsoZmlsZW5hbWUsIGxpbmVubykKLQkKLQlkZWYgY2xlYXJfYnJlYWtzX2Fib3ZlKHNlbGYsIGZpbGVuYW1lLCBhYm92ZSk6Ci0JCWlmIG5vdCBzZWxmLmJyZWFrcy5oYXNfa2V5KGZpbGVuYW1lKToKLQkJCXJldHVybiAnVGhlcmUgYXJlIG5vIGJyZWFrcG9pbnRzIGluIHRoYXQgZmlsZSEnCi0JCWZvciBsaW5lbm8gaW4gc2VsZi5icmVha3NbZmlsZW5hbWVdWzpdOgotCQkJaWYgbGluZW5vID4gYWJvdmU6Ci0JCQkJc2VsZi5icmVha3NbZmlsZW5hbWVdLnJlbW92ZShsaW5lbm8pCi0JCWlmIG5vdCBzZWxmLmJyZWFrc1tmaWxlbmFtZV06Ci0JCQlkZWwgc2VsZi5icmVha3NbZmlsZW5hbWVdCi0JCi0JIyBlZGl0b3Igc3R1ZmYKLQkKLQlkZWYgdXBkYXRlX2JyZWFrcyhzZWxmLCBmaWxlbmFtZSk6Ci0JCWlmIHNlbGYuYnJlYWtzdmlld2VyOgotCQkJc2VsZi5icmVha3N2aWV3ZXIudXBkYXRlKCkKLQkJaWYgc2VsZi5lZGl0b3JzLmhhc19rZXkoZmlsZW5hbWUpOgotCQkJZm9yIGVkaXRvciBpbiBzZWxmLmVkaXRvcnNbZmlsZW5hbWVdOgotCQkJCWlmIGVkaXRvci5fZGVidWdnZXI6CSMgWFhYCi0JCQkJCWVkaXRvci5kcmF3YnJlYWtwb2ludHMoKQotCQkJCWVsc2U6Ci0JCQkJCXByaW50ICd4eHggZGVhZCBlZGl0b3IhJwotCQotCWRlZiB1cGRhdGVfYWxsYnJlYWtzKHNlbGYpOgotCQlpZiBzZWxmLmJyZWFrc3ZpZXdlcjoKLQkJCXNlbGYuYnJlYWtzdmlld2VyLnVwZGF0ZSgpCi0JCWZvciBmaWxlbmFtZSBpbiBzZWxmLmJyZWFrcy5rZXlzKCk6Ci0JCQlpZiBzZWxmLmVkaXRvcnMuaGFzX2tleShmaWxlbmFtZSk6Ci0JCQkJZm9yIGVkaXRvciBpbiBzZWxmLmVkaXRvcnNbZmlsZW5hbWVdOgotCQkJCQlpZiBlZGl0b3IuX2RlYnVnZ2VyOgkjIFhYWAotCQkJCQkJZWRpdG9yLmRyYXdicmVha3BvaW50cygpCi0JCQkJCWVsc2U6Ci0JCQkJCQlwcmludCAneHh4IGRlYWQgZWRpdG9yIScKLQkKLQlkZWYgcmVnaXN0ZXJfZWRpdG9yKHNlbGYsIGVkaXRvciwgZmlsZW5hbWUpOgotCQlpZiBub3QgZmlsZW5hbWU6Ci0JCQlyZXR1cm4KLQkJaWYgbm90IHNlbGYuZWRpdG9ycy5oYXNfa2V5KGZpbGVuYW1lKToKLQkJCXNlbGYuZWRpdG9yc1tmaWxlbmFtZV0gPSBbZWRpdG9yXQotCQllbGlmIGVkaXRvciBub3QgaW4gc2VsZi5lZGl0b3JzW2ZpbGVuYW1lXToKLQkJCXNlbGYuZWRpdG9yc1tmaWxlbmFtZV0uYXBwZW5kKGVkaXRvcikKLQkKLQlkZWYgdW5yZWdpc3Rlcl9lZGl0b3Ioc2VsZiwgZWRpdG9yLCBmaWxlbmFtZSk6Ci0JCWlmIG5vdCBmaWxlbmFtZToKLQkJCXJldHVybgotCQl0cnk6Ci0JCQlzZWxmLmVkaXRvcnNbZmlsZW5hbWVdLnJlbW92ZShlZGl0b3IpCi0JCQlpZiBub3Qgc2VsZi5lZGl0b3JzW2ZpbGVuYW1lXToKLQkJCQlkZWwgc2VsZi5lZGl0b3JzW2ZpbGVuYW1lXQotCQkJCSMgaWYgdGhpcyB3YXMgYW4gdW50aXRsZWQgd2luZG93LCBjbGVhciB0aGUgYnJlYWtzLgotCQkJCWlmIGZpbGVuYW1lWzoxXSA9PSAnPCcgYW5kIGZpbGVuYW1lWy0xOl0gPT0gJz4nIGFuZCBcCi0JCQkJCQlzZWxmLmJyZWFrcy5oYXNfa2V5KGZpbGVuYW1lKToKLQkJCQkJc2VsZi5jbGVhcl9hbGxfZmlsZV9icmVha3MoZmlsZW5hbWUpCi0JCWV4Y2VwdCAoS2V5RXJyb3IsIFZhbHVlRXJyb3IpOgotCQkJcGFzcwotCQkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSA9ICdEZWJ1Z2dlcicpOgorICAgICAgICBiZGIuQmRiLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY2xvc2VkID0gMQorICAgICAgICBzZWxmLnRpdGxlID0gdGl0bGUKKyAgICAgICAgc2VsZi5icmVha3N2aWV3ZXIgPSBOb25lCisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzZWxmLnRyYWNpbmcgPSAwCisgICAgICAgIHNlbGYudHJhY2luZ21vbml0b3J0aW1lID0gRXZ0LlRpY2tDb3VudCgpCisgICAgICAgIHNlbGYuZWRpdG9ycyA9IHt9CisKKyAgICAgICAgcHJlZnMgPSBXLmdldGFwcGxpY2F0aW9uKCkuZ2V0cHJlZnMoKQorICAgICAgICBpZiBwcmVmcy5kZWJ1Z2dlcjoKKyAgICAgICAgICAgIGZvciBmaWxlLCBicmVha3MgaW4gcHJlZnMuZGVidWdnZXIuYnJlYWtzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgZm9yIGIgaW4gYnJlYWtzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNldF9icmVhayhmaWxlLCBiKQorICAgICAgICAgICAgc2VsZi5ib3VuZHMsIHNlbGYuaG9ycGFuZXMsIHNlbGYudmVycGFuZXMgPSBwcmVmcy5kZWJ1Z2dlci53aW5kb3dzZXR0aW5ncworICAgICAgICAgICAgc2VsZi50cmFjZW1hZ2ljID0gcHJlZnMuZGVidWdnZXIudHJhY2VtYWdpYworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5icmVha3MgPSB7fQorICAgICAgICAgICAgc2VsZi5ob3JwYW5lcyA9ICgwLjQsIDAuNikKKyAgICAgICAgICAgIHNlbGYudmVycGFuZXMgPSAoMC4zLCAwLjM1LCAwLjM1KQorICAgICAgICAgICAgc2VsZi5ib3VuZHMgPSAoNjAwLCA0MDApCisgICAgICAgICAgICBzZWxmLnRyYWNlbWFnaWMgPSAwCisgICAgICAgIHNlbGYubGFzdHN0YWNrc2VsID0gTm9uZQorCisgICAgZGVmIGNhbm9uaWMoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAjIG92ZXJyaWRlOiB0aGUgcHJvdmlkZWQgY2Fub25pYygpIG1ldGhvZCBicmVha3Mgb3VyCisgICAgICAgICMgZmlsZS1sZXNzIFVudGl0bGVkIHdpbmRvd3MKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuY3VycmVudGZyYW1lID0gTm9uZQorICAgICAgICBzZWxmLmZpbGUgPSBOb25lCisgICAgICAgIHNlbGYubGFzdHN0YWNrID0gTm9uZQorICAgICAgICBzZWxmLnJlYXNvbiA9ICdOb3QgcnVubmluZycKKyAgICAgICAgc2VsZi5jb250aW51ZXdpdGhvdXRkZWJ1Z2dlciA9IDAKKyAgICAgICAgYmRiLkJkYi5yZXNldChzZWxmKQorICAgICAgICBzZWxmLmZvcmdldCgpCisKKyAgICBkZWYgc3RhcnQoc2VsZiwgYm90dG9tZnJhbWUgPSBOb25lLCBydW5uaW5nID0gMCk6CisgICAgICAgIFcuZ2V0YXBwbGljYXRpb24oKS5EZWJ1Z2dlclF1aXQgPSBiZGIuQmRiUXVpdAorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgTWVudQorICAgICAgICBNZW51LkhpbGl0ZU1lbnUoMCkKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICBzZWxmLnNldHVwd2lkZ2V0cyhzZWxmLnRpdGxlKQorICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSAwCisgICAgICAgIGlmIG5vdCBzZWxmLncucGFyZW50LmRlYnVnZ2VyX3F1aXR0aW5nOgorICAgICAgICAgICAgc2VsZi53LnNlbGVjdCgpCisgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICdUaGVyZSBpcyBhbm90aGVyIGRlYnVnZ2VyIHNlc3Npb24gYnVzeS4nCisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzZWxmLmJvdGZyYW1lID0gYm90dG9tZnJhbWUKKyAgICAgICAgaWYgcnVubmluZzoKKyAgICAgICAgICAgIHNlbGYuc2V0X2NvbnRpbnVlKCkKKyAgICAgICAgICAgIHNlbGYucmVhc29uID0gJ1J1bm5pbmdceGM5JworICAgICAgICAgICAgc2VsZi5zZXRzdGF0ZSgncnVubmluZycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNldF9zdGVwKCkKKyAgICAgICAgICAgIHNlbGYucmVhc29uID0gJ3N0b3BwZWQnCisgICAgICAgICAgICBzZWxmLnNldHN0YXRlKCdzdG9wcGVkJykKKyAgICAgICAgc3lzLnNldHRyYWNlKHNlbGYudHJhY2VfZGlzcGF0Y2gpCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfcXVpdCgpCisgICAgICAgIGlmIHNlbGYudy5wYXJlbnQ6CisgICAgICAgICAgICBzZWxmLmV4aXRfbWFpbmxvb3AoKQorICAgICAgICAgICAgc2VsZi5yZXNldHdpZGdldHMoKQorCisgICAgZGVmIHNldF9jb250aW51ZV93aXRob3V0X2RlYnVnZ2VyKHNlbGYpOgorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgc2VsZi5zZXRfcXVpdCgpCisgICAgICAgIHNlbGYuY2xlYXJfdHJhY2VmdW5jcygpCisgICAgICAgIHNlbGYuY29udGludWV3aXRob3V0ZGVidWdnZXIgPSAxCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgInciKSBhbmQgc2VsZi53LnBhcmVudDoKKyAgICAgICAgICAgIHNlbGYuZXhpdF9tYWlubG9vcCgpCisgICAgICAgICAgICBzZWxmLnJlc2V0d2lkZ2V0cygpCisKKyAgICBkZWYgY2xlYXJfdHJhY2VmdW5jcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgJ3NwYW0nCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZnJhbWUgPSBzeXMuZXhjX3RyYWNlYmFjay50Yl9mcmFtZQorICAgICAgICB3aGlsZSBmcmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRlbCBmcmFtZS5mX3RyYWNlCisgICAgICAgICAgICBmcmFtZSA9IGZyYW1lLmZfYmFjaworCisgICAgZGVmIHBvc3Rtb3J0ZW0oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICBzZWxmLnNldHVwd2lkZ2V0cyhzZWxmLnRpdGxlKQorICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSAwCisgICAgICAgIGlmIG5vdCBzZWxmLncucGFyZW50LmRlYnVnZ2VyX3F1aXR0aW5nOgorICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAnVGhlcmUgaXMgYW5vdGhlciBkZWJ1Z2dlciBzZXNzaW9uIGJ1c3kuJworICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgaWYgdHJhY2ViYWNrOgorICAgICAgICAgICAgc2VsZi5ib3RmcmFtZSA9IHRyYWNlYmFjay50Yl9mcmFtZQorICAgICAgICAgICAgd2hpbGUgdHJhY2ViYWNrLnRiX25leHQgPD4gTm9uZToKKyAgICAgICAgICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2sudGJfbmV4dAorICAgICAgICAgICAgZnJhbWUgPSB0cmFjZWJhY2sudGJfZnJhbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYm90ZnJhbWUgPSBOb25lCisgICAgICAgICAgICBmcmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS5idXR0b25zLmtpbGxidXR0b24uZW5hYmxlKDEpCisgICAgICAgIHNlbGYucmVhc29uID0gJyhkZWFkKSAnICsgc2VsZi5mb3JtYXRleGNlcHRpb24oZXhjX3R5cGUsIGV4Y192YWx1ZSkKKyAgICAgICAgc2VsZi53LnNlbGVjdCgpCisgICAgICAgIHNlbGYuc2V0dXAoZnJhbWUsIHRyYWNlYmFjaykKKyAgICAgICAgc2VsZi5zZXRzdGF0ZSgnZGVhZCcpCisgICAgICAgIHNlbGYuc2hvd3N0YWNrKHNlbGYuY3VyaW5kZXgpCisgICAgICAgIHNlbGYuc2hvd2ZyYW1lKHNlbGYuY3VyaW5kZXgpCisKKyAgICBkZWYgc2V0dXB3aWRnZXRzKHNlbGYsIHRpdGxlKToKKyAgICAgICAgc2VsZi53ID0gdyA9IFcuV2luZG93KHNlbGYuYm91bmRzLCB0aXRsZSwgbWluc2l6ZSA9ICg1MDAsIDMwMCkpCisKKyAgICAgICAgdy5wYW5lcyA9IFcuSG9yaXpvbnRhbFBhbmVzKCg4LCA0LCAtOCwgLTgpLCBzZWxmLmhvcnBhbmVzKQorCisgICAgICAgIHcucGFuZXMuYnJvd3NlcnBhbmVzID0gYnJvd3NlcnBhbmVzID0gVy5WZXJ0aWNhbFBhbmVzKE5vbmUsIHNlbGYudmVycGFuZXMpCisKKyAgICAgICAgYnJvd3NlcnBhbmVzLnN0YWNrbGlzdCA9IFcuR3JvdXAoTm9uZSkKKyAgICAgICAgYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC50aXRsZSA9IFcuVGV4dEJveCgoNCwgMCwgMCwgMTIpLCAnU3RhY2snKQorICAgICAgICBicm93c2VycGFuZXMuc3RhY2tsaXN0LnN0YWNrID0gVy5MaXN0KCgwLCAxNiwgMCwgMCksIGNhbGxiYWNrID0gc2VsZi5kb19zdGFjaywgZmxhZ3MgPSBMaXN0cy5sT25seU9uZSkKKworICAgICAgICBicm93c2VycGFuZXMubG9jYWxzID0gVy5Hcm91cChOb25lKQorICAgICAgICBicm93c2VycGFuZXMubG9jYWxzLnRpdGxlID0gVy5UZXh0Qm94KCg0LCAwLCAwLCAxMiksICdMb2NhbCB2YXJpYWJsZXMnKQorICAgICAgICBicm93c2VycGFuZXMubG9jYWxzLmJyb3dzZXIgPSBQeUJyb3dzZXIuQnJvd3NlcldpZGdldCgoMCwgMTYsIDAsIDApKQorCisgICAgICAgIGJyb3dzZXJwYW5lcy5nbG9iYWxzID0gVy5Hcm91cChOb25lKQorICAgICAgICBicm93c2VycGFuZXMuZ2xvYmFscy50aXRsZSA9IFcuVGV4dEJveCgoNCwgMCwgMCwgMTIpLCAnR2xvYmFsIHZhcmlhYmxlcycpCisgICAgICAgIGJyb3dzZXJwYW5lcy5nbG9iYWxzLmJyb3dzZXIgPSBQeUJyb3dzZXIuQnJvd3NlcldpZGdldCgoMCwgMTYsIDAsIDApKQorCisgICAgICAgIHcucGFuZXMuYm90dG9tID0gYm90dG9tID0gVy5Hcm91cChOb25lKQorICAgICAgICBib3R0b20uc3JjID0gc3JjID0gVy5Hcm91cCgoMCwgNjQsIDAsIDApKQorICAgICAgICBzb3VyY2UgPSBTb3VyY2VWaWV3ZXIoKDEsIDEsIC0xNSwgLTE1KSwgcmVhZG9ubHkgPSAxLCBkZWJ1Z2dlciA9IHNlbGYpCisgICAgICAgIHNyYy5vcHRpb25zbWVudSA9IFcuUG9wdXBNZW51KCgtMTYsIDAsIDE2LCAxNiksIFtdKQorICAgICAgICBzcmMub3B0aW9uc21lbnUuYmluZCgnPGNsaWNrPicsIHNlbGYubWFrZW9wdGlvbnNtZW51KQorCisgICAgICAgIHNyYy5fYmFyeCA9IFcuU2Nyb2xsYmFyKCgwLCAtMTYsIC0xNSwgMTYpLCBzb3VyY2UuaHNjcm9sbCwgbWF4ID0gMzI3NjcpCisgICAgICAgIHNyYy5fYmFyeSA9IFcuU2Nyb2xsYmFyKCgtMTYsIDE1LCAxNiwgLTE1KSwgc291cmNlLnZzY3JvbGwsIG1heCA9IDMyNzY3KQorICAgICAgICBzcmMuc291cmNlID0gc291cmNlCisgICAgICAgIHNyYy5mcmFtZSA9IFcuRnJhbWUoKDAsIDAsIC0xNSwgLTE1KSkKKworICAgICAgICBib3R0b20udHJhY2luZ21vbml0b3IgPSBUcmFjaW5nTW9uaXRvcigoMCwgMjMsIDYsIDYpKQorICAgICAgICBib3R0b20uc3RhdGUgPSBXLlRleHRCb3goKDEyLCAyNCwgMCwgMTYpLCBzZWxmLnJlYXNvbikKKworICAgICAgICBib3R0b20uc3JjdGl0bGUgPSBXLlRleHRCb3goKDEyLCA0NCwgMCwgMTYpKQorICAgICAgICBib3R0b20uYnV0dG9ucyA9IGJ1dHRvbnMgPSBXLkdyb3VwKCgxMiwgMCwgMCwgMjApKQorCisgICAgICAgIGJ1dHRvbnMucnVuYnV0dG9uID0gVy5CdXR0b24oKDAsIDAsIDUwLCAxNiksICJSdW4iLCBzZWxmLmRvX3J1bikKKyAgICAgICAgYnV0dG9ucy5zdG9wYnV0dG9uID0gVy5CdXR0b24oKDU4LCAwLCA1MCwgMTYpLCAiU3RvcCIsIHNlbGYuZG9fc3RvcCkKKyAgICAgICAgYnV0dG9ucy5raWxsYnV0dG9uID0gVy5CdXR0b24oKDExNiwgMCwgNTAsIDE2KSwgIktpbGwiLCBzZWxmLmRvX2tpbGwpCisgICAgICAgIGJ1dHRvbnMubGluZSA9IFcuVmVydGljYWxMaW5lKCgxNzMsIDAsIDAsIDApKQorICAgICAgICBidXR0b25zLnN0ZXBidXR0b24gPSBXLkJ1dHRvbigoMTgxLCAwLCA2MCwgMTYpLCAiU3RlcCIsIHNlbGYuZG9fc3RlcCkKKyAgICAgICAgYnV0dG9ucy5zdGVwaW5idXR0b24gPSBXLkJ1dHRvbigoMjQ5LCAwLCA2MCwgMTYpLCAiU3RlcCBpbiIsIHNlbGYuZG9fc3RlcGluKQorICAgICAgICBidXR0b25zLnN0ZXBvdXRidXR0b24gPSBXLkJ1dHRvbigoMzE3LCAwLCA2MCwgMTYpLCAiU3RlcCBvdXQiLCBzZWxmLmRvX3N0ZXBvdXQpCisKKyAgICAgICAgdy5iaW5kKCdjbWRyJywgYnV0dG9ucy5ydW5idXR0b24ucHVzaCkKKyAgICAgICAgdy5iaW5kKCdjbWQuJywgYnV0dG9ucy5zdG9wYnV0dG9uLnB1c2gpCisgICAgICAgIHcuYmluZCgnY21kaycsIGJ1dHRvbnMua2lsbGJ1dHRvbi5wdXNoKQorICAgICAgICB3LmJpbmQoJ2NtZHMnLCBidXR0b25zLnN0ZXBidXR0b24ucHVzaCkKKyAgICAgICAgdy5iaW5kKCdjbWR0JywgYnV0dG9ucy5zdGVwaW5idXR0b24ucHVzaCkKKyAgICAgICAgdy5iaW5kKCdjbWR1JywgYnV0dG9ucy5zdGVwb3V0YnV0dG9uLnB1c2gpCisKKyAgICAgICAgdy5iaW5kKCc8Y2xvc2U+Jywgc2VsZi5jbG9zZSkKKworICAgICAgICB3Lm9wZW4oKQorICAgICAgICB3Lnh4eF9fX3NlbGVjdCh3LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlKQorCisgICAgZGVmIG1ha2VvcHRpb25zbWVudShzZWxmKToKKyAgICAgICAgb3B0aW9ucyA9IFsoJ0NsZWFyIGJyZWFrcG9pbnRzJywgc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLmNsZWFyYnJlYWtwb2ludHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCdDbGVhciBhbGwgYnJlYWtwb2ludHMnLCBzZWxmLmNsZWFyX2FsbF9icmVha3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCdFZGl0IGJyZWFrcG9pbnRzXHhjOScsIHNlbGYuZWRpdF9icmVha3MpLCAnLScsCisgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi50cmFjZW1hZ2ljIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGlzYWJsZSBfX21hZ2ljX18gdHJhY2luZycgb3IgJ0VuYWJsZSBfX21hZ2ljX18gdHJhY2luZycsIHNlbGYudG9nZ2xlbWFnaWMpXQorICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnNyYy5vcHRpb25zbWVudS5zZXQob3B0aW9ucykKKworICAgIGRlZiBlZGl0X2JyZWFrcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5icmVha3N2aWV3ZXI6CisgICAgICAgICAgICBzZWxmLmJyZWFrc3ZpZXdlci5zZWxlY3QoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5icmVha3N2aWV3ZXIgPSBCcmVha3BvaW50c1ZpZXdlcihzZWxmKQorCisgICAgZGVmIHRvZ2dsZW1hZ2ljKHNlbGYpOgorICAgICAgICBzZWxmLnRyYWNlbWFnaWMgPSBub3Qgc2VsZi50cmFjZW1hZ2ljCisKKyAgICBkZWYgc2V0c3RhdGUoc2VsZiwgc3RhdGUpOgorICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnRyYWNpbmdtb25pdG9yLnJlc2V0KCkKKyAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS5zdGF0ZS5zZXQoc2VsZi5yZWFzb24pCisgICAgICAgIGJ1dHRvbnMgPSBzZWxmLncucGFuZXMuYm90dG9tLmJ1dHRvbnMKKyAgICAgICAgaWYgc3RhdGUgPT0gJ3N0b3BwZWQnOgorICAgICAgICAgICAgYnV0dG9ucy5ydW5idXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBidXR0b25zLnN0b3BidXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBidXR0b25zLmtpbGxidXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBidXR0b25zLnN0ZXBidXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBidXR0b25zLnN0ZXBpbmJ1dHRvbi5lbmFibGUoMSkKKyAgICAgICAgICAgIGJ1dHRvbnMuc3RlcG91dGJ1dHRvbi5lbmFibGUoMSkKKyAgICAgICAgZWxpZiBzdGF0ZSA9PSAncnVubmluZyc6CisgICAgICAgICAgICBidXR0b25zLnJ1bmJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIGJ1dHRvbnMuc3RvcGJ1dHRvbi5lbmFibGUoMSkKKyAgICAgICAgICAgIGJ1dHRvbnMua2lsbGJ1dHRvbi5lbmFibGUoMSkKKyAgICAgICAgICAgIGJ1dHRvbnMuc3RlcGJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIGJ1dHRvbnMuc3RlcGluYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgYnV0dG9ucy5zdGVwb3V0YnV0dG9uLmVuYWJsZSgwKQorICAgICAgICBlbGlmIHN0YXRlID09ICdpZGxlJzoKKyAgICAgICAgICAgIGJ1dHRvbnMucnVuYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgYnV0dG9ucy5zdG9wYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgYnV0dG9ucy5raWxsYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgYnV0dG9ucy5zdGVwYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgYnV0dG9ucy5zdGVwaW5idXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBidXR0b25zLnN0ZXBvdXRidXR0b24uZW5hYmxlKDApCisgICAgICAgIGVsaWYgc3RhdGUgPT0gJ2RlYWQnOgorICAgICAgICAgICAgYnV0dG9ucy5ydW5idXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBidXR0b25zLnN0b3BidXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBidXR0b25zLmtpbGxidXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBidXR0b25zLnN0ZXBidXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBidXR0b25zLnN0ZXBpbmJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIGJ1dHRvbnMuc3RlcG91dGJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICd1bmtub3duIHN0YXRlOicsIHN0YXRlCisKKyAgICBkZWYgcmVzZXR3aWRnZXRzKHNlbGYpOgorICAgICAgICBzZWxmLnJlYXNvbiA9ICcnCisgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20uc3JjdGl0bGUuc2V0KCcnKQorICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0KCcnKQorICAgICAgICBzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC5zdGFjay5zZXQoW10pCisgICAgICAgIHNlbGYudy5wYW5lcy5icm93c2VycGFuZXMubG9jYWxzLmJyb3dzZXIuc2V0KHt9KQorICAgICAgICBzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLmdsb2JhbHMuYnJvd3Nlci5zZXQoe30pCisgICAgICAgIHNlbGYuc2V0c3RhdGUoJ2lkbGUnKQorCisgICAgIyBXIGNhbGxiYWNrcworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnNldF9xdWl0KCkKKyAgICAgICAgc2VsZi5leGl0X21haW5sb29wKCkKKyAgICAgICAgc2VsZi5jbG9zZWQgPSAxCisKKyAgICAgICAgc2VsZi51bnJlZ2lzdGVyX2VkaXRvcihzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2UuZmlsZSkKKyAgICAgICAgc2VsZi5ob3JwYW5lcyA9IHNlbGYudy5wYW5lcy5nZXRwYW5lc2l6ZXMoKQorICAgICAgICBzZWxmLnZlcnBhbmVzID0gc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5nZXRwYW5lc2l6ZXMoKQorICAgICAgICBzZWxmLmJvdW5kcyA9IHNlbGYudy5nZXRib3VuZHMoKQorICAgICAgICBwcmVmcyA9IFcuZ2V0YXBwbGljYXRpb24oKS5nZXRwcmVmcygpCisgICAgICAgIHByZWZzLmRlYnVnZ2VyLmJyZWFrcyA9IHNlbGYuYnJlYWtzCisgICAgICAgIHByZWZzLmRlYnVnZ2VyLndpbmRvd3NldHRpbmdzID0gc2VsZi5ib3VuZHMsIHNlbGYuaG9ycGFuZXMsIHNlbGYudmVycGFuZXMKKyAgICAgICAgcHJlZnMuZGVidWdnZXIudHJhY2VtYWdpYyA9IHNlbGYudHJhY2VtYWdpYworICAgICAgICBwcmVmcy5zYXZlKCkKKworICAgICMgc3RhY2sgbGlzdCBjYWxsYmFjaworCisgICAgZGVmIGRvX3N0YWNrKHNlbGYsIGlzZGJsKToKKyAgICAgICAgc2VsID0gc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5zdGFja2xpc3Quc3RhY2suZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgaWYgaXNkYmw6CisgICAgICAgICAgICBpZiBzZWw6CisgICAgICAgICAgICAgICAgZnJhbWUsIGxpbmVubyA9IHNlbGYuc3RhY2tbc2VsWzBdICsgMV0KKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZyYW1lLmZfY29kZS5jb19maWxlbmFtZQorICAgICAgICAgICAgICAgIGVkaXRvciA9IHNlbGYudy5fcGFyZW50d2luZG93LnBhcmVudC5vcGVuc2NyaXB0KGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgICAgICAgICAgaWYgc2VsZi5icmVha3MuaGFzX2tleShmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIGVkaXRvci5zaG93YnJlYWtwb2ludHMoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbCBhbmQgc2VsIDw+IHNlbGYubGFzdHN0YWNrc2VsOgorICAgICAgICAgICAgICAgIHNlbGYuc2hvd2ZyYW1lKHNlbFswXSArIDEpCisgICAgICAgICAgICBzZWxmLmxhc3RzdGFja3NlbCA9IHNlbAorCisgICAgZGVmIGdldGVkaXRvcihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGlmIGZpbGVuYW1lWzoxXSA9PSAnPCcgYW5kIGZpbGVuYW1lWy0xOl0gPT0gJz4nOgorICAgICAgICAgICAgZWRpdG9yID0gVy5nZXRhcHBsaWNhdGlvbigpLmdldHNjcmlwdChmaWxlbmFtZVsxOi0xXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVkaXRvciA9IFcuZ2V0YXBwbGljYXRpb24oKS5nZXRzY3JpcHQoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBlZGl0b3IKKworICAgICMgYnV0dG9uIGNhbGxiYWNrcworCisgICAgZGVmIGRvX3J1bihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5uaW5nKCkKKyAgICAgICAgc2VsZi5zZXRfY29udGludWUoKQorICAgICAgICBzZWxmLmV4aXRfbWFpbmxvb3AoKQorCisgICAgZGVmIGRvX3N0b3Aoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3N0ZXAoKQorCisgICAgZGVmIGRvX2tpbGwoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3F1aXQoKQorICAgICAgICBzZWxmLmV4aXRfbWFpbmxvb3AoKQorICAgICAgICBzZWxmLnJlc2V0d2lkZ2V0cygpCisKKyAgICBkZWYgZG9fc3RlcChzZWxmKToKKyAgICAgICAgc2VsZi5ydW5uaW5nKCkKKyAgICAgICAgc2VsZi5zZXRfbmV4dChzZWxmLmN1cmZyYW1lKQorICAgICAgICBzZWxmLmV4aXRfbWFpbmxvb3AoKQorCisgICAgZGVmIGRvX3N0ZXBpbihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5uaW5nKCkKKyAgICAgICAgc2VsZi5zZXRfc3RlcCgpCisgICAgICAgIHNlbGYuZXhpdF9tYWlubG9vcCgpCisKKyAgICBkZWYgZG9fc3RlcG91dChzZWxmKToKKyAgICAgICAgc2VsZi5ydW5uaW5nKCkKKyAgICAgICAgc2VsZi5zZXRfcmV0dXJuKHNlbGYuY3VyZnJhbWUpCisgICAgICAgIHNlbGYuZXhpdF9tYWlubG9vcCgpCisKKyAgICBkZWYgcnVubmluZyhzZWxmKToKKyAgICAgICAgVy5TZXRDdXJzb3IoJ3dhdGNoJykKKyAgICAgICAgc2VsZi5yZWFzb24gPSAnUnVubmluZ1x4YzknCisgICAgICAgIHNlbGYuc2V0c3RhdGUoJ3J1bm5pbmcnKQorICAgICAgICAjc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldCgnJykKKyAgICAgICAgI3NlbGYudy5wYW5lcy5icm93c2VycGFuZXMuc3RhY2tsaXN0LnN0YWNrLnNldChbXSkKKyAgICAgICAgI3NlbGYudy5wYW5lcy5icm93c2VycGFuZXMubG9jYWxzLmJyb3dzZXIuc2V0KHt9KQorICAgICAgICAjc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5nbG9iYWxzLmJyb3dzZXIuc2V0KHt9KQorCisgICAgZGVmIGV4aXRfbWFpbmxvb3Aoc2VsZik6CisgICAgICAgIHNlbGYudy5wYXJlbnQuZGVidWdnZXJfcXVpdHRpbmcgPSAxCisKKyAgICAjCisKKyAgICBkZWYgc2hvd2ZyYW1lKHNlbGYsIHN0YWNraW5kZXgpOgorICAgICAgICAoZnJhbWUsIGxpbmVubykgPSBzZWxmLnN0YWNrW3N0YWNraW5kZXhdCisgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgIGZpbGVuYW1lID0gZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgIGlmIGZpbGVuYW1lIDw+IHNlbGYuZmlsZToKKyAgICAgICAgICAgIGVkaXRvciA9IHNlbGYuZ2V0ZWRpdG9yKGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgZWRpdG9yOgorICAgICAgICAgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoZWRpdG9yLmdldCgpLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3JVJykKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZVstMzpdID09ICcucHknOgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGltcAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpWzotM10KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLCBmaWxlbmFtZSwgKHN1ZmYsIG1vZGUsIGR1bW15KSA9IGltcC5maW5kX21vZHVsZShtb2RuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoImNhbid0IGZpbmQgZmlsZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYgYW5kIHN1ZmYgPT0gJy5weSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnclUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoZGF0YSwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldCgiY2FuJ3QgZmluZCBmaWxlIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoImNhbid0IGZpbmQgZmlsZSIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgnXG4nLCAnXHInKQorICAgICAgICAgICAgICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0KGRhdGEsIGZpbGVuYW1lKQorICAgICAgICAgICAgc2VsZi5maWxlID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS5zcmN0aXRsZS5zZXQoJ1NvdXJjZTogJyArIGZpbGVuYW1lICsgKChsaW5lbm8gPiAwKSBhbmQgKCcgKGxpbmUgJWQpJyAlIGxpbmVubykgb3IgJyAnKSkKKyAgICAgICAgc2VsZi5nb3RvX2xpbmUobGluZW5vKQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworICAgICAgICBzZWxmLnNob3d2YXJzKChmcmFtZSwgbGluZW5vKSkKKworICAgIGRlZiBzaG93dmFycyhzZWxmLCAoZnJhbWUsIGxpbmVubykpOgorICAgICAgICBpZiBmcmFtZS5mX2xvY2FscyBpcyBub3QgZnJhbWUuZl9nbG9iYWxzOgorICAgICAgICAgICAgbG9jYWxzID0gZnJhbWUuZl9sb2NhbHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvY2FscyA9IHsnU2FtZSBhcyBHbG9iYWxzJzonJ30KKyAgICAgICAgZmlsdGVyZWRsb2NhbHMgPSB7fQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBsb2NhbHMuaXRlbXMoKToKKyAgICAgICAgICAgICMgZW1wdHkga2V5IGlzIG1hZ2ljIGZvciBQeXRob24gMS40OyAnLicgaXMgbWFnaWMgZm9yIDEuNS4uLgorICAgICAgICAgICAgaWYgbm90IGtleSBvciBrZXlbMF0gPD4gJy4nOgorICAgICAgICAgICAgICAgIGZpbHRlcmVkbG9jYWxzW2tleV0gPSB2YWx1ZQorICAgICAgICBzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLmxvY2Fscy5icm93c2VyLnNldChmaWx0ZXJlZGxvY2FscykKKyAgICAgICAgc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5nbG9iYWxzLmJyb3dzZXIuc2V0KGZyYW1lLmZfZ2xvYmFscykKKworICAgIGRlZiBzaG93c3RhY2soc2VsZiwgc3RhY2tpbmRleCk6CisgICAgICAgIHN0YWNrID0gW10KKyAgICAgICAgZm9yIGZyYW1lLCBsaW5lbm8gaW4gc2VsZi5zdGFja1sxOl06CisgICAgICAgICAgICBmaWxlbmFtZSA9IGZyYW1lLmZfY29kZS5jb19maWxlbmFtZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gX2ZpbGVuYW1lc1tmaWxlbmFtZV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZVs6MV0gKyBmaWxlbmFtZVstMTpdIDw+ICc8Pic6CisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBfZmlsZW5hbWVzW2ZyYW1lLmZfY29kZS5jb19maWxlbmFtZV0gPSBmaWxlbmFtZQorICAgICAgICAgICAgZnVuY25hbWUgPSBmcmFtZS5mX2NvZGUuY29fbmFtZQorICAgICAgICAgICAgaWYgZnVuY25hbWUgPT0gJz8nOgorICAgICAgICAgICAgICAgIGZ1bmNuYW1lID0gJzx0b3BsZXZlbD4nCisgICAgICAgICAgICBzdGFjay5hcHBlbmQoZmlsZW5hbWUgKyAnOiAnICsgZnVuY25hbWUpCisgICAgICAgIGlmIHN0YWNrIDw+IHNlbGYubGFzdHN0YWNrOgorICAgICAgICAgICAgc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5zdGFja2xpc3Quc3RhY2suc2V0KHN0YWNrKQorICAgICAgICAgICAgc2VsZi5sYXN0c3RhY2sgPSBzdGFjaworICAgICAgICBzZWwgPSBbc3RhY2tpbmRleCAtIDFdCisgICAgICAgIHNlbGYudy5wYW5lcy5icm93c2VycGFuZXMuc3RhY2tsaXN0LnN0YWNrLnNldHNlbGVjdGlvbihzZWwpCisgICAgICAgIHNlbGYubGFzdHN0YWNrc2VsID0gc2VsCisKKyAgICBkZWYgZ290b19saW5lKHNlbGYsIGxpbmVubyk6CisgICAgICAgIGlmIGxpbmVubyA+IDA6CisgICAgICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2VsZWN0bGluZShsaW5lbm8gLSAxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldHNlbGVjdGlvbigwLCAwKQorCisgICAgIyBiZGIgZW50cnkgcG9pbnRzCisKKyMgICAgICAgZGVmIHVzZXJfY2FsbChzZWxmLCBmcmFtZSwgYXJndW1lbnRfbGlzdCk6CisjICAgICAgICAgICAgICAgc2VsZi5yZWFzb24gPSAnQ2FsbGluZycKKyMgICAgICAgICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lKQorCisgICAgZGVmIHVzZXJfbGluZShzZWxmLCBmcmFtZSk6CisgICAgICAgICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBzdG9wIG9yIGJyZWFrIGF0IHRoaXMgbGluZQorICAgICAgICBzZWxmLnJlYXNvbiA9ICdTdG9wcGVkJworICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lKQorCisgICAgZGVmIHVzZXJfcmV0dXJuKHNlbGYsIGZyYW1lLCByZXR1cm5fdmFsdWUpOgorICAgICAgICAjIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSByZXR1cm4gdHJhcCBpcyBzZXQgaGVyZQorICAgICAgICBmbmFtZSA9IGZyYW1lLmZfY29kZS5jb19uYW1lCisgICAgICAgIGlmIGZuYW1lIDw+ICc/JzoKKyAgICAgICAgICAgIHNlbGYucmVhc29uID0gJ1JldHVybmluZyBmcm9tICVzKCknICUgZnJhbWUuZl9jb2RlLmNvX25hbWUKKyAgICAgICAgICAgIGZyYW1lLmZfbG9jYWxzWydfX3JldHVybl9fJ10gPSByZXR1cm5fdmFsdWUKKyAgICAgICAgZWxpZiBmcmFtZS5mX2JhY2sgaXMgc2VsZi5ib3RmcmFtZToKKyAgICAgICAgICAgIHNlbGYucmVhc29uID0gJ0RvbmUnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlYXNvbiA9ICdSZXR1cm5pbmcnCisgICAgICAgIHNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIE5vbmUsIDEpCisKKyAgICBkZWYgdXNlcl9leGNlcHRpb24oc2VsZiwgZnJhbWUsIChleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdHJhY2ViYWNrKSk6CisgICAgICAgICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBzdG9wIG9yIGJyZWFrIGF0IHRoaXMgbGluZQorICAgICAgICBzZWxmLnJlYXNvbiA9IHNlbGYuZm9ybWF0ZXhjZXB0aW9uKGV4Y190eXBlLCBleGNfdmFsdWUpCisgICAgICAgIHNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIGV4Y190cmFjZWJhY2spCisKKyAgICBkZWYgZm9ybWF0ZXhjZXB0aW9uKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUpOgorICAgICAgICBpZiBleGNfdHlwZSA9PSBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZSwgKGZpbGVuYW1lLCBsaW5lbm8sIGNoYXJubywgbGluZSkgPSBleGNfdmFsdWUKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIoZXhjX3R5cGUpICsgJzogJyArIHN0cih2YWx1ZSkKKyAgICAgICAgaWYgdHlwZShleGNfdHlwZSkgPT0gdHlwZXMuQ2xhc3NUeXBlOgorICAgICAgICAgICAgbmljZSA9IGV4Y190eXBlLl9fbmFtZV9fCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuaWNlID0gc3RyKGV4Y190eXBlKQorICAgICAgICB2YWx1ZSA9IHN0cihleGNfdmFsdWUpCisgICAgICAgIGlmIGV4Y192YWx1ZSBhbmQgdmFsdWU6CisgICAgICAgICAgICBuaWNlID0gbmljZSArICI6ICIgKyB2YWx1ZQorICAgICAgICByZXR1cm4gbmljZQorCisgICAgZGVmIGZvcmdldChzZWxmKToKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIHNlbGYuY3VyaW5kZXggPSAwCisgICAgICAgIHNlbGYuY3VyZnJhbWUgPSBOb25lCisKKyAgICBkZWYgc2V0dXAoc2VsZiwgZiwgdCwgaXNyZXR1cm5pbmcgPSAwKToKKyAgICAgICAgc2VsZi5mb3JnZXQoKQorICAgICAgICBzZWxmLnN0YWNrLCBzZWxmLmN1cmluZGV4ID0gc2VsZi5nZXRfc3RhY2soZiwgdCkKKyAgICAgICAgc2VsZi5jdXJmcmFtZSA9IHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleCAtIGlzcmV0dXJuaW5nXVswXQorCisgICAgZGVmIGludGVyYWN0aW9uKHNlbGYsIGZyYW1lLCB0cmFjZWJhY2ssIGlzcmV0dXJuaW5nID0gMCk6CisgICAgICAgIHNhdmVwb3J0ID0gUWQuR2V0UG9ydCgpCisgICAgICAgIHNlbGYudy5zZWxlY3QoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldHVwKGZyYW1lLCB0cmFjZWJhY2ssIGlzcmV0dXJuaW5nKQorICAgICAgICAgICAgc2VsZi5zZXRzdGF0ZSgnc3RvcHBlZCcpCisgICAgICAgICAgICBzdGFja2luZGV4ID0gc2VsZi5jdXJpbmRleAorICAgICAgICAgICAgaWYgaXNyZXR1cm5pbmc6CisgICAgICAgICAgICAgICAgaWYgZnJhbWUuZl9iYWNrIGlzIG5vdCBzZWxmLmJvdGZyYW1lOgorICAgICAgICAgICAgICAgICAgICBzdGFja2luZGV4ID0gc3RhY2tpbmRleCAtIDEKKyAgICAgICAgICAgIHNlbGYuc2hvd3N0YWNrKHN0YWNraW5kZXgpCisgICAgICAgICAgICBzZWxmLnNob3dmcmFtZShzdGFja2luZGV4KQorICAgICAgICAgICAgc2VsZi53LnBhcmVudC5kZWJ1Z2dlcl9tYWlubG9vcCgpCisgICAgICAgICAgICBzZWxmLmZvcmdldCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBRZC5TZXRQb3J0KHNhdmVwb3J0KQorCisgICAgIyBiZGIgY3VzdG9taXphdGlvbgorCisgICAgZGVmIHRyYWNlX2Rpc3BhdGNoKHNlbGYsIGZyYW1lLCBldmVudCwgYXJnLCBUaWNrQ291bnQgPSBFdnQuVGlja0NvdW50KToKKyAgICAgICAgaWYgVGlja0NvdW50KCkgLSBzZWxmLnRyYWNpbmdtb25pdG9ydGltZSA+IDE1OgorICAgICAgICAgICAgc2VsZi50cmFjaW5nbW9uaXRvcnRpbWUgPSBUaWNrQ291bnQoKQorICAgICAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS50cmFjaW5nbW9uaXRvci50b2dnbGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goMCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnF1aXR0aW5nOgorICAgICAgICAgICAgICAgICAgICAjIHJldHVybmluZyBOb25lIGlzIG5vdCBlbm91Z2gsIGEgZm9ybWVyIEJkYlF1aXQgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICMgbWlnaHQgaGF2ZSBiZWVuIGVhdGVuIGJ5IHRoZSBwcmludCBzdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgYmRiLkJkYlF1aXQKKyAgICAgICAgICAgICAgICBpZiBldmVudCA9PSAnbGluZSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc3BhdGNoX2xpbmUoZnJhbWUpCisgICAgICAgICAgICAgICAgaWYgZXZlbnQgPT0gJ2NhbGwnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwYXRjaF9jYWxsKGZyYW1lLCBhcmcpCisgICAgICAgICAgICAgICAgaWYgZXZlbnQgPT0gJ3JldHVybic6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc3BhdGNoX3JldHVybihmcmFtZSwgYXJnKQorICAgICAgICAgICAgICAgIGlmIGV2ZW50ID09ICdleGNlcHRpb24nOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwYXRjaF9leGNlcHRpb24oZnJhbWUsIGFyZykKKyAgICAgICAgICAgICAgICBwcmludCAnYmRiLkJkYi5kaXNwYXRjaDogdW5rbm93biBkZWJ1Z2dpbmcgZXZlbnQ6JywgcmVwcihldmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgc2VsZi5zZXRfc3RlcCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAorICAgICAgICBleGNlcHQgYmRiLkJkYlF1aXQ6CisgICAgICAgICAgICBpZiBzZWxmLmNvbnRpbnVld2l0aG91dGRlYnVnZ2VyOgorICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJfdHJhY2VmdW5jcygpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIGJkYi5CZGJRdWl0CisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHByaW50ICdYWFggRXhjZXB0aW9uIGR1cmluZyBkZWJ1Z2dlciBpbnRlcmFjdGlvbi4nLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtYXRleGNlcHRpb24oc3lzLmV4Y190eXBlLCBzeXMuZXhjX3ZhbHVlKQorICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAorCisgICAgZGVmIGRpc3BhdGNoX2NhbGwoc2VsZiwgZnJhbWUsIGFyZyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnRyYWNlbWFnaWMgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmZfY29kZS5jb19uYW1lWzoyXSA9PSAnX18nID09IGZyYW1lLmZfY29kZS5jb19uYW1lWy0yOl0gYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmZfY29kZS5jb19uYW1lIDw+ICdfX2luaXRfXyc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5ib3RmcmFtZSBpcyBOb25lOgorICAgICAgICAgICAgIyBGaXJzdCBjYWxsIG9mIGRpc3BhdGNoIHNpbmNlIHJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYm90ZnJhbWUgPSBmcmFtZS5mX2JhY2sgICAgIyB4eHggISEhIGFkZGVkIGZfYmFjaworICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKKyAgICAgICAgaWYgbm90IChzZWxmLnN0b3BfaGVyZShmcmFtZSkgb3Igc2VsZi5icmVha19hbnl3aGVyZShmcmFtZSkpOgorICAgICAgICAgICAgIyBObyBuZWVkIHRvIHRyYWNlIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgIHJldHVybiAjIE5vbmUKKyAgICAgICAgc2VsZi51c2VyX2NhbGwoZnJhbWUsIGFyZykKKyAgICAgICAgaWYgc2VsZi5xdWl0dGluZzoKKyAgICAgICAgICAgIHJhaXNlIGJkYi5CZGJRdWl0CisgICAgICAgIHJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCisKKyAgICBkZWYgc2V0X2NvbnRpbnVlKHNlbGYpOgorICAgICAgICAjIERvbid0IHN0b3AgZXhjZXB0IGF0IGJyZWFrcG9pbnRzIG9yIHdoZW4gZmluaXNoZWQKKyAgICAgICAgc2VsZi5zdG9wZnJhbWUgPSBzZWxmLmJvdGZyYW1lCisgICAgICAgIHNlbGYucmV0dXJuZnJhbWUgPSBOb25lCisgICAgICAgIHNlbGYucXVpdHRpbmcgPSAwCisgICAgICAgICMgdW5saWtlIGluIGJkYi9wZGIsIHRoZXJlJ3MgYSBjaGFuY2UgdGhhdCBicmVha3BvaW50cyBjaGFuZ2UKKyAgICAgICAgIyAqd2hpbGUqIGEgcHJvZ3JhbSAodGhpcyBwcm9ncmFtIDstKSBpcyBydW5uaW5nLiBJdCdzIGFjdHVhbGx5IHF1aXRlIGxpa2VseS4KKyAgICAgICAgIyBTbyB3ZSBkb24ndCBkZWxldGUgZnJhbWUuZl90cmFjZSB1bnRpbCB0aGUgYm90dG9tIGZyYW1lIGlmIHRoZXJlIGFyZSBubyBicmVha3BvaW50cy4KKworICAgIGRlZiBzZXRfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgIGlmIG5vdCBzZWxmLmJyZWFrcy5oYXNfa2V5KGZpbGVuYW1lKToKKyAgICAgICAgICAgIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXSA9IFtdCisgICAgICAgIGxpc3QgPSBzZWxmLmJyZWFrc1tmaWxlbmFtZV0KKyAgICAgICAgaWYgbGluZW5vIGluIGxpc3Q6CisgICAgICAgICAgICByZXR1cm4gJ1RoZXJlIGlzIGFscmVhZHkgYSBicmVha3BvaW50IHRoZXJlIScKKyAgICAgICAgbGlzdC5hcHBlbmQobGluZW5vKQorICAgICAgICBsaXN0LnNvcnQoKSAgICAgIyBJIHdhbnQgdG8ga2VlcCB0aGVtIG5lYXRseSBzb3J0ZWQ7IGVhc2llciBmb3IgZHJhd2luZworICAgICAgICBpZiBoYXNhdHRyKGJkYiwgIkJyZWFrcG9pbnQiKToKKyAgICAgICAgICAgICMgMS41LjJiMSBzcGVjaWZpYworICAgICAgICAgICAgYnAgPSBiZGIuQnJlYWtwb2ludChmaWxlbmFtZSwgbGluZW5vLCAwLCBOb25lKQorICAgICAgICBzZWxmLnVwZGF0ZV9icmVha3MoZmlsZW5hbWUpCisKKyAgICBkZWYgY2xlYXJfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgIGJkYi5CZGIuY2xlYXJfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgc2VsZi51cGRhdGVfYnJlYWtzKGZpbGVuYW1lKQorCisgICAgZGVmIGNsZWFyX2FsbF9maWxlX2JyZWFrcyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGJkYi5CZGIuY2xlYXJfYWxsX2ZpbGVfYnJlYWtzKHNlbGYsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLnVwZGF0ZV9icmVha3MoZmlsZW5hbWUpCisKKyAgICBkZWYgY2xlYXJfYWxsX2JyZWFrcyhzZWxmKToKKyAgICAgICAgYmRiLkJkYi5jbGVhcl9hbGxfYnJlYWtzKHNlbGYpCisgICAgICAgIGZvciBlZGl0b3JzIGluIHNlbGYuZWRpdG9ycy52YWx1ZXMoKToKKyAgICAgICAgICAgIGZvciBlZGl0b3IgaW4gZWRpdG9yczoKKyAgICAgICAgICAgICAgICBlZGl0b3IuZHJhd2JyZWFrcG9pbnRzKCkKKworICAgICMgc3BlY2lhbAorCisgICAgZGVmIHRvZ2dsZV9icmVhayhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgaWYgc2VsZi5nZXRfYnJlYWsoZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgICAgICBzZWxmLmNsZWFyX2JyZWFrKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNldF9icmVhayhmaWxlbmFtZSwgbGluZW5vKQorCisgICAgZGVmIGNsZWFyX2JyZWFrc19hYm92ZShzZWxmLCBmaWxlbmFtZSwgYWJvdmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5icmVha3MuaGFzX2tleShmaWxlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gJ1RoZXJlIGFyZSBubyBicmVha3BvaW50cyBpbiB0aGF0IGZpbGUhJworICAgICAgICBmb3IgbGluZW5vIGluIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXVs6XToKKyAgICAgICAgICAgIGlmIGxpbmVubyA+IGFib3ZlOgorICAgICAgICAgICAgICAgIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXS5yZW1vdmUobGluZW5vKQorICAgICAgICBpZiBub3Qgc2VsZi5icmVha3NbZmlsZW5hbWVdOgorICAgICAgICAgICAgZGVsIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXQorCisgICAgIyBlZGl0b3Igc3R1ZmYKKworICAgIGRlZiB1cGRhdGVfYnJlYWtzKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgaWYgc2VsZi5icmVha3N2aWV3ZXI6CisgICAgICAgICAgICBzZWxmLmJyZWFrc3ZpZXdlci51cGRhdGUoKQorICAgICAgICBpZiBzZWxmLmVkaXRvcnMuaGFzX2tleShmaWxlbmFtZSk6CisgICAgICAgICAgICBmb3IgZWRpdG9yIGluIHNlbGYuZWRpdG9yc1tmaWxlbmFtZV06CisgICAgICAgICAgICAgICAgaWYgZWRpdG9yLl9kZWJ1Z2dlcjogICAgIyBYWFgKKyAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmRyYXdicmVha3BvaW50cygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ3h4eCBkZWFkIGVkaXRvciEnCisKKyAgICBkZWYgdXBkYXRlX2FsbGJyZWFrcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5icmVha3N2aWV3ZXI6CisgICAgICAgICAgICBzZWxmLmJyZWFrc3ZpZXdlci51cGRhdGUoKQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gc2VsZi5icmVha3Mua2V5cygpOgorICAgICAgICAgICAgaWYgc2VsZi5lZGl0b3JzLmhhc19rZXkoZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIGZvciBlZGl0b3IgaW4gc2VsZi5lZGl0b3JzW2ZpbGVuYW1lXToKKyAgICAgICAgICAgICAgICAgICAgaWYgZWRpdG9yLl9kZWJ1Z2dlcjogICAgIyBYWFgKKyAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5kcmF3YnJlYWtwb2ludHMoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ3h4eCBkZWFkIGVkaXRvciEnCisKKyAgICBkZWYgcmVnaXN0ZXJfZWRpdG9yKHNlbGYsIGVkaXRvciwgZmlsZW5hbWUpOgorICAgICAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHNlbGYuZWRpdG9ycy5oYXNfa2V5KGZpbGVuYW1lKToKKyAgICAgICAgICAgIHNlbGYuZWRpdG9yc1tmaWxlbmFtZV0gPSBbZWRpdG9yXQorICAgICAgICBlbGlmIGVkaXRvciBub3QgaW4gc2VsZi5lZGl0b3JzW2ZpbGVuYW1lXToKKyAgICAgICAgICAgIHNlbGYuZWRpdG9yc1tmaWxlbmFtZV0uYXBwZW5kKGVkaXRvcikKKworICAgIGRlZiB1bnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBlZGl0b3IsIGZpbGVuYW1lKToKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZWRpdG9yc1tmaWxlbmFtZV0ucmVtb3ZlKGVkaXRvcikKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmVkaXRvcnNbZmlsZW5hbWVdOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmVkaXRvcnNbZmlsZW5hbWVdCisgICAgICAgICAgICAgICAgIyBpZiB0aGlzIHdhcyBhbiB1bnRpdGxlZCB3aW5kb3csIGNsZWFyIHRoZSBicmVha3MuCisgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWVbOjFdID09ICc8JyBhbmQgZmlsZW5hbWVbLTE6XSA9PSAnPicgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5icmVha3MuaGFzX2tleShmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJfYWxsX2ZpbGVfYnJlYWtzKGZpbGVuYW1lKQorICAgICAgICBleGNlcHQgKEtleUVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKwogCiBjbGFzcyBTb3VyY2VWaWV3ZXIoVy5QeUVkaXRvcik6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0JCWFwcGx5KFcuUHlFZGl0b3IuX19pbml0X18sIChzZWxmLCkgKyBhcmdzLCBrd2FyZ3MpCi0JCXNlbGYuYmluZCgnPGNsaWNrPicsIHNlbGYuY2xpY2tpbnRlcmNlcHQpCi0JCi0JZGVmIGNsaWNraW50ZXJjZXB0KHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlpZiBzZWxmLl9wYXJlbnR3aW5kb3cuX2N1cnJlbnR3aWRnZXQgPD4gc2VsZiBhbmQgbm90IHNlbGYucHRfaW5fYnJlYWtzKHBvaW50KToKLQkJCXNlbGYuX3BhcmVudHdpbmRvdy54eHhfX19zZWxlY3Qoc2VsZikKLQkJCXJldHVybiAxCi0JCi0JZGVmIF9nZXR2aWV3cmVjdChzZWxmKToKLQkJbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcwotCQlpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCXJldHVybiAobCArIDEyLCB0ICsgMiwgciAtIDEsIGIgLSAyKQotCQllbHNlOgotCQkJcmV0dXJuIChsICsgNSwgdCArIDIsIHIgLSAxLCBiIC0gMikKLQkKLQlkZWYgc2VsZWN0KHNlbGYsIG9ub2ZmLCBpc2NsaWNrID0gMCk6Ci0JCWlmIFcuU2VsZWN0YWJsZVdpZGdldC5zZWxlY3Qoc2VsZiwgb25vZmYpOgotCQkJcmV0dXJuCi0JCXNlbGYuU2V0UG9ydCgpCi0JCSNpZiBvbm9mZjoKLQkJIwlzZWxmLnRlZC5XRUFjdGl2YXRlKCkKLQkJI2Vsc2U6Ci0JCSMJc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKLQkJc2VsZi5kcmF3c2VsZnJhbWUob25vZmYpCi0JCi0JZGVmIGRyYXdzZWxmcmFtZShzZWxmLCBvbm9mZik6Ci0JCXBhc3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBhcHBseShXLlB5RWRpdG9yLl9faW5pdF9fLCAoc2VsZiwpICsgYXJncywga3dhcmdzKQorICAgICAgICBzZWxmLmJpbmQoJzxjbGljaz4nLCBzZWxmLmNsaWNraW50ZXJjZXB0KQorCisgICAgZGVmIGNsaWNraW50ZXJjZXB0KHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBzZWxmLl9wYXJlbnR3aW5kb3cuX2N1cnJlbnR3aWRnZXQgPD4gc2VsZiBhbmQgbm90IHNlbGYucHRfaW5fYnJlYWtzKHBvaW50KToKKyAgICAgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy54eHhfX19zZWxlY3Qoc2VsZikKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgX2dldHZpZXdyZWN0KHNlbGYpOgorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIGlmIHNlbGYuX2RlYnVnZ2VyOgorICAgICAgICAgICAgcmV0dXJuIChsICsgMTIsIHQgKyAyLCByIC0gMSwgYiAtIDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKGwgKyA1LCB0ICsgMiwgciAtIDEsIGIgLSAyKQorCisgICAgZGVmIHNlbGVjdChzZWxmLCBvbm9mZiwgaXNjbGljayA9IDApOgorICAgICAgICBpZiBXLlNlbGVjdGFibGVXaWRnZXQuc2VsZWN0KHNlbGYsIG9ub2ZmKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICAjaWYgb25vZmY6CisgICAgICAgICMgICAgICAgc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCisgICAgICAgICNlbHNlOgorICAgICAgICAjICAgICAgIHNlbGYudGVkLldFRGVhY3RpdmF0ZSgpCisgICAgICAgIHNlbGYuZHJhd3NlbGZyYW1lKG9ub2ZmKQorCisgICAgZGVmIGRyYXdzZWxmcmFtZShzZWxmLCBvbm9mZik6CisgICAgICAgIHBhc3MKIAogCiBjbGFzcyBCcmVha3BvaW50c1ZpZXdlcjoKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgZGVidWdnZXIpOgotCQlzZWxmLmRlYnVnZ2VyID0gZGVidWdnZXIKLQkJc2VsZi53ID0gVy5XaW5kb3coKDMwMCwgMjUwKSwgJ0JyZWFrcG9pbnRzJywgbWluc2l6ZSA9ICgyMDAsIDIwMCkpCi0JCXNlbGYudy5wYW5lcyA9IFcuSG9yaXpvbnRhbFBhbmVzKCg4LCA4LCAtOCwgLTMyKSwgKDAuMywgMC43KSkKLQkJc2VsZi53LnBhbmVzLmZpbGVzID0gVy5MaXN0KE5vbmUsIGNhbGxiYWNrID0gc2VsZi5maWxlaGl0KQkJIywgZmxhZ3MgPSBMaXN0cy5sT25seU9uZSkKLQkJc2VsZi53LnBhbmVzLmdyID0gVy5Hcm91cChOb25lKQotCQlzZWxmLncucGFuZXMuZ3IuYnJlYWtzID0gVy5MaXN0KCgwLCAwLCAtMTMwLCAwKSwgY2FsbGJhY2sgPSBzZWxmLmxpbmVoaXQpCSMsIGZsYWdzID0gTGlzdHMubE9ubHlPbmUpCi0JCXNlbGYudy5wYW5lcy5nci5vcGVuYnV0dG9uID0gVy5CdXR0b24oKC04MCwgNCwgMCwgMTYpLCAnVmlld1x4YzknLCBzZWxmLm9wZW5idXR0b25oaXQpCi0JCXNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24gPSBXLkJ1dHRvbigoLTgwLCAyOCwgMCwgMTYpLCAnRGVsZXRlJywgc2VsZi5kZWxldGVidXR0b25oaXQpCi0JCQotCQlzZWxmLncuYmluZCgnPGNsb3NlPicsIHNlbGYuY2xvc2UpCi0JCXNlbGYudy5iaW5kKCdiYWNrc3BhY2UnLCBzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uLnB1c2gpCi0JCQotCQlzZWxmLnNldHVwKCkKLQkJc2VsZi53Lm9wZW4oKQotCQlzZWxmLncucGFuZXMuZ3Iub3BlbmJ1dHRvbi5lbmFibGUoMCkKLQkJc2VsZi53LnBhbmVzLmdyLmRlbGV0ZWJ1dHRvbi5lbmFibGUoMCkKLQkJc2VsZi5jdXJmaWxlID0gTm9uZQotCQotCWRlZiBkZWxldGVidXR0b25oaXQoc2VsZik6Ci0JCWlmIHNlbGYudy5fY3VycmVudHdpZGdldCA9PSBzZWxmLncucGFuZXMuZmlsZXM6Ci0JCQlzZWxmLmRlbF9maWxlbmFtZSgpCi0JCWVsc2U6Ci0JCQlzZWxmLmRlbF9udW1iZXIoKQotCQlzZWxmLmNoZWNrYnV0dG9ucygpCi0JCi0JZGVmIGRlbF9udW1iZXIoc2VsZik6Ci0JCWlmIHNlbGYuY3VyZmlsZSBpcyBOb25lOgotCQkJcmV0dXJuCi0JCXNlbCA9IHNlbGYudy5wYW5lcy5nci5icmVha3MuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKLQkJZm9yIGxpbmVubyBpbiBzZWw6Ci0JCQlzZWxmLmRlYnVnZ2VyLmNsZWFyX2JyZWFrKHNlbGYuY3VyZmlsZSwgbGluZW5vKQotCQotCWRlZiBkZWxfZmlsZW5hbWUoc2VsZik6Ci0JCXNlbCA9IHNlbGYudy5wYW5lcy5maWxlcy5nZXRzZWxlY3RlZG9iamVjdHMoKQotCQlmb3IgZmlsZW5hbWUgaW4gc2VsOgotCQkJc2VsZi5kZWJ1Z2dlci5jbGVhcl9hbGxfZmlsZV9icmVha3MoZmlsZW5hbWUpCi0JCXNlbGYuZGVidWdnZXIudXBkYXRlX2FsbGJyZWFrcygpCi0JCi0JZGVmIHNldHVwKHNlbGYpOgotCQlmaWxlcyA9IHNlbGYuZGVidWdnZXIuYnJlYWtzLmtleXMoKQotCQlmaWxlcy5zb3J0KCkKLQkJc2VsZi53LnBhbmVzLmZpbGVzLnNldChmaWxlcykKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYuZGVidWdnZXIuYnJlYWtzdmlld2VyID0gTm9uZQotCQlzZWxmLmRlYnVnZ2VyID0gTm9uZQotCQotCWRlZiB1cGRhdGUoc2VsZik6Ci0JCXNlbCA9IHNlbGYudy5wYW5lcy5maWxlcy5nZXRzZWxlY3RlZG9iamVjdHMoKQotCQlzZWxmLnNldHVwKCkKLQkJc2VsZi53LnBhbmVzLmZpbGVzLnNldHNlbGVjdGVkb2JqZWN0cyhzZWwpCi0JCXNlbCA9IHNlbGYudy5wYW5lcy5maWxlcy5nZXRzZWxlY3Rpb24oKQotCQlpZiBsZW4oc2VsKSA9PSAwIGFuZCBzZWxmLmN1cmZpbGU6Ci0JCQlzZWxmLncucGFuZXMuZmlsZXMuc2V0c2VsZWN0ZWRvYmplY3RzKFtzZWxmLmN1cmZpbGVdKQotCQlzZWxmLmZpbGVoaXQoMCkKLQkKLQlkZWYgc2VsZWN0KHNlbGYpOgotCQlzZWxmLncuc2VsZWN0KCkKLQkKLQlkZWYgc2VsZWN0ZmlsZShzZWxmLCBmaWxlKToKLQkJc2VsZi53LnBhbmVzLmZpbGVzLnNldHNlbGVjdGVkb2JqZWN0cyhbZmlsZV0pCi0JCXNlbGYuZmlsZWhpdCgwKQkJCQotCQotCWRlZiBvcGVuYnV0dG9uaGl0KHNlbGYpOgotCQlzZWxmLmZpbGVoaXQoMSkKLQkKLQlkZWYgZmlsZWhpdChzZWxmLCBpc2RibCk6Ci0JCXNlbCA9IHNlbGYudy5wYW5lcy5maWxlcy5nZXRzZWxlY3RlZG9iamVjdHMoKQotCQlpZiBpc2RibDoKLQkJCWZvciBmaWxlbmFtZSBpbiBzZWw6Ci0JCQkJbGluZW5vID0gTm9uZQotCQkJCWlmIGZpbGVuYW1lID09IHNlbGYuY3VyZmlsZToKLQkJCQkJbGluZXNlbCA9IHNlbGYudy5wYW5lcy5nci5icmVha3MuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKLQkJCQkJaWYgbGluZXNlbDoKLQkJCQkJCWxpbmVubyA9IGxpbmVzZWxbLTFdCi0JCQkJCWVsaWYgc2VsZi53LnBhbmVzLmdyLmJyZWFrczoKLQkJCQkJCWxpbmVubyA9IHNlbGYudy5wYW5lcy5nci5icmVha3NbMF0KLQkJCQllZGl0b3IgPSBzZWxmLncuX3BhcmVudHdpbmRvdy5wYXJlbnQub3BlbnNjcmlwdChmaWxlbmFtZSwgbGluZW5vKQotCQkJCWVkaXRvci5zaG93YnJlYWtwb2ludHMoMSkKLQkJCXJldHVybgotCQlpZiBsZW4oc2VsKSA9PSAxOgotCQkJZmlsZSA9IHNlbFswXQotCQkJZmlsZWJyZWFrcyA9IHNlbGYuZGVidWdnZXIuYnJlYWtzW2ZpbGVdWzpdCi0JCQlpZiBzZWxmLmN1cmZpbGUgPT0gZmlsZToKLQkJCQlsaW5lc2VsID0gc2VsZi53LnBhbmVzLmdyLmJyZWFrcy5nZXRzZWxlY3RlZG9iamVjdHMoKQotCQkJc2VsZi53LnBhbmVzLmdyLmJyZWFrcy5zZXQoZmlsZWJyZWFrcykKLQkJCWlmIHNlbGYuY3VyZmlsZSA9PSBmaWxlOgotCQkJCXNlbGYudy5wYW5lcy5nci5icmVha3Muc2V0c2VsZWN0ZWRvYmplY3RzKGxpbmVzZWwpCi0JCQlzZWxmLmN1cmZpbGUgPSBmaWxlCi0JCWVsc2U6Ci0JCQlpZiBsZW4oc2VsKSA8PiAwOgotCQkJCXNlbGYuY3VyZmlsZSA9IE5vbmUKLQkJCXNlbGYudy5wYW5lcy5nci5icmVha3Muc2V0KFtdKQotCQlzZWxmLmNoZWNrYnV0dG9ucygpCi0JCi0JZGVmIGxpbmVoaXQoc2VsZiwgaXNkYmwpOgotCQlpZiBpc2RibDoKLQkJCWZpbGVzID0gc2VsZi53LnBhbmVzLmZpbGVzLmdldHNlbGVjdGVkb2JqZWN0cygpCi0JCQlpZiBsZW4oZmlsZXMpIDw+IDE6Ci0JCQkJcmV0dXJuCi0JCQlmaWxlbmFtZSA9IGZpbGVzWzBdCi0JCQlsaW5lbm9zID0gc2VsZi53LnBhbmVzLmdyLmJyZWFrcy5nZXRzZWxlY3RlZG9iamVjdHMoKQotCQkJaWYgbm90IGxpbmVub3M6Ci0JCQkJcmV0dXJuCi0JCQlsaW5lbm8gPSBsaW5lbm9zWy0xXQotCQkJZWRpdG9yID0gc2VsZi53Ll9wYXJlbnR3aW5kb3cucGFyZW50Lm9wZW5zY3JpcHQoZmlsZW5hbWUsIGxpbmVubykKLQkJCWVkaXRvci5zaG93YnJlYWtwb2ludHMoMSkKLQkJc2VsZi5jaGVja2J1dHRvbnMoKQotCQotCWRlZiBjaGVja2J1dHRvbnMoc2VsZik6Ci0JCWlmIHNlbGYudy5wYW5lcy5maWxlcy5nZXRzZWxlY3Rpb24oKToKLQkJCXNlbGYudy5wYW5lcy5nci5vcGVuYnV0dG9uLmVuYWJsZSgxKQotCQkJc2VsZi53Ll9wYXJlbnR3aW5kb3cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLncucGFuZXMuZ3Iub3BlbmJ1dHRvbikKLQkJCWlmIHNlbGYudy5fY3VycmVudHdpZGdldCA9PSBzZWxmLncucGFuZXMuZmlsZXM6Ci0JCQkJaWYgc2VsZi53LnBhbmVzLmZpbGVzLmdldHNlbGVjdGlvbigpOgotCQkJCQlzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uLmVuYWJsZSgxKQotCQkJCWVsc2U6Ci0JCQkJCXNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24uZW5hYmxlKDApCi0JCQllbHNlOgotCQkJCWlmIHNlbGYudy5wYW5lcy5nci5icmVha3MuZ2V0c2VsZWN0aW9uKCk6Ci0JCQkJCXNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24uZW5hYmxlKDEpCi0JCQkJZWxzZToKLQkJCQkJc2VsZi53LnBhbmVzLmdyLmRlbGV0ZWJ1dHRvbi5lbmFibGUoMCkKLQkJZWxzZToKLQkJCXNlbGYudy5wYW5lcy5nci5vcGVuYnV0dG9uLmVuYWJsZSgwKQotCQkJc2VsZi53LnBhbmVzLmdyLmRlbGV0ZWJ1dHRvbi5lbmFibGUoMCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWJ1Z2dlcik6CisgICAgICAgIHNlbGYuZGVidWdnZXIgPSBkZWJ1Z2dlcgorICAgICAgICBzZWxmLncgPSBXLldpbmRvdygoMzAwLCAyNTApLCAnQnJlYWtwb2ludHMnLCBtaW5zaXplID0gKDIwMCwgMjAwKSkKKyAgICAgICAgc2VsZi53LnBhbmVzID0gVy5Ib3Jpem9udGFsUGFuZXMoKDgsIDgsIC04LCAtMzIpLCAoMC4zLCAwLjcpKQorICAgICAgICBzZWxmLncucGFuZXMuZmlsZXMgPSBXLkxpc3QoTm9uZSwgY2FsbGJhY2sgPSBzZWxmLmZpbGVoaXQpICAgICAgICAgICAgICAjLCBmbGFncyA9IExpc3RzLmxPbmx5T25lKQorICAgICAgICBzZWxmLncucGFuZXMuZ3IgPSBXLkdyb3VwKE5vbmUpCisgICAgICAgIHNlbGYudy5wYW5lcy5nci5icmVha3MgPSBXLkxpc3QoKDAsIDAsIC0xMzAsIDApLCBjYWxsYmFjayA9IHNlbGYubGluZWhpdCkgICAgICAgIywgZmxhZ3MgPSBMaXN0cy5sT25seU9uZSkKKyAgICAgICAgc2VsZi53LnBhbmVzLmdyLm9wZW5idXR0b24gPSBXLkJ1dHRvbigoLTgwLCA0LCAwLCAxNiksICdWaWV3XHhjOScsIHNlbGYub3BlbmJ1dHRvbmhpdCkKKyAgICAgICAgc2VsZi53LnBhbmVzLmdyLmRlbGV0ZWJ1dHRvbiA9IFcuQnV0dG9uKCgtODAsIDI4LCAwLCAxNiksICdEZWxldGUnLCBzZWxmLmRlbGV0ZWJ1dHRvbmhpdCkKKworICAgICAgICBzZWxmLncuYmluZCgnPGNsb3NlPicsIHNlbGYuY2xvc2UpCisgICAgICAgIHNlbGYudy5iaW5kKCdiYWNrc3BhY2UnLCBzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uLnB1c2gpCisKKyAgICAgICAgc2VsZi5zZXR1cCgpCisgICAgICAgIHNlbGYudy5vcGVuKCkKKyAgICAgICAgc2VsZi53LnBhbmVzLmdyLm9wZW5idXR0b24uZW5hYmxlKDApCisgICAgICAgIHNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24uZW5hYmxlKDApCisgICAgICAgIHNlbGYuY3VyZmlsZSA9IE5vbmUKKworICAgIGRlZiBkZWxldGVidXR0b25oaXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYudy5fY3VycmVudHdpZGdldCA9PSBzZWxmLncucGFuZXMuZmlsZXM6CisgICAgICAgICAgICBzZWxmLmRlbF9maWxlbmFtZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRlbF9udW1iZXIoKQorICAgICAgICBzZWxmLmNoZWNrYnV0dG9ucygpCisKKyAgICBkZWYgZGVsX251bWJlcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jdXJmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsID0gc2VsZi53LnBhbmVzLmdyLmJyZWFrcy5nZXRzZWxlY3RlZG9iamVjdHMoKQorICAgICAgICBmb3IgbGluZW5vIGluIHNlbDoKKyAgICAgICAgICAgIHNlbGYuZGVidWdnZXIuY2xlYXJfYnJlYWsoc2VsZi5jdXJmaWxlLCBsaW5lbm8pCisKKyAgICBkZWYgZGVsX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBzZWwgPSBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIHNlbDoKKyAgICAgICAgICAgIHNlbGYuZGVidWdnZXIuY2xlYXJfYWxsX2ZpbGVfYnJlYWtzKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmRlYnVnZ2VyLnVwZGF0ZV9hbGxicmVha3MoKQorCisgICAgZGVmIHNldHVwKHNlbGYpOgorICAgICAgICBmaWxlcyA9IHNlbGYuZGVidWdnZXIuYnJlYWtzLmtleXMoKQorICAgICAgICBmaWxlcy5zb3J0KCkKKyAgICAgICAgc2VsZi53LnBhbmVzLmZpbGVzLnNldChmaWxlcykKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5kZWJ1Z2dlci5icmVha3N2aWV3ZXIgPSBOb25lCisgICAgICAgIHNlbGYuZGVidWdnZXIgPSBOb25lCisKKyAgICBkZWYgdXBkYXRlKHNlbGYpOgorICAgICAgICBzZWwgPSBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKKyAgICAgICAgc2VsZi5zZXR1cCgpCisgICAgICAgIHNlbGYudy5wYW5lcy5maWxlcy5zZXRzZWxlY3RlZG9iamVjdHMoc2VsKQorICAgICAgICBzZWwgPSBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgaWYgbGVuKHNlbCkgPT0gMCBhbmQgc2VsZi5jdXJmaWxlOgorICAgICAgICAgICAgc2VsZi53LnBhbmVzLmZpbGVzLnNldHNlbGVjdGVkb2JqZWN0cyhbc2VsZi5jdXJmaWxlXSkKKyAgICAgICAgc2VsZi5maWxlaGl0KDApCisKKyAgICBkZWYgc2VsZWN0KHNlbGYpOgorICAgICAgICBzZWxmLncuc2VsZWN0KCkKKworICAgIGRlZiBzZWxlY3RmaWxlKHNlbGYsIGZpbGUpOgorICAgICAgICBzZWxmLncucGFuZXMuZmlsZXMuc2V0c2VsZWN0ZWRvYmplY3RzKFtmaWxlXSkKKyAgICAgICAgc2VsZi5maWxlaGl0KDApCisKKyAgICBkZWYgb3BlbmJ1dHRvbmhpdChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlaGl0KDEpCisKKyAgICBkZWYgZmlsZWhpdChzZWxmLCBpc2RibCk6CisgICAgICAgIHNlbCA9IHNlbGYudy5wYW5lcy5maWxlcy5nZXRzZWxlY3RlZG9iamVjdHMoKQorICAgICAgICBpZiBpc2RibDoKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzZWw6CisgICAgICAgICAgICAgICAgbGluZW5vID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lID09IHNlbGYuY3VyZmlsZToKKyAgICAgICAgICAgICAgICAgICAgbGluZXNlbCA9IHNlbGYudy5wYW5lcy5nci5icmVha3MuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZXNlbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGxpbmVzZWxbLTFdCisgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi53LnBhbmVzLmdyLmJyZWFrczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IHNlbGYudy5wYW5lcy5nci5icmVha3NbMF0KKyAgICAgICAgICAgICAgICBlZGl0b3IgPSBzZWxmLncuX3BhcmVudHdpbmRvdy5wYXJlbnQub3BlbnNjcmlwdChmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgICAgIGVkaXRvci5zaG93YnJlYWtwb2ludHMoMSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBsZW4oc2VsKSA9PSAxOgorICAgICAgICAgICAgZmlsZSA9IHNlbFswXQorICAgICAgICAgICAgZmlsZWJyZWFrcyA9IHNlbGYuZGVidWdnZXIuYnJlYWtzW2ZpbGVdWzpdCisgICAgICAgICAgICBpZiBzZWxmLmN1cmZpbGUgPT0gZmlsZToKKyAgICAgICAgICAgICAgICBsaW5lc2VsID0gc2VsZi53LnBhbmVzLmdyLmJyZWFrcy5nZXRzZWxlY3RlZG9iamVjdHMoKQorICAgICAgICAgICAgc2VsZi53LnBhbmVzLmdyLmJyZWFrcy5zZXQoZmlsZWJyZWFrcykKKyAgICAgICAgICAgIGlmIHNlbGYuY3VyZmlsZSA9PSBmaWxlOgorICAgICAgICAgICAgICAgIHNlbGYudy5wYW5lcy5nci5icmVha3Muc2V0c2VsZWN0ZWRvYmplY3RzKGxpbmVzZWwpCisgICAgICAgICAgICBzZWxmLmN1cmZpbGUgPSBmaWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBsZW4oc2VsKSA8PiAwOgorICAgICAgICAgICAgICAgIHNlbGYuY3VyZmlsZSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYudy5wYW5lcy5nci5icmVha3Muc2V0KFtdKQorICAgICAgICBzZWxmLmNoZWNrYnV0dG9ucygpCisKKyAgICBkZWYgbGluZWhpdChzZWxmLCBpc2RibCk6CisgICAgICAgIGlmIGlzZGJsOgorICAgICAgICAgICAgZmlsZXMgPSBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKKyAgICAgICAgICAgIGlmIGxlbihmaWxlcykgPD4gMToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZXNbMF0KKyAgICAgICAgICAgIGxpbmVub3MgPSBzZWxmLncucGFuZXMuZ3IuYnJlYWtzLmdldHNlbGVjdGVkb2JqZWN0cygpCisgICAgICAgICAgICBpZiBub3QgbGluZW5vczoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGxpbmVubyA9IGxpbmVub3NbLTFdCisgICAgICAgICAgICBlZGl0b3IgPSBzZWxmLncuX3BhcmVudHdpbmRvdy5wYXJlbnQub3BlbnNjcmlwdChmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgZWRpdG9yLnNob3dicmVha3BvaW50cygxKQorICAgICAgICBzZWxmLmNoZWNrYnV0dG9ucygpCisKKyAgICBkZWYgY2hlY2tidXR0b25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0aW9uKCk6CisgICAgICAgICAgICBzZWxmLncucGFuZXMuZ3Iub3BlbmJ1dHRvbi5lbmFibGUoMSkKKyAgICAgICAgICAgIHNlbGYudy5fcGFyZW50d2luZG93LnNldGRlZmF1bHRidXR0b24oc2VsZi53LnBhbmVzLmdyLm9wZW5idXR0b24pCisgICAgICAgICAgICBpZiBzZWxmLncuX2N1cnJlbnR3aWRnZXQgPT0gc2VsZi53LnBhbmVzLmZpbGVzOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudy5wYW5lcy5maWxlcy5nZXRzZWxlY3Rpb24oKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53LnBhbmVzLmdyLmRlbGV0ZWJ1dHRvbi5lbmFibGUoMSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLncucGFuZXMuZ3IuYnJlYWtzLmdldHNlbGVjdGlvbigpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uLmVuYWJsZSgxKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24uZW5hYmxlKDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLncucGFuZXMuZ3Iub3BlbmJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIHNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24uZW5hYmxlKDApCiAKIAogY2xhc3MgVHJhY2luZ01vbml0b3IoVy5XaWRnZXQpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotCQlhcHBseShXLldpZGdldC5fX2luaXRfXywgKHNlbGYsKSArIGFyZ3MsIGt3YXJncykKLQkJc2VsZi5zdGF0ZSA9IDAKLQkKLQlkZWYgdG9nZ2xlKHNlbGYpOgotCQlpZiBoYXNhdHRyKHNlbGYsICJfcGFyZW50d2luZG93IikgYW5kIHNlbGYuX3BhcmVudHdpbmRvdyBpcyBub3QgTm9uZToKLQkJCXNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlICUgMiArIDEKLQkJCXBvcnQgPSBRZC5HZXRQb3J0KCkKLQkJCXNlbGYuU2V0UG9ydCgpCi0JCQlzZWxmLmRyYXcoKQotCQkJUWQuU2V0UG9ydChwb3J0KQotCQotCWRlZiByZXNldChzZWxmKToKLQkJaWYgc2VsZi5fcGFyZW50d2luZG93OgotCQkJc2VsZi5zdGF0ZSA9IDAKLQkJCXBvcnQgPSBRZC5HZXRQb3J0KCkKLQkJCXNlbGYuU2V0UG9ydCgpCi0JCQlzZWxmLmRyYXcoKQotCQkJUWQuU2V0UG9ydChwb3J0KQotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLnN0YXRlID09IDI6Ci0JCQlRZC5QYWludE92YWwoc2VsZi5fYm91bmRzKQotCQllbHNlOgotCQkJUWQuRXJhc2VPdmFsKHNlbGYuX2JvdW5kcykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBhcHBseShXLldpZGdldC5fX2luaXRfXywgKHNlbGYsKSArIGFyZ3MsIGt3YXJncykKKyAgICAgICAgc2VsZi5zdGF0ZSA9IDAKKworICAgIGRlZiB0b2dnbGUoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgIl9wYXJlbnR3aW5kb3ciKSBhbmQgc2VsZi5fcGFyZW50d2luZG93IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc3RhdGUgJSAyICsgMQorICAgICAgICAgICAgcG9ydCA9IFFkLkdldFBvcnQoKQorICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgICAgIHNlbGYuZHJhdygpCisgICAgICAgICAgICBRZC5TZXRQb3J0KHBvcnQpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3BhcmVudHdpbmRvdzoKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAwCisgICAgICAgICAgICBwb3J0ID0gUWQuR2V0UG9ydCgpCisgICAgICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICAgICAgc2VsZi5kcmF3KCkKKyAgICAgICAgICAgIFFkLlNldFBvcnQocG9ydCkKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLnN0YXRlID09IDI6CisgICAgICAgICAgICBRZC5QYWludE92YWwoc2VsZi5fYm91bmRzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgUWQuRXJhc2VPdmFsKHNlbGYuX2JvdW5kcykKIAogCiAjIGNvbnZlbmllbmNlIGZ1bmNzCiAKIGRlZiBwb3N0bW9ydGVtKGV4Y190eXBlLCBleGNfdmFsdWUsIHRiKToKLQlkID0gZ2V0ZGVidWdnZXIoKQotCWQucG9zdG1vcnRlbShleGNfdHlwZSwgZXhjX3ZhbHVlLCB0YikKKyAgICBkID0gZ2V0ZGVidWdnZXIoKQorICAgIGQucG9zdG1vcnRlbShleGNfdHlwZSwgZXhjX3ZhbHVlLCB0YikKIAogZGVmIHN0YXJ0KGJvdHRvbWZyYW1lID0gTm9uZSk6Ci0JZCA9IGdldGRlYnVnZ2VyKCkKLQlkLnN0YXJ0KGJvdHRvbWZyYW1lKQorICAgIGQgPSBnZXRkZWJ1Z2dlcigpCisgICAgZC5zdGFydChib3R0b21mcmFtZSkKIAogZGVmIHN0YXJ0ZnJvbWhlcmUoKToKLQlkID0gZ2V0ZGVidWdnZXIoKQotCXRyeToKLQkJcmFpc2UgJ3NwYW0nCi0JZXhjZXB0OgotCQlmcmFtZSA9IHN5cy5leGNfdHJhY2ViYWNrLnRiX2ZyYW1lLmZfYmFjawotCWQuc3RhcnQoZnJhbWUpCisgICAgZCA9IGdldGRlYnVnZ2VyKCkKKyAgICB0cnk6CisgICAgICAgIHJhaXNlICdzcGFtJworICAgIGV4Y2VwdDoKKyAgICAgICAgZnJhbWUgPSBzeXMuZXhjX3RyYWNlYmFjay50Yl9mcmFtZS5mX2JhY2sKKyAgICBkLnN0YXJ0KGZyYW1lKQogCiBkZWYgc3RhcnRmcm9tYm90dG9tKCk6Ci0JZCA9IGdldGRlYnVnZ2VyKCkKLQlkLnN0YXJ0KF9nZXRib3R0b21mcmFtZSgpLCAxKQorICAgIGQgPSBnZXRkZWJ1Z2dlcigpCisgICAgZC5zdGFydChfZ2V0Ym90dG9tZnJhbWUoKSwgMSkKIAogZGVmIHN0b3AoKToKLQlkID0gZ2V0ZGVidWdnZXIoKQotCWQuc3RvcCgpCisgICAgZCA9IGdldGRlYnVnZ2VyKCkKKyAgICBkLnN0b3AoKQogCiBkZWYgY29udCgpOgotCXN5cy5zZXR0cmFjZShOb25lKQotCWQgPSBnZXRkZWJ1Z2dlcigpCi0JZC5zZXRfY29udGludWVfd2l0aG91dF9kZWJ1Z2dlcigpCisgICAgc3lzLnNldHRyYWNlKE5vbmUpCisgICAgZCA9IGdldGRlYnVnZ2VyKCkKKyAgICBkLnNldF9jb250aW51ZV93aXRob3V0X2RlYnVnZ2VyKCkKIAogZGVmIF9nZXRib3R0b21mcmFtZSgpOgotCXRyeToKLQkJcmFpc2UgJ3NwYW0nCi0JZXhjZXB0OgotCQlwYXNzCi0JZnJhbWUgPSBzeXMuZXhjX3RyYWNlYmFjay50Yl9mcmFtZQotCXdoaWxlIDE6Ci0JCWlmIGZyYW1lLmZfY29kZS5jb19uYW1lID09ICdtYWlubG9vcCcgb3IgZnJhbWUuZl9iYWNrIGlzIE5vbmU6Ci0JCQlicmVhawotCQlmcmFtZSA9IGZyYW1lLmZfYmFjawotCXJldHVybiBmcmFtZQorICAgIHRyeToKKyAgICAgICAgcmFpc2UgJ3NwYW0nCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisgICAgZnJhbWUgPSBzeXMuZXhjX3RyYWNlYmFjay50Yl9mcmFtZQorICAgIHdoaWxlIDE6CisgICAgICAgIGlmIGZyYW1lLmZfY29kZS5jb19uYW1lID09ICdtYWlubG9vcCcgb3IgZnJhbWUuZl9iYWNrIGlzIE5vbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBmcmFtZSA9IGZyYW1lLmZfYmFjaworICAgIHJldHVybiBmcmFtZQogCiBfZGVidWdnZXIgPSBOb25lCiAKIGRlZiBnZXRkZWJ1Z2dlcigpOgotCWlmIG5vdCBfX2RlYnVnX186Ci0JCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGRlYnVnIGluIFwiT3B0aW1pemUgYnl0ZWNvZGVcIiBtb2RlLlxyKHNlZSBcIkRlZmF1bHQgc3RhcnR1cCBvcHRpb25zXCIgaW4gRWRpdFB5dGhvblByZWZlcmVuY2VzKSIKLQlnbG9iYWwgX2RlYnVnZ2VyCi0JaWYgX2RlYnVnZ2VyIGlzIE5vbmU6Ci0JCV9kZWJ1Z2dlciA9IERlYnVnZ2VyKCkKLQlyZXR1cm4gX2RlYnVnZ2VyCisgICAgaWYgbm90IF9fZGVidWdfXzoKKyAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZGVidWcgaW4gXCJPcHRpbWl6ZSBieXRlY29kZVwiIG1vZGUuXHIoc2VlIFwiRGVmYXVsdCBzdGFydHVwIG9wdGlvbnNcIiBpbiBFZGl0UHl0aG9uUHJlZmVyZW5jZXMpIgorICAgIGdsb2JhbCBfZGVidWdnZXIKKyAgICBpZiBfZGVidWdnZXIgaXMgTm9uZToKKyAgICAgICAgX2RlYnVnZ2VyID0gRGVidWdnZXIoKQorICAgIHJldHVybiBfZGVidWdnZXIKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvUHlEb2NTZWFyY2gucHkgYi9NYWMvVG9vbHMvSURFL1B5RG9jU2VhcmNoLnB5CmluZGV4IDFhYmQ0Y2QuLmVjNjY2YjYgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvUHlEb2NTZWFyY2gucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9QeURvY1NlYXJjaC5weQpAQCAtMTMsMjQ0ICsxMywyNDQgQEAKIF90aXRsZXBhdCA9IHJlLmNvbXBpbGUoJzx0aXRsZT5cKFtePF0qXCk8L3RpdGxlPicpCiAKIGRlZiBzdWNrdGl0bGUocGF0aCk6Ci0JZiA9IG9wZW4ocGF0aCkKLQl0ZXh0ID0gZi5yZWFkKDEwMjQpICMgYXNzdW1lIHRoZSB0aXRsZSBpcyBpbiB0aGUgZmlyc3QgMTAyNCBieXRlcwotCWYuY2xvc2UoKQotCWxvd2VydGV4dCA9IHRleHQubG93ZXIoKQotCW1hdGNoZXIgPSBfdGl0bGVwYXQuc2VhcmNoKGxvd2VydGV4dCkKLQlpZiBtYXRjaGVyOgotCQlyZXR1cm4gbWF0Y2hlci5ncm91cCgxKQotCXJldHVybiBwYXRoCisgICAgZiA9IG9wZW4ocGF0aCkKKyAgICB0ZXh0ID0gZi5yZWFkKDEwMjQpICMgYXNzdW1lIHRoZSB0aXRsZSBpcyBpbiB0aGUgZmlyc3QgMTAyNCBieXRlcworICAgIGYuY2xvc2UoKQorICAgIGxvd2VydGV4dCA9IHRleHQubG93ZXIoKQorICAgIG1hdGNoZXIgPSBfdGl0bGVwYXQuc2VhcmNoKGxvd2VydGV4dCkKKyAgICBpZiBtYXRjaGVyOgorICAgICAgICByZXR1cm4gbWF0Y2hlci5ncm91cCgxKQorICAgIHJldHVybiBwYXRoCiAKIGRlZiB2ZXJpZnlkb2NwYXRoKGRvY3BhdGgpOgotCXRyeToKLQkJdHV0ID0gb3MucGF0aC5qb2luKGRvY3BhdGgsICJ0dXQiKQotCQlsaWIgPSBvcy5wYXRoLmpvaW4oZG9jcGF0aCwgImxpYiIpCi0JCXJlZiA9IG9zLnBhdGguam9pbihkb2NwYXRoLCAicmVmIikKLQkJZm9yIHBhdGggaW4gW3R1dCwgbGliLCByZWZdOgotCQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgotCQkJCXJldHVybiAwCi0JZXhjZXB0OgotCQlyZXR1cm4gMAotCXJldHVybiAxCisgICAgdHJ5OgorICAgICAgICB0dXQgPSBvcy5wYXRoLmpvaW4oZG9jcGF0aCwgInR1dCIpCisgICAgICAgIGxpYiA9IG9zLnBhdGguam9pbihkb2NwYXRoLCAibGliIikKKyAgICAgICAgcmVmID0gb3MucGF0aC5qb2luKGRvY3BhdGgsICJyZWYiKQorICAgICAgICBmb3IgcGF0aCBpbiBbdHV0LCBsaWIsIHJlZl06CisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICBleGNlcHQ6CisgICAgICAgIHJldHVybiAwCisgICAgcmV0dXJuIDEKIAogCiBfcmVzdWx0c2NvdW50ZXIgPSAxCiAKIGNsYXNzIFJlc3VsdHM6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIGhpdHMpOgotCQlnbG9iYWwgX3Jlc3VsdHNjb3VudGVyCi0JCWhpdHMgPSBtYXAobGFtYmRhIChwYXRoLCBoaXRzKTogKHN1Y2t0aXRsZShwYXRoKSwgcGF0aCwgaGl0cyksIGhpdHMpCi0JCWhpdHMuc29ydCgpCi0JCXNlbGYuaGl0cyA9IGhpdHMKLQkJbmljZWhpdHMgPSBtYXAoCi0JCQkJbGFtYmRhICh0aXRsZSwgcGF0aCwgaGl0cyk6Ci0JCQkJdGl0bGUgKyAnXHInICsgc3RyaW5nLmpvaW4oCi0JCQkJbWFwKGxhbWJkYSAoYywgcCk6ICIlcyAoJWQpIiAlIChwLCBjKSwgaGl0cyksICcsICcpLCBoaXRzKQotCQluaWNlaGl0cy5zb3J0KCkKLQkJc2VsZi53ID0gVy5XaW5kb3coKDQ0MCwgMzAwKSwgIlNlYXJjaCByZXN1bHRzICVkIiAlIF9yZXN1bHRzY291bnRlciwgbWluc2l6ZSA9ICgyMDAsIDEwMCkpCi0JCXNlbGYudy5yZXN1bHRzID0gVy5Ud29MaW5lTGlzdCgoLTEsIC0xLCAxLCAtMTQpLCBuaWNlaGl0cywgc2VsZi5saXN0aGl0KQotCQlzZWxmLncub3BlbigpCi0JCXNlbGYudy5iaW5kKCdyZXR1cm4nLCBzZWxmLmxpc3RoaXQpCi0JCXNlbGYudy5iaW5kKCdlbnRlcicsIHNlbGYubGlzdGhpdCkKLQkJX3Jlc3VsdHNjb3VudGVyID0gX3Jlc3VsdHNjb3VudGVyICsgMQotCQotCWRlZiBsaXN0aGl0KHNlbGYsIGlzZGJsID0gMSk6Ci0JCWlmIGlzZGJsOgotCQkJZm9yIGkgaW4gc2VsZi53LnJlc3VsdHMuZ2V0c2VsZWN0aW9uKCk6Ci0JCQkJcGF0aCA9IHNlbGYuaGl0c1tpXVsxXQotCQkJCXVybCA9ICJmaWxlOi8vIiArICIvIi5qb2luKHBhdGguc3BsaXQoIjoiKSkKLQkJCQl3ZWJicm93c2VyLm9wZW4odXJsKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhpdHMpOgorICAgICAgICBnbG9iYWwgX3Jlc3VsdHNjb3VudGVyCisgICAgICAgIGhpdHMgPSBtYXAobGFtYmRhIChwYXRoLCBoaXRzKTogKHN1Y2t0aXRsZShwYXRoKSwgcGF0aCwgaGl0cyksIGhpdHMpCisgICAgICAgIGhpdHMuc29ydCgpCisgICAgICAgIHNlbGYuaGl0cyA9IGhpdHMKKyAgICAgICAgbmljZWhpdHMgPSBtYXAoCisgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgKHRpdGxlLCBwYXRoLCBoaXRzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlICsgJ1xyJyArIHN0cmluZy5qb2luKAorICAgICAgICAgICAgICAgICAgICAgICAgbWFwKGxhbWJkYSAoYywgcCk6ICIlcyAoJWQpIiAlIChwLCBjKSwgaGl0cyksICcsICcpLCBoaXRzKQorICAgICAgICBuaWNlaGl0cy5zb3J0KCkKKyAgICAgICAgc2VsZi53ID0gVy5XaW5kb3coKDQ0MCwgMzAwKSwgIlNlYXJjaCByZXN1bHRzICVkIiAlIF9yZXN1bHRzY291bnRlciwgbWluc2l6ZSA9ICgyMDAsIDEwMCkpCisgICAgICAgIHNlbGYudy5yZXN1bHRzID0gVy5Ud29MaW5lTGlzdCgoLTEsIC0xLCAxLCAtMTQpLCBuaWNlaGl0cywgc2VsZi5saXN0aGl0KQorICAgICAgICBzZWxmLncub3BlbigpCisgICAgICAgIHNlbGYudy5iaW5kKCdyZXR1cm4nLCBzZWxmLmxpc3RoaXQpCisgICAgICAgIHNlbGYudy5iaW5kKCdlbnRlcicsIHNlbGYubGlzdGhpdCkKKyAgICAgICAgX3Jlc3VsdHNjb3VudGVyID0gX3Jlc3VsdHNjb3VudGVyICsgMQorCisgICAgZGVmIGxpc3RoaXQoc2VsZiwgaXNkYmwgPSAxKToKKyAgICAgICAgaWYgaXNkYmw6CisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLncucmVzdWx0cy5nZXRzZWxlY3Rpb24oKToKKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5oaXRzW2ldWzFdCisgICAgICAgICAgICAgICAgdXJsID0gImZpbGU6Ly8iICsgIi8iLmpvaW4ocGF0aC5zcGxpdCgiOiIpKQorICAgICAgICAgICAgICAgIHdlYmJyb3dzZXIub3Blbih1cmwpCiAKIAogY2xhc3MgU3RhdHVzOgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJc2VsZi53ID0gVy5EaWFsb2coKDQ0MCwgNjQpLCAiU2VhcmNoaW5nXHhjOSIpCi0JCXNlbGYudy5zZWFyY2hpbmcgPSBXLlRleHRCb3goKDQsIDQsIC00LCAxNiksICIiKQotCQlzZWxmLncuaGl0cyA9IFcuVGV4dEJveCgoNCwgMjQsIC00LCAxNiksICJIaXRzOiAwIikKLQkJc2VsZi53LmNhbmNlbHRpcCA9IFcuVGV4dEJveCgoNCwgNDQsIC00LCAxNiksICJUeXBlIGNtZC1wZXJpb2QgKC4pIHRvIGNhbmNlbC4iKQotCQlzZWxmLncub3BlbigpCi0JCi0JZGVmIHNldChzZWxmLCBwYXRoLCBoaXRzKToKLQkJc2VsZi53LnNlYXJjaGluZy5zZXQocGF0aCkKLQkJc2VsZi53LmhpdHMuc2V0KCdIaXRzOiAlcicgJSAoaGl0cywpKQotCQlhcHAuYnJlYXRoZSgpCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlzZWxmLncuY2xvc2UoKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLncgPSBXLkRpYWxvZygoNDQwLCA2NCksICJTZWFyY2hpbmdceGM5IikKKyAgICAgICAgc2VsZi53LnNlYXJjaGluZyA9IFcuVGV4dEJveCgoNCwgNCwgLTQsIDE2KSwgIiIpCisgICAgICAgIHNlbGYudy5oaXRzID0gVy5UZXh0Qm94KCg0LCAyNCwgLTQsIDE2KSwgIkhpdHM6IDAiKQorICAgICAgICBzZWxmLncuY2FuY2VsdGlwID0gVy5UZXh0Qm94KCg0LCA0NCwgLTQsIDE2KSwgIlR5cGUgY21kLXBlcmlvZCAoLikgdG8gY2FuY2VsLiIpCisgICAgICAgIHNlbGYudy5vcGVuKCkKKworICAgIGRlZiBzZXQoc2VsZiwgcGF0aCwgaGl0cyk6CisgICAgICAgIHNlbGYudy5zZWFyY2hpbmcuc2V0KHBhdGgpCisgICAgICAgIHNlbGYudy5oaXRzLnNldCgnSGl0czogJXInICUgKGhpdHMsKSkKKyAgICAgICAgYXBwLmJyZWF0aGUoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLncuY2xvc2UoKQogCiAKIGRlZiBtYXRjaCh0ZXh0LCBwYXR0ZXJucywgYWxsKToKLQloaXRzID0gW10KLQloaXRzYXBwZW5kID0gaGl0cy5hcHBlbmQKLQlzdHJpbmdjb3VudCA9IHN0cmluZy5jb3VudAotCWZvciBwYXQgaW4gcGF0dGVybnM6Ci0JCWMgPSBzdHJpbmdjb3VudCh0ZXh0LCBwYXQpCi0JCWlmIGMgPiAwOgotCQkJaGl0c2FwcGVuZCgoYywgcGF0KSkKLQkJZWxpZiBhbGw6Ci0JCQloaXRzWzpdID0gW10KLQkJCWJyZWFrCi0JaGl0cy5zb3J0KCkKLQloaXRzLnJldmVyc2UoKQotCXJldHVybiBoaXRzCisgICAgaGl0cyA9IFtdCisgICAgaGl0c2FwcGVuZCA9IGhpdHMuYXBwZW5kCisgICAgc3RyaW5nY291bnQgPSBzdHJpbmcuY291bnQKKyAgICBmb3IgcGF0IGluIHBhdHRlcm5zOgorICAgICAgICBjID0gc3RyaW5nY291bnQodGV4dCwgcGF0KQorICAgICAgICBpZiBjID4gMDoKKyAgICAgICAgICAgIGhpdHNhcHBlbmQoKGMsIHBhdCkpCisgICAgICAgIGVsaWYgYWxsOgorICAgICAgICAgICAgaGl0c1s6XSA9IFtdCisgICAgICAgICAgICBicmVhaworICAgIGhpdHMuc29ydCgpCisgICAgaGl0cy5yZXZlcnNlKCkKKyAgICByZXR1cm4gaGl0cwogCiAKIGRlZiBkb3NlYXJjaChkb2NwYXRoLCBzZWFyY2hzdHJpbmcsIHNldHRpbmdzKToKLQkoZG9jcGF0aCwga2luZCwgY2FzZSwgd29yZCwgdHV0LCBsaWIsIHJlZiwgZXh0LCBhcGkpID0gc2V0dGluZ3MKLQlib29rcyA9IFsodHV0LCAndHV0JyksIChsaWIsICdsaWInKSwgKHJlZiwgJ3JlZicpLCAoZXh0LCAnZXh0JyksIChhcGksICdhcGknKV0KLQlpZiBub3QgY2FzZToKLQkJc2VhcmNoc3RyaW5nID0gc3RyaW5nLmxvd2VyKHNlYXJjaHN0cmluZykKLQkKLQlpZiBraW5kID09IDE6Ci0JCXBhdHRlcm5zID0gc3RyaW5nLnNwbGl0KHNlYXJjaHN0cmluZykKLQkJYWxsID0gMQotCWVsaWYga2luZCA9PSAyOgotCQlwYXR0ZXJucyA9IHN0cmluZy5zcGxpdChzZWFyY2hzdHJpbmcpCi0JCWFsbCA9IDAKLQllbHNlOgotCQlwYXR0ZXJucyA9IFtzZWFyY2hzdHJpbmddCi0JCWFsbCA9IDAgIyBub3QgcmVsZXZhbnQKLQkKLQlvc3BhdGhqb2luID0gb3MucGF0aC5qb2luCi0Jc3RyaW5nbG93ZXIgPSBzdHJpbmcubG93ZXIKLQlzdGF0dXMgPSBTdGF0dXMoKQotCXN0YXR1c3NldCA9IHN0YXR1cy5zZXQKLQlfbWF0Y2ggPSBtYXRjaAotCV9vcGVuID0gb3BlbgotCWhpdHMgPSB7fQotCXRyeToKLQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJTWFjT1MuRW5hYmxlQXBwc3dpdGNoKDApCi0JCXRyeToKLQkJCWZvciBkbywgbmFtZSBpbiBib29rczoKLQkJCQlpZiBub3QgZG86Ci0JCQkJCWNvbnRpbnVlCi0JCQkJYm9va3BhdGggPSBvc3BhdGhqb2luKGRvY3BhdGgsIG5hbWUpCi0JCQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKGJvb2twYXRoKToKLQkJCQkJY29udGludWUKLQkJCQlmaWxlcyA9IG9zLmxpc3RkaXIoYm9va3BhdGgpCi0JCQkJZm9yIGZpbGUgaW4gZmlsZXM6Ci0JCQkJCWZ1bGxwYXRoID0gb3NwYXRoam9pbihib29rcGF0aCwgZmlsZSkKLQkJCQkJaWYgZnVsbHBhdGhbLTU6XSA8PiAnLmh0bWwnOgotCQkJCQkJY29udGludWUKLQkJCQkJc3RhdHVzc2V0KGZ1bGxwYXRoLCBsZW4oaGl0cykpCi0JCQkJCWYgPSBfb3BlbihmdWxscGF0aCkKLQkJCQkJdGV4dCA9IGYucmVhZCgpCi0JCQkJCWlmIG5vdCBjYXNlOgotCQkJCQkJdGV4dCA9IHN0cmluZ2xvd2VyKHRleHQpCi0JCQkJCWYuY2xvc2UoKQotCQkJCQlmaWxlaGl0cyA9IF9tYXRjaCh0ZXh0LCBwYXR0ZXJucywgYWxsKQotCQkJCQlpZiBmaWxlaGl0czoKLQkJCQkJCWhpdHNbZnVsbHBhdGhdID0gZmlsZWhpdHMKLQkJZmluYWxseToKLQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCi0JCQlzdGF0dXMuY2xvc2UoKQotCWV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLQkJcGFzcwotCWhpdHMgPSBoaXRzLml0ZW1zKCkKLQloaXRzLnNvcnQoKQotCXJldHVybiBoaXRzCisgICAgKGRvY3BhdGgsIGtpbmQsIGNhc2UsIHdvcmQsIHR1dCwgbGliLCByZWYsIGV4dCwgYXBpKSA9IHNldHRpbmdzCisgICAgYm9va3MgPSBbKHR1dCwgJ3R1dCcpLCAobGliLCAnbGliJyksIChyZWYsICdyZWYnKSwgKGV4dCwgJ2V4dCcpLCAoYXBpLCAnYXBpJyldCisgICAgaWYgbm90IGNhc2U6CisgICAgICAgIHNlYXJjaHN0cmluZyA9IHN0cmluZy5sb3dlcihzZWFyY2hzdHJpbmcpCisKKyAgICBpZiBraW5kID09IDE6CisgICAgICAgIHBhdHRlcm5zID0gc3RyaW5nLnNwbGl0KHNlYXJjaHN0cmluZykKKyAgICAgICAgYWxsID0gMQorICAgIGVsaWYga2luZCA9PSAyOgorICAgICAgICBwYXR0ZXJucyA9IHN0cmluZy5zcGxpdChzZWFyY2hzdHJpbmcpCisgICAgICAgIGFsbCA9IDAKKyAgICBlbHNlOgorICAgICAgICBwYXR0ZXJucyA9IFtzZWFyY2hzdHJpbmddCisgICAgICAgIGFsbCA9IDAgIyBub3QgcmVsZXZhbnQKKworICAgIG9zcGF0aGpvaW4gPSBvcy5wYXRoLmpvaW4KKyAgICBzdHJpbmdsb3dlciA9IHN0cmluZy5sb3dlcgorICAgIHN0YXR1cyA9IFN0YXR1cygpCisgICAgc3RhdHVzc2V0ID0gc3RhdHVzLnNldAorICAgIF9tYXRjaCA9IG1hdGNoCisgICAgX29wZW4gPSBvcGVuCisgICAgaGl0cyA9IHt9CisgICAgdHJ5OgorICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGRvLCBuYW1lIGluIGJvb2tzOgorICAgICAgICAgICAgICAgIGlmIG5vdCBkbzoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBib29rcGF0aCA9IG9zcGF0aGpvaW4oZG9jcGF0aCwgbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYm9va3BhdGgpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihib29rcGF0aCkKKyAgICAgICAgICAgICAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGggPSBvc3BhdGhqb2luKGJvb2twYXRoLCBmaWxlKQorICAgICAgICAgICAgICAgICAgICBpZiBmdWxscGF0aFstNTpdIDw+ICcuaHRtbCc6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBzdGF0dXNzZXQoZnVsbHBhdGgsIGxlbihoaXRzKSkKKyAgICAgICAgICAgICAgICAgICAgZiA9IF9vcGVuKGZ1bGxwYXRoKQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZi5yZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNhc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gc3RyaW5nbG93ZXIodGV4dCkKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIGZpbGVoaXRzID0gX21hdGNoKHRleHQsIHBhdHRlcm5zLCBhbGwpCisgICAgICAgICAgICAgICAgICAgIGlmIGZpbGVoaXRzOgorICAgICAgICAgICAgICAgICAgICAgICAgaGl0c1tmdWxscGF0aF0gPSBmaWxlaGl0cworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKyAgICAgICAgICAgIHN0YXR1cy5jbG9zZSgpCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICBwYXNzCisgICAgaGl0cyA9IGhpdHMuaXRlbXMoKQorICAgIGhpdHMuc29ydCgpCisgICAgcmV0dXJuIGhpdHMKIAogCiBjbGFzcyBQeURvY1NlYXJjaDoKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCXByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKLQkJdHJ5OgotCQkJKGRvY3BhdGgsIGtpbmQsIGNhc2UsIHdvcmQsIHR1dCwgbGliLCByZWYsIGV4dCwgYXBpKSA9IHByZWZzLmRvY3NlYXJjaGVuZ2luZQotCQlleGNlcHQ6Ci0JCQkoZG9jcGF0aCwga2luZCwgY2FzZSwgd29yZCwgdHV0LCBsaWIsIHJlZiwgZXh0LCBhcGkpID0gcHJlZnMuZG9jc2VhcmNoZW5naW5lID0gXAotCQkJCSgiIiwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMCkKLQkJCi0JCWlmIGRvY3BhdGggYW5kIG5vdCB2ZXJpZnlkb2NwYXRoKGRvY3BhdGgpOgotCQkJZG9jcGF0aCA9ICIiCi0JCQotCQlzZWxmLncgPSBXLldpbmRvdygoNDAwLCAyMDApLCAiU2VhcmNoIHRoZSBQeXRob24gRG9jdW1lbnRhdGlvbiIpCi0JCXNlbGYudy5zZWFyY2h0ZXh0ID0gVy5FZGl0VGV4dCgoMTAsIDEwLCAtMTAwLCAyMCksIGNhbGxiYWNrID0gc2VsZi5jaGVja2J1dHRvbnMpCi0JCXNlbGYudy5zZWFyY2hidXR0b24gPSBXLkJ1dHRvbigoLTkwLCAxMiwgODAsIDE2KSwgIlNlYXJjaCIsIHNlbGYuc2VhcmNoKQotCQlidXR0b25zID0gW10KLQkJCi0JCWd1dHRlciA9IDEwCi0JCXdpZHRoID0gMTMwCi0JCWJvb2tzdGFydCA9IHdpZHRoICsgMiAqIGd1dHRlcgotCQlzZWxmLncucGhyYXNlcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCgxMCwgMzgsIHdpZHRoLCAxNiksICJBcyBhIHBocmFzZSIsIGJ1dHRvbnMpCi0JCXNlbGYudy5hbGx3b3Jkc3JhZGlvID0gVy5SYWRpb0J1dHRvbigoMTAsIDU4LCB3aWR0aCwgMTYpLCAiQWxsIHdvcmRzIiwgYnV0dG9ucykKLQkJc2VsZi53LmFueXdvcmRzcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCgxMCwgNzgsIHdpZHRoLCAxNiksICJBbnkgd29yZCIsIGJ1dHRvbnMpCi0JCXNlbGYudy5jYXNlc2VucyA9IFcuQ2hlY2tCb3goKDEwLCA5OCwgd2lkdGgsIDE2KSwgIkNhc2Ugc2Vuc2l0aXZlIikKLQkJc2VsZi53Lndob2xld29yZHMgPSBXLkNoZWNrQm94KCgxMCwgMTE4LCB3aWR0aCwgMTYpLCAiV2hvbGUgd29yZHMiKQotCQlzZWxmLncudHV0b3JpYWwgPSBXLkNoZWNrQm94KChib29rc3RhcnQsIDM4LCAtMTAsIDE2KSwgIlR1dG9yaWFsIikKLQkJc2VsZi53LmxpYnJhcnkgPSBXLkNoZWNrQm94KChib29rc3RhcnQsIDU4LCAtMTAsIDE2KSwgIkxpYnJhcnkgcmVmZXJlbmNlIikKLQkJc2VsZi53Lmxhbmd1ZXJlZiA9IFcuQ2hlY2tCb3goKGJvb2tzdGFydCwgNzgsIC0xMCwgMTYpLCAiTGFudWFnZSByZWZlcmVuY2UgbWFudWFsIikKLQkJc2VsZi53LmV4dGVuZGluZyA9IFcuQ2hlY2tCb3goKGJvb2tzdGFydCwgOTgsIC0xMCwgMTYpLCAiRXh0ZW5kaW5nICYgZW1iZWRkaW5nIikKLQkJc2VsZi53LmFwaSA9IFcuQ2hlY2tCb3goKGJvb2tzdGFydCwgMTE4LCAtMTAsIDE2KSwgIkMvQysrIEFQSSIpCi0JCQotCQlzZWxmLncuc2V0ZG9jZm9sZGVyYnV0dG9uID0gVy5CdXR0b24oKDEwLCAtMzAsIDEwMCwgMTYpLCAiU2V0IGRvYyBmb2xkZXIiLCBzZWxmLnNldGRvY3BhdGgpCi0JCQotCQlpZiBkb2NwYXRoOgotCQkJc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53LnNlYXJjaGJ1dHRvbikKLQkJZWxzZToKLQkJCXNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5zZXRkb2Nmb2xkZXJidXR0b24pCi0JCQotCQlzZWxmLmRvY3BhdGggPSBkb2NwYXRoCi0JCWlmIG5vdCBkb2NwYXRoOgotCQkJZG9jcGF0aCA9ICIocGxlYXNlIHNlbGVjdCB0aGUgUHl0aG9uIGh0bWwgZG9jdW1lbnRhdGlvbiBmb2xkZXIpIgotCQlzZWxmLncuZG9jZm9sZGVyID0gVy5UZXh0Qm94KCgxMjAsIC0yOCwgLTEwLCAxNiksIGRvY3BhdGgpCi0JCQotCQlbc2VsZi53LnBocmFzZXJhZGlvLCBzZWxmLncuYWxsd29yZHNyYWRpbywgc2VsZi53LmFueXdvcmRzcmFkaW9dW2tpbmRdLnNldCgxKQotCQkKLQkJc2VsZi53LmNhc2VzZW5zLnNldChjYXNlKQotCQlzZWxmLncud2hvbGV3b3Jkcy5zZXQod29yZCkKLQkJc2VsZi53LnR1dG9yaWFsLnNldCh0dXQpCi0JCXNlbGYudy5saWJyYXJ5LnNldChsaWIpCi0JCXNlbGYudy5sYW5ndWVyZWYuc2V0KHJlZikKLQkJc2VsZi53LmV4dGVuZGluZy5zZXQoZXh0KQotCQlzZWxmLncuYXBpLnNldChhcGkpCi0JCQotCQlzZWxmLncub3BlbigpCi0JCXNlbGYudy53aG9sZXdvcmRzLmVuYWJsZSgwKQotCQlzZWxmLncuYmluZCgnPGNsb3NlPicsIHNlbGYuY2xvc2UpCi0JCXNlbGYudy5zZWFyY2hidXR0b24uZW5hYmxlKDApCi0JCi0JZGVmIHNlYXJjaChzZWxmKToKLQkJaGl0cyA9IGRvc2VhcmNoKHNlbGYuZG9jcGF0aCwgc2VsZi53LnNlYXJjaHRleHQuZ2V0KCksIHNlbGYuZ2V0c2V0dGluZ3MoKSkKLQkJaWYgaGl0czoKLQkJCVJlc3VsdHMoaGl0cykKLQkJZWxpZiBoYXNhdHRyKE1hY09TLCAnU3lzQmVlcCcpOgotCQkJTWFjT1MuU3lzQmVlcCgwKQotCQotCWRlZiBzZXRkb2NwYXRoKHNlbGYpOgotCQlkb2NwYXRoID0gRWFzeURpYWxvZ3MuQXNrRm9sZGVyKCkKLQkJaWYgZG9jcGF0aDoKLQkJCWlmIG5vdCB2ZXJpZnlkb2NwYXRoKGRvY3BhdGgpOgotCQkJCVcuTWVzc2FnZSgiVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgUHl0aG9uIGRvY3VtZW50YXRpb24gZm9sZGVyLi4uIikKLQkJCWVsc2U6Ci0JCQkJc2VsZi5kb2NwYXRoID0gZG9jcGF0aAotCQkJCXNlbGYudy5kb2Nmb2xkZXIuc2V0KGRvY3BhdGgpCi0JCQkJc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53LnNlYXJjaGJ1dHRvbikKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKLQkJcHJlZnMuZG9jc2VhcmNoZW5naW5lID0gc2VsZi5nZXRzZXR0aW5ncygpCi0JCi0JZGVmIGdldHNldHRpbmdzKHNlbGYpOgotCQlyYWRpb2J1dHRvbnMgPSBbc2VsZi53LnBocmFzZXJhZGlvLCBzZWxmLncuYWxsd29yZHNyYWRpbywgc2VsZi53LmFueXdvcmRzcmFkaW9dCi0JCWZvciBpIGluIHJhbmdlKDMpOgotCQkJaWYgcmFkaW9idXR0b25zW2ldLmdldCgpOgotCQkJCWtpbmQgPSBpCi0JCQkJYnJlYWsKLQkJZG9jcGF0aCA9IHNlbGYuZG9jcGF0aAotCQljYXNlID0gc2VsZi53LmNhc2VzZW5zLmdldCgpCi0JCXdvcmQgPSBzZWxmLncud2hvbGV3b3Jkcy5nZXQoKQotCQl0dXQgPSBzZWxmLncudHV0b3JpYWwuZ2V0KCkKLQkJbGliID0gc2VsZi53LmxpYnJhcnkuZ2V0KCkKLQkJcmVmID0gc2VsZi53Lmxhbmd1ZXJlZi5nZXQoKQotCQlleHQgPSBzZWxmLncuZXh0ZW5kaW5nLmdldCgpCi0JCWFwaSA9IHNlbGYudy5hcGkuZ2V0KCkKLQkJcmV0dXJuIChkb2NwYXRoLCBraW5kLCBjYXNlLCB3b3JkLCB0dXQsIGxpYiwgcmVmLCBleHQsIGFwaSkKLQkKLQlkZWYgY2hlY2tidXR0b25zKHNlbGYpOgotCQlzZWxmLncuc2VhcmNoYnV0dG9uLmVuYWJsZShub3Qgbm90IHNlbGYudy5zZWFyY2h0ZXh0LmdldCgpKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIChkb2NwYXRoLCBraW5kLCBjYXNlLCB3b3JkLCB0dXQsIGxpYiwgcmVmLCBleHQsIGFwaSkgPSBwcmVmcy5kb2NzZWFyY2hlbmdpbmUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgKGRvY3BhdGgsIGtpbmQsIGNhc2UsIHdvcmQsIHR1dCwgbGliLCByZWYsIGV4dCwgYXBpKSA9IHByZWZzLmRvY3NlYXJjaGVuZ2luZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgKCIiLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwKQorCisgICAgICAgIGlmIGRvY3BhdGggYW5kIG5vdCB2ZXJpZnlkb2NwYXRoKGRvY3BhdGgpOgorICAgICAgICAgICAgZG9jcGF0aCA9ICIiCisKKyAgICAgICAgc2VsZi53ID0gVy5XaW5kb3coKDQwMCwgMjAwKSwgIlNlYXJjaCB0aGUgUHl0aG9uIERvY3VtZW50YXRpb24iKQorICAgICAgICBzZWxmLncuc2VhcmNodGV4dCA9IFcuRWRpdFRleHQoKDEwLCAxMCwgLTEwMCwgMjApLCBjYWxsYmFjayA9IHNlbGYuY2hlY2tidXR0b25zKQorICAgICAgICBzZWxmLncuc2VhcmNoYnV0dG9uID0gVy5CdXR0b24oKC05MCwgMTIsIDgwLCAxNiksICJTZWFyY2giLCBzZWxmLnNlYXJjaCkKKyAgICAgICAgYnV0dG9ucyA9IFtdCisKKyAgICAgICAgZ3V0dGVyID0gMTAKKyAgICAgICAgd2lkdGggPSAxMzAKKyAgICAgICAgYm9va3N0YXJ0ID0gd2lkdGggKyAyICogZ3V0dGVyCisgICAgICAgIHNlbGYudy5waHJhc2VyYWRpbyA9IFcuUmFkaW9CdXR0b24oKDEwLCAzOCwgd2lkdGgsIDE2KSwgIkFzIGEgcGhyYXNlIiwgYnV0dG9ucykKKyAgICAgICAgc2VsZi53LmFsbHdvcmRzcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCgxMCwgNTgsIHdpZHRoLCAxNiksICJBbGwgd29yZHMiLCBidXR0b25zKQorICAgICAgICBzZWxmLncuYW55d29yZHNyYWRpbyA9IFcuUmFkaW9CdXR0b24oKDEwLCA3OCwgd2lkdGgsIDE2KSwgIkFueSB3b3JkIiwgYnV0dG9ucykKKyAgICAgICAgc2VsZi53LmNhc2VzZW5zID0gVy5DaGVja0JveCgoMTAsIDk4LCB3aWR0aCwgMTYpLCAiQ2FzZSBzZW5zaXRpdmUiKQorICAgICAgICBzZWxmLncud2hvbGV3b3JkcyA9IFcuQ2hlY2tCb3goKDEwLCAxMTgsIHdpZHRoLCAxNiksICJXaG9sZSB3b3JkcyIpCisgICAgICAgIHNlbGYudy50dXRvcmlhbCA9IFcuQ2hlY2tCb3goKGJvb2tzdGFydCwgMzgsIC0xMCwgMTYpLCAiVHV0b3JpYWwiKQorICAgICAgICBzZWxmLncubGlicmFyeSA9IFcuQ2hlY2tCb3goKGJvb2tzdGFydCwgNTgsIC0xMCwgMTYpLCAiTGlicmFyeSByZWZlcmVuY2UiKQorICAgICAgICBzZWxmLncubGFuZ3VlcmVmID0gVy5DaGVja0JveCgoYm9va3N0YXJ0LCA3OCwgLTEwLCAxNiksICJMYW51YWdlIHJlZmVyZW5jZSBtYW51YWwiKQorICAgICAgICBzZWxmLncuZXh0ZW5kaW5nID0gVy5DaGVja0JveCgoYm9va3N0YXJ0LCA5OCwgLTEwLCAxNiksICJFeHRlbmRpbmcgJiBlbWJlZGRpbmciKQorICAgICAgICBzZWxmLncuYXBpID0gVy5DaGVja0JveCgoYm9va3N0YXJ0LCAxMTgsIC0xMCwgMTYpLCAiQy9DKysgQVBJIikKKworICAgICAgICBzZWxmLncuc2V0ZG9jZm9sZGVyYnV0dG9uID0gVy5CdXR0b24oKDEwLCAtMzAsIDEwMCwgMTYpLCAiU2V0IGRvYyBmb2xkZXIiLCBzZWxmLnNldGRvY3BhdGgpCisKKyAgICAgICAgaWYgZG9jcGF0aDoKKyAgICAgICAgICAgIHNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5zZWFyY2hidXR0b24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLncuc2V0ZG9jZm9sZGVyYnV0dG9uKQorCisgICAgICAgIHNlbGYuZG9jcGF0aCA9IGRvY3BhdGgKKyAgICAgICAgaWYgbm90IGRvY3BhdGg6CisgICAgICAgICAgICBkb2NwYXRoID0gIihwbGVhc2Ugc2VsZWN0IHRoZSBQeXRob24gaHRtbCBkb2N1bWVudGF0aW9uIGZvbGRlcikiCisgICAgICAgIHNlbGYudy5kb2Nmb2xkZXIgPSBXLlRleHRCb3goKDEyMCwgLTI4LCAtMTAsIDE2KSwgZG9jcGF0aCkKKworICAgICAgICBbc2VsZi53LnBocmFzZXJhZGlvLCBzZWxmLncuYWxsd29yZHNyYWRpbywgc2VsZi53LmFueXdvcmRzcmFkaW9dW2tpbmRdLnNldCgxKQorCisgICAgICAgIHNlbGYudy5jYXNlc2Vucy5zZXQoY2FzZSkKKyAgICAgICAgc2VsZi53Lndob2xld29yZHMuc2V0KHdvcmQpCisgICAgICAgIHNlbGYudy50dXRvcmlhbC5zZXQodHV0KQorICAgICAgICBzZWxmLncubGlicmFyeS5zZXQobGliKQorICAgICAgICBzZWxmLncubGFuZ3VlcmVmLnNldChyZWYpCisgICAgICAgIHNlbGYudy5leHRlbmRpbmcuc2V0KGV4dCkKKyAgICAgICAgc2VsZi53LmFwaS5zZXQoYXBpKQorCisgICAgICAgIHNlbGYudy5vcGVuKCkKKyAgICAgICAgc2VsZi53Lndob2xld29yZHMuZW5hYmxlKDApCisgICAgICAgIHNlbGYudy5iaW5kKCc8Y2xvc2U+Jywgc2VsZi5jbG9zZSkKKyAgICAgICAgc2VsZi53LnNlYXJjaGJ1dHRvbi5lbmFibGUoMCkKKworICAgIGRlZiBzZWFyY2goc2VsZik6CisgICAgICAgIGhpdHMgPSBkb3NlYXJjaChzZWxmLmRvY3BhdGgsIHNlbGYudy5zZWFyY2h0ZXh0LmdldCgpLCBzZWxmLmdldHNldHRpbmdzKCkpCisgICAgICAgIGlmIGhpdHM6CisgICAgICAgICAgICBSZXN1bHRzKGhpdHMpCisgICAgICAgIGVsaWYgaGFzYXR0cihNYWNPUywgJ1N5c0JlZXAnKToKKyAgICAgICAgICAgIE1hY09TLlN5c0JlZXAoMCkKKworICAgIGRlZiBzZXRkb2NwYXRoKHNlbGYpOgorICAgICAgICBkb2NwYXRoID0gRWFzeURpYWxvZ3MuQXNrRm9sZGVyKCkKKyAgICAgICAgaWYgZG9jcGF0aDoKKyAgICAgICAgICAgIGlmIG5vdCB2ZXJpZnlkb2NwYXRoKGRvY3BhdGgpOgorICAgICAgICAgICAgICAgIFcuTWVzc2FnZSgiVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgUHl0aG9uIGRvY3VtZW50YXRpb24gZm9sZGVyLi4uIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5kb2NwYXRoID0gZG9jcGF0aAorICAgICAgICAgICAgICAgIHNlbGYudy5kb2Nmb2xkZXIuc2V0KGRvY3BhdGgpCisgICAgICAgICAgICAgICAgc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53LnNlYXJjaGJ1dHRvbikKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcHJlZnMgPSBNYWNQcmVmcy5HZXRQcmVmcyhXLmdldGFwcGxpY2F0aW9uKCkucHJlZmZpbGVwYXRoKQorICAgICAgICBwcmVmcy5kb2NzZWFyY2hlbmdpbmUgPSBzZWxmLmdldHNldHRpbmdzKCkKKworICAgIGRlZiBnZXRzZXR0aW5ncyhzZWxmKToKKyAgICAgICAgcmFkaW9idXR0b25zID0gW3NlbGYudy5waHJhc2VyYWRpbywgc2VsZi53LmFsbHdvcmRzcmFkaW8sIHNlbGYudy5hbnl3b3Jkc3JhZGlvXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIGlmIHJhZGlvYnV0dG9uc1tpXS5nZXQoKToKKyAgICAgICAgICAgICAgICBraW5kID0gaQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGRvY3BhdGggPSBzZWxmLmRvY3BhdGgKKyAgICAgICAgY2FzZSA9IHNlbGYudy5jYXNlc2Vucy5nZXQoKQorICAgICAgICB3b3JkID0gc2VsZi53Lndob2xld29yZHMuZ2V0KCkKKyAgICAgICAgdHV0ID0gc2VsZi53LnR1dG9yaWFsLmdldCgpCisgICAgICAgIGxpYiA9IHNlbGYudy5saWJyYXJ5LmdldCgpCisgICAgICAgIHJlZiA9IHNlbGYudy5sYW5ndWVyZWYuZ2V0KCkKKyAgICAgICAgZXh0ID0gc2VsZi53LmV4dGVuZGluZy5nZXQoKQorICAgICAgICBhcGkgPSBzZWxmLncuYXBpLmdldCgpCisgICAgICAgIHJldHVybiAoZG9jcGF0aCwga2luZCwgY2FzZSwgd29yZCwgdHV0LCBsaWIsIHJlZiwgZXh0LCBhcGkpCisKKyAgICBkZWYgY2hlY2tidXR0b25zKHNlbGYpOgorICAgICAgICBzZWxmLncuc2VhcmNoYnV0dG9uLmVuYWJsZShub3Qgbm90IHNlbGYudy5zZWFyY2h0ZXh0LmdldCgpKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9QeUVkaXQucHkgYi9NYWMvVG9vbHMvSURFL1B5RWRpdC5weQppbmRleCBjZTIyOGZmLi44OGM3MmFjIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1B5RWRpdC5weQorKysgYi9NYWMvVG9vbHMvSURFL1B5RWRpdC5weQpAQCAtMjEsOSArMjEsOSBAQAogc21BbGxTY3JpcHRzID0gLTMKIAogaWYgaGFzYXR0cihXaW4sICJGcm9udE5vbkZsb2F0aW5nV2luZG93Iik6Ci0JTXlGcm9udFdpbmRvdyA9IFdpbi5Gcm9udE5vbkZsb2F0aW5nV2luZG93CisgICAgTXlGcm9udFdpbmRvdyA9IFdpbi5Gcm9udE5vbkZsb2F0aW5nV2luZG93CiBlbHNlOgotCU15RnJvbnRXaW5kb3cgPSBXaW4uRnJvbnRXaW5kb3cKKyAgICBNeUZyb250V2luZG93ID0gV2luLkZyb250V2luZG93CiAKIAogX3NjcmlwdHVudGl0bGVkY291bnRlciA9IDEKQEAgLTM1LDEzMjggKzM1LDEzMjggQEAKIAogCiBjbGFzcyBFZGl0b3IoVy5XaW5kb3cpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwYXRoID0gIiIsIHRpdGxlID0gIiIpOgotCQlkZWZhdWx0Zm9udHNldHRpbmdzLCBkZWZhdWx0dGFic2V0dGluZ3MsIGRlZmF1bHR3aW5kb3dzaXplID0gZ2V0ZWRpdG9ycHJlZnMoKQotCQlnbG9iYWwgX3NjcmlwdHVudGl0bGVkY291bnRlcgotCQlpZiBub3QgcGF0aDoKLQkJCWlmIHRpdGxlOgotCQkJCXNlbGYudGl0bGUgPSB0aXRsZQotCQkJZWxzZToKLQkJCQlzZWxmLnRpdGxlID0gIlVudGl0bGVkIFNjcmlwdCAlciIgJSAoX3NjcmlwdHVudGl0bGVkY291bnRlciwpCi0JCQkJX3NjcmlwdHVudGl0bGVkY291bnRlciA9IF9zY3JpcHR1bnRpdGxlZGNvdW50ZXIgKyAxCi0JCQl0ZXh0ID0gIiIKLQkJCXNlbGYuX2NyZWF0b3IgPSBXLl9zaWduYXR1cmUKLQkJCXNlbGYuX2VvbG4gPSBvcy5saW5lc2VwCi0JCWVsaWYgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0JCQlwYXRoID0gcmVzb2x2ZWFsaWFzZXMocGF0aCkKLQkJCWRpciwgbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKLQkJCXNlbGYudGl0bGUgPSBuYW1lCi0JCQlmID0gb3BlbihwYXRoLCAicmIiKQotCQkJdGV4dCA9IGYucmVhZCgpCi0JCQlmLmNsb3NlKCkKLQkJCXNlbGYuX2NyZWF0b3IsIGZpbGV0eXBlID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUocGF0aCkKLQkJCXNlbGYuYWRkcmVjZW50ZmlsZShwYXRoKQotCQkJaWYgJ1xuJyBpbiB0ZXh0OgotCQkJCWlmIHN0cmluZy5maW5kKHRleHQsICdcclxuJykgPj0gMDoKLQkJCQkJc2VsZi5fZW9sbiA9ICdcclxuJwotCQkJCWVsc2U6Ci0JCQkJCXNlbGYuX2VvbG4gPSAnXG4nCi0JCQkJdGV4dCA9IHN0cmluZy5yZXBsYWNlKHRleHQsIHNlbGYuX2VvbG4sICdccicpCi0JCQllbHNlOgotCQkJCXNlbGYuX2VvbG4gPSAnXHInCi0JCWVsc2U6Ci0JCQlyYWlzZSBJT0Vycm9yLCAiZmlsZSAnJXMnIGRvZXMgbm90IGV4aXN0IiAlIHBhdGgKLQkJc2VsZi5wYXRoID0gcGF0aAotCQkKLQkJc2VsZi5zZXR0aW5ncyA9IHt9Ci0JCWlmIHNlbGYucGF0aDoKLQkJCXNlbGYucmVhZHdpbmRvd3NldHRpbmdzKCkKLQkJaWYgc2VsZi5zZXR0aW5ncy5oYXNfa2V5KCJ3aW5kb3dib3VuZHMiKToKLQkJCWJvdW5kcyA9IHNlbGYuc2V0dGluZ3NbIndpbmRvd2JvdW5kcyJdCi0JCWVsc2U6Ci0JCQlib3VuZHMgPSBkZWZhdWx0d2luZG93c2l6ZQotCQlpZiBzZWxmLnNldHRpbmdzLmhhc19rZXkoImZvbnRzZXR0aW5ncyIpOgotCQkJc2VsZi5mb250c2V0dGluZ3MgPSBzZWxmLnNldHRpbmdzWyJmb250c2V0dGluZ3MiXQotCQllbHNlOgotCQkJc2VsZi5mb250c2V0dGluZ3MgPSBkZWZhdWx0Zm9udHNldHRpbmdzCi0JCWlmIHNlbGYuc2V0dGluZ3MuaGFzX2tleSgidGFic2l6ZSIpOgotCQkJdHJ5OgotCQkJCXNlbGYudGFic2V0dGluZ3MgPSAodGFic2l6ZSwgdGFibW9kZSkgPSBzZWxmLnNldHRpbmdzWyJ0YWJzaXplIl0KLQkJCWV4Y2VwdDoKLQkJCQlzZWxmLnRhYnNldHRpbmdzID0gZGVmYXVsdHRhYnNldHRpbmdzCi0JCWVsc2U6Ci0JCQlzZWxmLnRhYnNldHRpbmdzID0gZGVmYXVsdHRhYnNldHRpbmdzCi0JCQotCQlXLldpbmRvdy5fX2luaXRfXyhzZWxmLCBib3VuZHMsIHNlbGYudGl0bGUsIG1pbnNpemUgPSAoMzMwLCAxMjApLCB0YWJiYWJsZSA9IDApCi0JCXNlbGYuc2V0dXB3aWRnZXRzKHRleHQpCi0JCQotCQlpZiBzZWxmLnNldHRpbmdzLmhhc19rZXkoInNlbGVjdGlvbiIpOgotCQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYuc2V0dGluZ3NbInNlbGVjdGlvbiJdCi0JCQlzZWxmLnNldHNlbGVjdGlvbihzZWxzdGFydCwgc2VsZW5kKQotCQlzZWxmLm9wZW4oKQotCQlzZWxmLnNldGluZm90ZXh0KCkKLQkJc2VsZi5nbG9iYWxzID0ge30KLQkJc2VsZi5fYnVmID0gIiIgICMgZm9yIHdyaXRlIG1ldGhvZAotCQlzZWxmLmRlYnVnZ2luZyA9IDAKLQkJc2VsZi5wcm9maWxpbmcgPSAwCi0JCXNlbGYucnVuX2FzX21haW4gPSBzZWxmLnNldHRpbmdzLmdldCgicnVuX2FzX21haW4iLCAwKQotCQlzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyID0gc2VsZi5zZXR0aW5ncy5nZXQoInJ1bl93aXRoX2ludGVycHJldGVyIiwgMCkKLQkJc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlciA9IHNlbGYuc2V0dGluZ3MuZ2V0KCJydW5fd2l0aF9jbF9pbnRlcnByZXRlciIsIDApCi0JCi0JZGVmIHJlYWR3aW5kb3dzZXR0aW5ncyhzZWxmKToKLQkJdHJ5OgotCQkJcmVzcmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMSkKLQkJZXhjZXB0IFJlcy5FcnJvcjoKLQkJCXJldHVybgotCQl0cnk6Ci0JCQlSZXMuVXNlUmVzRmlsZShyZXNyZWYpCi0JCQlkYXRhID0gUmVzLkdldDFSZXNvdXJjZSgnUHlXUycsIDEyOCkKLQkJCXNlbGYuc2V0dGluZ3MgPSBtYXJzaGFsLmxvYWRzKGRhdGEuZGF0YSkKLQkJZXhjZXB0OgotCQkJcGFzcwotCQlSZXMuQ2xvc2VSZXNGaWxlKHJlc3JlZikKLQkJCi0JZGVmIHdyaXRld2luZG93c2V0dGluZ3Moc2VsZik6Ci0JCXRyeToKLQkJCXJlc3JlZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDMpCi0JCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQlSZXMuRlNwQ3JlYXRlUmVzRmlsZShzZWxmLnBhdGgsIHNlbGYuX2NyZWF0b3IsICdURVhUJywgc21BbGxTY3JpcHRzKQotCQkJcmVzcmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMykKLQkJdHJ5OgotCQkJZGF0YSA9IFJlcy5SZXNvdXJjZShtYXJzaGFsLmR1bXBzKHNlbGYuc2V0dGluZ3MpKQotCQkJUmVzLlVzZVJlc0ZpbGUocmVzcmVmKQotCQkJdHJ5OgotCQkJCXRlbXAgPSBSZXMuR2V0MVJlc291cmNlKCdQeVdTJywgMTI4KQotCQkJCXRlbXAuUmVtb3ZlUmVzb3VyY2UoKQotCQkJZXhjZXB0IFJlcy5FcnJvcjoKLQkJCQlwYXNzCi0JCQlkYXRhLkFkZFJlc291cmNlKCdQeVdTJywgMTI4LCAid2luZG93IHNldHRpbmdzIikKLQkJZmluYWxseToKLQkJCVJlcy5VcGRhdGVSZXNGaWxlKHJlc3JlZikKLQkJCVJlcy5DbG9zZVJlc0ZpbGUocmVzcmVmKQotCQotCWRlZiBnZXRzZXR0aW5ncyhzZWxmKToKLQkJc2VsZi5zZXR0aW5ncyA9IHt9Ci0JCXNlbGYuc2V0dGluZ3NbIndpbmRvd2JvdW5kcyJdID0gc2VsZi5nZXRib3VuZHMoKQotCQlzZWxmLnNldHRpbmdzWyJzZWxlY3Rpb24iXSA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJc2VsZi5zZXR0aW5nc1siZm9udHNldHRpbmdzIl0gPSBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0Zm9udHNldHRpbmdzKCkKLQkJc2VsZi5zZXR0aW5nc1sidGFic2l6ZSJdID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldHRhYnNldHRpbmdzKCkKLQkJc2VsZi5zZXR0aW5nc1sicnVuX2FzX21haW4iXSA9IHNlbGYucnVuX2FzX21haW4KLQkJc2VsZi5zZXR0aW5nc1sicnVuX3dpdGhfaW50ZXJwcmV0ZXIiXSA9IHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIKLQkJc2VsZi5zZXR0aW5nc1sicnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIiXSA9IHNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIKLQkKLQlkZWYgZ2V0KHNlbGYpOgotCQlyZXR1cm4gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldCgpCi0JCi0JZGVmIGdldHNlbGVjdGlvbihzZWxmKToKLQkJcmV0dXJuIHNlbGYuZWRpdGdyb3VwLmVkaXRvci50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQotCWRlZiBzZXRzZWxlY3Rpb24oc2VsZiwgc2Vsc3RhcnQsIHNlbGVuZCk6Ci0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZXRzZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbGVuZCkKLQkJCi0JZGVmIGdldHNlbGVjdGVkdGV4dChzZWxmKToKLQkJcmV0dXJuIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXRzZWxlY3RlZHRleHQoKQotCQotCWRlZiBnZXRmaWxlbmFtZShzZWxmKToKLQkJaWYgc2VsZi5wYXRoOgotCQkJcmV0dXJuIHNlbGYucGF0aAotCQlyZXR1cm4gJzwlcz4nICUgc2VsZi50aXRsZQotCQotCWRlZiBzZXR1cHdpZGdldHMoc2VsZiwgdGV4dCk6Ci0JCXRvcGJhcmhlaWdodCA9IDI0Ci0JCXBvcGZpZWxkd2lkdGggPSA4MAotCQlzZWxmLmxhc3RsaW5lbm8gPSBOb25lCi0JCQotCQkjIG1ha2UgYW4gZWRpdG9yCi0JCXNlbGYuZWRpdGdyb3VwID0gVy5Hcm91cCgoMCwgdG9wYmFyaGVpZ2h0ICsgMSwgMCwgMCkpCi0JCWVkaXRvciA9IFcuUHlFZGl0b3IoKDAsIDAsIC0xNSwtMTUpLCB0ZXh0LCAKLQkJCQlmb250c2V0dGluZ3MgPSBzZWxmLmZvbnRzZXR0aW5ncywgCi0JCQkJdGFic2V0dGluZ3MgPSBzZWxmLnRhYnNldHRpbmdzLAotCQkJCWZpbGUgPSBzZWxmLmdldGZpbGVuYW1lKCkpCi0JCQotCQkjIG1ha2UgdGhlIHdpZGdldHMKLQkJc2VsZi5wb3BmaWVsZCA9IENsYXNzRmluZGVyKChwb3BmaWVsZHdpZHRoIC0gMTcsIC0xNSwgMTYsIDE2KSwgW10sIHNlbGYucG9wc2VsZWN0bGluZSkKLQkJc2VsZi5saW5lZmllbGQgPSBXLkVkaXRUZXh0KCgtMSwgLTE1LCBwb3BmaWVsZHdpZHRoIC0gMTUsIDE2KSwgaW5zZXQgPSAoNiwgMSkpCi0JCXNlbGYuZWRpdGdyb3VwLl9iYXJ4ID0gVy5TY3JvbGxiYXIoKHBvcGZpZWxkd2lkdGggLSAyLCAtMTUsIC0xNCwgMTYpLCBlZGl0b3IuaHNjcm9sbCwgbWF4ID0gMzI3NjcpCi0JCXNlbGYuZWRpdGdyb3VwLl9iYXJ5ID0gVy5TY3JvbGxiYXIoKC0xNSwgMTQsIDE2LCAtMTQpLCBlZGl0b3IudnNjcm9sbCwgbWF4ID0gMzI3NjcpCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvciA9IGVkaXRvcgkjIGFkZCBlZGl0b3IgKmFmdGVyKiBzY3JvbGxiYXJzCi0JCQotCQlzZWxmLmVkaXRncm91cC5vcHRpb25zbWVudSA9IFcuUG9wdXBNZW51KCgtMTUsIC0xLCAxNiwgMTYpLCBbXSkKLQkJc2VsZi5lZGl0Z3JvdXAub3B0aW9uc21lbnUuYmluZCgnPGNsaWNrPicsIHNlbGYubWFrZW9wdGlvbnNtZW51KQotCQkKLQkJc2VsZi5iZXZlbGJveCA9IFcuQmV2ZWxCb3goKDAsIDAsIDAsIHRvcGJhcmhlaWdodCkpCi0JCXNlbGYuaGxpbmUgPSBXLkhvcml6b250YWxMaW5lKCgwLCB0b3BiYXJoZWlnaHQsIDAsIDApKQotCQlzZWxmLmluZm90ZXh0ID0gVy5UZXh0Qm94KCgxNzUsIDYsIC00LCAxNCksIGJhY2tncm91bmRjb2xvciA9ICgweGUwMDAsIDB4ZTAwMCwgMHhlMDAwKSkKLQkJc2VsZi5ydW5idXR0b24gPSBXLkJldmVsQnV0dG9uKCg2LCA0LCA4MCwgMTYpLCBydW5CdXR0b25MYWJlbHNbMF0sIHNlbGYucnVuKQotCQlzZWxmLnJ1bnNlbGJ1dHRvbiA9IFcuQmV2ZWxCdXR0b24oKDkwLCA0LCA4MCwgMTYpLCBydW5TZWxCdXR0b25MYWJlbHNbMF0sIHNlbGYucnVuc2VsZWN0aW9uKQotCQkKLQkJIyBiaW5kIHNvbWUga2V5cwotCQllZGl0b3IuYmluZCgiY21kciIsIHNlbGYucnVuYnV0dG9uLnB1c2gpCi0JCWVkaXRvci5iaW5kKCJlbnRlciIsIHNlbGYucnVuc2VsYnV0dG9uLnB1c2gpCi0JCWVkaXRvci5iaW5kKCJjbWRqIiwgc2VsZi5kb21lbnVfZ290b2xpbmUpCi0JCWVkaXRvci5iaW5kKCJjbWRkIiwgc2VsZi5kb21lbnVfdG9nZ2xlZGVidWdnZXIpCi0JCWVkaXRvci5iaW5kKCI8aWRsZT4iLCBzZWxmLnVwZGF0ZXNlbGVjdGlvbikKLQkJCi0JCWVkaXRvci5iaW5kKCJjbWRlIiwgc2VhcmNoZW5naW5lLnNldGZpbmRzdHJpbmcpCi0JCWVkaXRvci5iaW5kKCJjbWRmIiwgc2VhcmNoZW5naW5lLnNob3cpCi0JCWVkaXRvci5iaW5kKCJjbWRnIiwgc2VhcmNoZW5naW5lLmZpbmRuZXh0KQotCQllZGl0b3IuYmluZCgiY21kc2hpZnRyIiwgc2VhcmNoZW5naW5lLnJlcGxhY2UpCi0JCWVkaXRvci5iaW5kKCJjbWR0Iiwgc2VhcmNoZW5naW5lLnJlcGxhY2VmaW5kKQotCQkKLQkJc2VsZi5saW5lZmllbGQuYmluZCgicmV0dXJuIiwgc2VsZi5kb2xpbmVmaWVsZCkKLQkJc2VsZi5saW5lZmllbGQuYmluZCgiZW50ZXIiLCBzZWxmLmRvbGluZWZpZWxkKQotCQlzZWxmLmxpbmVmaWVsZC5iaW5kKCJ0YWIiLCBzZWxmLmRvbGluZWZpZWxkKQotCQkKLQkJIyBpbnRlcmNlcHQgY2xpY2tzCi0JCWVkaXRvci5iaW5kKCI8Y2xpY2s+Iiwgc2VsZi5jbGlja2VkaXRvcikKLQkJc2VsZi5saW5lZmllbGQuYmluZCgiPGNsaWNrPiIsIHNlbGYuY2xpY2tsaW5lZmllbGQpCi0JCi0JZGVmIG1ha2VvcHRpb25zbWVudShzZWxmKToKLQkJbWVudWl0ZW1zID0gWygnRm9udCBzZXR0aW5nc1x4YzknLCBzZWxmLmRvbWVudV9mb250c2V0dGluZ3MpLCAKLQkJCQkoIlNhdmUgb3B0aW9uc1x4YzkiLCBzZWxmLmRvbWVudV9vcHRpb25zKSwKLQkJCQknLScsCi0JCQkJKCdcMCcgKyBjaHIoc2VsZi5ydW5fYXNfbWFpbikgKyAnUnVuIGFzIF9fbWFpbl9fJywgc2VsZi5kb21lbnVfdG9nZ2xlX3J1bl9hc19tYWluKSwgCi0JCQkJIygnXDAnICsgY2hyKHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIpICsgJ1J1biB3aXRoIEludGVycHJldGVyJywgc2VsZi5kb21lbnVfZHRvZ2dsZV9ydW5fd2l0aF9pbnRlcnByZXRlciksIAotCQkJCSgnXDAnICsgY2hyKHNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIpICsgJ1J1biB3aXRoIGNvbW1hbmRsaW5lIFB5dGhvbicsIHNlbGYuZG9tZW51X3RvZ2dsZV9ydW5fd2l0aF9jbF9pbnRlcnByZXRlciksIAotCQkJCSctJywKLQkJCQkoJ01vZHVsYXJpemUnLCBzZWxmLmRvbWVudV9tb2R1bGFyaXplKSwKLQkJCQkoJ0Jyb3dzZSBuYW1lc3BhY2VceGM5Jywgc2VsZi5kb21lbnVfYnJvd3NlbmFtZXNwYWNlKSwgCi0JCQkJJy0nXQotCQlpZiBzZWxmLnByb2ZpbGluZzoKLQkJCW1lbnVpdGVtcyA9IG1lbnVpdGVtcyArIFsoJ0Rpc2FibGUgcHJvZmlsZXInLCBzZWxmLmRvbWVudV90b2dnbGVwcm9maWxlcildCi0JCWVsc2U6Ci0JCQltZW51aXRlbXMgPSBtZW51aXRlbXMgKyBbKCdFbmFibGUgcHJvZmlsZXInLCBzZWxmLmRvbWVudV90b2dnbGVwcm9maWxlcildCi0JCWlmIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5fZGVidWdnZXI6Ci0JCQltZW51aXRlbXMgPSBtZW51aXRlbXMgKyBbKCdEaXNhYmxlIGRlYnVnZ2VyJywgc2VsZi5kb21lbnVfdG9nZ2xlZGVidWdnZXIpLAotCQkJCSgnQ2xlYXIgYnJlYWtwb2ludHMnLCBzZWxmLmRvbWVudV9jbGVhcmJyZWFrcG9pbnRzKSwKLQkJCQkoJ0VkaXQgYnJlYWtwb2ludHNceGM5Jywgc2VsZi5kb21lbnVfZWRpdGJyZWFrcG9pbnRzKV0KLQkJZWxzZToKLQkJCW1lbnVpdGVtcyA9IG1lbnVpdGVtcyArIFsoJ0VuYWJsZSBkZWJ1Z2dlcicsIHNlbGYuZG9tZW51X3RvZ2dsZWRlYnVnZ2VyKV0KLQkJc2VsZi5lZGl0Z3JvdXAub3B0aW9uc21lbnUuc2V0KG1lbnVpdGVtcykKLQkKLQlkZWYgZG9tZW51X3RvZ2dsZV9ydW5fYXNfbWFpbihzZWxmKToKLQkJc2VsZi5ydW5fYXNfbWFpbiA9IG5vdCBzZWxmLnJ1bl9hc19tYWluCi0JCXNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIgPSAwCi0JCXNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIgPSAwCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3Rpb25jaGFuZ2VkKCkKLQkKLQlkZWYgWFhkb21lbnVfdG9nZ2xlX3J1bl93aXRoX2ludGVycHJldGVyKHNlbGYpOgotCQlzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyID0gbm90IHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIKLQkJc2VsZi5ydW5fYXNfbWFpbiA9IDAKLQkJc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlciA9IDAKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGlvbmNoYW5nZWQoKQotCQotCWRlZiBkb21lbnVfdG9nZ2xlX3J1bl93aXRoX2NsX2ludGVycHJldGVyKHNlbGYpOgotCQlzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyID0gbm90IHNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIKLQkJc2VsZi5ydW5fYXNfbWFpbiA9IDAKLQkJc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlciA9IDAKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGlvbmNoYW5nZWQoKQotCQotCWRlZiBzaG93YnJlYWtwb2ludHMoc2VsZiwgb25vZmYpOgotCQlzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2hvd2JyZWFrcG9pbnRzKG9ub2ZmKQotCQlzZWxmLmRlYnVnZ2luZyA9IG9ub2ZmCi0JCi0JZGVmIGRvbWVudV9jbGVhcmJyZWFrcG9pbnRzKHNlbGYsICphcmdzKToKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmNsZWFyYnJlYWtwb2ludHMoKQotCQotCWRlZiBkb21lbnVfZWRpdGJyZWFrcG9pbnRzKHNlbGYsICphcmdzKToKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmVkaXRicmVha3BvaW50cygpCi0JCi0JZGVmIGRvbWVudV90b2dnbGVkZWJ1Z2dlcihzZWxmLCAqYXJncyk6Ci0JCWlmIG5vdCBzZWxmLmRlYnVnZ2luZzoKLQkJCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JCXNlbGYuZGVidWdnaW5nID0gbm90IHNlbGYuZGVidWdnaW5nCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci50b2dnbGVicmVha3BvaW50cygpCi0JCQotCWRlZiBkb21lbnVfdG9nZ2xlcHJvZmlsZXIoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLnByb2ZpbGluZyA9IG5vdCBzZWxmLnByb2ZpbGluZwotCQotCWRlZiBkb21lbnVfYnJvd3NlbmFtZXNwYWNlKHNlbGYsICphcmdzKToKLQkJaW1wb3J0IFB5QnJvd3NlciwgVwotCQlXLlNldEN1cnNvcignd2F0Y2gnKQotCQlnbG9iYWxzLCBmaWxlLCBtb2RuYW1lID0gc2VsZi5nZXRlbnZpcm9ubWVudCgpCi0JCWlmIG5vdCBtb2RuYW1lOgotCQkJbW9kbmFtZSA9IHNlbGYudGl0bGUKLQkJUHlCcm93c2VyLkJyb3dzZXIoZ2xvYmFscywgIk9iamVjdCBicm93c2VyOiAiICsgbW9kbmFtZSkKLQkKLQlkZWYgZG9tZW51X21vZHVsYXJpemUoc2VsZiwgKmFyZ3MpOgotCQltb2RuYW1lID0gX2ZpbGVuYW1lX2FzX21vZG5hbWUoc2VsZi50aXRsZSkKLQkJaWYgbm90IG1vZG5hbWU6Ci0JCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBtb2R1bGFyaXplIFwiJXNcIiIgJSBzZWxmLnRpdGxlCi0JCXJ1bl9hc19tYWluID0gc2VsZi5ydW5fYXNfbWFpbgotCQlzZWxmLnJ1bl9hc19tYWluID0gMAotCQlzZWxmLnJ1bigpCi0JCXNlbGYucnVuX2FzX21haW4gPSBydW5fYXNfbWFpbgotCQlpZiBzZWxmLnBhdGg6Ci0JCQlmaWxlID0gc2VsZi5wYXRoCi0JCWVsc2U6Ci0JCQlmaWxlID0gc2VsZi50aXRsZQotCQkKLQkJaWYgc2VsZi5nbG9iYWxzIGFuZCBub3Qgc3lzLm1vZHVsZXMuaGFzX2tleShtb2RuYW1lKToKLQkJCW1vZHVsZSA9IGltcC5uZXdfbW9kdWxlKG1vZG5hbWUpCi0JCQlmb3IgYXR0ciBpbiBzZWxmLmdsb2JhbHMua2V5cygpOgotCQkJCXNldGF0dHIobW9kdWxlLGF0dHIsc2VsZi5nbG9iYWxzW2F0dHJdKQotCQkJc3lzLm1vZHVsZXNbbW9kbmFtZV0gPSBtb2R1bGUKLQkJCXNlbGYuZ2xvYmFscyA9IHt9Ci0JCi0JZGVmIGRvbWVudV9mb250c2V0dGluZ3Moc2VsZiwgKmFyZ3MpOgotCQlpbXBvcnQgRm9udFNldHRpbmdzCi0JCWZvbnRzZXR0aW5ncyA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXRmb250c2V0dGluZ3MoKQotCQl0YWJzZXR0aW5ncyA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXR0YWJzZXR0aW5ncygpCi0JCXNldHRpbmdzID0gRm9udFNldHRpbmdzLkZvbnREaWFsb2coZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncykKLQkJaWYgc2V0dGluZ3M6Ci0JCQlmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gc2V0dGluZ3MKLQkJCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZXRmb250c2V0dGluZ3MoZm9udHNldHRpbmdzKQotCQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNldHRhYnNldHRpbmdzKHRhYnNldHRpbmdzKQotCQotCWRlZiBkb21lbnVfb3B0aW9ucyhzZWxmLCAqYXJncyk6Ci0JCXJ2ID0gU2F2ZU9wdGlvbnMoc2VsZi5fY3JlYXRvciwgc2VsZi5fZW9sbikKLQkJaWYgcnY6Ci0JCQlzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2VsZWN0aW9uY2hhbmdlZCgpICMgb3VjaC4uLgotCQkJc2VsZi5fY3JlYXRvciwgc2VsZi5fZW9sbiA9IHJ2Ci0JCi0JZGVmIGNsaWNrbGluZWZpZWxkKHNlbGYpOgotCQlpZiBzZWxmLl9jdXJyZW50d2lkZ2V0IDw+IHNlbGYubGluZWZpZWxkOgotCQkJc2VsZi5saW5lZmllbGQuc2VsZWN0KDEpCi0JCQlzZWxmLmxpbmVmaWVsZC5zZWxlY3RhbGwoKQotCQkJcmV0dXJuIDEKLQkKLQlkZWYgY2xpY2tlZGl0b3Ioc2VsZik6Ci0JCWlmIHNlbGYuX2N1cnJlbnR3aWRnZXQgPD4gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yOgotCQkJc2VsZi5kb2xpbmVmaWVsZCgpCi0JCQlyZXR1cm4gMQotCQotCWRlZiB1cGRhdGVzZWxlY3Rpb24oc2VsZiwgZm9yY2UgPSAwKToKLQkJc2VsID0gbWluKHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXRzZWxlY3Rpb24oKSkKLQkJbGluZW5vID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLm9mZnNldHRvbGluZShzZWwpCi0JCWlmIGxpbmVubyA8PiBzZWxmLmxhc3RsaW5lbm8gb3IgZm9yY2U6Ci0JCQlzZWxmLmxhc3RsaW5lbm8gPSBsaW5lbm8KLQkJCXNlbGYubGluZWZpZWxkLnNldChzdHIobGluZW5vICsgMSkpCi0JCQlzZWxmLmxpbmVmaWVsZC5zZWx2aWV3KCkKLQkKLQlkZWYgZG9saW5lZmllbGQoc2VsZik6Ci0JCXRyeToKLQkJCWxpbmVubyA9IHN0cmluZy5hdG9pKHNlbGYubGluZWZpZWxkLmdldCgpKSAtIDEKLQkJCWlmIGxpbmVubyA8PiBzZWxmLmxhc3RsaW5lbm86Ci0JCQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGxpbmUobGluZW5vKQotCQkJCXNlbGYudXBkYXRlc2VsZWN0aW9uKDEpCi0JCWV4Y2VwdDoKLQkJCXNlbGYudXBkYXRlc2VsZWN0aW9uKDEpCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3QoMSkKLQkKLQlkZWYgc2V0aW5mb3RleHQoc2VsZik6Ci0JCWlmIG5vdCBoYXNhdHRyKHNlbGYsICdpbmZvdGV4dCcpOgotCQkJcmV0dXJuCi0JCWlmIHNlbGYucGF0aDoKLQkJCXNlbGYuaW5mb3RleHQuc2V0KHNlbGYucGF0aCkKLQkJZWxzZToKLQkJCXNlbGYuaW5mb3RleHQuc2V0KCIiKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmNoYW5nZWQ6Ci0JCQlRZC5Jbml0Q3Vyc29yKCkKLQkJCXNhdmUgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgnU2F2ZSB3aW5kb3cgIiVzIiBiZWZvcmUgY2xvc2luZz8nICUgc2VsZi50aXRsZSwKLQkJCQkJZGVmYXVsdD0xLCBubz0iRG9uXHhkNXQgc2F2ZSIpCi0JCQlpZiBzYXZlID4gMDoKLQkJCQlpZiBzZWxmLmRvbWVudV9zYXZlKCk6Ci0JCQkJCXJldHVybiAxCi0JCQllbGlmIHNhdmUgPCAwOgotCQkJCXJldHVybiAxCi0JCXNlbGYuZ2xvYmFscyA9IE5vbmUKLQkJVy5XaW5kb3cuY2xvc2Uoc2VsZikKLQkKLQlkZWYgZG9tZW51X2Nsb3NlKHNlbGYsICphcmdzKToKLQkJcmV0dXJuIHNlbGYuY2xvc2UoKQotCQotCWRlZiBkb21lbnVfc2F2ZShzZWxmLCAqYXJncyk6Ci0JCWlmIG5vdCBzZWxmLnBhdGg6Ci0JCQkjIFdpbGwgY2FsbCB1cyByZWN1cnNpdmVseQotCQkJcmV0dXJuIHNlbGYuZG9tZW51X3NhdmVfYXMoKQotCQlkYXRhID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldCgpCi0JCWlmIHNlbGYuX2VvbG4gIT0gJ1xyJzoKLQkJCWRhdGEgPSBzdHJpbmcucmVwbGFjZShkYXRhLCAnXHInLCBzZWxmLl9lb2xuKQotCQlmcCA9IG9wZW4oc2VsZi5wYXRoLCAnd2InKSAgIyBvcGVuIGZpbGUgaW4gYmluYXJ5IG1vZGUsIGRhdGEgaGFzICdccicgbGluZS1lbmRpbmdzCi0JCWZwLndyaXRlKGRhdGEpCi0JCWZwLmNsb3NlKCkKLQkJTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUoc2VsZi5wYXRoLCBzZWxmLl9jcmVhdG9yLCAnVEVYVCcpCi0JCXNlbGYuZ2V0c2V0dGluZ3MoKQotCQlzZWxmLndyaXRld2luZG93c2V0dGluZ3MoKQotCQlzZWxmLmVkaXRncm91cC5lZGl0b3IuY2hhbmdlZCA9IDAKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGNoYW5nZWQgPSAwCi0JCWltcG9ydCBsaW5lY2FjaGUKLQkJaWYgbGluZWNhY2hlLmNhY2hlLmhhc19rZXkoc2VsZi5wYXRoKToKLQkJCWRlbCBsaW5lY2FjaGUuY2FjaGVbc2VsZi5wYXRoXQotCQlpbXBvcnQgbWFjb3N0b29scwotCQltYWNvc3Rvb2xzLnRvdWNoZWQoc2VsZi5wYXRoKQotCQlzZWxmLmFkZHJlY2VudGZpbGUoc2VsZi5wYXRoKQotCQotCWRlZiBjYW5fc2F2ZShzZWxmLCBtZW51aXRlbSk6Ci0JCXJldHVybiBzZWxmLmVkaXRncm91cC5lZGl0b3IuY2hhbmdlZCBvciBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2VsY2hhbmdlZAotCQotCWRlZiBkb21lbnVfc2F2ZV9hcyhzZWxmLCAqYXJncyk6Ci0JCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzOicsIHNhdmVkRmlsZU5hbWU9c2VsZi50aXRsZSkKLQkJaWYgbm90IHBhdGg6IAotCQkJcmV0dXJuIDEKLQkJc2VsZi5zaG93YnJlYWtwb2ludHMoMCkKLQkJc2VsZi5wYXRoID0gcGF0aAotCQlzZWxmLnNldGluZm90ZXh0KCkKLQkJc2VsZi50aXRsZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5wYXRoKVstMV0KLQkJc2VsZi53aWQuU2V0V1RpdGxlKHNlbGYudGl0bGUpCi0JCXNlbGYuZG9tZW51X3NhdmUoKQotCQlzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2V0ZmlsZShzZWxmLmdldGZpbGVuYW1lKCkpCi0JCWFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKQotCQlhcHAubWFrZW9wZW53aW5kb3dzbWVudSgpCi0JCWlmIGhhc2F0dHIoYXBwLCAnbWFrZXNjcmlwdHNtZW51Jyk6Ci0JCQlhcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKLQkJCWZzciwgY2hhbmdlZCA9IGFwcC5zY3JpcHRzZm9sZGVyLkZTUmVzb2x2ZUFsaWFzKE5vbmUpCi0JCQlwYXRoID0gZnNyLmFzX3BhdGhuYW1lKCkKLQkJCWlmIHBhdGggPT0gc2VsZi5wYXRoWzpsZW4ocGF0aCldOgotCQkJCVcuZ2V0YXBwbGljYXRpb24oKS5tYWtlc2NyaXB0c21lbnUoKQotCQotCWRlZiBkb21lbnVfc2F2ZV9hc19hcHBsZXQoc2VsZiwgKmFyZ3MpOgotCQlpbXBvcnQgYnVpbGR0b29scwotCQkKLQkJYnVpbGR0b29scy5ERUJVRyA9IDAJIyBvdWNoLgotCQkKLQkJaWYgc2VsZi50aXRsZVstMzpdID09ICIucHkiOgotCQkJZGVzdG5hbWUgPSBzZWxmLnRpdGxlWzotM10KLQkJZWxzZToKLQkJCWRlc3RuYW1lID0gc2VsZi50aXRsZSArICIuYXBwbGV0IgotCQlkZXN0bmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgYXMgQXBwbGV0OicsIAotCQkJc2F2ZWRGaWxlTmFtZT1kZXN0bmFtZSkKLQkJaWYgbm90IGRlc3RuYW1lOiAKLQkJCXJldHVybiAxCi0JCVcuU2V0Q3Vyc29yKCJ3YXRjaCIpCi0JCWlmIHNlbGYucGF0aDoKLQkJCWZpbGVuYW1lID0gc2VsZi5wYXRoCi0JCQlpZiBmaWxlbmFtZVstMzpdID09ICIucHkiOgotCQkJCXJzcmNuYW1lID0gZmlsZW5hbWVbOi0zXSArICcucnNyYycKLQkJCWVsc2U6Ci0JCQkJcnNyY25hbWUgPSBmaWxlbmFtZSArICcucnNyYycKLQkJZWxzZToKLQkJCWZpbGVuYW1lID0gc2VsZi50aXRsZQotCQkJcnNyY25hbWUgPSAiIgotCQkKLQkJcHl0ZXh0ID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldCgpCi0JCXB5dGV4dCA9IHN0cmluZy5zcGxpdChweXRleHQsICdccicpCi0JCXB5dGV4dCA9IHN0cmluZy5qb2luKHB5dGV4dCwgJ1xuJykgKyAnXG4nCi0JCXRyeToKLQkJCWNvZGUgPSBjb21waWxlKHB5dGV4dCwgZmlsZW5hbWUsICJleGVjIikKLQkJZXhjZXB0IChTeW50YXhFcnJvciwgRU9GRXJyb3IpOgotCQkJcmFpc2UgYnVpbGR0b29scy5CdWlsZEVycm9yLCAiU3ludGF4IGVycm9yIGluIHNjcmlwdCAlciIgJSAoZmlsZW5hbWUsKQotCQkJCi0JCWltcG9ydCB0ZW1wZmlsZQotCQl0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKLQkJCi0JCWlmIGZpbGVuYW1lWy0zOl0gIT0gIi5weSI6Ci0JCQlmaWxlbmFtZSA9IGZpbGVuYW1lICsgIi5weSIKLQkJZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXSkKLQkJZnAgPSBvcGVuKGZpbGVuYW1lLCAidyIpCi0JCWZwLndyaXRlKHB5dGV4dCkKLQkJZnAuY2xvc2UoKQotCQkKLQkJIyBUcnkgcmVtb3ZpbmcgdGhlIG91dHB1dCBmaWxlCi0JCXRyeToKLQkJCW9zLnJlbW92ZShkZXN0bmFtZSkKLQkJZXhjZXB0IG9zLmVycm9yOgotCQkJcGFzcwotCQl0ZW1wbGF0ZSA9IGJ1aWxkdG9vbHMuZmluZHRlbXBsYXRlKCkKLQkJYnVpbGR0b29scy5wcm9jZXNzKHRlbXBsYXRlLCBmaWxlbmFtZSwgZGVzdG5hbWUsIDEsIHJzcmNuYW1lPXJzcmNuYW1lLCBwcm9ncmVzcz1Ob25lKQotCQl0cnk6Ci0JCQlvcy5yZW1vdmUoZmlsZW5hbWUpCi0JCQlvcy5ybWRpcih0bXBkaXIpCi0JCWV4Y2VwdCBvcy5lcnJvcjoKLQkJCXBhc3MKLQkKLQlkZWYgZG9tZW51X2dvdG9saW5lKHNlbGYsICphcmdzKToKLQkJc2VsZi5saW5lZmllbGQuc2VsZWN0YWxsKCkKLQkJc2VsZi5saW5lZmllbGQuc2VsZWN0KDEpCi0JCXNlbGYubGluZWZpZWxkLnNlbGVjdGFsbCgpCi0JCi0JZGVmIGRvbWVudV9zZWxlY3RsaW5lKHNlbGYsICphcmdzKToKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmV4cGFuZHNlbGVjdGlvbigpCi0JCi0JZGVmIGRvbWVudV9maW5kKHNlbGYsICphcmdzKToKLQkJc2VhcmNoZW5naW5lLnNob3coKQotCQotCWRlZiBkb21lbnVfZW50ZXJzZWFyY2hzdHJpbmcoc2VsZiwgKmFyZ3MpOgotCQlzZWFyY2hlbmdpbmUuc2V0ZmluZHN0cmluZygpCi0JCi0JZGVmIGRvbWVudV9yZXBsYWNlKHNlbGYsICphcmdzKToKLQkJc2VhcmNoZW5naW5lLnJlcGxhY2UoKQotCQotCWRlZiBkb21lbnVfZmluZG5leHQoc2VsZiwgKmFyZ3MpOgotCQlzZWFyY2hlbmdpbmUuZmluZG5leHQoKQotCQotCWRlZiBkb21lbnVfcmVwbGFjZWZpbmQoc2VsZiwgKmFyZ3MpOgotCQlzZWFyY2hlbmdpbmUucmVwbGFjZWZpbmQoKQotCQotCWRlZiBkb21lbnVfcnVuKHNlbGYsICphcmdzKToKLQkJc2VsZi5ydW5idXR0b24ucHVzaCgpCi0JCi0JZGVmIGRvbWVudV9ydW5zZWxlY3Rpb24oc2VsZiwgKmFyZ3MpOgotCQlzZWxmLnJ1bnNlbGJ1dHRvbi5wdXNoKCkKLQkKLQlkZWYgcnVuKHNlbGYpOgotCQlzZWxmLl9ydW4oKQotCQotCWRlZiBfcnVuKHNlbGYpOgotCQlpZiBzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyOgotCQkJaWYgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmNoYW5nZWQ6Ci0JCQkJUWQuSW5pdEN1cnNvcigpCi0JCQkJc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlICIlcyIgYmVmb3JlIHJ1bm5pbmc/JyAlIHNlbGYudGl0bGUsIDEpCi0JCQkJaWYgc2F2ZSA+IDA6Ci0JCQkJCWlmIHNlbGYuZG9tZW51X3NhdmUoKToKLQkJCQkJCXJldHVybgotCQkJCWVsaWYgc2F2ZSA8IDA6Ci0JCQkJCXJldHVybgotCQkJaWYgbm90IHNlbGYucGF0aDoKLQkJCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBydW4gdW5zYXZlZCBmaWxlIgotCQkJc2VsZi5fcnVuX3dpdGhfaW50ZXJwcmV0ZXIoKQotCQllbGlmIHNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXI6Ci0JCQlpZiBzZWxmLmVkaXRncm91cC5lZGl0b3IuY2hhbmdlZDoKLQkJCQlRZC5Jbml0Q3Vyc29yKCkKLQkJCQlzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgIiVzIiBiZWZvcmUgcnVubmluZz8nICUgc2VsZi50aXRsZSwgMSkKLQkJCQlpZiBzYXZlID4gMDoKLQkJCQkJaWYgc2VsZi5kb21lbnVfc2F2ZSgpOgotCQkJCQkJcmV0dXJuCi0JCQkJZWxpZiBzYXZlIDwgMDoKLQkJCQkJcmV0dXJuCi0JCQlpZiBub3Qgc2VsZi5wYXRoOgotCQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IHJ1biB1bnNhdmVkIGZpbGUiCi0JCQlzZWxmLl9ydW5fd2l0aF9jbF9pbnRlcnByZXRlcigpCi0JCWVsc2U6Ci0JCQlweXRleHQgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0KCkKLQkJCWdsb2JhbHMsIGZpbGUsIG1vZG5hbWUgPSBzZWxmLmdldGVudmlyb25tZW50KCkKLQkJCXNlbGYuZXhlY3N0cmluZyhweXRleHQsIGdsb2JhbHMsIGdsb2JhbHMsIGZpbGUsIG1vZG5hbWUpCi0JCi0JZGVmIF9ydW5fd2l0aF9pbnRlcnByZXRlcihzZWxmKToKLQkJaW50ZXJwX3BhdGggPSBvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAiUHl0aG9uSW50ZXJwcmV0ZXIiKQotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoaW50ZXJwX3BhdGgpOgotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBpbnRlcnByZXRlciIKLQkJaW1wb3J0IGZpbmRlcnRvb2xzCi0JCVhYWAogCi0JZGVmIF9ydW5fd2l0aF9jbF9pbnRlcnByZXRlcihzZWxmKToKLQkJaW1wb3J0IFRlcm1pbmFsCi0JCWludGVycF9wYXRoID0gb3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgCi0JCQkiUmVzb3VyY2VzIiwgIlB5dGhvbi5hcHAiLCAiQ29udGVudHMiLCAiTWFjT1MiLCAiUHl0aG9uIikKLQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKGludGVycF9wYXRoKToKLQkJCWludGVycF9wYXRoID0gb3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgImJpbiIsICJweXRob24iKQotCQlmaWxlX3BhdGggPSBzZWxmLnBhdGgKLQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKGludGVycF9wYXRoKToKLQkJCSMgVGhpcyAiY2FuIGhhcHBlbiIgaWYgd2UgYXJlIHJ1bm5pbmcgSURFIHVuZGVyIE1hY1B5dGhvbi1PUzkuCi0JCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBmaW5kIGNvbW1hbmQtbGluZSBQeXRob24iCi0JCWNtZCA9ICciJXMiICIlcyIgOyBleGl0JyAlIChpbnRlcnBfcGF0aCwgZmlsZV9wYXRoKQotCQl0ID0gVGVybWluYWwuVGVybWluYWwoKQotCQl0LmRvX3NjcmlwdChjbWQpCi0JCi0JZGVmIHJ1bnNlbGVjdGlvbihzZWxmKToKLQkJc2VsZi5fcnVuc2VsZWN0aW9uKCkKLQkKLQlkZWYgX3J1bnNlbGVjdGlvbihzZWxmKToKLQkJaWYgc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlciBvciBzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyOgotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgcnVuIHNlbGVjdGlvbiB3aXRoIEludGVycHJldGVyIgotCQlnbG9iYWxzLCBmaWxlLCBtb2RuYW1lID0gc2VsZi5nZXRlbnZpcm9ubWVudCgpCi0JCWxvY2FscyA9IGdsb2JhbHMKLQkJIyBzZWxlY3Qgd2hvbGUgbGluZXMKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmV4cGFuZHNlbGVjdGlvbigpCi0JCQotCQkjIGdldCBsaW5lbm8gb2YgZmlyc3Qgc2VsZWN0ZWQgbGluZQotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldHNlbGVjdGlvbigpCi0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCksIG1heChzZWxzdGFydCwgc2VsZW5kKQotCQlzZWxmaXJzdGxpbmUgPSBzZWxmLmVkaXRncm91cC5lZGl0b3Iub2Zmc2V0dG9saW5lKHNlbHN0YXJ0KQotCQlhbGx0ZXh0ID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldCgpCi0JCXB5dGV4dCA9IGFsbHRleHRbc2Vsc3RhcnQ6c2VsZW5kXQotCQlsaW5lcyA9IHN0cmluZy5zcGxpdChweXRleHQsICdccicpCi0JCWluZGVudCA9IGdldG1pbmluZGVudChsaW5lcykKLQkJaWYgaW5kZW50ID09IDE6Ci0JCQljbGFzc25hbWUgPSAnJwotCQkJYWxsbGluZXMgPSBzdHJpbmcuc3BsaXQoYWxsdGV4dCwgJ1xyJykKLQkJCWZvciBpIGluIHJhbmdlKHNlbGZpcnN0bGluZSAtIDEsIC0xLCAtMSk6Ci0JCQkJbGluZSA9IGFsbGxpbmVzW2ldCi0JCQkJaWYgbGluZVs6Nl0gPT0gJ2NsYXNzICc6Ci0JCQkJCWNsYXNzbmFtZSA9IHN0cmluZy5zcGxpdChzdHJpbmcuc3RyaXAobGluZVs2Ol0pKVswXQotCQkJCQljbGFzc2VuZCA9IGlkZW50aWZpZVJFX21hdGNoKGNsYXNzbmFtZSkKLQkJCQkJaWYgY2xhc3NlbmQgPCAxOgotCQkJCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBhIGNsYXNzLiIKLQkJCQkJY2xhc3NuYW1lID0gY2xhc3NuYW1lWzpjbGFzc2VuZF0KLQkJCQkJYnJlYWsKLQkJCQllbGlmIGxpbmUgYW5kIGxpbmVbMF0gbm90IGluICdcdCMnOgotCQkJCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBmaW5kIGEgY2xhc3MuIgotCQkJZWxzZToKLQkJCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBmaW5kIGEgY2xhc3MuIgotCQkJaWYgZ2xvYmFscy5oYXNfa2V5KGNsYXNzbmFtZSk6Ci0JCQkJa2xhc3MgPSBnbG9iYWxzW2NsYXNzbmFtZV0KLQkJCWVsc2U6Ci0JCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBjbGFzcyBcIiVzXCIuIiAlIGNsYXNzbmFtZQotCQkJIyBhZGQgY2xhc3MgZGVmCi0JCQlweXRleHQgPSAoImNsYXNzICVzOlxuIiAlIGNsYXNzbmFtZSkgKyBweXRleHQKLQkJCXNlbGZpcnN0bGluZSA9IHNlbGZpcnN0bGluZSAtIDEKLQkJZWxpZiBpbmRlbnQgPiAwOgotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgcnVuIGluZGVudGVkIGNvZGUuIgotCQkKLQkJIyBhZGQgIm5ld2xpbmVzIiB0byBmb29sIGNvbXBpbGUvZXhlYzogCi0JCSMgbm93IGEgdHJhY2ViYWNrIHdpbGwgZ2l2ZSB0aGUgcmlnaHQgbGluZSBudW1iZXIKLQkJcHl0ZXh0ID0gc2VsZmlyc3RsaW5lICogJ1xyJyArIHB5dGV4dAotCQlzZWxmLmV4ZWNzdHJpbmcocHl0ZXh0LCBnbG9iYWxzLCBsb2NhbHMsIGZpbGUsIG1vZG5hbWUpCi0JCWlmIGluZGVudCA9PSAxIGFuZCBnbG9iYWxzW2NsYXNzbmFtZV0gaXMgbm90IGtsYXNzOgotCQkJIyB1cGRhdGUgdGhlIGNsYXNzIGluIHBsYWNlCi0JCQlrbGFzcy5fX2RpY3RfXy51cGRhdGUoZ2xvYmFsc1tjbGFzc25hbWVdLl9fZGljdF9fKQotCQkJZ2xvYmFsc1tjbGFzc25hbWVdID0ga2xhc3MKLQkKLQlkZWYgZXhlY3N0cmluZyhzZWxmLCBweXRleHQsIGdsb2JhbHMsIGxvY2FscywgZmlsZSwgbW9kbmFtZSk6Ci0JCXRyYWNlYmFja3dpbmRvdy5oaWRlKCkKLQkJIyB1cGRhdGUgd2luZG93cwotCQlXLmdldGFwcGxpY2F0aW9uKCkucmVmcmVzaHdpbmRvd3MoKQotCQlpZiBzZWxmLnJ1bl9hc19tYWluOgotCQkJbW9kbmFtZSA9ICJfX21haW5fXyIKLQkJaWYgc2VsZi5wYXRoOgotCQkJZGlyID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKLQkJCXNhdmVkaXIgPSBvcy5nZXRjd2QoKQotCQkJb3MuY2hkaXIoZGlyKQotCQkJc3lzLnBhdGguaW5zZXJ0KDAsIGRpcikKLQkJc2VsZi5fc2NyaXB0RG9uZSA9IEZhbHNlCi0JCWlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKLQkJCSMgT24gTWFjT1NYLCBNYWNQeXRob24gZG9lc24ndCBwb2xsIGZvciBjb21tYW5kLXBlcmlvZAotCQkJIyAoY2FuY2VsKSwgc28gdG8gZW5hYmxlIHRoZSB1c2VyIHRvIGNhbmNlbCBhIHJ1bm5pbmcKLQkJCSMgc2NyaXB0LCB3ZSBoYXZlIHRvIHNwYXduIGEgdGhyZWFkIHdoaWNoIGRvZXMgdGhlCi0JCQkjIHBvbGxpbmcuIEl0IHdpbGwgc2VuZCBhIFNJR0lOVCB0byB0aGUgbWFpbiB0aHJlYWQKLQkJCSMgKGluIHdoaWNoIHRoZSBzY3JpcHQgaXMgcnVubmluZykgd2hlbiB0aGUgdXNlciB0eXBlcwotCQkJIyBjb21tYW5kLXBlcmlvZC4KLQkJCWZyb20gdGhyZWFkaW5nIGltcG9ydCBUaHJlYWQKLQkJCXQgPSBUaHJlYWQodGFyZ2V0PXNlbGYuX3VzZXJDYW5jZWxsZWRNb25pdG9yLAotCQkJCQluYW1lPSJVc2VyQ2FuY2VsbGVkTW9uaXRvciIpCi0JCQl0LnN0YXJ0KCkKLQkJdHJ5OgotCQkJZXhlY3N0cmluZyhweXRleHQsIGdsb2JhbHMsIGxvY2FscywgZmlsZSwgc2VsZi5kZWJ1Z2dpbmcsIAotCQkJCQltb2RuYW1lLCBzZWxmLnByb2ZpbGluZykKLQkJZmluYWxseToKLQkJCXNlbGYuX3NjcmlwdERvbmUgPSBUcnVlCi0JCQlpZiBzZWxmLnBhdGg6Ci0JCQkJb3MuY2hkaXIoc2F2ZWRpcikKLQkJCQlkZWwgc3lzLnBhdGhbMF0KLQkKLQlkZWYgX3VzZXJDYW5jZWxsZWRNb25pdG9yKHNlbGYpOgotCQlpbXBvcnQgdGltZQotCQlmcm9tIHNpZ25hbCBpbXBvcnQgU0lHSU5UCi0JCXdoaWxlIG5vdCBzZWxmLl9zY3JpcHREb25lOgotCQkJaWYgRXZ0LkNoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwoKToKLQkJCQkjIFNlbmQgYSBTSUdJTlQgc2lnbmFsIHRvIG91cnNlbHZlcy4KLQkJCQkjIFRoaXMgZ2V0cyBkZWxpdmVyZWQgdG8gdGhlIG1haW4gdGhyZWFkLAotCQkJCSMgY2FuY2VsbGluZyB0aGUgcnVubmluZyBzY3JpcHQuCi0JCQkJb3Mua2lsbChvcy5nZXRwaWQoKSwgU0lHSU5UKQotCQkJCWJyZWFrCi0JCQl0aW1lLnNsZWVwKDAuMjUpCi0JCi0JZGVmIGdldGVudmlyb25tZW50KHNlbGYpOgotCQlpZiBzZWxmLnBhdGg6Ci0JCQlmaWxlID0gc2VsZi5wYXRoCi0JCQlkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZmlsZSkKLQkJCSMgY2hlY2sgaWYgd2UncmUgcGFydCBvZiBhIHBhY2thZ2UKLQkJCW1vZG5hbWUgPSAiIgotCQkJd2hpbGUgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGRpciwgIl9faW5pdF9fLnB5IikpOgotCQkJCWRpciwgZGlybmFtZSA9IG9zLnBhdGguc3BsaXQoZGlyKQotCQkJCW1vZG5hbWUgPSBkaXJuYW1lICsgJy4nICsgbW9kbmFtZQotCQkJc3VibmFtZSA9IF9maWxlbmFtZV9hc19tb2RuYW1lKHNlbGYudGl0bGUpCi0JCQlpZiBzdWJuYW1lIGlzIE5vbmU6Ci0JCQkJcmV0dXJuIHNlbGYuZ2xvYmFscywgZmlsZSwgTm9uZQotCQkJaWYgbW9kbmFtZToKLQkJCQlpZiBzdWJuYW1lID09ICJfX2luaXRfXyI6Ci0JCQkJCSMgc3RyaXAgdHJhaWxpbmcgcGVyaW9kCi0JCQkJCW1vZG5hbWUgPSBtb2RuYW1lWzotMV0KLQkJCQllbHNlOgotCQkJCQltb2RuYW1lID0gbW9kbmFtZSArIHN1Ym5hbWUKLQkJCWVsc2U6Ci0JCQkJbW9kbmFtZSA9IHN1Ym5hbWUKLQkJCWlmIHN5cy5tb2R1bGVzLmhhc19rZXkobW9kbmFtZSk6Ci0JCQkJZ2xvYmFscyA9IHN5cy5tb2R1bGVzW21vZG5hbWVdLl9fZGljdF9fCi0JCQkJc2VsZi5nbG9iYWxzID0ge30KLQkJCWVsc2U6Ci0JCQkJZ2xvYmFscyA9IHNlbGYuZ2xvYmFscwotCQkJCW1vZG5hbWUgPSBzdWJuYW1lCi0JCWVsc2U6Ci0JCQlmaWxlID0gJzwlcz4nICUgc2VsZi50aXRsZQotCQkJZ2xvYmFscyA9IHNlbGYuZ2xvYmFscwotCQkJbW9kbmFtZSA9IGZpbGUKLQkJcmV0dXJuIGdsb2JhbHMsIGZpbGUsIG1vZG5hbWUKLQkKLQlkZWYgd3JpdGUoc2VsZiwgc3R1ZmYpOgotCQkiIiJmb3IgdXNlIGFzIHN0ZG91dCIiIgotCQlzZWxmLl9idWYgPSBzZWxmLl9idWYgKyBzdHVmZgotCQlpZiAnXG4nIGluIHNlbGYuX2J1ZjoKLQkJCXNlbGYuZmx1c2goKQotCQotCWRlZiBmbHVzaChzZWxmKToKLQkJc3R1ZmYgPSBzdHJpbmcuc3BsaXQoc2VsZi5fYnVmLCAnXG4nKQotCQlzdHVmZiA9IHN0cmluZy5qb2luKHN0dWZmLCAnXHInKQotCQllbmQgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IudGVkLldFR2V0VGV4dExlbmd0aCgpCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci50ZWQuV0VTZXRTZWxlY3Rpb24oZW5kLCBlbmQpCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci50ZWQuV0VJbnNlcnQoc3R1ZmYsIE5vbmUsIE5vbmUpCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5fYnVmID0gIiIKLQkJIyA/IG9wdGlvbmFsOgotCQkjc2VsZi53aWQuU2VsZWN0V2luZG93KCkKLQkKLQlkZWYgZ2V0Y2xhc3NsaXN0KHNlbGYpOgotCQlmcm9tIHN0cmluZyBpbXBvcnQgZmluZCwgc3RyaXAKLQkJbWV0aG9kUkUgPSByZS5jb21waWxlKHIiXHJbIFx0XStkZWYgIikKLQkJZmluZE1ldGhvZCA9IG1ldGhvZFJFLnNlYXJjaAotCQllZGl0b3IgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IKLQkJdGV4dCA9IGVkaXRvci5nZXQoKQotCQlsaXN0ID0gW10KLQkJYXBwZW5kID0gbGlzdC5hcHBlbmQKLQkJZnVuY3RhZyA9ICJmdW5jIgotCQljbGFzc3RhZyA9ICJjbGFzcyIKLQkJbWV0aG9kdGFnID0gIm1ldGhvZCIKLQkJcG9zID0gLTEKLQkJaWYgdGV4dFs6NF0gPT0gJ2RlZiAnOgotCQkJYXBwZW5kKChwb3MgKyA0LCBmdW5jdGFnKSkKLQkJCXBvcyA9IDQKLQkJd2hpbGUgMToKLQkJCXBvcyA9IGZpbmQodGV4dCwgJ1xyZGVmICcsIHBvcyArIDEpCi0JCQlpZiBwb3MgPCAwOgotCQkJCWJyZWFrCi0JCQlhcHBlbmQoKHBvcyArIDUsIGZ1bmN0YWcpKQotCQlwb3MgPSAtMQotCQlpZiB0ZXh0Wzo2XSA9PSAnY2xhc3MgJzoKLQkJCWFwcGVuZCgocG9zICsgNiwgY2xhc3N0YWcpKQotCQkJcG9zID0gNgotCQl3aGlsZSAxOgotCQkJcG9zID0gZmluZCh0ZXh0LCAnXHJjbGFzcyAnLCBwb3MgKyAxKQotCQkJaWYgcG9zIDwgMDoKLQkJCQlicmVhawotCQkJYXBwZW5kKChwb3MgKyA3LCBjbGFzc3RhZykpCi0JCXBvcyA9IDAKLQkJd2hpbGUgMToKLQkJCW0gPSBmaW5kTWV0aG9kKHRleHQsIHBvcyArIDEpCi0JCQlpZiBtIGlzIE5vbmU6Ci0JCQkJYnJlYWsKLQkJCXBvcyA9IG0ucmVnc1swXVswXQotCQkJI3BvcyA9IGZpbmQodGV4dCwgJ1xyXHRkZWYgJywgcG9zICsgMSkKLQkJCWFwcGVuZCgobS5yZWdzWzBdWzFdLCBtZXRob2R0YWcpKQotCQlsaXN0LnNvcnQoKQotCQljbGFzc2xpc3QgPSBbXQotCQltZXRob2RsaXN0YXBwZW5kID0gTm9uZQotCQlvZmZzZXRUb0xpbmUgPSBlZGl0b3IudGVkLldFT2Zmc2V0VG9MaW5lCi0JCWdldExpbmVSYW5nZSA9IGVkaXRvci50ZWQuV0VHZXRMaW5lUmFuZ2UKLQkJYXBwZW5kID0gY2xhc3NsaXN0LmFwcGVuZAotCQlmb3IgcG9zLCB0YWcgaW4gbGlzdDoKLQkJCWxpbmVubyA9IG9mZnNldFRvTGluZShwb3MpCi0JCQlsaW5lU3RhcnQsIGxpbmVFbmQgPSBnZXRMaW5lUmFuZ2UobGluZW5vKQotCQkJbGluZSA9IHN0cmlwKHRleHRbcG9zOmxpbmVFbmRdKQotCQkJbGluZSA9IGxpbmVbOmlkZW50aWZpZVJFX21hdGNoKGxpbmUpXQotCQkJaWYgdGFnIGlzIGZ1bmN0YWc6Ci0JCQkJYXBwZW5kKCgiZGVmICIgKyBsaW5lLCBsaW5lbm8gKyAxKSkKLQkJCQltZXRob2RsaXN0YXBwZW5kID0gTm9uZQotCQkJZWxpZiB0YWcgaXMgY2xhc3N0YWc6Ci0JCQkJYXBwZW5kKFsiY2xhc3MgIiArIGxpbmVdKQotCQkJCW1ldGhvZGxpc3RhcHBlbmQgPSBjbGFzc2xpc3RbLTFdLmFwcGVuZAotCQkJZWxpZiBtZXRob2RsaXN0YXBwZW5kIGFuZCB0YWcgaXMgbWV0aG9kdGFnOgotCQkJCW1ldGhvZGxpc3RhcHBlbmQoKCJkZWYgIiArIGxpbmUsIGxpbmVubyArIDEpKQotCQlyZXR1cm4gY2xhc3NsaXN0Ci0JCi0JZGVmIHBvcHNlbGVjdGxpbmUoc2VsZiwgbGluZW5vKToKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGxpbmUobGluZW5vIC0gMSkKLQkKLQlkZWYgc2VsZWN0bGluZShzZWxmLCBsaW5lbm8sIGNoYXJvZmZzZXQgPSAwKToKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGxpbmUobGluZW5vIC0gMSwgY2hhcm9mZnNldCkKLQkJCi0JZGVmIGFkZHJlY2VudGZpbGUoc2VsZiwgZmlsZW5hbWUpOgotCQlhcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKLQkJYXBwLmFkZHJlY2VudGZpbGUoZmlsZW5hbWUpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGggPSAiIiwgdGl0bGUgPSAiIik6CisgICAgICAgIGRlZmF1bHRmb250c2V0dGluZ3MsIGRlZmF1bHR0YWJzZXR0aW5ncywgZGVmYXVsdHdpbmRvd3NpemUgPSBnZXRlZGl0b3JwcmVmcygpCisgICAgICAgIGdsb2JhbCBfc2NyaXB0dW50aXRsZWRjb3VudGVyCisgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgaWYgdGl0bGU6CisgICAgICAgICAgICAgICAgc2VsZi50aXRsZSA9IHRpdGxlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudGl0bGUgPSAiVW50aXRsZWQgU2NyaXB0ICVyIiAlIChfc2NyaXB0dW50aXRsZWRjb3VudGVyLCkKKyAgICAgICAgICAgICAgICBfc2NyaXB0dW50aXRsZWRjb3VudGVyID0gX3NjcmlwdHVudGl0bGVkY291bnRlciArIDEKKyAgICAgICAgICAgIHRleHQgPSAiIgorICAgICAgICAgICAgc2VsZi5fY3JlYXRvciA9IFcuX3NpZ25hdHVyZQorICAgICAgICAgICAgc2VsZi5fZW9sbiA9IG9zLmxpbmVzZXAKKyAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgIHBhdGggPSByZXNvbHZlYWxpYXNlcyhwYXRoKQorICAgICAgICAgICAgZGlyLCBuYW1lID0gb3MucGF0aC5zcGxpdChwYXRoKQorICAgICAgICAgICAgc2VsZi50aXRsZSA9IG5hbWUKKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICJyYiIpCisgICAgICAgICAgICB0ZXh0ID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5fY3JlYXRvciwgZmlsZXR5cGUgPSBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZShwYXRoKQorICAgICAgICAgICAgc2VsZi5hZGRyZWNlbnRmaWxlKHBhdGgpCisgICAgICAgICAgICBpZiAnXG4nIGluIHRleHQ6CisgICAgICAgICAgICAgICAgaWYgc3RyaW5nLmZpbmQodGV4dCwgJ1xyXG4nKSA+PSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9lb2xuID0gJ1xyXG4nCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZW9sbiA9ICdcbicKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc3RyaW5nLnJlcGxhY2UodGV4dCwgc2VsZi5fZW9sbiwgJ1xyJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fZW9sbiA9ICdccicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJmaWxlICclcycgZG9lcyBub3QgZXhpc3QiICUgcGF0aAorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisKKyAgICAgICAgc2VsZi5zZXR0aW5ncyA9IHt9CisgICAgICAgIGlmIHNlbGYucGF0aDoKKyAgICAgICAgICAgIHNlbGYucmVhZHdpbmRvd3NldHRpbmdzKCkKKyAgICAgICAgaWYgc2VsZi5zZXR0aW5ncy5oYXNfa2V5KCJ3aW5kb3dib3VuZHMiKToKKyAgICAgICAgICAgIGJvdW5kcyA9IHNlbGYuc2V0dGluZ3NbIndpbmRvd2JvdW5kcyJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBib3VuZHMgPSBkZWZhdWx0d2luZG93c2l6ZQorICAgICAgICBpZiBzZWxmLnNldHRpbmdzLmhhc19rZXkoImZvbnRzZXR0aW5ncyIpOgorICAgICAgICAgICAgc2VsZi5mb250c2V0dGluZ3MgPSBzZWxmLnNldHRpbmdzWyJmb250c2V0dGluZ3MiXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mb250c2V0dGluZ3MgPSBkZWZhdWx0Zm9udHNldHRpbmdzCisgICAgICAgIGlmIHNlbGYuc2V0dGluZ3MuaGFzX2tleSgidGFic2l6ZSIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYudGFic2V0dGluZ3MgPSAodGFic2l6ZSwgdGFibW9kZSkgPSBzZWxmLnNldHRpbmdzWyJ0YWJzaXplIl0KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLnRhYnNldHRpbmdzID0gZGVmYXVsdHRhYnNldHRpbmdzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRhYnNldHRpbmdzID0gZGVmYXVsdHRhYnNldHRpbmdzCisKKyAgICAgICAgVy5XaW5kb3cuX19pbml0X18oc2VsZiwgYm91bmRzLCBzZWxmLnRpdGxlLCBtaW5zaXplID0gKDMzMCwgMTIwKSwgdGFiYmFibGUgPSAwKQorICAgICAgICBzZWxmLnNldHVwd2lkZ2V0cyh0ZXh0KQorCisgICAgICAgIGlmIHNlbGYuc2V0dGluZ3MuaGFzX2tleSgic2VsZWN0aW9uIik6CisgICAgICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi5zZXR0aW5nc1sic2VsZWN0aW9uIl0KKyAgICAgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgIHNlbGYub3BlbigpCisgICAgICAgIHNlbGYuc2V0aW5mb3RleHQoKQorICAgICAgICBzZWxmLmdsb2JhbHMgPSB7fQorICAgICAgICBzZWxmLl9idWYgPSAiIiAgIyBmb3Igd3JpdGUgbWV0aG9kCisgICAgICAgIHNlbGYuZGVidWdnaW5nID0gMAorICAgICAgICBzZWxmLnByb2ZpbGluZyA9IDAKKyAgICAgICAgc2VsZi5ydW5fYXNfbWFpbiA9IHNlbGYuc2V0dGluZ3MuZ2V0KCJydW5fYXNfbWFpbiIsIDApCisgICAgICAgIHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIgPSBzZWxmLnNldHRpbmdzLmdldCgicnVuX3dpdGhfaW50ZXJwcmV0ZXIiLCAwKQorICAgICAgICBzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyID0gc2VsZi5zZXR0aW5ncy5nZXQoInJ1bl93aXRoX2NsX2ludGVycHJldGVyIiwgMCkKKworICAgIGRlZiByZWFkd2luZG93c2V0dGluZ3Moc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3JlZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDEpCisgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgUmVzLlVzZVJlc0ZpbGUocmVzcmVmKQorICAgICAgICAgICAgZGF0YSA9IFJlcy5HZXQxUmVzb3VyY2UoJ1B5V1MnLCAxMjgpCisgICAgICAgICAgICBzZWxmLnNldHRpbmdzID0gbWFyc2hhbC5sb2FkcyhkYXRhLmRhdGEpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgUmVzLkNsb3NlUmVzRmlsZShyZXNyZWYpCisKKyAgICBkZWYgd3JpdGV3aW5kb3dzZXR0aW5ncyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzcmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMykKKyAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjoKKyAgICAgICAgICAgIFJlcy5GU3BDcmVhdGVSZXNGaWxlKHNlbGYucGF0aCwgc2VsZi5fY3JlYXRvciwgJ1RFWFQnLCBzbUFsbFNjcmlwdHMpCisgICAgICAgICAgICByZXNyZWYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gUmVzLlJlc291cmNlKG1hcnNoYWwuZHVtcHMoc2VsZi5zZXR0aW5ncykpCisgICAgICAgICAgICBSZXMuVXNlUmVzRmlsZShyZXNyZWYpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVtcCA9IFJlcy5HZXQxUmVzb3VyY2UoJ1B5V1MnLCAxMjgpCisgICAgICAgICAgICAgICAgdGVtcC5SZW1vdmVSZXNvdXJjZSgpCisgICAgICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRhdGEuQWRkUmVzb3VyY2UoJ1B5V1MnLCAxMjgsICJ3aW5kb3cgc2V0dGluZ3MiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgUmVzLlVwZGF0ZVJlc0ZpbGUocmVzcmVmKQorICAgICAgICAgICAgUmVzLkNsb3NlUmVzRmlsZShyZXNyZWYpCisKKyAgICBkZWYgZ2V0c2V0dGluZ3Moc2VsZik6CisgICAgICAgIHNlbGYuc2V0dGluZ3MgPSB7fQorICAgICAgICBzZWxmLnNldHRpbmdzWyJ3aW5kb3dib3VuZHMiXSA9IHNlbGYuZ2V0Ym91bmRzKCkKKyAgICAgICAgc2VsZi5zZXR0aW5nc1sic2VsZWN0aW9uIl0gPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIHNlbGYuc2V0dGluZ3NbImZvbnRzZXR0aW5ncyJdID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldGZvbnRzZXR0aW5ncygpCisgICAgICAgIHNlbGYuc2V0dGluZ3NbInRhYnNpemUiXSA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXR0YWJzZXR0aW5ncygpCisgICAgICAgIHNlbGYuc2V0dGluZ3NbInJ1bl9hc19tYWluIl0gPSBzZWxmLnJ1bl9hc19tYWluCisgICAgICAgIHNlbGYuc2V0dGluZ3NbInJ1bl93aXRoX2ludGVycHJldGVyIl0gPSBzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyCisgICAgICAgIHNlbGYuc2V0dGluZ3NbInJ1bl93aXRoX2NsX2ludGVycHJldGVyIl0gPSBzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldCgpCisKKyAgICBkZWYgZ2V0c2VsZWN0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnRlZC5XRUdldFNlbGVjdGlvbigpCisKKyAgICBkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIHNlbHN0YXJ0LCBzZWxlbmQpOgorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2V0c2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCisKKyAgICBkZWYgZ2V0c2VsZWN0ZWR0ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldHNlbGVjdGVkdGV4dCgpCisKKyAgICBkZWYgZ2V0ZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGlmIHNlbGYucGF0aDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGgKKyAgICAgICAgcmV0dXJuICc8JXM+JyAlIHNlbGYudGl0bGUKKworICAgIGRlZiBzZXR1cHdpZGdldHMoc2VsZiwgdGV4dCk6CisgICAgICAgIHRvcGJhcmhlaWdodCA9IDI0CisgICAgICAgIHBvcGZpZWxkd2lkdGggPSA4MAorICAgICAgICBzZWxmLmxhc3RsaW5lbm8gPSBOb25lCisKKyAgICAgICAgIyBtYWtlIGFuIGVkaXRvcgorICAgICAgICBzZWxmLmVkaXRncm91cCA9IFcuR3JvdXAoKDAsIHRvcGJhcmhlaWdodCArIDEsIDAsIDApKQorICAgICAgICBlZGl0b3IgPSBXLlB5RWRpdG9yKCgwLCAwLCAtMTUsLTE1KSwgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzZXR0aW5ncyA9IHNlbGYuZm9udHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFic2V0dGluZ3MgPSBzZWxmLnRhYnNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHNlbGYuZ2V0ZmlsZW5hbWUoKSkKKworICAgICAgICAjIG1ha2UgdGhlIHdpZGdldHMKKyAgICAgICAgc2VsZi5wb3BmaWVsZCA9IENsYXNzRmluZGVyKChwb3BmaWVsZHdpZHRoIC0gMTcsIC0xNSwgMTYsIDE2KSwgW10sIHNlbGYucG9wc2VsZWN0bGluZSkKKyAgICAgICAgc2VsZi5saW5lZmllbGQgPSBXLkVkaXRUZXh0KCgtMSwgLTE1LCBwb3BmaWVsZHdpZHRoIC0gMTUsIDE2KSwgaW5zZXQgPSAoNiwgMSkpCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLl9iYXJ4ID0gVy5TY3JvbGxiYXIoKHBvcGZpZWxkd2lkdGggLSAyLCAtMTUsIC0xNCwgMTYpLCBlZGl0b3IuaHNjcm9sbCwgbWF4ID0gMzI3NjcpCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLl9iYXJ5ID0gVy5TY3JvbGxiYXIoKC0xNSwgMTQsIDE2LCAtMTQpLCBlZGl0b3IudnNjcm9sbCwgbWF4ID0gMzI3NjcpCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvciA9IGVkaXRvciAgIyBhZGQgZWRpdG9yICphZnRlciogc2Nyb2xsYmFycworCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLm9wdGlvbnNtZW51ID0gVy5Qb3B1cE1lbnUoKC0xNSwgLTEsIDE2LCAxNiksIFtdKQorICAgICAgICBzZWxmLmVkaXRncm91cC5vcHRpb25zbWVudS5iaW5kKCc8Y2xpY2s+Jywgc2VsZi5tYWtlb3B0aW9uc21lbnUpCisKKyAgICAgICAgc2VsZi5iZXZlbGJveCA9IFcuQmV2ZWxCb3goKDAsIDAsIDAsIHRvcGJhcmhlaWdodCkpCisgICAgICAgIHNlbGYuaGxpbmUgPSBXLkhvcml6b250YWxMaW5lKCgwLCB0b3BiYXJoZWlnaHQsIDAsIDApKQorICAgICAgICBzZWxmLmluZm90ZXh0ID0gVy5UZXh0Qm94KCgxNzUsIDYsIC00LCAxNCksIGJhY2tncm91bmRjb2xvciA9ICgweGUwMDAsIDB4ZTAwMCwgMHhlMDAwKSkKKyAgICAgICAgc2VsZi5ydW5idXR0b24gPSBXLkJldmVsQnV0dG9uKCg2LCA0LCA4MCwgMTYpLCBydW5CdXR0b25MYWJlbHNbMF0sIHNlbGYucnVuKQorICAgICAgICBzZWxmLnJ1bnNlbGJ1dHRvbiA9IFcuQmV2ZWxCdXR0b24oKDkwLCA0LCA4MCwgMTYpLCBydW5TZWxCdXR0b25MYWJlbHNbMF0sIHNlbGYucnVuc2VsZWN0aW9uKQorCisgICAgICAgICMgYmluZCBzb21lIGtleXMKKyAgICAgICAgZWRpdG9yLmJpbmQoImNtZHIiLCBzZWxmLnJ1bmJ1dHRvbi5wdXNoKQorICAgICAgICBlZGl0b3IuYmluZCgiZW50ZXIiLCBzZWxmLnJ1bnNlbGJ1dHRvbi5wdXNoKQorICAgICAgICBlZGl0b3IuYmluZCgiY21kaiIsIHNlbGYuZG9tZW51X2dvdG9saW5lKQorICAgICAgICBlZGl0b3IuYmluZCgiY21kZCIsIHNlbGYuZG9tZW51X3RvZ2dsZWRlYnVnZ2VyKQorICAgICAgICBlZGl0b3IuYmluZCgiPGlkbGU+Iiwgc2VsZi51cGRhdGVzZWxlY3Rpb24pCisKKyAgICAgICAgZWRpdG9yLmJpbmQoImNtZGUiLCBzZWFyY2hlbmdpbmUuc2V0ZmluZHN0cmluZykKKyAgICAgICAgZWRpdG9yLmJpbmQoImNtZGYiLCBzZWFyY2hlbmdpbmUuc2hvdykKKyAgICAgICAgZWRpdG9yLmJpbmQoImNtZGciLCBzZWFyY2hlbmdpbmUuZmluZG5leHQpCisgICAgICAgIGVkaXRvci5iaW5kKCJjbWRzaGlmdHIiLCBzZWFyY2hlbmdpbmUucmVwbGFjZSkKKyAgICAgICAgZWRpdG9yLmJpbmQoImNtZHQiLCBzZWFyY2hlbmdpbmUucmVwbGFjZWZpbmQpCisKKyAgICAgICAgc2VsZi5saW5lZmllbGQuYmluZCgicmV0dXJuIiwgc2VsZi5kb2xpbmVmaWVsZCkKKyAgICAgICAgc2VsZi5saW5lZmllbGQuYmluZCgiZW50ZXIiLCBzZWxmLmRvbGluZWZpZWxkKQorICAgICAgICBzZWxmLmxpbmVmaWVsZC5iaW5kKCJ0YWIiLCBzZWxmLmRvbGluZWZpZWxkKQorCisgICAgICAgICMgaW50ZXJjZXB0IGNsaWNrcworICAgICAgICBlZGl0b3IuYmluZCgiPGNsaWNrPiIsIHNlbGYuY2xpY2tlZGl0b3IpCisgICAgICAgIHNlbGYubGluZWZpZWxkLmJpbmQoIjxjbGljaz4iLCBzZWxmLmNsaWNrbGluZWZpZWxkKQorCisgICAgZGVmIG1ha2VvcHRpb25zbWVudShzZWxmKToKKyAgICAgICAgbWVudWl0ZW1zID0gWygnRm9udCBzZXR0aW5nc1x4YzknLCBzZWxmLmRvbWVudV9mb250c2V0dGluZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJTYXZlIG9wdGlvbnNceGM5Iiwgc2VsZi5kb21lbnVfb3B0aW9ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAnLScsCisgICAgICAgICAgICAgICAgICAgICAgICAoJ1wwJyArIGNocihzZWxmLnJ1bl9hc19tYWluKSArICdSdW4gYXMgX19tYWluX18nLCBzZWxmLmRvbWVudV90b2dnbGVfcnVuX2FzX21haW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgIygnXDAnICsgY2hyKHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIpICsgJ1J1biB3aXRoIEludGVycHJldGVyJywgc2VsZi5kb21lbnVfZHRvZ2dsZV9ydW5fd2l0aF9pbnRlcnByZXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAoJ1wwJyArIGNocihzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyKSArICdSdW4gd2l0aCBjb21tYW5kbGluZSBQeXRob24nLCBzZWxmLmRvbWVudV90b2dnbGVfcnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgJy0nLAorICAgICAgICAgICAgICAgICAgICAgICAgKCdNb2R1bGFyaXplJywgc2VsZi5kb21lbnVfbW9kdWxhcml6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoJ0Jyb3dzZSBuYW1lc3BhY2VceGM5Jywgc2VsZi5kb21lbnVfYnJvd3NlbmFtZXNwYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICctJ10KKyAgICAgICAgaWYgc2VsZi5wcm9maWxpbmc6CisgICAgICAgICAgICBtZW51aXRlbXMgPSBtZW51aXRlbXMgKyBbKCdEaXNhYmxlIHByb2ZpbGVyJywgc2VsZi5kb21lbnVfdG9nZ2xlcHJvZmlsZXIpXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWVudWl0ZW1zID0gbWVudWl0ZW1zICsgWygnRW5hYmxlIHByb2ZpbGVyJywgc2VsZi5kb21lbnVfdG9nZ2xlcHJvZmlsZXIpXQorICAgICAgICBpZiBzZWxmLmVkaXRncm91cC5lZGl0b3IuX2RlYnVnZ2VyOgorICAgICAgICAgICAgbWVudWl0ZW1zID0gbWVudWl0ZW1zICsgWygnRGlzYWJsZSBkZWJ1Z2dlcicsIHNlbGYuZG9tZW51X3RvZ2dsZWRlYnVnZ2VyKSwKKyAgICAgICAgICAgICAgICAgICAgKCdDbGVhciBicmVha3BvaW50cycsIHNlbGYuZG9tZW51X2NsZWFyYnJlYWtwb2ludHMpLAorICAgICAgICAgICAgICAgICAgICAoJ0VkaXQgYnJlYWtwb2ludHNceGM5Jywgc2VsZi5kb21lbnVfZWRpdGJyZWFrcG9pbnRzKV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1lbnVpdGVtcyA9IG1lbnVpdGVtcyArIFsoJ0VuYWJsZSBkZWJ1Z2dlcicsIHNlbGYuZG9tZW51X3RvZ2dsZWRlYnVnZ2VyKV0KKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAub3B0aW9uc21lbnUuc2V0KG1lbnVpdGVtcykKKworICAgIGRlZiBkb21lbnVfdG9nZ2xlX3J1bl9hc19tYWluKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9hc19tYWluID0gbm90IHNlbGYucnVuX2FzX21haW4KKyAgICAgICAgc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlciA9IDAKKyAgICAgICAgc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlciA9IDAKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGlvbmNoYW5nZWQoKQorCisgICAgZGVmIFhYZG9tZW51X3RvZ2dsZV9ydW5fd2l0aF9pbnRlcnByZXRlcihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlciA9IG5vdCBzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyCisgICAgICAgIHNlbGYucnVuX2FzX21haW4gPSAwCisgICAgICAgIHNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIgPSAwCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3Rpb25jaGFuZ2VkKCkKKworICAgIGRlZiBkb21lbnVfdG9nZ2xlX3J1bl93aXRoX2NsX2ludGVycHJldGVyKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyID0gbm90IHNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIKKyAgICAgICAgc2VsZi5ydW5fYXNfbWFpbiA9IDAKKyAgICAgICAgc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlciA9IDAKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGlvbmNoYW5nZWQoKQorCisgICAgZGVmIHNob3dicmVha3BvaW50cyhzZWxmLCBvbm9mZik6CisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5zaG93YnJlYWtwb2ludHMob25vZmYpCisgICAgICAgIHNlbGYuZGVidWdnaW5nID0gb25vZmYKKworICAgIGRlZiBkb21lbnVfY2xlYXJicmVha3BvaW50cyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5jbGVhcmJyZWFrcG9pbnRzKCkKKworICAgIGRlZiBkb21lbnVfZWRpdGJyZWFrcG9pbnRzKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmVkaXRicmVha3BvaW50cygpCisKKyAgICBkZWYgZG9tZW51X3RvZ2dsZWRlYnVnZ2VyKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgbm90IHNlbGYuZGVidWdnaW5nOgorICAgICAgICAgICAgVy5TZXRDdXJzb3IoJ3dhdGNoJykKKyAgICAgICAgc2VsZi5kZWJ1Z2dpbmcgPSBub3Qgc2VsZi5kZWJ1Z2dpbmcKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnRvZ2dsZWJyZWFrcG9pbnRzKCkKKworICAgIGRlZiBkb21lbnVfdG9nZ2xlcHJvZmlsZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLnByb2ZpbGluZyA9IG5vdCBzZWxmLnByb2ZpbGluZworCisgICAgZGVmIGRvbWVudV9icm93c2VuYW1lc3BhY2Uoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpbXBvcnQgUHlCcm93c2VyLCBXCisgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgIGdsb2JhbHMsIGZpbGUsIG1vZG5hbWUgPSBzZWxmLmdldGVudmlyb25tZW50KCkKKyAgICAgICAgaWYgbm90IG1vZG5hbWU6CisgICAgICAgICAgICBtb2RuYW1lID0gc2VsZi50aXRsZQorICAgICAgICBQeUJyb3dzZXIuQnJvd3NlcihnbG9iYWxzLCAiT2JqZWN0IGJyb3dzZXI6ICIgKyBtb2RuYW1lKQorCisgICAgZGVmIGRvbWVudV9tb2R1bGFyaXplKHNlbGYsICphcmdzKToKKyAgICAgICAgbW9kbmFtZSA9IF9maWxlbmFtZV9hc19tb2RuYW1lKHNlbGYudGl0bGUpCisgICAgICAgIGlmIG5vdCBtb2RuYW1lOgorICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgbW9kdWxhcml6ZSBcIiVzXCIiICUgc2VsZi50aXRsZQorICAgICAgICBydW5fYXNfbWFpbiA9IHNlbGYucnVuX2FzX21haW4KKyAgICAgICAgc2VsZi5ydW5fYXNfbWFpbiA9IDAKKyAgICAgICAgc2VsZi5ydW4oKQorICAgICAgICBzZWxmLnJ1bl9hc19tYWluID0gcnVuX2FzX21haW4KKyAgICAgICAgaWYgc2VsZi5wYXRoOgorICAgICAgICAgICAgZmlsZSA9IHNlbGYucGF0aAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmlsZSA9IHNlbGYudGl0bGUKKworICAgICAgICBpZiBzZWxmLmdsb2JhbHMgYW5kIG5vdCBzeXMubW9kdWxlcy5oYXNfa2V5KG1vZG5hbWUpOgorICAgICAgICAgICAgbW9kdWxlID0gaW1wLm5ld19tb2R1bGUobW9kbmFtZSkKKyAgICAgICAgICAgIGZvciBhdHRyIGluIHNlbGYuZ2xvYmFscy5rZXlzKCk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihtb2R1bGUsYXR0cixzZWxmLmdsb2JhbHNbYXR0cl0pCisgICAgICAgICAgICBzeXMubW9kdWxlc1ttb2RuYW1lXSA9IG1vZHVsZQorICAgICAgICAgICAgc2VsZi5nbG9iYWxzID0ge30KKworICAgIGRlZiBkb21lbnVfZm9udHNldHRpbmdzKHNlbGYsICphcmdzKToKKyAgICAgICAgaW1wb3J0IEZvbnRTZXR0aW5ncworICAgICAgICBmb250c2V0dGluZ3MgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0Zm9udHNldHRpbmdzKCkKKyAgICAgICAgdGFic2V0dGluZ3MgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0dGFic2V0dGluZ3MoKQorICAgICAgICBzZXR0aW5ncyA9IEZvbnRTZXR0aW5ncy5Gb250RGlhbG9nKGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MpCisgICAgICAgIGlmIHNldHRpbmdzOgorICAgICAgICAgICAgZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHNldHRpbmdzCisgICAgICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2V0Zm9udHNldHRpbmdzKGZvbnRzZXR0aW5ncykKKyAgICAgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZXR0YWJzZXR0aW5ncyh0YWJzZXR0aW5ncykKKworICAgIGRlZiBkb21lbnVfb3B0aW9ucyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJ2ID0gU2F2ZU9wdGlvbnMoc2VsZi5fY3JlYXRvciwgc2VsZi5fZW9sbikKKyAgICAgICAgaWYgcnY6CisgICAgICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2VsZWN0aW9uY2hhbmdlZCgpICMgb3VjaC4uLgorICAgICAgICAgICAgc2VsZi5fY3JlYXRvciwgc2VsZi5fZW9sbiA9IHJ2CisKKyAgICBkZWYgY2xpY2tsaW5lZmllbGQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2N1cnJlbnR3aWRnZXQgPD4gc2VsZi5saW5lZmllbGQ6CisgICAgICAgICAgICBzZWxmLmxpbmVmaWVsZC5zZWxlY3QoMSkKKyAgICAgICAgICAgIHNlbGYubGluZWZpZWxkLnNlbGVjdGFsbCgpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGNsaWNrZWRpdG9yKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jdXJyZW50d2lkZ2V0IDw+IHNlbGYuZWRpdGdyb3VwLmVkaXRvcjoKKyAgICAgICAgICAgIHNlbGYuZG9saW5lZmllbGQoKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiB1cGRhdGVzZWxlY3Rpb24oc2VsZiwgZm9yY2UgPSAwKToKKyAgICAgICAgc2VsID0gbWluKHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXRzZWxlY3Rpb24oKSkKKyAgICAgICAgbGluZW5vID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLm9mZnNldHRvbGluZShzZWwpCisgICAgICAgIGlmIGxpbmVubyA8PiBzZWxmLmxhc3RsaW5lbm8gb3IgZm9yY2U6CisgICAgICAgICAgICBzZWxmLmxhc3RsaW5lbm8gPSBsaW5lbm8KKyAgICAgICAgICAgIHNlbGYubGluZWZpZWxkLnNldChzdHIobGluZW5vICsgMSkpCisgICAgICAgICAgICBzZWxmLmxpbmVmaWVsZC5zZWx2aWV3KCkKKworICAgIGRlZiBkb2xpbmVmaWVsZChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGluZW5vID0gc3RyaW5nLmF0b2koc2VsZi5saW5lZmllbGQuZ2V0KCkpIC0gMQorICAgICAgICAgICAgaWYgbGluZW5vIDw+IHNlbGYubGFzdGxpbmVubzoKKyAgICAgICAgICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2VsZWN0bGluZShsaW5lbm8pCisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVzZWxlY3Rpb24oMSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi51cGRhdGVzZWxlY3Rpb24oMSkKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdCgxKQorCisgICAgZGVmIHNldGluZm90ZXh0KHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnaW5mb3RleHQnKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnBhdGg6CisgICAgICAgICAgICBzZWxmLmluZm90ZXh0LnNldChzZWxmLnBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmluZm90ZXh0LnNldCgiIikKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmNoYW5nZWQ6CisgICAgICAgICAgICBRZC5Jbml0Q3Vyc29yKCkKKyAgICAgICAgICAgIHNhdmUgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgnU2F2ZSB3aW5kb3cgIiVzIiBiZWZvcmUgY2xvc2luZz8nICUgc2VsZi50aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTEsIG5vPSJEb25ceGQ1dCBzYXZlIikKKyAgICAgICAgICAgIGlmIHNhdmUgPiAwOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZG9tZW51X3NhdmUoKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGVsaWYgc2F2ZSA8IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgc2VsZi5nbG9iYWxzID0gTm9uZQorICAgICAgICBXLldpbmRvdy5jbG9zZShzZWxmKQorCisgICAgZGVmIGRvbWVudV9jbG9zZShzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBkb21lbnVfc2F2ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIG5vdCBzZWxmLnBhdGg6CisgICAgICAgICAgICAjIFdpbGwgY2FsbCB1cyByZWN1cnNpdmVseQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9tZW51X3NhdmVfYXMoKQorICAgICAgICBkYXRhID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldCgpCisgICAgICAgIGlmIHNlbGYuX2VvbG4gIT0gJ1xyJzoKKyAgICAgICAgICAgIGRhdGEgPSBzdHJpbmcucmVwbGFjZShkYXRhLCAnXHInLCBzZWxmLl9lb2xuKQorICAgICAgICBmcCA9IG9wZW4oc2VsZi5wYXRoLCAnd2InKSAgIyBvcGVuIGZpbGUgaW4gYmluYXJ5IG1vZGUsIGRhdGEgaGFzICdccicgbGluZS1lbmRpbmdzCisgICAgICAgIGZwLndyaXRlKGRhdGEpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUoc2VsZi5wYXRoLCBzZWxmLl9jcmVhdG9yLCAnVEVYVCcpCisgICAgICAgIHNlbGYuZ2V0c2V0dGluZ3MoKQorICAgICAgICBzZWxmLndyaXRld2luZG93c2V0dGluZ3MoKQorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3IuY2hhbmdlZCA9IDAKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGNoYW5nZWQgPSAwCisgICAgICAgIGltcG9ydCBsaW5lY2FjaGUKKyAgICAgICAgaWYgbGluZWNhY2hlLmNhY2hlLmhhc19rZXkoc2VsZi5wYXRoKToKKyAgICAgICAgICAgIGRlbCBsaW5lY2FjaGUuY2FjaGVbc2VsZi5wYXRoXQorICAgICAgICBpbXBvcnQgbWFjb3N0b29scworICAgICAgICBtYWNvc3Rvb2xzLnRvdWNoZWQoc2VsZi5wYXRoKQorICAgICAgICBzZWxmLmFkZHJlY2VudGZpbGUoc2VsZi5wYXRoKQorCisgICAgZGVmIGNhbl9zYXZlKHNlbGYsIG1lbnVpdGVtKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5jaGFuZ2VkIG9yIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxjaGFuZ2VkCisKKyAgICBkZWYgZG9tZW51X3NhdmVfYXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSBhczonLCBzYXZlZEZpbGVOYW1lPXNlbGYudGl0bGUpCisgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgc2VsZi5zaG93YnJlYWtwb2ludHMoMCkKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLnNldGluZm90ZXh0KCkKKyAgICAgICAgc2VsZi50aXRsZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5wYXRoKVstMV0KKyAgICAgICAgc2VsZi53aWQuU2V0V1RpdGxlKHNlbGYudGl0bGUpCisgICAgICAgIHNlbGYuZG9tZW51X3NhdmUoKQorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2V0ZmlsZShzZWxmLmdldGZpbGVuYW1lKCkpCisgICAgICAgIGFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKQorICAgICAgICBhcHAubWFrZW9wZW53aW5kb3dzbWVudSgpCisgICAgICAgIGlmIGhhc2F0dHIoYXBwLCAnbWFrZXNjcmlwdHNtZW51Jyk6CisgICAgICAgICAgICBhcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKKyAgICAgICAgICAgIGZzciwgY2hhbmdlZCA9IGFwcC5zY3JpcHRzZm9sZGVyLkZTUmVzb2x2ZUFsaWFzKE5vbmUpCisgICAgICAgICAgICBwYXRoID0gZnNyLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgICAgIGlmIHBhdGggPT0gc2VsZi5wYXRoWzpsZW4ocGF0aCldOgorICAgICAgICAgICAgICAgIFcuZ2V0YXBwbGljYXRpb24oKS5tYWtlc2NyaXB0c21lbnUoKQorCisgICAgZGVmIGRvbWVudV9zYXZlX2FzX2FwcGxldChzZWxmLCAqYXJncyk6CisgICAgICAgIGltcG9ydCBidWlsZHRvb2xzCisKKyAgICAgICAgYnVpbGR0b29scy5ERUJVRyA9IDAgICAgIyBvdWNoLgorCisgICAgICAgIGlmIHNlbGYudGl0bGVbLTM6XSA9PSAiLnB5IjoKKyAgICAgICAgICAgIGRlc3RuYW1lID0gc2VsZi50aXRsZVs6LTNdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZXN0bmFtZSA9IHNlbGYudGl0bGUgKyAiLmFwcGxldCIKKyAgICAgICAgZGVzdG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzIEFwcGxldDonLAorICAgICAgICAgICAgICAgIHNhdmVkRmlsZU5hbWU9ZGVzdG5hbWUpCisgICAgICAgIGlmIG5vdCBkZXN0bmFtZToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIFcuU2V0Q3Vyc29yKCJ3YXRjaCIpCisgICAgICAgIGlmIHNlbGYucGF0aDoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5wYXRoCisgICAgICAgICAgICBpZiBmaWxlbmFtZVstMzpdID09ICIucHkiOgorICAgICAgICAgICAgICAgIHJzcmNuYW1lID0gZmlsZW5hbWVbOi0zXSArICcucnNyYycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcnNyY25hbWUgPSBmaWxlbmFtZSArICcucnNyYycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi50aXRsZQorICAgICAgICAgICAgcnNyY25hbWUgPSAiIgorCisgICAgICAgIHB5dGV4dCA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXQoKQorICAgICAgICBweXRleHQgPSBzdHJpbmcuc3BsaXQocHl0ZXh0LCAnXHInKQorICAgICAgICBweXRleHQgPSBzdHJpbmcuam9pbihweXRleHQsICdcbicpICsgJ1xuJworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb2RlID0gY29tcGlsZShweXRleHQsIGZpbGVuYW1lLCAiZXhlYyIpCisgICAgICAgIGV4Y2VwdCAoU3ludGF4RXJyb3IsIEVPRkVycm9yKToKKyAgICAgICAgICAgIHJhaXNlIGJ1aWxkdG9vbHMuQnVpbGRFcnJvciwgIlN5bnRheCBlcnJvciBpbiBzY3JpcHQgJXIiICUgKGZpbGVuYW1lLCkKKworICAgICAgICBpbXBvcnQgdGVtcGZpbGUKKyAgICAgICAgdG1wZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisKKyAgICAgICAgaWYgZmlsZW5hbWVbLTM6XSAhPSAiLnB5IjoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgKyAiLnB5IgorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIsIG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpWzFdKQorICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICJ3IikKKyAgICAgICAgZnAud3JpdGUocHl0ZXh0KQorICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgIyBUcnkgcmVtb3ZpbmcgdGhlIG91dHB1dCBmaWxlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShkZXN0bmFtZSkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0ZW1wbGF0ZSA9IGJ1aWxkdG9vbHMuZmluZHRlbXBsYXRlKCkKKyAgICAgICAgYnVpbGR0b29scy5wcm9jZXNzKHRlbXBsYXRlLCBmaWxlbmFtZSwgZGVzdG5hbWUsIDEsIHJzcmNuYW1lPXJzcmNuYW1lLCBwcm9ncmVzcz1Ob25lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCisgICAgICAgICAgICBvcy5ybWRpcih0bXBkaXIpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBkb21lbnVfZ290b2xpbmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmxpbmVmaWVsZC5zZWxlY3RhbGwoKQorICAgICAgICBzZWxmLmxpbmVmaWVsZC5zZWxlY3QoMSkKKyAgICAgICAgc2VsZi5saW5lZmllbGQuc2VsZWN0YWxsKCkKKworICAgIGRlZiBkb21lbnVfc2VsZWN0bGluZShzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5leHBhbmRzZWxlY3Rpb24oKQorCisgICAgZGVmIGRvbWVudV9maW5kKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VhcmNoZW5naW5lLnNob3coKQorCisgICAgZGVmIGRvbWVudV9lbnRlcnNlYXJjaHN0cmluZyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlYXJjaGVuZ2luZS5zZXRmaW5kc3RyaW5nKCkKKworICAgIGRlZiBkb21lbnVfcmVwbGFjZShzZWxmLCAqYXJncyk6CisgICAgICAgIHNlYXJjaGVuZ2luZS5yZXBsYWNlKCkKKworICAgIGRlZiBkb21lbnVfZmluZG5leHQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWFyY2hlbmdpbmUuZmluZG5leHQoKQorCisgICAgZGVmIGRvbWVudV9yZXBsYWNlZmluZChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlYXJjaGVuZ2luZS5yZXBsYWNlZmluZCgpCisKKyAgICBkZWYgZG9tZW51X3J1bihzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYucnVuYnV0dG9uLnB1c2goKQorCisgICAgZGVmIGRvbWVudV9ydW5zZWxlY3Rpb24oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLnJ1bnNlbGJ1dHRvbi5wdXNoKCkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuX3J1bigpCisKKyAgICBkZWYgX3J1bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlcjoKKyAgICAgICAgICAgIGlmIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5jaGFuZ2VkOgorICAgICAgICAgICAgICAgIFFkLkluaXRDdXJzb3IoKQorICAgICAgICAgICAgICAgIHNhdmUgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgnU2F2ZSAiJXMiIGJlZm9yZSBydW5uaW5nPycgJSBzZWxmLnRpdGxlLCAxKQorICAgICAgICAgICAgICAgIGlmIHNhdmUgPiAwOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRvbWVudV9zYXZlKCk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBlbGlmIHNhdmUgPCAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBhdGg6CisgICAgICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgcnVuIHVuc2F2ZWQgZmlsZSIKKyAgICAgICAgICAgIHNlbGYuX3J1bl93aXRoX2ludGVycHJldGVyKCkKKyAgICAgICAgZWxpZiBzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyOgorICAgICAgICAgICAgaWYgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmNoYW5nZWQ6CisgICAgICAgICAgICAgICAgUWQuSW5pdEN1cnNvcigpCisgICAgICAgICAgICAgICAgc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlICIlcyIgYmVmb3JlIHJ1bm5pbmc/JyAlIHNlbGYudGl0bGUsIDEpCisgICAgICAgICAgICAgICAgaWYgc2F2ZSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZG9tZW51X3NhdmUoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsaWYgc2F2ZSA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbm90IHNlbGYucGF0aDoKKyAgICAgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBydW4gdW5zYXZlZCBmaWxlIgorICAgICAgICAgICAgc2VsZi5fcnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHl0ZXh0ID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldCgpCisgICAgICAgICAgICBnbG9iYWxzLCBmaWxlLCBtb2RuYW1lID0gc2VsZi5nZXRlbnZpcm9ubWVudCgpCisgICAgICAgICAgICBzZWxmLmV4ZWNzdHJpbmcocHl0ZXh0LCBnbG9iYWxzLCBnbG9iYWxzLCBmaWxlLCBtb2RuYW1lKQorCisgICAgZGVmIF9ydW5fd2l0aF9pbnRlcnByZXRlcihzZWxmKToKKyAgICAgICAgaW50ZXJwX3BhdGggPSBvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAiUHl0aG9uSW50ZXJwcmV0ZXIiKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaW50ZXJwX3BhdGgpOgorICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBpbnRlcnByZXRlciIKKyAgICAgICAgaW1wb3J0IGZpbmRlcnRvb2xzCisgICAgICAgIFhYWAorCisgICAgZGVmIF9ydW5fd2l0aF9jbF9pbnRlcnByZXRlcihzZWxmKToKKyAgICAgICAgaW1wb3J0IFRlcm1pbmFsCisgICAgICAgIGludGVycF9wYXRoID0gb3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAiUmVzb3VyY2VzIiwgIlB5dGhvbi5hcHAiLCAiQ29udGVudHMiLCAiTWFjT1MiLCAiUHl0aG9uIikKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGludGVycF9wYXRoKToKKyAgICAgICAgICAgIGludGVycF9wYXRoID0gb3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgImJpbiIsICJweXRob24iKQorICAgICAgICBmaWxlX3BhdGggPSBzZWxmLnBhdGgKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGludGVycF9wYXRoKToKKyAgICAgICAgICAgICMgVGhpcyAiY2FuIGhhcHBlbiIgaWYgd2UgYXJlIHJ1bm5pbmcgSURFIHVuZGVyIE1hY1B5dGhvbi1PUzkuCisgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBmaW5kIGNvbW1hbmQtbGluZSBQeXRob24iCisgICAgICAgIGNtZCA9ICciJXMiICIlcyIgOyBleGl0JyAlIChpbnRlcnBfcGF0aCwgZmlsZV9wYXRoKQorICAgICAgICB0ID0gVGVybWluYWwuVGVybWluYWwoKQorICAgICAgICB0LmRvX3NjcmlwdChjbWQpCisKKyAgICBkZWYgcnVuc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5zZWxlY3Rpb24oKQorCisgICAgZGVmIF9ydW5zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIGlmIHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIgb3Igc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlcjoKKyAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IHJ1biBzZWxlY3Rpb24gd2l0aCBJbnRlcnByZXRlciIKKyAgICAgICAgZ2xvYmFscywgZmlsZSwgbW9kbmFtZSA9IHNlbGYuZ2V0ZW52aXJvbm1lbnQoKQorICAgICAgICBsb2NhbHMgPSBnbG9iYWxzCisgICAgICAgICMgc2VsZWN0IHdob2xlIGxpbmVzCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5leHBhbmRzZWxlY3Rpb24oKQorCisgICAgICAgICMgZ2V0IGxpbmVubyBvZiBmaXJzdCBzZWxlY3RlZCBsaW5lCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgc2VsZW5kKSwgbWF4KHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgIHNlbGZpcnN0bGluZSA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5vZmZzZXR0b2xpbmUoc2Vsc3RhcnQpCisgICAgICAgIGFsbHRleHQgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0KCkKKyAgICAgICAgcHl0ZXh0ID0gYWxsdGV4dFtzZWxzdGFydDpzZWxlbmRdCisgICAgICAgIGxpbmVzID0gc3RyaW5nLnNwbGl0KHB5dGV4dCwgJ1xyJykKKyAgICAgICAgaW5kZW50ID0gZ2V0bWluaW5kZW50KGxpbmVzKQorICAgICAgICBpZiBpbmRlbnQgPT0gMToKKyAgICAgICAgICAgIGNsYXNzbmFtZSA9ICcnCisgICAgICAgICAgICBhbGxsaW5lcyA9IHN0cmluZy5zcGxpdChhbGx0ZXh0LCAnXHInKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZmlyc3RsaW5lIC0gMSwgLTEsIC0xKToKKyAgICAgICAgICAgICAgICBsaW5lID0gYWxsbGluZXNbaV0KKyAgICAgICAgICAgICAgICBpZiBsaW5lWzo2XSA9PSAnY2xhc3MgJzoKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gc3RyaW5nLnNwbGl0KHN0cmluZy5zdHJpcChsaW5lWzY6XSkpWzBdCisgICAgICAgICAgICAgICAgICAgIGNsYXNzZW5kID0gaWRlbnRpZmllUkVfbWF0Y2goY2xhc3NuYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiBjbGFzc2VuZCA8IDE6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBmaW5kIGEgY2xhc3MuIgorICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWVbOmNsYXNzZW5kXQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgbGluZSBhbmQgbGluZVswXSBub3QgaW4gJ1x0Iyc6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgYSBjbGFzcy4iCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgYSBjbGFzcy4iCisgICAgICAgICAgICBpZiBnbG9iYWxzLmhhc19rZXkoY2xhc3NuYW1lKToKKyAgICAgICAgICAgICAgICBrbGFzcyA9IGdsb2JhbHNbY2xhc3NuYW1lXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBmaW5kIGNsYXNzIFwiJXNcIi4iICUgY2xhc3NuYW1lCisgICAgICAgICAgICAjIGFkZCBjbGFzcyBkZWYKKyAgICAgICAgICAgIHB5dGV4dCA9ICgiY2xhc3MgJXM6XG4iICUgY2xhc3NuYW1lKSArIHB5dGV4dAorICAgICAgICAgICAgc2VsZmlyc3RsaW5lID0gc2VsZmlyc3RsaW5lIC0gMQorICAgICAgICBlbGlmIGluZGVudCA+IDA6CisgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBydW4gaW5kZW50ZWQgY29kZS4iCisKKyAgICAgICAgIyBhZGQgIm5ld2xpbmVzIiB0byBmb29sIGNvbXBpbGUvZXhlYzoKKyAgICAgICAgIyBub3cgYSB0cmFjZWJhY2sgd2lsbCBnaXZlIHRoZSByaWdodCBsaW5lIG51bWJlcgorICAgICAgICBweXRleHQgPSBzZWxmaXJzdGxpbmUgKiAnXHInICsgcHl0ZXh0CisgICAgICAgIHNlbGYuZXhlY3N0cmluZyhweXRleHQsIGdsb2JhbHMsIGxvY2FscywgZmlsZSwgbW9kbmFtZSkKKyAgICAgICAgaWYgaW5kZW50ID09IDEgYW5kIGdsb2JhbHNbY2xhc3NuYW1lXSBpcyBub3Qga2xhc3M6CisgICAgICAgICAgICAjIHVwZGF0ZSB0aGUgY2xhc3MgaW4gcGxhY2UKKyAgICAgICAgICAgIGtsYXNzLl9fZGljdF9fLnVwZGF0ZShnbG9iYWxzW2NsYXNzbmFtZV0uX19kaWN0X18pCisgICAgICAgICAgICBnbG9iYWxzW2NsYXNzbmFtZV0gPSBrbGFzcworCisgICAgZGVmIGV4ZWNzdHJpbmcoc2VsZiwgcHl0ZXh0LCBnbG9iYWxzLCBsb2NhbHMsIGZpbGUsIG1vZG5hbWUpOgorICAgICAgICB0cmFjZWJhY2t3aW5kb3cuaGlkZSgpCisgICAgICAgICMgdXBkYXRlIHdpbmRvd3MKKyAgICAgICAgVy5nZXRhcHBsaWNhdGlvbigpLnJlZnJlc2h3aW5kb3dzKCkKKyAgICAgICAgaWYgc2VsZi5ydW5fYXNfbWFpbjoKKyAgICAgICAgICAgIG1vZG5hbWUgPSAiX19tYWluX18iCisgICAgICAgIGlmIHNlbGYucGF0aDoKKyAgICAgICAgICAgIGRpciA9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpCisgICAgICAgICAgICBzYXZlZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgIG9zLmNoZGlyKGRpcikKKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBkaXIpCisgICAgICAgIHNlbGYuX3NjcmlwdERvbmUgPSBGYWxzZQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgICAgICAjIE9uIE1hY09TWCwgTWFjUHl0aG9uIGRvZXNuJ3QgcG9sbCBmb3IgY29tbWFuZC1wZXJpb2QKKyAgICAgICAgICAgICMgKGNhbmNlbCksIHNvIHRvIGVuYWJsZSB0aGUgdXNlciB0byBjYW5jZWwgYSBydW5uaW5nCisgICAgICAgICAgICAjIHNjcmlwdCwgd2UgaGF2ZSB0byBzcGF3biBhIHRocmVhZCB3aGljaCBkb2VzIHRoZQorICAgICAgICAgICAgIyBwb2xsaW5nLiBJdCB3aWxsIHNlbmQgYSBTSUdJTlQgdG8gdGhlIG1haW4gdGhyZWFkCisgICAgICAgICAgICAjIChpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcpIHdoZW4gdGhlIHVzZXIgdHlwZXMKKyAgICAgICAgICAgICMgY29tbWFuZC1wZXJpb2QuCisgICAgICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCisgICAgICAgICAgICB0ID0gVGhyZWFkKHRhcmdldD1zZWxmLl91c2VyQ2FuY2VsbGVkTW9uaXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJVc2VyQ2FuY2VsbGVkTW9uaXRvciIpCisgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlY3N0cmluZyhweXRleHQsIGdsb2JhbHMsIGxvY2FscywgZmlsZSwgc2VsZi5kZWJ1Z2dpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSwgc2VsZi5wcm9maWxpbmcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9zY3JpcHREb25lID0gVHJ1ZQorICAgICAgICAgICAgaWYgc2VsZi5wYXRoOgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKHNhdmVkaXIpCisgICAgICAgICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisKKyAgICBkZWYgX3VzZXJDYW5jZWxsZWRNb25pdG9yKHNlbGYpOgorICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICBmcm9tIHNpZ25hbCBpbXBvcnQgU0lHSU5UCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9zY3JpcHREb25lOgorICAgICAgICAgICAgaWYgRXZ0LkNoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwoKToKKyAgICAgICAgICAgICAgICAjIFNlbmQgYSBTSUdJTlQgc2lnbmFsIHRvIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAjIFRoaXMgZ2V0cyBkZWxpdmVyZWQgdG8gdGhlIG1haW4gdGhyZWFkLAorICAgICAgICAgICAgICAgICMgY2FuY2VsbGluZyB0aGUgcnVubmluZyBzY3JpcHQuCisgICAgICAgICAgICAgICAgb3Mua2lsbChvcy5nZXRwaWQoKSwgU0lHSU5UKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMjUpCisKKyAgICBkZWYgZ2V0ZW52aXJvbm1lbnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYucGF0aDoKKyAgICAgICAgICAgIGZpbGUgPSBzZWxmLnBhdGgKKyAgICAgICAgICAgIGRpciA9IG9zLnBhdGguZGlybmFtZShmaWxlKQorICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSdyZSBwYXJ0IG9mIGEgcGFja2FnZQorICAgICAgICAgICAgbW9kbmFtZSA9ICIiCisgICAgICAgICAgICB3aGlsZSBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oZGlyLCAiX19pbml0X18ucHkiKSk6CisgICAgICAgICAgICAgICAgZGlyLCBkaXJuYW1lID0gb3MucGF0aC5zcGxpdChkaXIpCisgICAgICAgICAgICAgICAgbW9kbmFtZSA9IGRpcm5hbWUgKyAnLicgKyBtb2RuYW1lCisgICAgICAgICAgICBzdWJuYW1lID0gX2ZpbGVuYW1lX2FzX21vZG5hbWUoc2VsZi50aXRsZSkKKyAgICAgICAgICAgIGlmIHN1Ym5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5nbG9iYWxzLCBmaWxlLCBOb25lCisgICAgICAgICAgICBpZiBtb2RuYW1lOgorICAgICAgICAgICAgICAgIGlmIHN1Ym5hbWUgPT0gIl9faW5pdF9fIjoKKyAgICAgICAgICAgICAgICAgICAgIyBzdHJpcCB0cmFpbGluZyBwZXJpb2QKKyAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSA9IG1vZG5hbWVbOi0xXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBtb2RuYW1lICsgc3VibmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gc3VibmFtZQorICAgICAgICAgICAgaWYgc3lzLm1vZHVsZXMuaGFzX2tleShtb2RuYW1lKToKKyAgICAgICAgICAgICAgICBnbG9iYWxzID0gc3lzLm1vZHVsZXNbbW9kbmFtZV0uX19kaWN0X18KKyAgICAgICAgICAgICAgICBzZWxmLmdsb2JhbHMgPSB7fQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBnbG9iYWxzID0gc2VsZi5nbG9iYWxzCisgICAgICAgICAgICAgICAgbW9kbmFtZSA9IHN1Ym5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbGUgPSAnPCVzPicgJSBzZWxmLnRpdGxlCisgICAgICAgICAgICBnbG9iYWxzID0gc2VsZi5nbG9iYWxzCisgICAgICAgICAgICBtb2RuYW1lID0gZmlsZQorICAgICAgICByZXR1cm4gZ2xvYmFscywgZmlsZSwgbW9kbmFtZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHN0dWZmKToKKyAgICAgICAgIiIiZm9yIHVzZSBhcyBzdGRvdXQiIiIKKyAgICAgICAgc2VsZi5fYnVmID0gc2VsZi5fYnVmICsgc3R1ZmYKKyAgICAgICAgaWYgJ1xuJyBpbiBzZWxmLl9idWY6CisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc3R1ZmYgPSBzdHJpbmcuc3BsaXQoc2VsZi5fYnVmLCAnXG4nKQorICAgICAgICBzdHVmZiA9IHN0cmluZy5qb2luKHN0dWZmLCAnXHInKQorICAgICAgICBlbmQgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IudGVkLldFR2V0VGV4dExlbmd0aCgpCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci50ZWQuV0VTZXRTZWxlY3Rpb24oZW5kLCBlbmQpCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci50ZWQuV0VJbnNlcnQoc3R1ZmYsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5fYnVmID0gIiIKKyAgICAgICAgIyA/IG9wdGlvbmFsOgorICAgICAgICAjc2VsZi53aWQuU2VsZWN0V2luZG93KCkKKworICAgIGRlZiBnZXRjbGFzc2xpc3Qoc2VsZik6CisgICAgICAgIGZyb20gc3RyaW5nIGltcG9ydCBmaW5kLCBzdHJpcAorICAgICAgICBtZXRob2RSRSA9IHJlLmNvbXBpbGUociJcclsgXHRdK2RlZiAiKQorICAgICAgICBmaW5kTWV0aG9kID0gbWV0aG9kUkUuc2VhcmNoCisgICAgICAgIGVkaXRvciA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvcgorICAgICAgICB0ZXh0ID0gZWRpdG9yLmdldCgpCisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICBhcHBlbmQgPSBsaXN0LmFwcGVuZAorICAgICAgICBmdW5jdGFnID0gImZ1bmMiCisgICAgICAgIGNsYXNzdGFnID0gImNsYXNzIgorICAgICAgICBtZXRob2R0YWcgPSAibWV0aG9kIgorICAgICAgICBwb3MgPSAtMQorICAgICAgICBpZiB0ZXh0Wzo0XSA9PSAnZGVmICc6CisgICAgICAgICAgICBhcHBlbmQoKHBvcyArIDQsIGZ1bmN0YWcpKQorICAgICAgICAgICAgcG9zID0gNAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcG9zID0gZmluZCh0ZXh0LCAnXHJkZWYgJywgcG9zICsgMSkKKyAgICAgICAgICAgIGlmIHBvcyA8IDA6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGFwcGVuZCgocG9zICsgNSwgZnVuY3RhZykpCisgICAgICAgIHBvcyA9IC0xCisgICAgICAgIGlmIHRleHRbOjZdID09ICdjbGFzcyAnOgorICAgICAgICAgICAgYXBwZW5kKChwb3MgKyA2LCBjbGFzc3RhZykpCisgICAgICAgICAgICBwb3MgPSA2CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBwb3MgPSBmaW5kKHRleHQsICdccmNsYXNzICcsIHBvcyArIDEpCisgICAgICAgICAgICBpZiBwb3MgPCAwOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBhcHBlbmQoKHBvcyArIDcsIGNsYXNzdGFnKSkKKyAgICAgICAgcG9zID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbSA9IGZpbmRNZXRob2QodGV4dCwgcG9zICsgMSkKKyAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcG9zID0gbS5yZWdzWzBdWzBdCisgICAgICAgICAgICAjcG9zID0gZmluZCh0ZXh0LCAnXHJcdGRlZiAnLCBwb3MgKyAxKQorICAgICAgICAgICAgYXBwZW5kKChtLnJlZ3NbMF1bMV0sIG1ldGhvZHRhZykpCisgICAgICAgIGxpc3Quc29ydCgpCisgICAgICAgIGNsYXNzbGlzdCA9IFtdCisgICAgICAgIG1ldGhvZGxpc3RhcHBlbmQgPSBOb25lCisgICAgICAgIG9mZnNldFRvTGluZSA9IGVkaXRvci50ZWQuV0VPZmZzZXRUb0xpbmUKKyAgICAgICAgZ2V0TGluZVJhbmdlID0gZWRpdG9yLnRlZC5XRUdldExpbmVSYW5nZQorICAgICAgICBhcHBlbmQgPSBjbGFzc2xpc3QuYXBwZW5kCisgICAgICAgIGZvciBwb3MsIHRhZyBpbiBsaXN0OgorICAgICAgICAgICAgbGluZW5vID0gb2Zmc2V0VG9MaW5lKHBvcykKKyAgICAgICAgICAgIGxpbmVTdGFydCwgbGluZUVuZCA9IGdldExpbmVSYW5nZShsaW5lbm8pCisgICAgICAgICAgICBsaW5lID0gc3RyaXAodGV4dFtwb3M6bGluZUVuZF0pCisgICAgICAgICAgICBsaW5lID0gbGluZVs6aWRlbnRpZmllUkVfbWF0Y2gobGluZSldCisgICAgICAgICAgICBpZiB0YWcgaXMgZnVuY3RhZzoKKyAgICAgICAgICAgICAgICBhcHBlbmQoKCJkZWYgIiArIGxpbmUsIGxpbmVubyArIDEpKQorICAgICAgICAgICAgICAgIG1ldGhvZGxpc3RhcHBlbmQgPSBOb25lCisgICAgICAgICAgICBlbGlmIHRhZyBpcyBjbGFzc3RhZzoKKyAgICAgICAgICAgICAgICBhcHBlbmQoWyJjbGFzcyAiICsgbGluZV0pCisgICAgICAgICAgICAgICAgbWV0aG9kbGlzdGFwcGVuZCA9IGNsYXNzbGlzdFstMV0uYXBwZW5kCisgICAgICAgICAgICBlbGlmIG1ldGhvZGxpc3RhcHBlbmQgYW5kIHRhZyBpcyBtZXRob2R0YWc6CisgICAgICAgICAgICAgICAgbWV0aG9kbGlzdGFwcGVuZCgoImRlZiAiICsgbGluZSwgbGluZW5vICsgMSkpCisgICAgICAgIHJldHVybiBjbGFzc2xpc3QKKworICAgIGRlZiBwb3BzZWxlY3RsaW5lKHNlbGYsIGxpbmVubyk6CisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3RsaW5lKGxpbmVubyAtIDEpCisKKyAgICBkZWYgc2VsZWN0bGluZShzZWxmLCBsaW5lbm8sIGNoYXJvZmZzZXQgPSAwKToKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGxpbmUobGluZW5vIC0gMSwgY2hhcm9mZnNldCkKKworICAgIGRlZiBhZGRyZWNlbnRmaWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgYXBwID0gVy5nZXRhcHBsaWNhdGlvbigpCisgICAgICAgIGFwcC5hZGRyZWNlbnRmaWxlKGZpbGVuYW1lKQogCiBjbGFzcyBfc2F2ZW9wdGlvbnM6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIGNyZWF0b3IsIGVvbG4pOgotCQlzZWxmLnJ2ID0gTm9uZQotCQlzZWxmLmVvbG4gPSBlb2xuCi0JCXNlbGYudyA9IHcgPSBXLk1vZGFsRGlhbG9nKCgyNjAsIDE2MCksICdTYXZlIG9wdGlvbnMnKQotCQlyYWRpb2J1dHRvbnMgPSBbXQotCQl3LmxhYmVsID0gVy5UZXh0Qm94KCg4LCA4LCA4MCwgMTgpLCAiRmlsZSBjcmVhdG9yOiIpCi0JCXcuaWRlX3JhZGlvID0gVy5SYWRpb0J1dHRvbigoOCwgMjIsIDE2MCwgMTgpLCAiUHl0aG9uSURFIiwgcmFkaW9idXR0b25zLCBzZWxmLmlkZV9oaXQpCi0JCXcuaW50ZXJwX3JhZGlvID0gVy5SYWRpb0J1dHRvbigoOCwgNDIsIDE2MCwgMTgpLCAiTWFjUHl0aG9uLU9TOSBJbnRlcnByZXRlciIsIHJhZGlvYnV0dG9ucywgc2VsZi5pbnRlcnBfaGl0KQotCQl3LmludGVycHhfcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCg4LCA2MiwgMTYwLCAxOCksICJQeXRob25MYXVuY2hlciIsIHJhZGlvYnV0dG9ucywgc2VsZi5pbnRlcnB4X2hpdCkKLQkJdy5vdGhlcl9yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDgsIDgyLCA1MCwgMTgpLCAiT3RoZXI6IiwgcmFkaW9idXR0b25zKQotCQl3Lm90aGVyX2NyZWF0b3IgPSBXLkVkaXRUZXh0KCg2MiwgODIsIDQwLCAyMCksIGNyZWF0b3IsIHNlbGYub3RoZXJzZWxlY3QpCi0JCXcubm9uZV9yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDgsIDEwMiwgMTYwLCAxOCksICJOb25lIiwgcmFkaW9idXR0b25zLCBzZWxmLm5vbmVfaGl0KQotCQl3LmNhbmNlbGJ1dHRvbiA9IFcuQnV0dG9uKCgtMTgwLCAtMzAsIDgwLCAxNiksICJDYW5jZWwiLCBzZWxmLmNhbmNlbGJ1dHRvbmhpdCkKLQkJdy5va2J1dHRvbiA9IFcuQnV0dG9uKCgtOTAsIC0zMCwgODAsIDE2KSwgIkRvbmUiLCBzZWxmLm9rYnV0dG9uaGl0KQotCQl3LnNldGRlZmF1bHRidXR0b24ody5va2J1dHRvbikKLQkJaWYgY3JlYXRvciA9PSAnUHl0aCc6Ci0JCQl3LmludGVycF9yYWRpby5zZXQoMSkKLQkJZWxpZiBjcmVhdG9yID09IFcuX3NpZ25hdHVyZToKLQkJCXcuaWRlX3JhZGlvLnNldCgxKQotCQllbGlmIGNyZWF0b3IgPT0gJ1B5dFgnOgotCQkJdy5pbnRlcnB4X3JhZGlvLnNldCgxKQotCQllbGlmIGNyZWF0b3IgPT0gJ1wwXDBcMFwwJzoKLQkJCXcubm9uZV9yYWRpby5zZXQoMSkKLQkJZWxzZToKLQkJCXcub3RoZXJfcmFkaW8uc2V0KDEpCi0JCQkKLQkJdy5lb2xubGFiZWwgPSBXLlRleHRCb3goKDE2OCwgOCwgODAsIDE4KSwgIk5ld2xpbmUgc3R5bGU6IikKLQkJcmFkaW9idXR0b25zID0gW10KLQkJdy51bml4X3JhZGlvID0gVy5SYWRpb0J1dHRvbigoMTY4LCAyMiwgODAsIDE4KSwgIlVuaXgiLCByYWRpb2J1dHRvbnMsIHNlbGYudW5peF9oaXQpCi0JCXcubWFjX3JhZGlvID0gVy5SYWRpb0J1dHRvbigoMTY4LCA0MiwgODAsIDE4KSwgIk1hY2ludG9zaCIsIHJhZGlvYnV0dG9ucywgc2VsZi5tYWNfaGl0KQotCQl3Lndpbl9yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDE2OCwgNjIsIDgwLCAxOCksICJXaW5kb3dzIiwgcmFkaW9idXR0b25zLCBzZWxmLndpbl9oaXQpCi0JCWlmIHNlbGYuZW9sbiA9PSAnXG4nOgotCQkJdy51bml4X3JhZGlvLnNldCgxKQotCQllbGlmIHNlbGYuZW9sbiA9PSAnXHJcbic6Ci0JCQl3Lndpbl9yYWRpby5zZXQoMSkKLQkJZWxzZToKLQkJCXcubWFjX3JhZGlvLnNldCgxKQotCQkKLQkJdy5iaW5kKCJjbWQuIiwgdy5jYW5jZWxidXR0b24ucHVzaCkKLQkJdy5vcGVuKCkKLQkKLQlkZWYgaWRlX2hpdChzZWxmKToKLQkJc2VsZi53Lm90aGVyX2NyZWF0b3Iuc2V0KFcuX3NpZ25hdHVyZSkKLQkKLQlkZWYgaW50ZXJwX2hpdChzZWxmKToKLQkJc2VsZi53Lm90aGVyX2NyZWF0b3Iuc2V0KCJQeXRoIikKLQkKLQlkZWYgaW50ZXJweF9oaXQoc2VsZik6Ci0JCXNlbGYudy5vdGhlcl9jcmVhdG9yLnNldCgiUHl0WCIpCi0JCi0JZGVmIG5vbmVfaGl0KHNlbGYpOgotCQlzZWxmLncub3RoZXJfY3JlYXRvci5zZXQoIlwwXDBcMFwwIikKLQkKLQlkZWYgb3RoZXJzZWxlY3Qoc2VsZiwgKmFyZ3MpOgotCQlzZWxfZnJvbSwgc2VsX3RvID0gc2VsZi53Lm90aGVyX2NyZWF0b3IuZ2V0c2VsZWN0aW9uKCkKLQkJY3JlYXRvciA9IHNlbGYudy5vdGhlcl9jcmVhdG9yLmdldCgpWzo0XQotCQljcmVhdG9yID0gY3JlYXRvciArICIgIiAqICg0IC0gbGVuKGNyZWF0b3IpKQotCQlzZWxmLncub3RoZXJfY3JlYXRvci5zZXQoY3JlYXRvcikKLQkJc2VsZi53Lm90aGVyX2NyZWF0b3Iuc2V0c2VsZWN0aW9uKHNlbF9mcm9tLCBzZWxfdG8pCi0JCXNlbGYudy5vdGhlcl9yYWRpby5zZXQoMSkKLQkKLQlkZWYgbWFjX2hpdChzZWxmKToKLQkJc2VsZi5lb2xuID0gJ1xyJwotCQkKLQlkZWYgdW5peF9oaXQoc2VsZik6Ci0JCXNlbGYuZW9sbiA9ICdcbicKLQkJCi0JZGVmIHdpbl9oaXQoc2VsZik6Ci0JCXNlbGYuZW9sbiA9ICdcclxuJwotCQkKLQlkZWYgY2FuY2VsYnV0dG9uaGl0KHNlbGYpOgotCQlzZWxmLncuY2xvc2UoKQotCQotCWRlZiBva2J1dHRvbmhpdChzZWxmKToKLQkJc2VsZi5ydiA9IChzZWxmLncub3RoZXJfY3JlYXRvci5nZXQoKVs6NF0sIHNlbGYuZW9sbikKLQkJc2VsZi53LmNsb3NlKCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjcmVhdG9yLCBlb2xuKToKKyAgICAgICAgc2VsZi5ydiA9IE5vbmUKKyAgICAgICAgc2VsZi5lb2xuID0gZW9sbgorICAgICAgICBzZWxmLncgPSB3ID0gVy5Nb2RhbERpYWxvZygoMjYwLCAxNjApLCAnU2F2ZSBvcHRpb25zJykKKyAgICAgICAgcmFkaW9idXR0b25zID0gW10KKyAgICAgICAgdy5sYWJlbCA9IFcuVGV4dEJveCgoOCwgOCwgODAsIDE4KSwgIkZpbGUgY3JlYXRvcjoiKQorICAgICAgICB3LmlkZV9yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDgsIDIyLCAxNjAsIDE4KSwgIlB5dGhvbklERSIsIHJhZGlvYnV0dG9ucywgc2VsZi5pZGVfaGl0KQorICAgICAgICB3LmludGVycF9yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDgsIDQyLCAxNjAsIDE4KSwgIk1hY1B5dGhvbi1PUzkgSW50ZXJwcmV0ZXIiLCByYWRpb2J1dHRvbnMsIHNlbGYuaW50ZXJwX2hpdCkKKyAgICAgICAgdy5pbnRlcnB4X3JhZGlvID0gVy5SYWRpb0J1dHRvbigoOCwgNjIsIDE2MCwgMTgpLCAiUHl0aG9uTGF1bmNoZXIiLCByYWRpb2J1dHRvbnMsIHNlbGYuaW50ZXJweF9oaXQpCisgICAgICAgIHcub3RoZXJfcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCg4LCA4MiwgNTAsIDE4KSwgIk90aGVyOiIsIHJhZGlvYnV0dG9ucykKKyAgICAgICAgdy5vdGhlcl9jcmVhdG9yID0gVy5FZGl0VGV4dCgoNjIsIDgyLCA0MCwgMjApLCBjcmVhdG9yLCBzZWxmLm90aGVyc2VsZWN0KQorICAgICAgICB3Lm5vbmVfcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCg4LCAxMDIsIDE2MCwgMTgpLCAiTm9uZSIsIHJhZGlvYnV0dG9ucywgc2VsZi5ub25lX2hpdCkKKyAgICAgICAgdy5jYW5jZWxidXR0b24gPSBXLkJ1dHRvbigoLTE4MCwgLTMwLCA4MCwgMTYpLCAiQ2FuY2VsIiwgc2VsZi5jYW5jZWxidXR0b25oaXQpCisgICAgICAgIHcub2tidXR0b24gPSBXLkJ1dHRvbigoLTkwLCAtMzAsIDgwLCAxNiksICJEb25lIiwgc2VsZi5va2J1dHRvbmhpdCkKKyAgICAgICAgdy5zZXRkZWZhdWx0YnV0dG9uKHcub2tidXR0b24pCisgICAgICAgIGlmIGNyZWF0b3IgPT0gJ1B5dGgnOgorICAgICAgICAgICAgdy5pbnRlcnBfcmFkaW8uc2V0KDEpCisgICAgICAgIGVsaWYgY3JlYXRvciA9PSBXLl9zaWduYXR1cmU6CisgICAgICAgICAgICB3LmlkZV9yYWRpby5zZXQoMSkKKyAgICAgICAgZWxpZiBjcmVhdG9yID09ICdQeXRYJzoKKyAgICAgICAgICAgIHcuaW50ZXJweF9yYWRpby5zZXQoMSkKKyAgICAgICAgZWxpZiBjcmVhdG9yID09ICdcMFwwXDBcMCc6CisgICAgICAgICAgICB3Lm5vbmVfcmFkaW8uc2V0KDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3Lm90aGVyX3JhZGlvLnNldCgxKQorCisgICAgICAgIHcuZW9sbmxhYmVsID0gVy5UZXh0Qm94KCgxNjgsIDgsIDgwLCAxOCksICJOZXdsaW5lIHN0eWxlOiIpCisgICAgICAgIHJhZGlvYnV0dG9ucyA9IFtdCisgICAgICAgIHcudW5peF9yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDE2OCwgMjIsIDgwLCAxOCksICJVbml4IiwgcmFkaW9idXR0b25zLCBzZWxmLnVuaXhfaGl0KQorICAgICAgICB3Lm1hY19yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDE2OCwgNDIsIDgwLCAxOCksICJNYWNpbnRvc2giLCByYWRpb2J1dHRvbnMsIHNlbGYubWFjX2hpdCkKKyAgICAgICAgdy53aW5fcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCgxNjgsIDYyLCA4MCwgMTgpLCAiV2luZG93cyIsIHJhZGlvYnV0dG9ucywgc2VsZi53aW5faGl0KQorICAgICAgICBpZiBzZWxmLmVvbG4gPT0gJ1xuJzoKKyAgICAgICAgICAgIHcudW5peF9yYWRpby5zZXQoMSkKKyAgICAgICAgZWxpZiBzZWxmLmVvbG4gPT0gJ1xyXG4nOgorICAgICAgICAgICAgdy53aW5fcmFkaW8uc2V0KDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3Lm1hY19yYWRpby5zZXQoMSkKKworICAgICAgICB3LmJpbmQoImNtZC4iLCB3LmNhbmNlbGJ1dHRvbi5wdXNoKQorICAgICAgICB3Lm9wZW4oKQorCisgICAgZGVmIGlkZV9oaXQoc2VsZik6CisgICAgICAgIHNlbGYudy5vdGhlcl9jcmVhdG9yLnNldChXLl9zaWduYXR1cmUpCisKKyAgICBkZWYgaW50ZXJwX2hpdChzZWxmKToKKyAgICAgICAgc2VsZi53Lm90aGVyX2NyZWF0b3Iuc2V0KCJQeXRoIikKKworICAgIGRlZiBpbnRlcnB4X2hpdChzZWxmKToKKyAgICAgICAgc2VsZi53Lm90aGVyX2NyZWF0b3Iuc2V0KCJQeXRYIikKKworICAgIGRlZiBub25lX2hpdChzZWxmKToKKyAgICAgICAgc2VsZi53Lm90aGVyX2NyZWF0b3Iuc2V0KCJcMFwwXDBcMCIpCisKKyAgICBkZWYgb3RoZXJzZWxlY3Qoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxfZnJvbSwgc2VsX3RvID0gc2VsZi53Lm90aGVyX2NyZWF0b3IuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgY3JlYXRvciA9IHNlbGYudy5vdGhlcl9jcmVhdG9yLmdldCgpWzo0XQorICAgICAgICBjcmVhdG9yID0gY3JlYXRvciArICIgIiAqICg0IC0gbGVuKGNyZWF0b3IpKQorICAgICAgICBzZWxmLncub3RoZXJfY3JlYXRvci5zZXQoY3JlYXRvcikKKyAgICAgICAgc2VsZi53Lm90aGVyX2NyZWF0b3Iuc2V0c2VsZWN0aW9uKHNlbF9mcm9tLCBzZWxfdG8pCisgICAgICAgIHNlbGYudy5vdGhlcl9yYWRpby5zZXQoMSkKKworICAgIGRlZiBtYWNfaGl0KHNlbGYpOgorICAgICAgICBzZWxmLmVvbG4gPSAnXHInCisKKyAgICBkZWYgdW5peF9oaXQoc2VsZik6CisgICAgICAgIHNlbGYuZW9sbiA9ICdcbicKKworICAgIGRlZiB3aW5faGl0KHNlbGYpOgorICAgICAgICBzZWxmLmVvbG4gPSAnXHJcbicKKworICAgIGRlZiBjYW5jZWxidXR0b25oaXQoc2VsZik6CisgICAgICAgIHNlbGYudy5jbG9zZSgpCisKKyAgICBkZWYgb2tidXR0b25oaXQoc2VsZik6CisgICAgICAgIHNlbGYucnYgPSAoc2VsZi53Lm90aGVyX2NyZWF0b3IuZ2V0KClbOjRdLCBzZWxmLmVvbG4pCisgICAgICAgIHNlbGYudy5jbG9zZSgpCiAKIAogZGVmIFNhdmVPcHRpb25zKGNyZWF0b3IsIGVvbG4pOgotCXMgPSBfc2F2ZW9wdGlvbnMoY3JlYXRvciwgZW9sbikKLQlyZXR1cm4gcy5ydgorICAgIHMgPSBfc2F2ZW9wdGlvbnMoY3JlYXRvciwgZW9sbikKKyAgICByZXR1cm4gcy5ydgogCiAKLWRlZiBfZXNjYXBlKHdoZXJlLCB3aGF0KSA6IAotCXJldHVybiBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQod2hlcmUsIHdoYXQpLCAnXFwnICsgd2hhdCkKK2RlZiBfZXNjYXBlKHdoZXJlLCB3aGF0KSA6CisgICAgcmV0dXJuIHN0cmluZy5qb2luKHN0cmluZy5zcGxpdCh3aGVyZSwgd2hhdCksICdcXCcgKyB3aGF0KQogCiBkZWYgX21ha2V3aG9sZXdvcmRwYXR0ZXJuKHdvcmQpOgotCSMgZmlyc3QsIGVzY2FwZSBzcGVjaWFsIHJlZ2V4IGNoYXJzCi0JZm9yIGVzYyBpbiAiXFxbXSgpfC4qXiskPyI6Ci0JCXdvcmQgPSBfZXNjYXBlKHdvcmQsIGVzYykKLQlub3R3b3JkY2hhcnNwYXQgPSAnW14nICsgX3dvcmRjaGFycyArICddJwotCXBhdHRlcm4gPSAnKCcgKyB3b3JkICsgJyknCi0JaWYgd29yZFswXSBpbiBfd29yZGNoYXJzOgotCQlwYXR0ZXJuID0gbm90d29yZGNoYXJzcGF0ICsgcGF0dGVybgotCWlmIHdvcmRbLTFdIGluIF93b3JkY2hhcnM6Ci0JCXBhdHRlcm4gPSBwYXR0ZXJuICsgbm90d29yZGNoYXJzcGF0Ci0JcmV0dXJuIHJlLmNvbXBpbGUocGF0dGVybikKKyAgICAjIGZpcnN0LCBlc2NhcGUgc3BlY2lhbCByZWdleCBjaGFycworICAgIGZvciBlc2MgaW4gIlxcW10oKXwuKl4rJD8iOgorICAgICAgICB3b3JkID0gX2VzY2FwZSh3b3JkLCBlc2MpCisgICAgbm90d29yZGNoYXJzcGF0ID0gJ1teJyArIF93b3JkY2hhcnMgKyAnXScKKyAgICBwYXR0ZXJuID0gJygnICsgd29yZCArICcpJworICAgIGlmIHdvcmRbMF0gaW4gX3dvcmRjaGFyczoKKyAgICAgICAgcGF0dGVybiA9IG5vdHdvcmRjaGFyc3BhdCArIHBhdHRlcm4KKyAgICBpZiB3b3JkWy0xXSBpbiBfd29yZGNoYXJzOgorICAgICAgICBwYXR0ZXJuID0gcGF0dGVybiArIG5vdHdvcmRjaGFyc3BhdAorICAgIHJldHVybiByZS5jb21waWxlKHBhdHRlcm4pCiAKIAogY2xhc3MgU2VhcmNoRW5naW5lOgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJc2VsZi52aXNpYmxlID0gMAotCQlzZWxmLncgPSBOb25lCi0JCXNlbGYucGFybXMgPSB7ICAiZmluZCI6ICIiLAotCQkJCQkicmVwbGFjZSI6ICIiLAotCQkJCQkid3JhcCI6IDEsCi0JCQkJCSJjYXNlc2VucyI6IDEsCi0JCQkJCSJ3aG9sZXdvcmQiOiAxCi0JCQkJfQotCQlpbXBvcnQgTWFjUHJlZnMKLQkJcHJlZnMgPSBNYWNQcmVmcy5HZXRQcmVmcyhXLmdldGFwcGxpY2F0aW9uKCkucHJlZmZpbGVwYXRoKQotCQlpZiBwcmVmcy5zZWFyY2hlbmdpbmU6Ci0JCQlzZWxmLnBhcm1zWyJjYXNlc2VucyJdID0gcHJlZnMuc2VhcmNoZW5naW5lLmNhc2VzZW5zCi0JCQlzZWxmLnBhcm1zWyJ3cmFwIl0gPSBwcmVmcy5zZWFyY2hlbmdpbmUud3JhcAotCQkJc2VsZi5wYXJtc1sid2hvbGV3b3JkIl0gPSBwcmVmcy5zZWFyY2hlbmdpbmUud2hvbGV3b3JkCi0JCi0JZGVmIHNob3coc2VsZik6Ci0JCXNlbGYudmlzaWJsZSA9IDEKLQkJaWYgc2VsZi53OgotCQkJc2VsZi53LndpZC5TaG93V2luZG93KCkKLQkJCXNlbGYudy53aWQuU2VsZWN0V2luZG93KCkKLQkJCXNlbGYudy5maW5kLmVkaXQuc2VsZWN0KDEpCi0JCQlzZWxmLncuZmluZC5lZGl0LnNlbGVjdGFsbCgpCi0JCQlyZXR1cm4KLQkJc2VsZi53ID0gVy5EaWFsb2coKDQyMCwgMTUwKSwgIkZpbmQiKQotCQkKLQkJc2VsZi53LmZpbmQgPSBUaXRsZWRFZGl0VGV4dCgoMTAsIDQsIDMwMCwgMzYpLCAiU2VhcmNoIGZvcjoiKQotCQlzZWxmLncucmVwbGFjZSA9IFRpdGxlZEVkaXRUZXh0KCgxMCwgMTAwLCAzMDAsIDM2KSwgIlJlcGxhY2Ugd2l0aDoiKQotCQkKLQkJc2VsZi53LmJveGVzID0gVy5Hcm91cCgoMTAsIDUwLCAzMDAsIDQwKSkKLQkJc2VsZi53LmJveGVzLmNhc2VzZW5zID0gVy5DaGVja0JveCgoMCwgMCwgMTAwLCAxNiksICJDYXNlIHNlbnNpdGl2ZSIpCi0JCXNlbGYudy5ib3hlcy53aG9sZXdvcmQgPSBXLkNoZWNrQm94KCgwLCAyMCwgMTAwLCAxNiksICJXaG9sZSB3b3JkIikKLQkJc2VsZi53LmJveGVzLndyYXAgPSBXLkNoZWNrQm94KCgxMTAsIDAsIDEwMCwgMTYpLCAiV3JhcCBhcm91bmQiKQotCQkKLQkJc2VsZi5idXR0b25zID0gWwkoIkZpbmQiLAkJImNtZGYiLAkgc2VsZi5maW5kKSwgCi0JCQkJCSgiUmVwbGFjZSIsCSAgICAgImNtZHIiLAkgc2VsZi5yZXBsYWNlKSwgCi0JCQkJCSgiUmVwbGFjZSBhbGwiLAkgTm9uZSwgICBzZWxmLnJlcGxhY2VhbGwpLCAKLQkJCQkJKCJEb24ndCBmaW5kIiwgICJjbWRkIiwJIHNlbGYuZG9udCksIAotCQkJCQkoIkNhbmNlbCIsCSAgICAgICJjbWQuIiwJIHNlbGYuY2FuY2VsKQotCQkJCV0KLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuYnV0dG9ucykpOgotCQkJYm91bmRzID0gLTkwLCAyMiArIGkgKiAyNCwgODAsIDE2Ci0JCQl0aXRsZSwgc2hvcnRjdXQsIGNhbGxiYWNrID0gc2VsZi5idXR0b25zW2ldCi0JCQlzZWxmLndbdGl0bGVdID0gVy5CdXR0b24oYm91bmRzLCB0aXRsZSwgY2FsbGJhY2spCi0JCQlpZiBzaG9ydGN1dDoKLQkJCQlzZWxmLncuYmluZChzaG9ydGN1dCwgc2VsZi53W3RpdGxlXS5wdXNoKQotCQlzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndbIkRvbid0IGZpbmQiXSkKLQkJc2VsZi53LmZpbmQuZWRpdC5iaW5kKCI8a2V5PiIsIHNlbGYua2V5KQotCQlzZWxmLncuYmluZCgiPGFjdGl2YXRlPiIsIHNlbGYuYWN0aXZhdGUpCi0JCXNlbGYudy5iaW5kKCI8Y2xvc2U+Iiwgc2VsZi5jbG9zZSkKLQkJc2VsZi53Lm9wZW4oKQotCQlzZWxmLnNldHBhcm1zKCkKLQkJc2VsZi53LmZpbmQuZWRpdC5zZWxlY3QoMSkKLQkJc2VsZi53LmZpbmQuZWRpdC5zZWxlY3RhbGwoKQotCQlzZWxmLmNoZWNrYnV0dG9ucygpCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlzZWxmLmhpZGUoKQotCQlyZXR1cm4gLTEKLQkKLQlkZWYga2V5KHNlbGYsIGNoYXIsIG1vZGlmaWVycyk6Ci0JCXNlbGYudy5maW5kLmVkaXQua2V5KGNoYXIsIG1vZGlmaWVycykKLQkJc2VsZi5jaGVja2J1dHRvbnMoKQotCQlyZXR1cm4gMQotCQotCWRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6Ci0JCWlmIG9ub2ZmOgotCQkJc2VsZi5jaGVja2J1dHRvbnMoKQotCQotCWRlZiBjaGVja2J1dHRvbnMoc2VsZik6Ci0JCWVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKLQkJaWYgZWRpdG9yOgotCQkJaWYgc2VsZi53LmZpbmQuZ2V0KCk6Ci0JCQkJZm9yIHRpdGxlLCBjbWQsIGNhbGwgaW4gc2VsZi5idXR0b25zWzotMl06Ci0JCQkJCXNlbGYud1t0aXRsZV0uZW5hYmxlKDEpCi0JCQkJc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53WyJGaW5kIl0pCi0JCQllbHNlOgotCQkJCWZvciB0aXRsZSwgY21kLCBjYWxsIGluIHNlbGYuYnV0dG9uc1s6LTJdOgotCQkJCQlzZWxmLndbdGl0bGVdLmVuYWJsZSgwKQotCQkJCXNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud1siRG9uJ3QgZmluZCJdKQotCQllbHNlOgotCQkJZm9yIHRpdGxlLCBjbWQsIGNhbGwgaW4gc2VsZi5idXR0b25zWzotMl06Ci0JCQkJc2VsZi53W3RpdGxlXS5lbmFibGUoMCkKLQkJCXNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud1siRG9uJ3QgZmluZCJdKQotCQotCWRlZiBmaW5kKHNlbGYpOgotCQlzZWxmLmdldHBhcm1zZnJvbXdpbmRvdygpCi0JCWlmIHNlbGYuZmluZG5leHQoKToKLQkJCXNlbGYuaGlkZSgpCi0JCi0JZGVmIHJlcGxhY2Uoc2VsZik6Ci0JCWVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKLQkJaWYgbm90IGVkaXRvcjoKLQkJCXJldHVybgotCQlpZiBzZWxmLnZpc2libGU6Ci0JCQlzZWxmLmdldHBhcm1zZnJvbXdpbmRvdygpCi0JCXRleHQgPSBlZGl0b3IuZ2V0c2VsZWN0ZWR0ZXh0KCkKLQkJZmluZCA9IHNlbGYucGFybXNbImZpbmQiXQotCQlpZiBub3Qgc2VsZi5wYXJtc1siY2FzZXNlbnMiXToKLQkJCWZpbmQgPSBzdHJpbmcubG93ZXIoZmluZCkKLQkJCXRleHQgPSBzdHJpbmcubG93ZXIodGV4dCkKLQkJaWYgdGV4dCA9PSBmaW5kOgotCQkJc2VsZi5oaWRlKCkKLQkJCWVkaXRvci5pbnNlcnQoc2VsZi5wYXJtc1sicmVwbGFjZSJdKQotCQotCWRlZiByZXBsYWNlYWxsKHNlbGYpOgotCQllZGl0b3IgPSBmaW5kZWRpdG9yKHNlbGYpCi0JCWlmIG5vdCBlZGl0b3I6Ci0JCQlyZXR1cm4KLQkJaWYgc2VsZi52aXNpYmxlOgotCQkJc2VsZi5nZXRwYXJtc2Zyb213aW5kb3coKQotCQlXLlNldEN1cnNvcigid2F0Y2giKQotCQlmaW5kID0gc2VsZi5wYXJtc1siZmluZCJdCi0JCWlmIG5vdCBmaW5kOgotCQkJcmV0dXJuCi0JCWZpbmRsZW4gPSBsZW4oZmluZCkKLQkJcmVwbGFjZSA9IHNlbGYucGFybXNbInJlcGxhY2UiXQotCQlyZXBsYWNlbGVuID0gbGVuKHJlcGxhY2UpCi0JCVRleHQgPSBlZGl0b3IuZ2V0KCkKLQkJaWYgbm90IHNlbGYucGFybXNbImNhc2VzZW5zIl06Ci0JCQlmaW5kID0gc3RyaW5nLmxvd2VyKGZpbmQpCi0JCQl0ZXh0ID0gc3RyaW5nLmxvd2VyKFRleHQpCi0JCWVsc2U6Ci0JCQl0ZXh0ID0gVGV4dAotCQluZXd0ZXh0ID0gIiIKLQkJcG9zID0gMAotCQljb3VudGVyID0gMAotCQl3aGlsZSAxOgotCQkJaWYgc2VsZi5wYXJtc1sid2hvbGV3b3JkIl06Ci0JCQkJd2hvbGV3b3JkUkUgPSBfbWFrZXdob2xld29yZHBhdHRlcm4oZmluZCkKLQkJCQltYXRjaCA9IHdob2xld29yZFJFLnNlYXJjaCh0ZXh0LCBwb3MpCi0JCQkJaWYgbWF0Y2g6Ci0JCQkJCXBvcyA9IG1hdGNoLnN0YXJ0KDEpCi0JCQkJZWxzZToKLQkJCQkJcG9zID0gLTEKLQkJCWVsc2U6Ci0JCQkJcG9zID0gc3RyaW5nLmZpbmQodGV4dCwgZmluZCwgcG9zKQotCQkJaWYgcG9zIDwgMDoKLQkJCQlicmVhawotCQkJY291bnRlciA9IGNvdW50ZXIgKyAxCi0JCQl0ZXh0ID0gdGV4dFs6cG9zXSArIHJlcGxhY2UgKyB0ZXh0W3BvcyArIGZpbmRsZW46XQotCQkJVGV4dCA9IFRleHRbOnBvc10gKyByZXBsYWNlICsgVGV4dFtwb3MgKyBmaW5kbGVuOl0KLQkJCXBvcyA9IHBvcyArIHJlcGxhY2VsZW4KLQkJVy5TZXRDdXJzb3IoImFycm93IikKLQkJaWYgY291bnRlcjoKLQkJCXNlbGYuaGlkZSgpCi0JCQlmcm9tIENhcmJvbiBpbXBvcnQgUmVzCi0JCQllZGl0b3IudGV4dGNoYW5nZWQoKQotCQkJZWRpdG9yLnNlbGVjdGlvbmNoYW5nZWQoKQotCQkJZWRpdG9yLnNldChUZXh0KQotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiUmVwbGFjZWQgJWQgb2NjdXJyZW5jZXMiICUgY291bnRlcikKLQkKLQlkZWYgZG9udChzZWxmKToKLQkJc2VsZi5nZXRwYXJtc2Zyb213aW5kb3coKQotCQlzZWxmLmhpZGUoKQotCQotCWRlZiByZXBsYWNlZmluZChzZWxmKToKLQkJc2VsZi5yZXBsYWNlKCkKLQkJc2VsZi5maW5kbmV4dCgpCi0JCi0JZGVmIHNldGZpbmRzdHJpbmcoc2VsZik6Ci0JCWVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKLQkJaWYgbm90IGVkaXRvcjoKLQkJCXJldHVybgotCQlmaW5kID0gZWRpdG9yLmdldHNlbGVjdGVkdGV4dCgpCi0JCWlmIG5vdCBmaW5kOgotCQkJcmV0dXJuCi0JCXNlbGYucGFybXNbImZpbmQiXSA9IGZpbmQKLQkJaWYgc2VsZi53OgotCQkJc2VsZi53LmZpbmQuZWRpdC5zZXQoc2VsZi5wYXJtc1siZmluZCJdKQotCQkJc2VsZi53LmZpbmQuZWRpdC5zZWxlY3RhbGwoKQotCQotCWRlZiBmaW5kbmV4dChzZWxmKToKLQkJZWRpdG9yID0gZmluZGVkaXRvcihzZWxmKQotCQlpZiBub3QgZWRpdG9yOgotCQkJcmV0dXJuCi0JCWZpbmQgPSBzZWxmLnBhcm1zWyJmaW5kIl0KLQkJaWYgbm90IGZpbmQ6Ci0JCQlyZXR1cm4KLQkJdGV4dCA9IGVkaXRvci5nZXQoKQotCQlpZiBub3Qgc2VsZi5wYXJtc1siY2FzZXNlbnMiXToKLQkJCWZpbmQgPSBzdHJpbmcubG93ZXIoZmluZCkKLQkJCXRleHQgPSBzdHJpbmcubG93ZXIodGV4dCkKLQkJc2Vsc3RhcnQsIHNlbGVuZCA9IGVkaXRvci5nZXRzZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKLQkJaWYgc2VsZi5wYXJtc1sid2hvbGV3b3JkIl06Ci0JCQl3aG9sZXdvcmRSRSA9IF9tYWtld2hvbGV3b3JkcGF0dGVybihmaW5kKQotCQkJbWF0Y2ggPSB3aG9sZXdvcmRSRS5zZWFyY2godGV4dCwgc2VsZW5kKQotCQkJaWYgbWF0Y2g6Ci0JCQkJcG9zID0gbWF0Y2guc3RhcnQoMSkKLQkJCWVsc2U6Ci0JCQkJcG9zID0gLTEKLQkJZWxzZToKLQkJCXBvcyA9IHN0cmluZy5maW5kKHRleHQsIGZpbmQsIHNlbGVuZCkKLQkJaWYgcG9zID49IDA6Ci0JCQllZGl0b3Iuc2V0c2VsZWN0aW9uKHBvcywgcG9zICsgbGVuKGZpbmQpKQotCQkJcmV0dXJuIDEKLQkJZWxpZiBzZWxmLnBhcm1zWyJ3cmFwIl06Ci0JCQlpZiBzZWxmLnBhcm1zWyJ3aG9sZXdvcmQiXToKLQkJCQltYXRjaCA9IHdob2xld29yZFJFLnNlYXJjaCh0ZXh0LCAwKQotCQkJCWlmIG1hdGNoOgotCQkJCQlwb3MgPSBtYXRjaC5zdGFydCgxKQotCQkJCWVsc2U6Ci0JCQkJCXBvcyA9IC0xCi0JCQllbHNlOgotCQkJCXBvcyA9IHN0cmluZy5maW5kKHRleHQsIGZpbmQpCi0JCQlpZiBzZWxzdGFydCA+IHBvcyA+PSAwOgotCQkJCWVkaXRvci5zZXRzZWxlY3Rpb24ocG9zLCBwb3MgKyBsZW4oZmluZCkpCi0JCQkJcmV0dXJuIDEKLQkKLQlkZWYgc2V0cGFybXMoc2VsZik6Ci0JCWZvciBrZXksIHZhbHVlIGluIHNlbGYucGFybXMuaXRlbXMoKToKLQkJCXRyeToKLQkJCQlzZWxmLndba2V5XS5zZXQodmFsdWUpCi0JCQlleGNlcHQgS2V5RXJyb3I6Ci0JCQkJc2VsZi53LmJveGVzW2tleV0uc2V0KHZhbHVlKQotCQotCWRlZiBnZXRwYXJtc2Zyb213aW5kb3coc2VsZik6Ci0JCWlmIG5vdCBzZWxmLnc6Ci0JCQlyZXR1cm4KLQkJZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5wYXJtcy5pdGVtcygpOgotCQkJdHJ5OgotCQkJCXZhbHVlID0gc2VsZi53W2tleV0uZ2V0KCkKLQkJCWV4Y2VwdCBLZXlFcnJvcjoKLQkJCQl2YWx1ZSA9IHNlbGYudy5ib3hlc1trZXldLmdldCgpCi0JCQlzZWxmLnBhcm1zW2tleV0gPSB2YWx1ZQotCQotCWRlZiBjYW5jZWwoc2VsZik6Ci0JCXNlbGYuaGlkZSgpCi0JCXNlbGYuc2V0cGFybXMoKQotCQotCWRlZiBoaWRlKHNlbGYpOgotCQlpZiBzZWxmLnc6Ci0JCQlzZWxmLncud2lkLkhpZGVXaW5kb3coKQotCQkJc2VsZi52aXNpYmxlID0gMAotCQotCWRlZiB3cml0ZXByZWZzKHNlbGYpOgotCQlpbXBvcnQgTWFjUHJlZnMKLQkJc2VsZi5nZXRwYXJtc2Zyb213aW5kb3coKQotCQlwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCi0JCXByZWZzLnNlYXJjaGVuZ2luZS5jYXNlc2VucyA9IHNlbGYucGFybXNbImNhc2VzZW5zIl0KLQkJcHJlZnMuc2VhcmNoZW5naW5lLndyYXAgPSBzZWxmLnBhcm1zWyJ3cmFwIl0KLQkJcHJlZnMuc2VhcmNoZW5naW5lLndob2xld29yZCA9IHNlbGYucGFybXNbIndob2xld29yZCJdCi0JCXByZWZzLnNhdmUoKQotCQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZpc2libGUgPSAwCisgICAgICAgIHNlbGYudyA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJtcyA9IHsgICJmaW5kIjogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlIjogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cmFwIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhc2VzZW5zIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndob2xld29yZCI6IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaW1wb3J0IE1hY1ByZWZzCisgICAgICAgIHByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKKyAgICAgICAgaWYgcHJlZnMuc2VhcmNoZW5naW5lOgorICAgICAgICAgICAgc2VsZi5wYXJtc1siY2FzZXNlbnMiXSA9IHByZWZzLnNlYXJjaGVuZ2luZS5jYXNlc2VucworICAgICAgICAgICAgc2VsZi5wYXJtc1sid3JhcCJdID0gcHJlZnMuc2VhcmNoZW5naW5lLndyYXAKKyAgICAgICAgICAgIHNlbGYucGFybXNbIndob2xld29yZCJdID0gcHJlZnMuc2VhcmNoZW5naW5lLndob2xld29yZAorCisgICAgZGVmIHNob3coc2VsZik6CisgICAgICAgIHNlbGYudmlzaWJsZSA9IDEKKyAgICAgICAgaWYgc2VsZi53OgorICAgICAgICAgICAgc2VsZi53LndpZC5TaG93V2luZG93KCkKKyAgICAgICAgICAgIHNlbGYudy53aWQuU2VsZWN0V2luZG93KCkKKyAgICAgICAgICAgIHNlbGYudy5maW5kLmVkaXQuc2VsZWN0KDEpCisgICAgICAgICAgICBzZWxmLncuZmluZC5lZGl0LnNlbGVjdGFsbCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi53ID0gVy5EaWFsb2coKDQyMCwgMTUwKSwgIkZpbmQiKQorCisgICAgICAgIHNlbGYudy5maW5kID0gVGl0bGVkRWRpdFRleHQoKDEwLCA0LCAzMDAsIDM2KSwgIlNlYXJjaCBmb3I6IikKKyAgICAgICAgc2VsZi53LnJlcGxhY2UgPSBUaXRsZWRFZGl0VGV4dCgoMTAsIDEwMCwgMzAwLCAzNiksICJSZXBsYWNlIHdpdGg6IikKKworICAgICAgICBzZWxmLncuYm94ZXMgPSBXLkdyb3VwKCgxMCwgNTAsIDMwMCwgNDApKQorICAgICAgICBzZWxmLncuYm94ZXMuY2FzZXNlbnMgPSBXLkNoZWNrQm94KCgwLCAwLCAxMDAsIDE2KSwgIkNhc2Ugc2Vuc2l0aXZlIikKKyAgICAgICAgc2VsZi53LmJveGVzLndob2xld29yZCA9IFcuQ2hlY2tCb3goKDAsIDIwLCAxMDAsIDE2KSwgIldob2xlIHdvcmQiKQorICAgICAgICBzZWxmLncuYm94ZXMud3JhcCA9IFcuQ2hlY2tCb3goKDExMCwgMCwgMTAwLCAxNiksICJXcmFwIGFyb3VuZCIpCisKKyAgICAgICAgc2VsZi5idXR0b25zID0gWyAgICAgICAgKCJGaW5kIiwgICAgICAgICAgICAgICAgImNtZGYiLCAgc2VsZi5maW5kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJSZXBsYWNlIiwgICAgICAgICAgImNtZHIiLCAgICAgc2VsZi5yZXBsYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJSZXBsYWNlIGFsbCIsICBOb25lLCAgIHNlbGYucmVwbGFjZWFsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiRG9uJ3QgZmluZCIsICAiY21kZCIsICBzZWxmLmRvbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbmNlbCIsICAgICAgICAgICAgImNtZC4iLCAgICBzZWxmLmNhbmNlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuYnV0dG9ucykpOgorICAgICAgICAgICAgYm91bmRzID0gLTkwLCAyMiArIGkgKiAyNCwgODAsIDE2CisgICAgICAgICAgICB0aXRsZSwgc2hvcnRjdXQsIGNhbGxiYWNrID0gc2VsZi5idXR0b25zW2ldCisgICAgICAgICAgICBzZWxmLndbdGl0bGVdID0gVy5CdXR0b24oYm91bmRzLCB0aXRsZSwgY2FsbGJhY2spCisgICAgICAgICAgICBpZiBzaG9ydGN1dDoKKyAgICAgICAgICAgICAgICBzZWxmLncuYmluZChzaG9ydGN1dCwgc2VsZi53W3RpdGxlXS5wdXNoKQorICAgICAgICBzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndbIkRvbid0IGZpbmQiXSkKKyAgICAgICAgc2VsZi53LmZpbmQuZWRpdC5iaW5kKCI8a2V5PiIsIHNlbGYua2V5KQorICAgICAgICBzZWxmLncuYmluZCgiPGFjdGl2YXRlPiIsIHNlbGYuYWN0aXZhdGUpCisgICAgICAgIHNlbGYudy5iaW5kKCI8Y2xvc2U+Iiwgc2VsZi5jbG9zZSkKKyAgICAgICAgc2VsZi53Lm9wZW4oKQorICAgICAgICBzZWxmLnNldHBhcm1zKCkKKyAgICAgICAgc2VsZi53LmZpbmQuZWRpdC5zZWxlY3QoMSkKKyAgICAgICAgc2VsZi53LmZpbmQuZWRpdC5zZWxlY3RhbGwoKQorICAgICAgICBzZWxmLmNoZWNrYnV0dG9ucygpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuaGlkZSgpCisgICAgICAgIHJldHVybiAtMQorCisgICAgZGVmIGtleShzZWxmLCBjaGFyLCBtb2RpZmllcnMpOgorICAgICAgICBzZWxmLncuZmluZC5lZGl0LmtleShjaGFyLCBtb2RpZmllcnMpCisgICAgICAgIHNlbGYuY2hlY2tidXR0b25zKCkKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6CisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgc2VsZi5jaGVja2J1dHRvbnMoKQorCisgICAgZGVmIGNoZWNrYnV0dG9ucyhzZWxmKToKKyAgICAgICAgZWRpdG9yID0gZmluZGVkaXRvcihzZWxmKQorICAgICAgICBpZiBlZGl0b3I6CisgICAgICAgICAgICBpZiBzZWxmLncuZmluZC5nZXQoKToKKyAgICAgICAgICAgICAgICBmb3IgdGl0bGUsIGNtZCwgY2FsbCBpbiBzZWxmLmJ1dHRvbnNbOi0yXToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53W3RpdGxlXS5lbmFibGUoMSkKKyAgICAgICAgICAgICAgICBzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndbIkZpbmQiXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIHRpdGxlLCBjbWQsIGNhbGwgaW4gc2VsZi5idXR0b25zWzotMl06CisgICAgICAgICAgICAgICAgICAgIHNlbGYud1t0aXRsZV0uZW5hYmxlKDApCisgICAgICAgICAgICAgICAgc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53WyJEb24ndCBmaW5kIl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgdGl0bGUsIGNtZCwgY2FsbCBpbiBzZWxmLmJ1dHRvbnNbOi0yXToKKyAgICAgICAgICAgICAgICBzZWxmLndbdGl0bGVdLmVuYWJsZSgwKQorICAgICAgICAgICAgc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53WyJEb24ndCBmaW5kIl0pCisKKyAgICBkZWYgZmluZChzZWxmKToKKyAgICAgICAgc2VsZi5nZXRwYXJtc2Zyb213aW5kb3coKQorICAgICAgICBpZiBzZWxmLmZpbmRuZXh0KCk6CisgICAgICAgICAgICBzZWxmLmhpZGUoKQorCisgICAgZGVmIHJlcGxhY2Uoc2VsZik6CisgICAgICAgIGVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKKyAgICAgICAgaWYgbm90IGVkaXRvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnZpc2libGU6CisgICAgICAgICAgICBzZWxmLmdldHBhcm1zZnJvbXdpbmRvdygpCisgICAgICAgIHRleHQgPSBlZGl0b3IuZ2V0c2VsZWN0ZWR0ZXh0KCkKKyAgICAgICAgZmluZCA9IHNlbGYucGFybXNbImZpbmQiXQorICAgICAgICBpZiBub3Qgc2VsZi5wYXJtc1siY2FzZXNlbnMiXToKKyAgICAgICAgICAgIGZpbmQgPSBzdHJpbmcubG93ZXIoZmluZCkKKyAgICAgICAgICAgIHRleHQgPSBzdHJpbmcubG93ZXIodGV4dCkKKyAgICAgICAgaWYgdGV4dCA9PSBmaW5kOgorICAgICAgICAgICAgc2VsZi5oaWRlKCkKKyAgICAgICAgICAgIGVkaXRvci5pbnNlcnQoc2VsZi5wYXJtc1sicmVwbGFjZSJdKQorCisgICAgZGVmIHJlcGxhY2VhbGwoc2VsZik6CisgICAgICAgIGVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKKyAgICAgICAgaWYgbm90IGVkaXRvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnZpc2libGU6CisgICAgICAgICAgICBzZWxmLmdldHBhcm1zZnJvbXdpbmRvdygpCisgICAgICAgIFcuU2V0Q3Vyc29yKCJ3YXRjaCIpCisgICAgICAgIGZpbmQgPSBzZWxmLnBhcm1zWyJmaW5kIl0KKyAgICAgICAgaWYgbm90IGZpbmQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZmluZGxlbiA9IGxlbihmaW5kKQorICAgICAgICByZXBsYWNlID0gc2VsZi5wYXJtc1sicmVwbGFjZSJdCisgICAgICAgIHJlcGxhY2VsZW4gPSBsZW4ocmVwbGFjZSkKKyAgICAgICAgVGV4dCA9IGVkaXRvci5nZXQoKQorICAgICAgICBpZiBub3Qgc2VsZi5wYXJtc1siY2FzZXNlbnMiXToKKyAgICAgICAgICAgIGZpbmQgPSBzdHJpbmcubG93ZXIoZmluZCkKKyAgICAgICAgICAgIHRleHQgPSBzdHJpbmcubG93ZXIoVGV4dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHQgPSBUZXh0CisgICAgICAgIG5ld3RleHQgPSAiIgorICAgICAgICBwb3MgPSAwCisgICAgICAgIGNvdW50ZXIgPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBpZiBzZWxmLnBhcm1zWyJ3aG9sZXdvcmQiXToKKyAgICAgICAgICAgICAgICB3aG9sZXdvcmRSRSA9IF9tYWtld2hvbGV3b3JkcGF0dGVybihmaW5kKQorICAgICAgICAgICAgICAgIG1hdGNoID0gd2hvbGV3b3JkUkUuc2VhcmNoKHRleHQsIHBvcykKKyAgICAgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gbWF0Y2guc3RhcnQoMSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwb3MgPSAtMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwb3MgPSBzdHJpbmcuZmluZCh0ZXh0LCBmaW5kLCBwb3MpCisgICAgICAgICAgICBpZiBwb3MgPCAwOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjb3VudGVyID0gY291bnRlciArIDEKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0Wzpwb3NdICsgcmVwbGFjZSArIHRleHRbcG9zICsgZmluZGxlbjpdCisgICAgICAgICAgICBUZXh0ID0gVGV4dFs6cG9zXSArIHJlcGxhY2UgKyBUZXh0W3BvcyArIGZpbmRsZW46XQorICAgICAgICAgICAgcG9zID0gcG9zICsgcmVwbGFjZWxlbgorICAgICAgICBXLlNldEN1cnNvcigiYXJyb3ciKQorICAgICAgICBpZiBjb3VudGVyOgorICAgICAgICAgICAgc2VsZi5oaWRlKCkKKyAgICAgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBSZXMKKyAgICAgICAgICAgIGVkaXRvci50ZXh0Y2hhbmdlZCgpCisgICAgICAgICAgICBlZGl0b3Iuc2VsZWN0aW9uY2hhbmdlZCgpCisgICAgICAgICAgICBlZGl0b3Iuc2V0KFRleHQpCisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJSZXBsYWNlZCAlZCBvY2N1cnJlbmNlcyIgJSBjb3VudGVyKQorCisgICAgZGVmIGRvbnQoc2VsZik6CisgICAgICAgIHNlbGYuZ2V0cGFybXNmcm9td2luZG93KCkKKyAgICAgICAgc2VsZi5oaWRlKCkKKworICAgIGRlZiByZXBsYWNlZmluZChzZWxmKToKKyAgICAgICAgc2VsZi5yZXBsYWNlKCkKKyAgICAgICAgc2VsZi5maW5kbmV4dCgpCisKKyAgICBkZWYgc2V0ZmluZHN0cmluZyhzZWxmKToKKyAgICAgICAgZWRpdG9yID0gZmluZGVkaXRvcihzZWxmKQorICAgICAgICBpZiBub3QgZWRpdG9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbmQgPSBlZGl0b3IuZ2V0c2VsZWN0ZWR0ZXh0KCkKKyAgICAgICAgaWYgbm90IGZpbmQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5wYXJtc1siZmluZCJdID0gZmluZAorICAgICAgICBpZiBzZWxmLnc6CisgICAgICAgICAgICBzZWxmLncuZmluZC5lZGl0LnNldChzZWxmLnBhcm1zWyJmaW5kIl0pCisgICAgICAgICAgICBzZWxmLncuZmluZC5lZGl0LnNlbGVjdGFsbCgpCisKKyAgICBkZWYgZmluZG5leHQoc2VsZik6CisgICAgICAgIGVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKKyAgICAgICAgaWYgbm90IGVkaXRvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmaW5kID0gc2VsZi5wYXJtc1siZmluZCJdCisgICAgICAgIGlmIG5vdCBmaW5kOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRleHQgPSBlZGl0b3IuZ2V0KCkKKyAgICAgICAgaWYgbm90IHNlbGYucGFybXNbImNhc2VzZW5zIl06CisgICAgICAgICAgICBmaW5kID0gc3RyaW5nLmxvd2VyKGZpbmQpCisgICAgICAgICAgICB0ZXh0ID0gc3RyaW5nLmxvd2VyKHRleHQpCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBlZGl0b3IuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgc2VsZW5kKSwgbWF4KHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgIGlmIHNlbGYucGFybXNbIndob2xld29yZCJdOgorICAgICAgICAgICAgd2hvbGV3b3JkUkUgPSBfbWFrZXdob2xld29yZHBhdHRlcm4oZmluZCkKKyAgICAgICAgICAgIG1hdGNoID0gd2hvbGV3b3JkUkUuc2VhcmNoKHRleHQsIHNlbGVuZCkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIHBvcyA9IG1hdGNoLnN0YXJ0KDEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBvcyA9IC0xCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwb3MgPSBzdHJpbmcuZmluZCh0ZXh0LCBmaW5kLCBzZWxlbmQpCisgICAgICAgIGlmIHBvcyA+PSAwOgorICAgICAgICAgICAgZWRpdG9yLnNldHNlbGVjdGlvbihwb3MsIHBvcyArIGxlbihmaW5kKSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsaWYgc2VsZi5wYXJtc1sid3JhcCJdOgorICAgICAgICAgICAgaWYgc2VsZi5wYXJtc1sid2hvbGV3b3JkIl06CisgICAgICAgICAgICAgICAgbWF0Y2ggPSB3aG9sZXdvcmRSRS5zZWFyY2godGV4dCwgMCkKKyAgICAgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gbWF0Y2guc3RhcnQoMSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwb3MgPSAtMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwb3MgPSBzdHJpbmcuZmluZCh0ZXh0LCBmaW5kKQorICAgICAgICAgICAgaWYgc2Vsc3RhcnQgPiBwb3MgPj0gMDoKKyAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0c2VsZWN0aW9uKHBvcywgcG9zICsgbGVuKGZpbmQpKQorICAgICAgICAgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgc2V0cGFybXMoc2VsZik6CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYucGFybXMuaXRlbXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLndba2V5XS5zZXQodmFsdWUpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi53LmJveGVzW2tleV0uc2V0KHZhbHVlKQorCisgICAgZGVmIGdldHBhcm1zZnJvbXdpbmRvdyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYudzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLnBhcm1zLml0ZW1zKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLndba2V5XS5nZXQoKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi53LmJveGVzW2tleV0uZ2V0KCkKKyAgICAgICAgICAgIHNlbGYucGFybXNba2V5XSA9IHZhbHVlCisKKyAgICBkZWYgY2FuY2VsKHNlbGYpOgorICAgICAgICBzZWxmLmhpZGUoKQorICAgICAgICBzZWxmLnNldHBhcm1zKCkKKworICAgIGRlZiBoaWRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnc6CisgICAgICAgICAgICBzZWxmLncud2lkLkhpZGVXaW5kb3coKQorICAgICAgICAgICAgc2VsZi52aXNpYmxlID0gMAorCisgICAgZGVmIHdyaXRlcHJlZnMoc2VsZik6CisgICAgICAgIGltcG9ydCBNYWNQcmVmcworICAgICAgICBzZWxmLmdldHBhcm1zZnJvbXdpbmRvdygpCisgICAgICAgIHByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKKyAgICAgICAgcHJlZnMuc2VhcmNoZW5naW5lLmNhc2VzZW5zID0gc2VsZi5wYXJtc1siY2FzZXNlbnMiXQorICAgICAgICBwcmVmcy5zZWFyY2hlbmdpbmUud3JhcCA9IHNlbGYucGFybXNbIndyYXAiXQorICAgICAgICBwcmVmcy5zZWFyY2hlbmdpbmUud2hvbGV3b3JkID0gc2VsZi5wYXJtc1sid2hvbGV3b3JkIl0KKyAgICAgICAgcHJlZnMuc2F2ZSgpCisKIAogY2xhc3MgVGl0bGVkRWRpdFRleHQoVy5Hcm91cCk6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlLCB0ZXh0ID0gIiIpOgotCQlXLkdyb3VwLl9faW5pdF9fKHNlbGYsIHBvc3NpemUpCi0JCXNlbGYudGl0bGUgPSBXLlRleHRCb3goKDAsIDAsIDAsIDE2KSwgdGl0bGUpCi0JCXNlbGYuZWRpdCA9IFcuRWRpdFRleHQoKDAsIDE2LCAwLCAwKSwgdGV4dCkKLQkKLQlkZWYgc2V0KHNlbGYsIHZhbHVlKToKLQkJc2VsZi5lZGl0LnNldCh2YWx1ZSkKLQkKLQlkZWYgZ2V0KHNlbGYpOgotCQlyZXR1cm4gc2VsZi5lZGl0LmdldCgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUsIHRleHQgPSAiIik6CisgICAgICAgIFcuR3JvdXAuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKKyAgICAgICAgc2VsZi50aXRsZSA9IFcuVGV4dEJveCgoMCwgMCwgMCwgMTYpLCB0aXRsZSkKKyAgICAgICAgc2VsZi5lZGl0ID0gVy5FZGl0VGV4dCgoMCwgMTYsIDAsIDApLCB0ZXh0KQorCisgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuZWRpdC5zZXQodmFsdWUpCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0LmdldCgpCiAKIAogY2xhc3MgQ2xhc3NGaW5kZXIoVy5Qb3B1cFdpZGdldCk6Ci0JCi0JZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlXLlNldEN1cnNvcigid2F0Y2giKQotCQlzZWxmLnNldChzZWxmLl9wYXJlbnR3aW5kb3cuZ2V0Y2xhc3NsaXN0KCkpCi0JCVcuUG9wdXBXaWRnZXQuY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycykKKworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgVy5TZXRDdXJzb3IoIndhdGNoIikKKyAgICAgICAgc2VsZi5zZXQoc2VsZi5fcGFyZW50d2luZG93LmdldGNsYXNzbGlzdCgpKQorICAgICAgICBXLlBvcHVwV2lkZ2V0LmNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpCiAKIAogZGVmIGdldG1pbmluZGVudChsaW5lcyk6Ci0JaW5kZW50ID0gLTEKLQlmb3IgbGluZSBpbiBsaW5lczoKLQkJc3RyaXBwZWQgPSBzdHJpbmcuc3RyaXAobGluZSkKLQkJaWYgbm90IHN0cmlwcGVkIG9yIHN0cmlwcGVkWzBdID09ICcjJzoKLQkJCWNvbnRpbnVlCi0JCWlmIGluZGVudCA8IDAgb3IgbGluZVs6aW5kZW50XSA8PiBpbmRlbnQgKiAnXHQnOgotCQkJaW5kZW50ID0gMAotCQkJZm9yIGMgaW4gbGluZToKLQkJCQlpZiBjIDw+ICdcdCc6Ci0JCQkJCWJyZWFrCi0JCQkJaW5kZW50ID0gaW5kZW50ICsgMQotCXJldHVybiBpbmRlbnQKKyAgICBpbmRlbnQgPSAtMQorICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICBzdHJpcHBlZCA9IHN0cmluZy5zdHJpcChsaW5lKQorICAgICAgICBpZiBub3Qgc3RyaXBwZWQgb3Igc3RyaXBwZWRbMF0gPT0gJyMnOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgaW5kZW50IDwgMCBvciBsaW5lWzppbmRlbnRdIDw+IGluZGVudCAqICdcdCc6CisgICAgICAgICAgICBpbmRlbnQgPSAwCisgICAgICAgICAgICBmb3IgYyBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGlmIGMgPD4gJ1x0JzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgKyAxCisgICAgcmV0dXJuIGluZGVudAogCiAKIGRlZiBnZXRvcHRpb25rZXkoKToKLQlyZXR1cm4gbm90IG5vdCBvcmQoRXZ0LkdldEtleXMoKVs3XSkgJiAweDA0CisgICAgcmV0dXJuIG5vdCBub3Qgb3JkKEV2dC5HZXRLZXlzKClbN10pICYgMHgwNAogCiAKLWRlZiBleGVjc3RyaW5nKHB5dGV4dCwgZ2xvYmFscywgbG9jYWxzLCBmaWxlbmFtZT0iPHN0cmluZz4iLCBkZWJ1Z2dpbmc9MCwgCi0JCQltb2RuYW1lPSJfX21haW5fXyIsIHByb2ZpbGluZz0wKToKLQlpZiBkZWJ1Z2dpbmc6Ci0JCWltcG9ydCBQeURlYnVnZ2VyLCBiZGIKLQkJQmRiUXVpdCA9IGJkYi5CZGJRdWl0Ci0JZWxzZToKLQkJQmRiUXVpdCA9ICdCZGJRdWl0RHVtbXlFeGNlcHRpb24nCi0JcHl0ZXh0ID0gc3RyaW5nLnNwbGl0KHB5dGV4dCwgJ1xyJykKLQlweXRleHQgPSBzdHJpbmcuam9pbihweXRleHQsICdcbicpICsgJ1xuJwotCVcuU2V0Q3Vyc29yKCJ3YXRjaCIpCi0JZ2xvYmFsc1snX19uYW1lX18nXSA9IG1vZG5hbWUKLQlnbG9iYWxzWydfX2ZpbGVfXyddID0gZmlsZW5hbWUKLQlzeXMuYXJndiA9IFtmaWxlbmFtZV0KLQl0cnk6Ci0JCWNvZGUgPSBjb21waWxlKHB5dGV4dCwgZmlsZW5hbWUsICJleGVjIikKLQlleGNlcHQ6Ci0JCSMgWFhYWCBCQUFBQURERC4uLi4gV2UgbGV0IHRyYWNlYmFja3dpbmRvdyBkZWNpZGUgdG8gdHJlYXQgU3ludGF4RXJyb3IgCi0JCSMgc3BlY2lhbC4gVGhhdCdzIHdyb25nIGJlY2F1c2UgVEhJUyBjYXNlIGlzIHNwZWNpYWwgKGNvdWxkIGJlIGxpdGVyYWwgCi0JCSMgb3ZlcmZsb3chKSBhbmQgU3ludGF4RXJyb3IgY291bGQgbWVhbiB3ZSBuZWVkIGEgdHJhY2ViYWNrIChzeW50YXggZXJyb3IgCi0JCSMgaW4gaW1wb3J0ZWQgbW9kdWxlISEhCi0JCXRyYWNlYmFja3dpbmRvdy50cmFjZWJhY2soMSwgZmlsZW5hbWUpCi0JCXJldHVybgotCXRyeToKLQkJaWYgZGVidWdnaW5nOgotCQkJUHlEZWJ1Z2dlci5zdGFydGZyb21oZXJlKCkKLQkJZWxzZToKLQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goMCkKLQkJdHJ5OgotCQkJaWYgcHJvZmlsaW5nOgotCQkJCWltcG9ydCBwcm9maWxlLCBQcm9maWxlQnJvd3NlcgotCQkJCXAgPSBwcm9maWxlLlByb2ZpbGUoKQotCQkJCXAuc2V0X2NtZChmaWxlbmFtZSkKLQkJCQl0cnk6Ci0JCQkJCXAucnVuY3R4KGNvZGUsIGdsb2JhbHMsIGxvY2FscykKLQkJCQlmaW5hbGx5OgotCQkJCQlpbXBvcnQgcHN0YXRzCi0JCQkJCQotCQkJCQlzdGF0cyA9IHBzdGF0cy5TdGF0cyhwKQotCQkJCQlQcm9maWxlQnJvd3Nlci5Qcm9maWxlQnJvd3NlcihzdGF0cykKLQkJCWVsc2U6Ci0JCQkJZXhlYyBjb2RlIGluIGdsb2JhbHMsIGxvY2FscwotCQlmaW5hbGx5OgotCQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQlleGNlcHQgVy5BbGVydEVycm9yLCBkZXRhaWw6Ci0JCXJhaXNlIFcuQWxlcnRFcnJvciwgZGV0YWlsCi0JZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgQmRiUXVpdCk6Ci0JCXBhc3MKLQlleGNlcHQgU3lzdGVtRXhpdCwgYXJnOgotCQlpZiBhcmcuY29kZToKLQkJCXN5cy5zdGRlcnIud3JpdGUoIlNjcmlwdCBleGl0ZWQgd2l0aCBzdGF0dXMgY29kZTogJXNcbiIgJSByZXByKGFyZy5jb2RlKSkKLQlleGNlcHQ6Ci0JCWlmIGRlYnVnZ2luZzoKLQkJCXN5cy5zZXR0cmFjZShOb25lKQotCQkJUHlEZWJ1Z2dlci5wb3N0bW9ydGVtKHN5cy5leGNfdHlwZSwgc3lzLmV4Y192YWx1ZSwgc3lzLmV4Y190cmFjZWJhY2spCi0JCQlyZXR1cm4KLQkJZWxzZToKLQkJCXRyYWNlYmFja3dpbmRvdy50cmFjZWJhY2soMSwgZmlsZW5hbWUpCi0JaWYgZGVidWdnaW5nOgotCQlzeXMuc2V0dHJhY2UoTm9uZSkKLQkJUHlEZWJ1Z2dlci5zdG9wKCkKK2RlZiBleGVjc3RyaW5nKHB5dGV4dCwgZ2xvYmFscywgbG9jYWxzLCBmaWxlbmFtZT0iPHN0cmluZz4iLCBkZWJ1Z2dpbmc9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWU9Il9fbWFpbl9fIiwgcHJvZmlsaW5nPTApOgorICAgIGlmIGRlYnVnZ2luZzoKKyAgICAgICAgaW1wb3J0IFB5RGVidWdnZXIsIGJkYgorICAgICAgICBCZGJRdWl0ID0gYmRiLkJkYlF1aXQKKyAgICBlbHNlOgorICAgICAgICBCZGJRdWl0ID0gJ0JkYlF1aXREdW1teUV4Y2VwdGlvbicKKyAgICBweXRleHQgPSBzdHJpbmcuc3BsaXQocHl0ZXh0LCAnXHInKQorICAgIHB5dGV4dCA9IHN0cmluZy5qb2luKHB5dGV4dCwgJ1xuJykgKyAnXG4nCisgICAgVy5TZXRDdXJzb3IoIndhdGNoIikKKyAgICBnbG9iYWxzWydfX25hbWVfXyddID0gbW9kbmFtZQorICAgIGdsb2JhbHNbJ19fZmlsZV9fJ10gPSBmaWxlbmFtZQorICAgIHN5cy5hcmd2ID0gW2ZpbGVuYW1lXQorICAgIHRyeToKKyAgICAgICAgY29kZSA9IGNvbXBpbGUocHl0ZXh0LCBmaWxlbmFtZSwgImV4ZWMiKQorICAgIGV4Y2VwdDoKKyAgICAgICAgIyBYWFhYIEJBQUFBRERELi4uLiBXZSBsZXQgdHJhY2ViYWNrd2luZG93IGRlY2lkZSB0byB0cmVhdCBTeW50YXhFcnJvcgorICAgICAgICAjIHNwZWNpYWwuIFRoYXQncyB3cm9uZyBiZWNhdXNlIFRISVMgY2FzZSBpcyBzcGVjaWFsIChjb3VsZCBiZSBsaXRlcmFsCisgICAgICAgICMgb3ZlcmZsb3chKSBhbmQgU3ludGF4RXJyb3IgY291bGQgbWVhbiB3ZSBuZWVkIGEgdHJhY2ViYWNrIChzeW50YXggZXJyb3IKKyAgICAgICAgIyBpbiBpbXBvcnRlZCBtb2R1bGUhISEKKyAgICAgICAgdHJhY2ViYWNrd2luZG93LnRyYWNlYmFjaygxLCBmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuCisgICAgdHJ5OgorICAgICAgICBpZiBkZWJ1Z2dpbmc6CisgICAgICAgICAgICBQeURlYnVnZ2VyLnN0YXJ0ZnJvbWhlcmUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBwcm9maWxpbmc6CisgICAgICAgICAgICAgICAgaW1wb3J0IHByb2ZpbGUsIFByb2ZpbGVCcm93c2VyCisgICAgICAgICAgICAgICAgcCA9IHByb2ZpbGUuUHJvZmlsZSgpCisgICAgICAgICAgICAgICAgcC5zZXRfY21kKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcC5ydW5jdHgoY29kZSwgZ2xvYmFscywgbG9jYWxzKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBwc3RhdHMKKworICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IHBzdGF0cy5TdGF0cyhwKQorICAgICAgICAgICAgICAgICAgICBQcm9maWxlQnJvd3Nlci5Qcm9maWxlQnJvd3NlcihzdGF0cykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhlYyBjb2RlIGluIGdsb2JhbHMsIGxvY2FscworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKyAgICBleGNlcHQgVy5BbGVydEVycm9yLCBkZXRhaWw6CisgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgZGV0YWlsCisgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgQmRiUXVpdCk6CisgICAgICAgIHBhc3MKKyAgICBleGNlcHQgU3lzdGVtRXhpdCwgYXJnOgorICAgICAgICBpZiBhcmcuY29kZToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlNjcmlwdCBleGl0ZWQgd2l0aCBzdGF0dXMgY29kZTogJXNcbiIgJSByZXByKGFyZy5jb2RlKSkKKyAgICBleGNlcHQ6CisgICAgICAgIGlmIGRlYnVnZ2luZzoKKyAgICAgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICAgICAgUHlEZWJ1Z2dlci5wb3N0bW9ydGVtKHN5cy5leGNfdHlwZSwgc3lzLmV4Y192YWx1ZSwgc3lzLmV4Y190cmFjZWJhY2spCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyYWNlYmFja3dpbmRvdy50cmFjZWJhY2soMSwgZmlsZW5hbWUpCisgICAgaWYgZGVidWdnaW5nOgorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgUHlEZWJ1Z2dlci5zdG9wKCkKIAogCiBfaWRlbnRpZmllUkUgPSByZS5jb21waWxlKHIiW0EtWmEtel9dW0EtWmEtel8wLTldKiIpCiAKIGRlZiBpZGVudGlmaWVSRV9tYXRjaChzdHIpOgotCW1hdGNoID0gX2lkZW50aWZpZVJFLm1hdGNoKHN0cikKLQlpZiBub3QgbWF0Y2g6Ci0JCXJldHVybiAtMQotCXJldHVybiBtYXRjaC5lbmQoKQorICAgIG1hdGNoID0gX2lkZW50aWZpZVJFLm1hdGNoKHN0cikKKyAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgIHJldHVybiAtMQorICAgIHJldHVybiBtYXRjaC5lbmQoKQogCiBkZWYgX2ZpbGVuYW1lX2FzX21vZG5hbWUoZm5hbWUpOgotCWlmIGZuYW1lWy0zOl0gPT0gJy5weSc6Ci0JCW1vZG5hbWUgPSBmbmFtZVs6LTNdCi0JCW1hdGNoID0gX2lkZW50aWZpZVJFLm1hdGNoKG1vZG5hbWUpCi0JCWlmIG1hdGNoIGFuZCBtYXRjaC5zdGFydCgpID09IDAgYW5kIG1hdGNoLmVuZCgpID09IGxlbihtb2RuYW1lKToKLQkJCXJldHVybiBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQobW9kbmFtZSwgJy4nKSwgJ18nKQorICAgIGlmIGZuYW1lWy0zOl0gPT0gJy5weSc6CisgICAgICAgIG1vZG5hbWUgPSBmbmFtZVs6LTNdCisgICAgICAgIG1hdGNoID0gX2lkZW50aWZpZVJFLm1hdGNoKG1vZG5hbWUpCisgICAgICAgIGlmIG1hdGNoIGFuZCBtYXRjaC5zdGFydCgpID09IDAgYW5kIG1hdGNoLmVuZCgpID09IGxlbihtb2RuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQobW9kbmFtZSwgJy4nKSwgJ18nKQogCiBkZWYgZmluZGVkaXRvcih0b3B3aW5kb3csIGZyb210b3AgPSAwKToKLQl3aWQgPSBNeUZyb250V2luZG93KCkKLQlpZiBub3QgZnJvbXRvcDoKLQkJaWYgdG9wd2luZG93LncgYW5kIHdpZCA9PSB0b3B3aW5kb3cudy53aWQ6Ci0JCQl3aWQgPSB0b3B3aW5kb3cudy53aWQuR2V0TmV4dFdpbmRvdygpCi0JaWYgbm90IHdpZDoKLQkJcmV0dXJuCi0JYXBwID0gVy5nZXRhcHBsaWNhdGlvbigpCi0JaWYgYXBwLl93aW5kb3dzLmhhc19rZXkod2lkKTogIyBLZXlFcnJvciBvdGhlcndpc2UgY2FuIGhhcHBlbiBpbiBSb2JvRm9nIDotKAotCQl3aW5kb3cgPSBXLmdldGFwcGxpY2F0aW9uKCkuX3dpbmRvd3Nbd2lkXQotCWVsc2U6Ci0JCXJldHVybgotCWlmIG5vdCBpc2luc3RhbmNlKHdpbmRvdywgRWRpdG9yKToKLQkJcmV0dXJuCi0JcmV0dXJuIHdpbmRvdy5lZGl0Z3JvdXAuZWRpdG9yCisgICAgd2lkID0gTXlGcm9udFdpbmRvdygpCisgICAgaWYgbm90IGZyb210b3A6CisgICAgICAgIGlmIHRvcHdpbmRvdy53IGFuZCB3aWQgPT0gdG9wd2luZG93Lncud2lkOgorICAgICAgICAgICAgd2lkID0gdG9wd2luZG93Lncud2lkLkdldE5leHRXaW5kb3coKQorICAgIGlmIG5vdCB3aWQ6CisgICAgICAgIHJldHVybgorICAgIGFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKQorICAgIGlmIGFwcC5fd2luZG93cy5oYXNfa2V5KHdpZCk6ICMgS2V5RXJyb3Igb3RoZXJ3aXNlIGNhbiBoYXBwZW4gaW4gUm9ib0ZvZyA6LSgKKyAgICAgICAgd2luZG93ID0gVy5nZXRhcHBsaWNhdGlvbigpLl93aW5kb3dzW3dpZF0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4KKyAgICBpZiBub3QgaXNpbnN0YW5jZSh3aW5kb3csIEVkaXRvcik6CisgICAgICAgIHJldHVybgorICAgIHJldHVybiB3aW5kb3cuZWRpdGdyb3VwLmVkaXRvcgogCiAKIGNsYXNzIF9FZGl0b3JEZWZhdWx0U2V0dGluZ3M6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlzZWxmLnRlbXBsYXRlID0gIiVzLCAlZCBwb2ludCIKLQkJc2VsZi5mb250c2V0dGluZ3MsIHNlbGYudGFic2V0dGluZ3MsIHNlbGYud2luZG93c2l6ZSA9IGdldGVkaXRvcnByZWZzKCkKLQkJc2VsZi53ID0gVy5EaWFsb2coKDMyOCwgMTIwKSwgIkVkaXRvciBkZWZhdWx0IHNldHRpbmdzIikKLQkJc2VsZi53LnNldGZvbnRidXR0b24gPSBXLkJ1dHRvbigoOCwgOCwgODAsIDE2KSwgIlNldCBmb250XHhjOSIsIHNlbGYuZG9mb250KQotCQlzZWxmLncuZm9udHRleHQgPSBXLlRleHRCb3goKDk4LCAxMCwgLTgsIDE0KSwgc2VsZi50ZW1wbGF0ZSAlIChzZWxmLmZvbnRzZXR0aW5nc1swXSwgc2VsZi5mb250c2V0dGluZ3NbMl0pKQotCQkKLQkJc2VsZi53LnBpY2tzaXplYnV0dG9uID0gVy5CdXR0b24oKDgsIDUwLCA4MCwgMTYpLCAiRnJvbnQgd2luZG93Iiwgc2VsZi5waWNrc2l6ZSkKLQkJc2VsZi53LnhzaXplbGFiZWwgPSBXLlRleHRCb3goKDk4LCAzMiwgNDAsIDE0KSwgIldpZHRoOiIpCi0JCXNlbGYudy55c2l6ZWxhYmVsID0gVy5UZXh0Qm94KCgxNDgsIDMyLCA0MCwgMTQpLCAiSGVpZ2h0OiIpCi0JCXNlbGYudy54c2l6ZSA9IFcuRWRpdFRleHQoKDk4LCA0OCwgNDAsIDIwKSwgcmVwcihzZWxmLndpbmRvd3NpemVbMF0pKQotCQlzZWxmLncueXNpemUgPSBXLkVkaXRUZXh0KCgxNDgsIDQ4LCA0MCwgMjApLCByZXByKHNlbGYud2luZG93c2l6ZVsxXSkpCi0JCQotCQlzZWxmLncuY2FuY2VsYnV0dG9uID0gVy5CdXR0b24oKC0xODAsIC0yNiwgODAsIDE2KSwgIkNhbmNlbCIsIHNlbGYuY2FuY2VsKQotCQlzZWxmLncub2tidXR0b24gPSBXLkJ1dHRvbigoLTkwLCAtMjYsIDgwLCAxNiksICJEb25lIiwgc2VsZi5vaykKLQkJc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53Lm9rYnV0dG9uKQotCQlzZWxmLncuYmluZCgnY21kLicsIHNlbGYudy5jYW5jZWxidXR0b24ucHVzaCkKLQkJc2VsZi53Lm9wZW4oKQotCQotCWRlZiBwaWNrc2l6ZShzZWxmKToKLQkJYXBwID0gVy5nZXRhcHBsaWNhdGlvbigpCi0JCWVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKLQkJaWYgZWRpdG9yIGlzIG5vdCBOb25lOgotCQkJd2lkdGgsIGhlaWdodCA9IGVkaXRvci5fcGFyZW50d2luZG93Ll9ib3VuZHNbMjpdCi0JCQlzZWxmLncueHNpemUuc2V0KHJlcHIod2lkdGgpKQotCQkJc2VsZi53LnlzaXplLnNldChyZXByKGhlaWdodCkpCi0JCWVsc2U6Ci0JCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJObyBlZGl0IHdpbmRvdyBmb3VuZCIKLQkKLQlkZWYgZG9mb250KHNlbGYpOgotCQlpbXBvcnQgRm9udFNldHRpbmdzCi0JCXNldHRpbmdzID0gRm9udFNldHRpbmdzLkZvbnREaWFsb2coc2VsZi5mb250c2V0dGluZ3MsIHNlbGYudGFic2V0dGluZ3MpCi0JCWlmIHNldHRpbmdzOgotCQkJc2VsZi5mb250c2V0dGluZ3MsIHNlbGYudGFic2V0dGluZ3MgPSBzZXR0aW5ncwotCQkJc3lzLmV4Y190cmFjZWJhY2sgPSBOb25lCi0JCQlzZWxmLncuZm9udHRleHQuc2V0KHNlbGYudGVtcGxhdGUgJSAoc2VsZi5mb250c2V0dGluZ3NbMF0sIHNlbGYuZm9udHNldHRpbmdzWzJdKSkKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYudy5jbG9zZSgpCi0JCWRlbCBzZWxmLncKLQkKLQlkZWYgY2FuY2VsKHNlbGYpOgotCQlzZWxmLmNsb3NlKCkKLQkKLQlkZWYgb2soc2VsZik6Ci0JCXRyeToKLQkJCXdpZHRoID0gc3RyaW5nLmF0b2koc2VsZi53LnhzaXplLmdldCgpKQotCQlleGNlcHQ6Ci0JCQlzZWxmLncueHNpemUuc2VsZWN0KDEpCi0JCQlzZWxmLncueHNpemUuc2VsZWN0YWxsKCkKLQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkJhZCBudW1iZXIgZm9yIHdpbmRvdyB3aWR0aCIKLQkJdHJ5OgotCQkJaGVpZ2h0ID0gc3RyaW5nLmF0b2koc2VsZi53LnlzaXplLmdldCgpKQotCQlleGNlcHQ6Ci0JCQlzZWxmLncueXNpemUuc2VsZWN0KDEpCi0JCQlzZWxmLncueXNpemUuc2VsZWN0YWxsKCkKLQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkJhZCBudW1iZXIgZm9yIHdpbmRvdyBoZWlnaHQiCi0JCXNlbGYud2luZG93c2l6ZSA9IHdpZHRoLCBoZWlnaHQKLQkJc2V0ZWRpdG9ycHJlZnMoc2VsZi5mb250c2V0dGluZ3MsIHNlbGYudGFic2V0dGluZ3MsIHNlbGYud2luZG93c2l6ZSkKLQkJc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudGVtcGxhdGUgPSAiJXMsICVkIHBvaW50IgorICAgICAgICBzZWxmLmZvbnRzZXR0aW5ncywgc2VsZi50YWJzZXR0aW5ncywgc2VsZi53aW5kb3dzaXplID0gZ2V0ZWRpdG9ycHJlZnMoKQorICAgICAgICBzZWxmLncgPSBXLkRpYWxvZygoMzI4LCAxMjApLCAiRWRpdG9yIGRlZmF1bHQgc2V0dGluZ3MiKQorICAgICAgICBzZWxmLncuc2V0Zm9udGJ1dHRvbiA9IFcuQnV0dG9uKCg4LCA4LCA4MCwgMTYpLCAiU2V0IGZvbnRceGM5Iiwgc2VsZi5kb2ZvbnQpCisgICAgICAgIHNlbGYudy5mb250dGV4dCA9IFcuVGV4dEJveCgoOTgsIDEwLCAtOCwgMTQpLCBzZWxmLnRlbXBsYXRlICUgKHNlbGYuZm9udHNldHRpbmdzWzBdLCBzZWxmLmZvbnRzZXR0aW5nc1syXSkpCisKKyAgICAgICAgc2VsZi53LnBpY2tzaXplYnV0dG9uID0gVy5CdXR0b24oKDgsIDUwLCA4MCwgMTYpLCAiRnJvbnQgd2luZG93Iiwgc2VsZi5waWNrc2l6ZSkKKyAgICAgICAgc2VsZi53LnhzaXplbGFiZWwgPSBXLlRleHRCb3goKDk4LCAzMiwgNDAsIDE0KSwgIldpZHRoOiIpCisgICAgICAgIHNlbGYudy55c2l6ZWxhYmVsID0gVy5UZXh0Qm94KCgxNDgsIDMyLCA0MCwgMTQpLCAiSGVpZ2h0OiIpCisgICAgICAgIHNlbGYudy54c2l6ZSA9IFcuRWRpdFRleHQoKDk4LCA0OCwgNDAsIDIwKSwgcmVwcihzZWxmLndpbmRvd3NpemVbMF0pKQorICAgICAgICBzZWxmLncueXNpemUgPSBXLkVkaXRUZXh0KCgxNDgsIDQ4LCA0MCwgMjApLCByZXByKHNlbGYud2luZG93c2l6ZVsxXSkpCisKKyAgICAgICAgc2VsZi53LmNhbmNlbGJ1dHRvbiA9IFcuQnV0dG9uKCgtMTgwLCAtMjYsIDgwLCAxNiksICJDYW5jZWwiLCBzZWxmLmNhbmNlbCkKKyAgICAgICAgc2VsZi53Lm9rYnV0dG9uID0gVy5CdXR0b24oKC05MCwgLTI2LCA4MCwgMTYpLCAiRG9uZSIsIHNlbGYub2spCisgICAgICAgIHNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5va2J1dHRvbikKKyAgICAgICAgc2VsZi53LmJpbmQoJ2NtZC4nLCBzZWxmLncuY2FuY2VsYnV0dG9uLnB1c2gpCisgICAgICAgIHNlbGYudy5vcGVuKCkKKworICAgIGRlZiBwaWNrc2l6ZShzZWxmKToKKyAgICAgICAgYXBwID0gVy5nZXRhcHBsaWNhdGlvbigpCisgICAgICAgIGVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKKyAgICAgICAgaWYgZWRpdG9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCA9IGVkaXRvci5fcGFyZW50d2luZG93Ll9ib3VuZHNbMjpdCisgICAgICAgICAgICBzZWxmLncueHNpemUuc2V0KHJlcHIod2lkdGgpKQorICAgICAgICAgICAgc2VsZi53LnlzaXplLnNldChyZXByKGhlaWdodCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICJObyBlZGl0IHdpbmRvdyBmb3VuZCIKKworICAgIGRlZiBkb2ZvbnQoc2VsZik6CisgICAgICAgIGltcG9ydCBGb250U2V0dGluZ3MKKyAgICAgICAgc2V0dGluZ3MgPSBGb250U2V0dGluZ3MuRm9udERpYWxvZyhzZWxmLmZvbnRzZXR0aW5ncywgc2VsZi50YWJzZXR0aW5ncykKKyAgICAgICAgaWYgc2V0dGluZ3M6CisgICAgICAgICAgICBzZWxmLmZvbnRzZXR0aW5ncywgc2VsZi50YWJzZXR0aW5ncyA9IHNldHRpbmdzCisgICAgICAgICAgICBzeXMuZXhjX3RyYWNlYmFjayA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYudy5mb250dGV4dC5zZXQoc2VsZi50ZW1wbGF0ZSAlIChzZWxmLmZvbnRzZXR0aW5nc1swXSwgc2VsZi5mb250c2V0dGluZ3NbMl0pKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLncuY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi53CisKKyAgICBkZWYgY2FuY2VsKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBvayhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2lkdGggPSBzdHJpbmcuYXRvaShzZWxmLncueHNpemUuZ2V0KCkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYudy54c2l6ZS5zZWxlY3QoMSkKKyAgICAgICAgICAgIHNlbGYudy54c2l6ZS5zZWxlY3RhbGwoKQorICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQmFkIG51bWJlciBmb3Igd2luZG93IHdpZHRoIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBoZWlnaHQgPSBzdHJpbmcuYXRvaShzZWxmLncueXNpemUuZ2V0KCkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYudy55c2l6ZS5zZWxlY3QoMSkKKyAgICAgICAgICAgIHNlbGYudy55c2l6ZS5zZWxlY3RhbGwoKQorICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQmFkIG51bWJlciBmb3Igd2luZG93IGhlaWdodCIKKyAgICAgICAgc2VsZi53aW5kb3dzaXplID0gd2lkdGgsIGhlaWdodAorICAgICAgICBzZXRlZGl0b3JwcmVmcyhzZWxmLmZvbnRzZXR0aW5ncywgc2VsZi50YWJzZXR0aW5ncywgc2VsZi53aW5kb3dzaXplKQorICAgICAgICBzZWxmLmNsb3NlKCkKIAogZGVmIGdldGVkaXRvcnByZWZzKCk6Ci0JaW1wb3J0IE1hY1ByZWZzCi0JcHJlZnMgPSBNYWNQcmVmcy5HZXRQcmVmcyhXLmdldGFwcGxpY2F0aW9uKCkucHJlZmZpbGVwYXRoKQotCXRyeToKLQkJZm9udHNldHRpbmdzID0gcHJlZnMucHllZGl0LmZvbnRzZXR0aW5ncwotCQl0YWJzZXR0aW5ncyA9IHByZWZzLnB5ZWRpdC50YWJzZXR0aW5ncwotCQl3aW5kb3dzaXplID0gcHJlZnMucHllZGl0LndpbmRvd3NpemUKLQlleGNlcHQ6Ci0JCWZvbnRzZXR0aW5ncyA9IHByZWZzLnB5ZWRpdC5mb250c2V0dGluZ3MgPSAoIkdlbmV2YSIsIDAsIDEwLCAoMCwgMCwgMCkpCi0JCXRhYnNldHRpbmdzID0gcHJlZnMucHllZGl0LnRhYnNldHRpbmdzID0gKDgsIDEpCi0JCXdpbmRvd3NpemUgPSBwcmVmcy5weWVkaXQud2luZG93c2l6ZSA9ICg1MDAsIDI1MCkKLQkJc3lzLmV4Y190cmFjZWJhY2sgPSBOb25lCi0JcmV0dXJuIGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MsIHdpbmRvd3NpemUKKyAgICBpbXBvcnQgTWFjUHJlZnMKKyAgICBwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCisgICAgdHJ5OgorICAgICAgICBmb250c2V0dGluZ3MgPSBwcmVmcy5weWVkaXQuZm9udHNldHRpbmdzCisgICAgICAgIHRhYnNldHRpbmdzID0gcHJlZnMucHllZGl0LnRhYnNldHRpbmdzCisgICAgICAgIHdpbmRvd3NpemUgPSBwcmVmcy5weWVkaXQud2luZG93c2l6ZQorICAgIGV4Y2VwdDoKKyAgICAgICAgZm9udHNldHRpbmdzID0gcHJlZnMucHllZGl0LmZvbnRzZXR0aW5ncyA9ICgiR2VuZXZhIiwgMCwgMTAsICgwLCAwLCAwKSkKKyAgICAgICAgdGFic2V0dGluZ3MgPSBwcmVmcy5weWVkaXQudGFic2V0dGluZ3MgPSAoOCwgMSkKKyAgICAgICAgd2luZG93c2l6ZSA9IHByZWZzLnB5ZWRpdC53aW5kb3dzaXplID0gKDUwMCwgMjUwKQorICAgICAgICBzeXMuZXhjX3RyYWNlYmFjayA9IE5vbmUKKyAgICByZXR1cm4gZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncywgd2luZG93c2l6ZQogCiBkZWYgc2V0ZWRpdG9ycHJlZnMoZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncywgd2luZG93c2l6ZSk6Ci0JaW1wb3J0IE1hY1ByZWZzCi0JcHJlZnMgPSBNYWNQcmVmcy5HZXRQcmVmcyhXLmdldGFwcGxpY2F0aW9uKCkucHJlZmZpbGVwYXRoKQotCXByZWZzLnB5ZWRpdC5mb250c2V0dGluZ3MgPSBmb250c2V0dGluZ3MKLQlwcmVmcy5weWVkaXQudGFic2V0dGluZ3MgPSB0YWJzZXR0aW5ncwotCXByZWZzLnB5ZWRpdC53aW5kb3dzaXplID0gd2luZG93c2l6ZQotCXByZWZzLnNhdmUoKQorICAgIGltcG9ydCBNYWNQcmVmcworICAgIHByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKKyAgICBwcmVmcy5weWVkaXQuZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCisgICAgcHJlZnMucHllZGl0LnRhYnNldHRpbmdzID0gdGFic2V0dGluZ3MKKyAgICBwcmVmcy5weWVkaXQud2luZG93c2l6ZSA9IHdpbmRvd3NpemUKKyAgICBwcmVmcy5zYXZlKCkKIAogX2RlZmF1bHRTZXR0aW5nc0VkaXRvciA9IE5vbmUKIAogZGVmIEVkaXRvckRlZmF1bHRTZXR0aW5ncygpOgotCWdsb2JhbCBfZGVmYXVsdFNldHRpbmdzRWRpdG9yCi0JaWYgX2RlZmF1bHRTZXR0aW5nc0VkaXRvciBpcyBOb25lIG9yIG5vdCBoYXNhdHRyKF9kZWZhdWx0U2V0dGluZ3NFZGl0b3IsICJ3Iik6Ci0JCV9kZWZhdWx0U2V0dGluZ3NFZGl0b3IgPSBfRWRpdG9yRGVmYXVsdFNldHRpbmdzKCkKLQllbHNlOgotCQlfZGVmYXVsdFNldHRpbmdzRWRpdG9yLncuc2VsZWN0KCkKKyAgICBnbG9iYWwgX2RlZmF1bHRTZXR0aW5nc0VkaXRvcgorICAgIGlmIF9kZWZhdWx0U2V0dGluZ3NFZGl0b3IgaXMgTm9uZSBvciBub3QgaGFzYXR0cihfZGVmYXVsdFNldHRpbmdzRWRpdG9yLCAidyIpOgorICAgICAgICBfZGVmYXVsdFNldHRpbmdzRWRpdG9yID0gX0VkaXRvckRlZmF1bHRTZXR0aW5ncygpCisgICAgZWxzZToKKyAgICAgICAgX2RlZmF1bHRTZXR0aW5nc0VkaXRvci53LnNlbGVjdCgpCiAKIGRlZiByZXNvbHZlYWxpYXNlcyhwYXRoKToKLQl0cnk6Ci0JCWZzciwgZDEsIGQyID0gRmlsZS5GU1Jlc29sdmVBbGlhc0ZpbGUocGF0aCwgMSkKLQkJcGF0aCA9IGZzci5hc19wYXRobmFtZSgpCi0JCXJldHVybiBwYXRoCi0JZXhjZXB0IChGaWxlLkVycm9yLCBWYWx1ZUVycm9yKSwgKGVycm9yLCBzdHIpOgotCQlpZiBlcnJvciA8PiAtMTIwOgotCQkJcmFpc2UKLQkJZGlyLCBmaWxlID0gb3MucGF0aC5zcGxpdChwYXRoKQotCQlyZXR1cm4gb3MucGF0aC5qb2luKHJlc29sdmVhbGlhc2VzKGRpciksIGZpbGUpCisgICAgdHJ5OgorICAgICAgICBmc3IsIGQxLCBkMiA9IEZpbGUuRlNSZXNvbHZlQWxpYXNGaWxlKHBhdGgsIDEpCisgICAgICAgIHBhdGggPSBmc3IuYXNfcGF0aG5hbWUoKQorICAgICAgICByZXR1cm4gcGF0aAorICAgIGV4Y2VwdCAoRmlsZS5FcnJvciwgVmFsdWVFcnJvciksIChlcnJvciwgc3RyKToKKyAgICAgICAgaWYgZXJyb3IgPD4gLTEyMDoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGRpciwgZmlsZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihyZXNvbHZlYWxpYXNlcyhkaXIpLCBmaWxlKQogCiBzZWFyY2hlbmdpbmUgPSBTZWFyY2hFbmdpbmUoKQogdHJhY2ViYWNrd2luZG93ID0gV3RyYWNlYmFjay5UcmFjZUJhY2soKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9QeUZvbnRpZnkucHkgYi9NYWMvVG9vbHMvSURFL1B5Rm9udGlmeS5weQppbmRleCBlYjM3YWQzLi40MWYxOTQyIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1B5Rm9udGlmeS5weQorKysgYi9NYWMvVG9vbHMvSURFL1B5Rm9udGlmeS5weQpAQCAtMSwyOSArMSwyOSBAQAogIiIiTW9kdWxlIHRvIGFuYWx5emUgUHl0aG9uIHNvdXJjZSBjb2RlOyBmb3Igc3ludGF4IGNvbG9yaW5nIHRvb2xzLgogCiBJbnRlcmZhY2U6Ci0JdGFncyA9IGZvbnRpZnkocHl0ZXh0LCBzZWFyY2hmcm9tLCBzZWFyY2h0bykKKyAgICAgICAgdGFncyA9IGZvbnRpZnkocHl0ZXh0LCBzZWFyY2hmcm9tLCBzZWFyY2h0bykKIAogVGhlICdweXRleHQnIGFyZ3VtZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgUHl0aG9uIHNvdXJjZSBjb2RlLgotVGhlIChvcHRpb25hbCkgYXJndW1lbnRzICdzZWFyY2hmcm9tJyBhbmQgJ3NlYXJjaHRvJyBtYXkgY29udGFpbiBhIHNsaWNlIGluIHB5dGV4dC4gCitUaGUgKG9wdGlvbmFsKSBhcmd1bWVudHMgJ3NlYXJjaGZyb20nIGFuZCAnc2VhcmNodG8nIG1heSBjb250YWluIGEgc2xpY2UgaW4gcHl0ZXh0LgogVGhlIHJldHVybmVkIHZhbHVlIGlzIGEgbGlzdCBvZiB0dXBsZXMsIGZvcm1hdHRlZCBsaWtlIHRoaXM6Ci0JWygna2V5d29yZCcsIDAsIDYsIE5vbmUpLCAoJ2tleXdvcmQnLCAxMSwgMTcsIE5vbmUpLCAoJ2NvbW1lbnQnLCAyMywgNTMsIE5vbmUpLCBldGMuIF0KKyAgICAgICAgWygna2V5d29yZCcsIDAsIDYsIE5vbmUpLCAoJ2tleXdvcmQnLCAxMSwgMTcsIE5vbmUpLCAoJ2NvbW1lbnQnLCAyMywgNTMsIE5vbmUpLCBldGMuIF0KIFRoZSB0dXBsZSBjb250ZW50cyBhcmUgYWx3YXlzIGxpa2UgdGhpczoKLQkodGFnLCBzdGFydGluZGV4LCBlbmRpbmRleCwgc3VibGlzdCkKKyAgICAgICAgKHRhZywgc3RhcnRpbmRleCwgZW5kaW5kZXgsIHN1Ymxpc3QpCiB0YWcgaXMgb25lIG9mICdrZXl3b3JkJywgJ3N0cmluZycsICdjb21tZW50JyBvciAnaWRlbnRpZmllcicKLXN1Ymxpc3QgaXMgbm90IHVzZWQsIGhlbmNlIGFsd2F5cyBOb25lLiAKK3N1Ymxpc3QgaXMgbm90IHVzZWQsIGhlbmNlIGFsd2F5cyBOb25lLgogIiIiCiAKICMgQmFzZWQgb24gRm9udFRleHQucHkgYnkgTWl0Y2hlbGwgUy4gQ2hhcG1hbiwKICMgd2hpY2ggd2FzIG1vZGlmaWVkIGJ5IFphY2hhcnkgUm9hZGhvdXNlLAogIyB0aGVuIHVuLVRrJ2QgYnkgSnVzdCB2YW4gUm9zc3VtLgogIyBNYW55IHRoYW5rcyBmb3IgcmVndWxhciBleHByZXNzaW9uIGRlYnVnZ2luZyAmIGF1dGhvcmluZyBhcmUgZHVlIHRvOgotIwlUaW0gKHRoZS1pbmNyZWRpYi1seSB5J3JzKSBQZXRlcnMgYW5kIENyaXN0aWFuIFRpc21lcgorIyAgICAgICBUaW0gKHRoZS1pbmNyZWRpYi1seSB5J3JzKSBQZXRlcnMgYW5kIENyaXN0aWFuIFRpc21lcgogIyBTbywgd2hvIG93bnMgdGhlIGNvcHlyaWdodD8gOy0pIEhvdyBhYm91dCB0aGlzOgotIyBDb3B5cmlnaHQgMTk5Ni0yMDAxOiAKLSMJTWl0Y2hlbGwgUy4gQ2hhcG1hbiwKLSMJWmFjaGFyeSBSb2FkaG91c2UsCi0jCVRpbSBQZXRlcnMsCi0jCUp1c3QgdmFuIFJvc3N1bQorIyBDb3B5cmlnaHQgMTk5Ni0yMDAxOgorIyAgICAgICBNaXRjaGVsbCBTLiBDaGFwbWFuLAorIyAgICAgICBaYWNoYXJ5IFJvYWRob3VzZSwKKyMgICAgICAgVGltIFBldGVycywKKyMgICAgICAgSnVzdCB2YW4gUm9zc3VtCiAKIF9fdmVyc2lvbl9fID0gIjAuNCIKIApAQCAtMzMsMTggKzMzLDE4IEBACiAjIEZpcnN0IGEgbGl0dGxlIGhlbHBlciwgc2luY2UgSSBkb24ndCBsaWtlIHRvIHJlcGVhdCB0aGluZ3MuIChUaXNtZXIgc3BlYWtpbmcpCiBpbXBvcnQgc3RyaW5nCiBkZWYgcmVwbGFjZSh3aGVyZSwgd2hhdCwgd2l0aCk6Ci0JcmV0dXJuIHN0cmluZy5qb2luKHN0cmluZy5zcGxpdCh3aGVyZSwgd2hhdCksIHdpdGgpCisgICAgcmV0dXJuIHN0cmluZy5qb2luKHN0cmluZy5zcGxpdCh3aGVyZSwgd2hhdCksIHdpdGgpCiAKICMgVGhpcyBsaXN0IG9mIGtleXdvcmRzIGlzIHRha2VuIGZyb20gcmVmL25vZGUxMy5odG1sIG9mIHRoZQogIyBQeXRob24gMS4zIEhUTUwgZG9jdW1lbnRhdGlvbi4gKCJhY2Nlc3MiIGlzIGludGVudGlvbmFsbHkgb21pdHRlZC4pCiBrZXl3b3Jkc0xpc3QgPSBbCi0JImFzc2VydCIsICJleGVjIiwKLQkiZGVsIiwgImZyb20iLCAibGFtYmRhIiwgInJldHVybiIsCi0JImFuZCIsICJlbGlmIiwgImdsb2JhbCIsICJub3QiLCAidHJ5IiwKLQkiYnJlYWsiLCAiZWxzZSIsICJpZiIsICJvciIsICJ3aGlsZSIsCi0JImNsYXNzIiwgImV4Y2VwdCIsICJpbXBvcnQiLCAicGFzcyIsCi0JImNvbnRpbnVlIiwgImZpbmFsbHkiLCAiaW4iLCAicHJpbnQiLAotCSJkZWYiLCAiZm9yIiwgImlzIiwgInJhaXNlIiwgInlpZWxkIl0KKyAgICAgICAgImFzc2VydCIsICJleGVjIiwKKyAgICAgICAgImRlbCIsICJmcm9tIiwgImxhbWJkYSIsICJyZXR1cm4iLAorICAgICAgICAiYW5kIiwgImVsaWYiLCAiZ2xvYmFsIiwgIm5vdCIsICJ0cnkiLAorICAgICAgICAiYnJlYWsiLCAiZWxzZSIsICJpZiIsICJvciIsICJ3aGlsZSIsCisgICAgICAgICJjbGFzcyIsICJleGNlcHQiLCAiaW1wb3J0IiwgInBhc3MiLAorICAgICAgICAiY29udGludWUiLCAiZmluYWxseSIsICJpbiIsICJwcmludCIsCisgICAgICAgICJkZWYiLCAiZm9yIiwgImlzIiwgInJhaXNlIiwgInlpZWxkIl0KIAogIyBCdWlsZCB1cCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCB3aWxsIG1hdGNoIGFueXRoaW5nCiAjIGludGVyZXN0aW5nLCBpbmNsdWRpbmcgbXVsdGktbGluZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MuCkBAIC01NSwyNCArNTUsMjQgQEAKIAogIyBXYXkgdG8gZ28sIFRpbSEKIHBhdCA9IHIiIiIKLQlxcXEKLQlbXlxccV0qCi0JKAotCQkoCVxcW1wwMDAtXDM3N10KLQkJfAlxCi0JCQkoCVxcW1wwMDAtXDM3N10KLQkJCXwJW15ccV0KLQkJCXwJcQotCQkJCSgJXFxbXDAwMC1cMzc3XQotCQkJCXwJW15cXHFdCi0JCQkJKQotCQkJKQotCQkpCi0JCVteXFxxXSoKLQkpKgotCXFxcQorICAgICAgICBxcXEKKyAgICAgICAgW15cXHFdKgorICAgICAgICAoCisgICAgICAgICAgICAgICAgKCAgICAgICBcXFtcMDAwLVwzNzddCisgICAgICAgICAgICAgICAgfCAgICAgICBxCisgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgIFxcW1wwMDAtXDM3N10KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgW15ccV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgcQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICAgICAgIFxcW1wwMDAtXDM3N10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBbXlxccV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBbXlxccV0qCisgICAgICAgICkqCisgICAgICAgIHFxcQogIiIiCi1wYXQgPSBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQocGF0KSwgJycpCSMgZ2V0IHJpZCBvZiB3aGl0ZXNwYWNlCitwYXQgPSBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQocGF0KSwgJycpICAgICAgICAjIGdldCByaWQgb2Ygd2hpdGVzcGFjZQogdHJpcGxlUXVvdGVQYXQgPSByZXBsYWNlKHBhdCwgInEiLCAiJyIpICsgInwiICsgcmVwbGFjZShwYXQsICdxJywgJyInKQogCiAjIEJ1aWxkIHVwIGEgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIG1hdGNoZXMgYWxsIGFuZCBvbmx5CkBAIC04Nyw2OSArODcsNjkgQEAKIG1hdGNoUGF0ID0gY29tbWVudFBhdCArICJ8IiArIGtleVBhdCArICJ8IiArIHRyaXBsZVF1b3RlUGF0ICsgInwiICsgcXVvdGVQYXQKIG1hdGNoUkUgPSByZS5jb21waWxlKG1hdGNoUGF0KQogCi1pZEtleVBhdCA9ICJbIFx0XSpbQS1aYS16X11bQS1aYS16XzAtOS5dKiIJIyBJZGVudCB3LiBsZWFkaW5nIHdoaXRlc3BhY2UuCitpZEtleVBhdCA9ICJbIFx0XSpbQS1aYS16X11bQS1aYS16XzAtOS5dKiIgICAgICAjIElkZW50IHcuIGxlYWRpbmcgd2hpdGVzcGFjZS4KIGlkUkUgPSByZS5jb21waWxlKGlkS2V5UGF0KQogCiAKIGRlZiBmb250aWZ5KHB5dGV4dCwgc2VhcmNoZnJvbSA9IDAsIHNlYXJjaHRvID0gTm9uZSk6Ci0JaWYgc2VhcmNodG8gaXMgTm9uZToKLQkJc2VhcmNodG8gPSBsZW4ocHl0ZXh0KQotCSMgQ2FjaGUgYSBmZXcgYXR0cmlidXRlcyBmb3IgcXVpY2tlciByZWZlcmVuY2UuCi0Jc2VhcmNoID0gbWF0Y2hSRS5zZWFyY2gKLQlpZFNlYXJjaCA9IGlkUkUuc2VhcmNoCi0JCi0JdGFncyA9IFtdCi0JdGFnc19hcHBlbmQgPSB0YWdzLmFwcGVuZAotCWNvbW1lbnRUYWcgPSAnY29tbWVudCcKLQlzdHJpbmdUYWcgPSAnc3RyaW5nJwotCWtleXdvcmRUYWcgPSAna2V5d29yZCcKLQlpZGVudGlmaWVyVGFnID0gJ2lkZW50aWZpZXInCi0JCi0Jc3RhcnQgPSAwCi0JZW5kID0gc2VhcmNoZnJvbQotCXdoaWxlIDE6Ci0JCW0gPSBzZWFyY2gocHl0ZXh0LCBlbmQpCi0JCWlmIG0gaXMgTm9uZToKLQkJCWJyZWFrCSMgRVhJVCBMT09QCi0JCXN0YXJ0ID0gbS5zdGFydCgpCi0JCWlmIHN0YXJ0ID49IHNlYXJjaHRvOgotCQkJYnJlYWsJIyBFWElUIExPT1AKLQkJbWF0Y2ggPSBtLmdyb3VwKDApCi0JCWVuZCA9IHN0YXJ0ICsgbGVuKG1hdGNoKQotCQljID0gbWF0Y2hbMF0KLQkJaWYgYyBub3QgaW4gIiMnXCIiOgotCQkJIyBNdXN0IGhhdmUgbWF0Y2hlZCBhIGtleXdvcmQuCi0JCQlpZiBzdGFydCA8PiBzZWFyY2hmcm9tOgotCQkJCSMgdGhlcmUncyBzdGlsbCBhIHJlZHVuZGFudCBjaGFyIGJlZm9yZSBhbmQgYWZ0ZXIgaXQsIHN0cmlwIQotCQkJCW1hdGNoID0gbWF0Y2hbMTotMV0KLQkJCQlzdGFydCA9IHN0YXJ0ICsgMQotCQkJZWxzZToKLQkJCQkjIHRoaXMgaXMgdGhlIGZpcnN0IGtleXdvcmQgaW4gdGhlIHRleHQuCi0JCQkJIyBPbmx5IGEgc3BhY2UgYXQgdGhlIGVuZC4KLQkJCQltYXRjaCA9IG1hdGNoWzotMV0KLQkJCWVuZCA9IGVuZCAtIDEKLQkJCXRhZ3NfYXBwZW5kKChrZXl3b3JkVGFnLCBzdGFydCwgZW5kLCBOb25lKSkKLQkJCSMgSWYgdGhpcyB3YXMgYSBkZWZpbmluZyBrZXl3b3JkLCBsb29rIGFoZWFkIHRvIHRoZQotCQkJIyBmb2xsb3dpbmcgaWRlbnRpZmllci4KLQkJCWlmIG1hdGNoIGluIFsiZGVmIiwgImNsYXNzIl06Ci0JCQkJbSA9IGlkU2VhcmNoKHB5dGV4dCwgZW5kKQotCQkJCWlmIG0gaXMgbm90IE5vbmU6Ci0JCQkJCXN0YXJ0ID0gbS5zdGFydCgpCi0JCQkJCWlmIHN0YXJ0ID09IGVuZDoKLQkJCQkJCW1hdGNoID0gbS5ncm91cCgwKQotCQkJCQkJZW5kID0gc3RhcnQgKyBsZW4obWF0Y2gpCi0JCQkJCQl0YWdzX2FwcGVuZCgoaWRlbnRpZmllclRhZywgc3RhcnQsIGVuZCwgTm9uZSkpCi0JCWVsaWYgYyA9PSAiIyI6Ci0JCQl0YWdzX2FwcGVuZCgoY29tbWVudFRhZywgc3RhcnQsIGVuZCwgTm9uZSkpCi0JCWVsc2U6Ci0JCQl0YWdzX2FwcGVuZCgoc3RyaW5nVGFnLCBzdGFydCwgZW5kLCBOb25lKSkKLQlyZXR1cm4gdGFncworICAgIGlmIHNlYXJjaHRvIGlzIE5vbmU6CisgICAgICAgIHNlYXJjaHRvID0gbGVuKHB5dGV4dCkKKyAgICAjIENhY2hlIGEgZmV3IGF0dHJpYnV0ZXMgZm9yIHF1aWNrZXIgcmVmZXJlbmNlLgorICAgIHNlYXJjaCA9IG1hdGNoUkUuc2VhcmNoCisgICAgaWRTZWFyY2ggPSBpZFJFLnNlYXJjaAorCisgICAgdGFncyA9IFtdCisgICAgdGFnc19hcHBlbmQgPSB0YWdzLmFwcGVuZAorICAgIGNvbW1lbnRUYWcgPSAnY29tbWVudCcKKyAgICBzdHJpbmdUYWcgPSAnc3RyaW5nJworICAgIGtleXdvcmRUYWcgPSAna2V5d29yZCcKKyAgICBpZGVudGlmaWVyVGFnID0gJ2lkZW50aWZpZXInCisKKyAgICBzdGFydCA9IDAKKyAgICBlbmQgPSBzZWFyY2hmcm9tCisgICAgd2hpbGUgMToKKyAgICAgICAgbSA9IHNlYXJjaChweXRleHQsIGVuZCkKKyAgICAgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAgICAgYnJlYWsgICAjIEVYSVQgTE9PUAorICAgICAgICBzdGFydCA9IG0uc3RhcnQoKQorICAgICAgICBpZiBzdGFydCA+PSBzZWFyY2h0bzoKKyAgICAgICAgICAgIGJyZWFrICAgIyBFWElUIExPT1AKKyAgICAgICAgbWF0Y2ggPSBtLmdyb3VwKDApCisgICAgICAgIGVuZCA9IHN0YXJ0ICsgbGVuKG1hdGNoKQorICAgICAgICBjID0gbWF0Y2hbMF0KKyAgICAgICAgaWYgYyBub3QgaW4gIiMnXCIiOgorICAgICAgICAgICAgIyBNdXN0IGhhdmUgbWF0Y2hlZCBhIGtleXdvcmQuCisgICAgICAgICAgICBpZiBzdGFydCA8PiBzZWFyY2hmcm9tOgorICAgICAgICAgICAgICAgICMgdGhlcmUncyBzdGlsbCBhIHJlZHVuZGFudCBjaGFyIGJlZm9yZSBhbmQgYWZ0ZXIgaXQsIHN0cmlwIQorICAgICAgICAgICAgICAgIG1hdGNoID0gbWF0Y2hbMTotMV0KKyAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0ICsgMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHRoaXMgaXMgdGhlIGZpcnN0IGtleXdvcmQgaW4gdGhlIHRleHQuCisgICAgICAgICAgICAgICAgIyBPbmx5IGEgc3BhY2UgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoWzotMV0KKyAgICAgICAgICAgIGVuZCA9IGVuZCAtIDEKKyAgICAgICAgICAgIHRhZ3NfYXBwZW5kKChrZXl3b3JkVGFnLCBzdGFydCwgZW5kLCBOb25lKSkKKyAgICAgICAgICAgICMgSWYgdGhpcyB3YXMgYSBkZWZpbmluZyBrZXl3b3JkLCBsb29rIGFoZWFkIHRvIHRoZQorICAgICAgICAgICAgIyBmb2xsb3dpbmcgaWRlbnRpZmllci4KKyAgICAgICAgICAgIGlmIG1hdGNoIGluIFsiZGVmIiwgImNsYXNzIl06CisgICAgICAgICAgICAgICAgbSA9IGlkU2VhcmNoKHB5dGV4dCwgZW5kKQorICAgICAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbS5zdGFydCgpCisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXJ0ID09IGVuZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gbS5ncm91cCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBsZW4obWF0Y2gpCisgICAgICAgICAgICAgICAgICAgICAgICB0YWdzX2FwcGVuZCgoaWRlbnRpZmllclRhZywgc3RhcnQsIGVuZCwgTm9uZSkpCisgICAgICAgIGVsaWYgYyA9PSAiIyI6CisgICAgICAgICAgICB0YWdzX2FwcGVuZCgoY29tbWVudFRhZywgc3RhcnQsIGVuZCwgTm9uZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YWdzX2FwcGVuZCgoc3RyaW5nVGFnLCBzdGFydCwgZW5kLCBOb25lKSkKKyAgICByZXR1cm4gdGFncwogCiAKIGRlZiB0ZXN0KHBhdGgpOgotCWYgPSBvcGVuKHBhdGgpCi0JdGV4dCA9IGYucmVhZCgpCi0JZi5jbG9zZSgpCi0JdGFncyA9IGZvbnRpZnkodGV4dCkKLQlmb3IgdGFnLCBzdGFydCwgZW5kLCBzdWJsaXN0IGluIHRhZ3M6Ci0JCXByaW50IHRhZywgcmVwcih0ZXh0W3N0YXJ0OmVuZF0pCisgICAgZiA9IG9wZW4ocGF0aCkKKyAgICB0ZXh0ID0gZi5yZWFkKCkKKyAgICBmLmNsb3NlKCkKKyAgICB0YWdzID0gZm9udGlmeSh0ZXh0KQorICAgIGZvciB0YWcsIHN0YXJ0LCBlbmQsIHN1Ymxpc3QgaW4gdGFnczoKKyAgICAgICAgcHJpbnQgdGFnLCByZXByKHRleHRbc3RhcnQ6ZW5kXSkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvUHlJbnRlcmFjdGl2ZS5weSBiL01hYy9Ub29scy9JREUvUHlJbnRlcmFjdGl2ZS5weQppbmRleCAzYWQwMmM1Li45ODdlZWM1IDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1B5SW50ZXJhY3RpdmUucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9QeUludGVyYWN0aXZlLnB5CkBAIC00LDExNCArNCwxMTQgQEAKIAogCiB0cnk6Ci0Jc3lzLnBzMQorICAgIHN5cy5wczEKIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLQlzeXMucHMxID0gIj4+PiAiCisgICAgc3lzLnBzMSA9ICI+Pj4gIgogdHJ5OgotCXN5cy5wczIKKyAgICBzeXMucHMyCiBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0Jc3lzLnBzMiA9ICIuLi4gIgorICAgIHN5cy5wczIgPSAiLi4uICIKIAogCiBkZWYgcHJpbnRfZXhjKGxpbWl0PU5vbmUsIGZpbGU9Tm9uZSk6Ci0JaWYgbm90IGZpbGU6Ci0JCWZpbGUgPSBzeXMuc3RkZXJyCi0JIyB3ZSdyZSBnb2luZyB0byBza2lwIHRoZSBvdXRlcm1vc3QgdHJhY2ViYWNrIG9iamVjdCwgd2UgZG9uJ3QKLQkjIHdhbnQgcGVvcGxlIHRvIHNlZSB0aGUgbGluZSB3aGljaCBleGNlY3V0ZWQgdGhlaXIgY29kZS4KLQl0YiA9IHN5cy5leGNfdHJhY2ViYWNrCi0JaWYgdGI6Ci0JCXRiID0gdGIudGJfbmV4dAotCXRyeToKLQkJc3lzLmxhc3RfdHlwZSA9IHN5cy5leGNfdHlwZQotCQlzeXMubGFzdF92YWx1ZSA9IHN5cy5leGNfdmFsdWUKLQkJc3lzLmxhc3RfdHJhY2ViYWNrID0gdGIKLQkJdHJhY2ViYWNrLnByaW50X2V4Y2VwdGlvbihzeXMubGFzdF90eXBlLCBzeXMubGFzdF92YWx1ZSwgCi0JCQkJCXN5cy5sYXN0X3RyYWNlYmFjaywgbGltaXQsIGZpbGUpCi0JZXhjZXB0OgotCQlwcmludCAnLS0tIGhvbGEhIC0tLScKLQkJdHJhY2ViYWNrLnByaW50X2V4Y2VwdGlvbihzeXMuZXhjX3R5cGUsIHN5cy5leGNfdmFsdWUsIAotCQkJCQlzeXMuZXhjX3RyYWNlYmFjaywgbGltaXQsIGZpbGUpCisgICAgaWYgbm90IGZpbGU6CisgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCisgICAgIyB3ZSdyZSBnb2luZyB0byBza2lwIHRoZSBvdXRlcm1vc3QgdHJhY2ViYWNrIG9iamVjdCwgd2UgZG9uJ3QKKyAgICAjIHdhbnQgcGVvcGxlIHRvIHNlZSB0aGUgbGluZSB3aGljaCBleGNlY3V0ZWQgdGhlaXIgY29kZS4KKyAgICB0YiA9IHN5cy5leGNfdHJhY2ViYWNrCisgICAgaWYgdGI6CisgICAgICAgIHRiID0gdGIudGJfbmV4dAorICAgIHRyeToKKyAgICAgICAgc3lzLmxhc3RfdHlwZSA9IHN5cy5leGNfdHlwZQorICAgICAgICBzeXMubGFzdF92YWx1ZSA9IHN5cy5leGNfdmFsdWUKKyAgICAgICAgc3lzLmxhc3RfdHJhY2ViYWNrID0gdGIKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4Y2VwdGlvbihzeXMubGFzdF90eXBlLCBzeXMubGFzdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmxhc3RfdHJhY2ViYWNrLCBsaW1pdCwgZmlsZSkKKyAgICBleGNlcHQ6CisgICAgICAgIHByaW50ICctLS0gaG9sYSEgLS0tJworICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uKHN5cy5leGNfdHlwZSwgc3lzLmV4Y192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmV4Y190cmFjZWJhY2ssIGxpbWl0LCBmaWxlKQogCiAKIGNsYXNzIFB5SW50ZXJhY3RpdmU6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlpbXBvcnQgY29kZW9wCi0JCXNlbGYuX3B5YnVmID0gIiIKLQkJc2VsZi5fY29tcGlsZSA9IGNvZGVvcC5Db21waWxlKCkKLQkKLQlkZWYgZXhlY3V0ZWxpbmUoc2VsZiwgc3R1ZmYsIG91dCA9IE5vbmUsIGVudiA9IE5vbmUpOgotCQlpZiBlbnYgaXMgTm9uZToKLQkJCWltcG9ydCBfX21haW5fXwotCQkJZW52ID0gX19tYWluX18uX19kaWN0X18KLQkJaWYgb3V0OgotCQkJc2F2ZWVyciwgc2F2ZW91dCA9IHN5cy5zdGRlcnIsIHN5cy5zdGRvdXQKLQkJCXN5cy5zdGRlcnIgPSBzeXMuc3Rkb3V0ID0gb3V0Ci0JCXRyeToKLQkJCWlmIHNlbGYuX3B5YnVmOgotCQkJCXNlbGYuX3B5YnVmID0gc2VsZi5fcHlidWYgKyAnXG4nICsgc3R1ZmYKLQkJCWVsc2U6Ci0JCQkJc2VsZi5fcHlidWYgPSBzdHVmZgotCQkJCi0JCQkjIENvbXBpbGUgdGhyZWUgdGltZXM6IGFzIGlzLCB3aXRoIFxuLCBhbmQgd2l0aCBcblxuIGFwcGVuZGVkLgotCQkJIyBJZiBpdCBjb21waWxlcyBhcyBpcywgaXQncyBjb21wbGV0ZS4gIElmIGl0IGNvbXBpbGVzIHdpdGgKLQkJCSMgb25lIFxuIGFwcGVuZGVkLCB3ZSBleHBlY3QgbW9yZS4gIElmIGl0IGRvZXNuJ3QgY29tcGlsZQotCQkJIyBlaXRoZXIgd2F5LCB3ZSBjb21wYXJlIHRoZSBlcnJvciB3ZSBnZXQgd2hlbiBjb21waWxpbmcgd2l0aAotCQkJIyBcbiBvciBcblxuIGFwcGVuZGVkLiAgSWYgdGhlIGVycm9ycyBhcmUgdGhlIHNhbWUsIHRoZSBjb2RlCi0JCQkjIGlzIGJyb2tlbi4gIEJ1dCBpZiB0aGUgZXJyb3JzIGFyZSBkaWZmZXJlbnQsIHdlIGV4cGVjdCBtb3JlLgotCQkJIyBOb3QgaW50dWl0aXZlOyBub3QgZXZlbiBndWFyYW50ZWVkIHRvIGhvbGQgaW4gZnV0dXJlCi0JCQkjIHJlbGVhc2VzOyBidXQgdGhpcyBtYXRjaGVzIHRoZSBjb21waWxlcidzIGJlaGF2aW9yIGluIFB5dGhvbgotCQkJIyAxLjQgYW5kIDEuNS4KLQkJCWVyciA9IGVycjEgPSBlcnIyID0gTm9uZQotCQkJY29kZSA9IGNvZGUxID0gY29kZTIgPSBOb25lCi0JCQkKLQkJCSMgcXVpY2tseSBnZXQgb3V0IG9mIGhlcmUgd2hlbiB0aGUgbGluZSBpcyAnZW1wdHknIG9yIGlzIGEgY29tbWVudAotCQkJc3RyaXBwZWQgPSBzdHJpbmcuc3RyaXAoc2VsZi5fcHlidWYpCi0JCQlpZiBub3Qgc3RyaXBwZWQgb3Igc3RyaXBwZWRbMF0gPT0gJyMnOgotCQkJCXNlbGYuX3B5YnVmID0gJycKLQkJCQlzeXMuc3Rkb3V0LndyaXRlKHN5cy5wczEpCi0JCQkJc3lzLnN0ZG91dC5mbHVzaCgpCi0JCQkJcmV0dXJuCi0JCQkKLQkJCXRyeToKLQkJCQljb2RlID0gc2VsZi5fY29tcGlsZShzZWxmLl9weWJ1ZiwgIjxpbnB1dD4iLCAic2luZ2xlIikKLQkJCWV4Y2VwdCBTeW50YXhFcnJvciwgZXJyOgotCQkJCXBhc3MKLQkJCWV4Y2VwdDoKLQkJCQkjIE92ZXJmbG93RXJyb3IuIE1vcmU/Ci0JCQkJcHJpbnRfZXhjKCkKLQkJCQlzZWxmLl9weWJ1ZiA9ICIiCi0JCQkJc3lzLnN0ZG91dC53cml0ZShzeXMucHMxKQotCQkJCXN5cy5zdGRvdXQuZmx1c2goKQotCQkJCXJldHVybgotCQkJCi0JCQl0cnk6Ci0JCQkJY29kZTEgPSBzZWxmLl9jb21waWxlKHNlbGYuX3B5YnVmICsgIlxuIiwgIjxpbnB1dD4iLCAic2luZ2xlIikKLQkJCWV4Y2VwdCBTeW50YXhFcnJvciwgZXJyMToKLQkJCQlwYXNzCi0JCQkKLQkJCXRyeToKLQkJCQljb2RlMiA9IHNlbGYuX2NvbXBpbGUoc2VsZi5fcHlidWYgKyAiXG5cbiIsICI8aW5wdXQ+IiwgInNpbmdsZSIpCi0JCQlleGNlcHQgU3ludGF4RXJyb3IsIGVycjI6Ci0JCQkJcGFzcwotCQkJCi0JCQlpZiBjb2RlOgotCQkJCXRyeToKLQkJCQkJZXhlYyBjb2RlIGluIGVudgotCQkJCWV4Y2VwdDoKLQkJCQkJcHJpbnRfZXhjKCkKLQkJCQlzZWxmLl9weWJ1ZiA9ICIiCi0JCQllbGlmIGNvZGUxOgotCQkJCXBhc3MKLQkJCWVsaWYgZXJyMSA9PSBlcnIyIG9yIChub3Qgc3R1ZmYgYW5kIHNlbGYuX3B5YnVmKToKLQkJCQlwcmludF9leGMoKQotCQkJCXNlbGYuX3B5YnVmID0gIiIKLQkJCWlmIHNlbGYuX3B5YnVmOgotCQkJCXN5cy5zdGRvdXQud3JpdGUoc3lzLnBzMikKLQkJCQlzeXMuc3Rkb3V0LmZsdXNoKCkKLQkJCWVsc2U6Ci0JCQkJc3lzLnN0ZG91dC53cml0ZShzeXMucHMxKQotCQkJCXN5cy5zdGRvdXQuZmx1c2goKQotCQlmaW5hbGx5OgotCQkJaWYgb3V0OgotCQkJCXN5cy5zdGRlcnIsIHN5cy5zdGRvdXQgPSBzYXZlZXJyLCBzYXZlb3V0CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGltcG9ydCBjb2Rlb3AKKyAgICAgICAgc2VsZi5fcHlidWYgPSAiIgorICAgICAgICBzZWxmLl9jb21waWxlID0gY29kZW9wLkNvbXBpbGUoKQorCisgICAgZGVmIGV4ZWN1dGVsaW5lKHNlbGYsIHN0dWZmLCBvdXQgPSBOb25lLCBlbnYgPSBOb25lKToKKyAgICAgICAgaWYgZW52IGlzIE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgX19tYWluX18KKyAgICAgICAgICAgIGVudiA9IF9fbWFpbl9fLl9fZGljdF9fCisgICAgICAgIGlmIG91dDoKKyAgICAgICAgICAgIHNhdmVlcnIsIHNhdmVvdXQgPSBzeXMuc3RkZXJyLCBzeXMuc3Rkb3V0CisgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3lzLnN0ZG91dCA9IG91dAorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9weWJ1ZjoKKyAgICAgICAgICAgICAgICBzZWxmLl9weWJ1ZiA9IHNlbGYuX3B5YnVmICsgJ1xuJyArIHN0dWZmCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3B5YnVmID0gc3R1ZmYKKworICAgICAgICAgICAgIyBDb21waWxlIHRocmVlIHRpbWVzOiBhcyBpcywgd2l0aCBcbiwgYW5kIHdpdGggXG5cbiBhcHBlbmRlZC4KKyAgICAgICAgICAgICMgSWYgaXQgY29tcGlsZXMgYXMgaXMsIGl0J3MgY29tcGxldGUuICBJZiBpdCBjb21waWxlcyB3aXRoCisgICAgICAgICAgICAjIG9uZSBcbiBhcHBlbmRlZCwgd2UgZXhwZWN0IG1vcmUuICBJZiBpdCBkb2Vzbid0IGNvbXBpbGUKKyAgICAgICAgICAgICMgZWl0aGVyIHdheSwgd2UgY29tcGFyZSB0aGUgZXJyb3Igd2UgZ2V0IHdoZW4gY29tcGlsaW5nIHdpdGgKKyAgICAgICAgICAgICMgXG4gb3IgXG5cbiBhcHBlbmRlZC4gIElmIHRoZSBlcnJvcnMgYXJlIHRoZSBzYW1lLCB0aGUgY29kZQorICAgICAgICAgICAgIyBpcyBicm9rZW4uICBCdXQgaWYgdGhlIGVycm9ycyBhcmUgZGlmZmVyZW50LCB3ZSBleHBlY3QgbW9yZS4KKyAgICAgICAgICAgICMgTm90IGludHVpdGl2ZTsgbm90IGV2ZW4gZ3VhcmFudGVlZCB0byBob2xkIGluIGZ1dHVyZQorICAgICAgICAgICAgIyByZWxlYXNlczsgYnV0IHRoaXMgbWF0Y2hlcyB0aGUgY29tcGlsZXIncyBiZWhhdmlvciBpbiBQeXRob24KKyAgICAgICAgICAgICMgMS40IGFuZCAxLjUuCisgICAgICAgICAgICBlcnIgPSBlcnIxID0gZXJyMiA9IE5vbmUKKyAgICAgICAgICAgIGNvZGUgPSBjb2RlMSA9IGNvZGUyID0gTm9uZQorCisgICAgICAgICAgICAjIHF1aWNrbHkgZ2V0IG91dCBvZiBoZXJlIHdoZW4gdGhlIGxpbmUgaXMgJ2VtcHR5JyBvciBpcyBhIGNvbW1lbnQKKyAgICAgICAgICAgIHN0cmlwcGVkID0gc3RyaW5nLnN0cmlwKHNlbGYuX3B5YnVmKQorICAgICAgICAgICAgaWYgbm90IHN0cmlwcGVkIG9yIHN0cmlwcGVkWzBdID09ICcjJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9weWJ1ZiA9ICcnCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzeXMucHMxKQorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29kZSA9IHNlbGYuX2NvbXBpbGUoc2VsZi5fcHlidWYsICI8aW5wdXQ+IiwgInNpbmdsZSIpCisgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBPdmVyZmxvd0Vycm9yLiBNb3JlPworICAgICAgICAgICAgICAgIHByaW50X2V4YygpCisgICAgICAgICAgICAgICAgc2VsZi5fcHlidWYgPSAiIgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoc3lzLnBzMSkKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvZGUxID0gc2VsZi5fY29tcGlsZShzZWxmLl9weWJ1ZiArICJcbiIsICI8aW5wdXQ+IiwgInNpbmdsZSIpCisgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IsIGVycjE6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29kZTIgPSBzZWxmLl9jb21waWxlKHNlbGYuX3B5YnVmICsgIlxuXG4iLCAiPGlucHV0PiIsICJzaW5nbGUiKQorICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBlcnIyOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgaWYgY29kZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGV4ZWMgY29kZSBpbiBlbnYKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50X2V4YygpCisgICAgICAgICAgICAgICAgc2VsZi5fcHlidWYgPSAiIgorICAgICAgICAgICAgZWxpZiBjb2RlMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIGVycjEgPT0gZXJyMiBvciAobm90IHN0dWZmIGFuZCBzZWxmLl9weWJ1Zik6CisgICAgICAgICAgICAgICAgcHJpbnRfZXhjKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9weWJ1ZiA9ICIiCisgICAgICAgICAgICBpZiBzZWxmLl9weWJ1ZjoKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHN5cy5wczIpCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoc3lzLnBzMSkKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG91dDoKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLCBzeXMuc3Rkb3V0ID0gc2F2ZWVyciwgc2F2ZW91dApkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9QeXRob25JREUucHkgYi9NYWMvVG9vbHMvSURFL1B5dGhvbklERS5weQppbmRleCAxZWE3NzExLi5iOGY1NGE5IDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1B5dGhvbklERS5weQorKysgYi9NYWMvVG9vbHMvSURFL1B5dGhvbklERS5weQpAQCAtMSw2ICsxLDYgQEAKICMgY29weXJpZ2h0IDE5OTYtMjAwMSBKdXN0IHZhbiBSb3NzdW0sIExldHRlcnJvci4ganVzdEBsZXR0ZXJyb3IuY29tCiAKLSMga2VlcCB0aGlzIChfX21haW5fXykgYXMgY2xlYW4gYXMgcG9zc2libGUsIHNpbmNlIHdlIGFyZSB1c2luZyAKKyMga2VlcCB0aGlzIChfX21haW5fXykgYXMgY2xlYW4gYXMgcG9zc2libGUsIHNpbmNlIHdlIGFyZSB1c2luZwogIyBpdCBsaWtlIHRoZSAibm9ybWFsIiBpbnRlcnByZXRlci4KIAogX192ZXJzaW9uX18gPSAnMS4wLjInCkBAIC04LDQ4ICs4LDQ4IEBACiBpbXBvcnQgb3MKIAogZGVmIGluaXQoKToKLQlpbXBvcnQgTWFjT1MKLQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkKLQl0cnk6Ci0JCWltcG9ydCBhdXRvR0lMCi0JZXhjZXB0IEltcG9ydEVycm9yOgotCQlwYXNzCi0JZWxzZToKLQkJYXV0b0dJTC5pbnN0YWxsQXV0b0dJTCgpCi0JCi0JZnJvbSBDYXJib24gaW1wb3J0IFFkLCBRdWlja0RyYXcKLQlRZC5TZXRDdXJzb3IoUWQuR2V0Q3Vyc29yKFF1aWNrRHJhdy53YXRjaEN1cnNvcikuZGF0YSkKLQkKLQlpbXBvcnQgbWFjcmVzb3VyY2UKLQlpbXBvcnQgc3lzLCBvcwotCW1hY3Jlc291cmNlLm5lZWQoJ0RJVEwnLCA0NjgsICJQeXRob25JREUucnNyYyIpCi0Jd2lkZ2V0cmVzcGF0aHNlZ3MgPSBbc3lzLmV4ZWNfcHJlZml4LCAiTWFjIiwgIlRvb2xzIiwgIklERSIsICJXaWRnZXRzLnJzcmMiXQotCXdpZGdldHJlc2ZpbGUgPSBvcy5wYXRoLmpvaW4oKndpZGdldHJlc3BhdGhzZWdzKQotCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyh3aWRnZXRyZXNmaWxlKToKLQkJd2lkZ2V0cmVzcGF0aHNlZ3MgPSBbb3MucGFyZGlyLCAiVG9vbHMiLCAiSURFIiwgIldpZGdldHMucnNyYyJdCi0JCXdpZGdldHJlc2ZpbGUgPSBvcy5wYXRoLmpvaW4oKndpZGdldHJlc3BhdGhzZWdzKQotCXJlZm5vID0gbWFjcmVzb3VyY2UubmVlZCgnQ1VSUycsIDQ2OCwgd2lkZ2V0cmVzZmlsZSkKLQlpZiBvcy5lbnZpcm9uLmhhc19rZXkoJ1BZVEhPTklERVBBVEgnKToKLQkJIyBGb3IgZGV2ZWxvcG1lbnQgc2V0IHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUKLQkJaWRlX3BhdGggPSBvcy5lbnZpcm9uWydQWVRIT05JREVQQVRIJ10KLQllbGlmIHJlZm5vOgotCQkjIFdlJ3JlIG5vdCBhIGZ1bGxibG93biBhcHBsaWNhdGlvbgotCQlpZGVwYXRoc2VncyA9IFtzeXMuZXhlY19wcmVmaXgsICJNYWMiLCAiVG9vbHMiLCAiSURFIl0KLQkJaWRlX3BhdGggPSBvcy5wYXRoLmpvaW4oKmlkZXBhdGhzZWdzKQotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoaWRlX3BhdGgpOgotCQkJaWRlcGF0aHNlZ3MgPSBbb3MucGFyZGlyLCAiVG9vbHMiLCAiSURFIl0KLQkJCWZvciBwIGluIHN5cy5wYXRoOgotCQkJCWlkZV9wYXRoID0gb3MucGF0aC5qb2luKCooW3BdK2lkZXBhdGhzZWdzKSkKLQkJCQlpZiBvcy5wYXRoLmV4aXN0cyhpZGVfcGF0aCk6Ci0JCQkJCWJyZWFrCi0JCQotCWVsc2U6Ci0JCSMgV2UgYXJlIGEgZnVsbHkgZnJvemVuIGFwcGxpY2F0aW9uCi0JCWlkZV9wYXRoID0gc3lzLmFyZ3ZbMF0KLQlpZiBpZGVfcGF0aCBub3QgaW4gc3lzLnBhdGg6Ci0JCXN5cy5wYXRoLmluc2VydCgxLCBpZGVfcGF0aCkKKyAgICBpbXBvcnQgTWFjT1MKKyAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKworICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGF1dG9HSUwKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBhdXRvR0lMLmluc3RhbGxBdXRvR0lMKCkKKworICAgIGZyb20gQ2FyYm9uIGltcG9ydCBRZCwgUXVpY2tEcmF3CisgICAgUWQuU2V0Q3Vyc29yKFFkLkdldEN1cnNvcihRdWlja0RyYXcud2F0Y2hDdXJzb3IpLmRhdGEpCisKKyAgICBpbXBvcnQgbWFjcmVzb3VyY2UKKyAgICBpbXBvcnQgc3lzLCBvcworICAgIG1hY3Jlc291cmNlLm5lZWQoJ0RJVEwnLCA0NjgsICJQeXRob25JREUucnNyYyIpCisgICAgd2lkZ2V0cmVzcGF0aHNlZ3MgPSBbc3lzLmV4ZWNfcHJlZml4LCAiTWFjIiwgIlRvb2xzIiwgIklERSIsICJXaWRnZXRzLnJzcmMiXQorICAgIHdpZGdldHJlc2ZpbGUgPSBvcy5wYXRoLmpvaW4oKndpZGdldHJlc3BhdGhzZWdzKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh3aWRnZXRyZXNmaWxlKToKKyAgICAgICAgd2lkZ2V0cmVzcGF0aHNlZ3MgPSBbb3MucGFyZGlyLCAiVG9vbHMiLCAiSURFIiwgIldpZGdldHMucnNyYyJdCisgICAgICAgIHdpZGdldHJlc2ZpbGUgPSBvcy5wYXRoLmpvaW4oKndpZGdldHJlc3BhdGhzZWdzKQorICAgIHJlZm5vID0gbWFjcmVzb3VyY2UubmVlZCgnQ1VSUycsIDQ2OCwgd2lkZ2V0cmVzZmlsZSkKKyAgICBpZiBvcy5lbnZpcm9uLmhhc19rZXkoJ1BZVEhPTklERVBBVEgnKToKKyAgICAgICAgIyBGb3IgZGV2ZWxvcG1lbnQgc2V0IHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgaWRlX3BhdGggPSBvcy5lbnZpcm9uWydQWVRIT05JREVQQVRIJ10KKyAgICBlbGlmIHJlZm5vOgorICAgICAgICAjIFdlJ3JlIG5vdCBhIGZ1bGxibG93biBhcHBsaWNhdGlvbgorICAgICAgICBpZGVwYXRoc2VncyA9IFtzeXMuZXhlY19wcmVmaXgsICJNYWMiLCAiVG9vbHMiLCAiSURFIl0KKyAgICAgICAgaWRlX3BhdGggPSBvcy5wYXRoLmpvaW4oKmlkZXBhdGhzZWdzKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaWRlX3BhdGgpOgorICAgICAgICAgICAgaWRlcGF0aHNlZ3MgPSBbb3MucGFyZGlyLCAiVG9vbHMiLCAiSURFIl0KKyAgICAgICAgICAgIGZvciBwIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgICAgIGlkZV9wYXRoID0gb3MucGF0aC5qb2luKCooW3BdK2lkZXBhdGhzZWdzKSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpZGVfcGF0aCk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBlbHNlOgorICAgICAgICAjIFdlIGFyZSBhIGZ1bGx5IGZyb3plbiBhcHBsaWNhdGlvbgorICAgICAgICBpZGVfcGF0aCA9IHN5cy5hcmd2WzBdCisgICAgaWYgaWRlX3BhdGggbm90IGluIHN5cy5wYXRoOgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMSwgaWRlX3BhdGgpCiAKIAogaW5pdCgpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1B5dGhvbklERU1haW4ucHkgYi9NYWMvVG9vbHMvSURFL1B5dGhvbklERU1haW4ucHkKaW5kZXggMTExYTBiMC4uNGRiZTkyYSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9QeXRob25JREVNYWluLnB5CisrKyBiL01hYy9Ub29scy9JREUvUHl0aG9uSURFTWFpbi5weQpAQCAtMTMsNDc2ICsxMyw0NzYgQEAKIGZyb20gQ2FyYm9uIGltcG9ydCBGaWxlcwogCiBpZiBNYWNPUy5ydW50aW1lbW9kZWwgPT0gJ21hY2hvJzoKLQlFTExJUFNJUyA9ICcuLi4nCisgICAgRUxMSVBTSVMgPSAnLi4uJwogZWxzZToKLQlFTExJUFNJUyA9ICdceGM5JworICAgIEVMTElQU0lTID0gJ1x4YzknCiAKIGRlZiBydW5uaW5nT25PU1goKToKLQlmcm9tIGdlc3RhbHQgaW1wb3J0IGdlc3RhbHQKLQlnZXN0YWx0TWVudU1nckFxdWFMYXlvdXRCaXQgPSAxICAjIG1lbnVzIGhhdmUgdGhlIEFxdWEgMS4wIGxheW91dAotCWdlc3RhbHRNZW51TWdyQXF1YUxheW91dE1hc2sgPSAoMUwgPDwgZ2VzdGFsdE1lbnVNZ3JBcXVhTGF5b3V0Qml0KQotCXZhbHVlID0gZ2VzdGFsdCgibWVudSIpICYgZ2VzdGFsdE1lbnVNZ3JBcXVhTGF5b3V0TWFzawotCXJldHVybiBub3Qgbm90IHZhbHVlCisgICAgZnJvbSBnZXN0YWx0IGltcG9ydCBnZXN0YWx0CisgICAgZ2VzdGFsdE1lbnVNZ3JBcXVhTGF5b3V0Qml0ID0gMSAgIyBtZW51cyBoYXZlIHRoZSBBcXVhIDEuMCBsYXlvdXQKKyAgICBnZXN0YWx0TWVudU1nckFxdWFMYXlvdXRNYXNrID0gKDFMIDw8IGdlc3RhbHRNZW51TWdyQXF1YUxheW91dEJpdCkKKyAgICB2YWx1ZSA9IGdlc3RhbHQoIm1lbnUiKSAmIGdlc3RhbHRNZW51TWdyQXF1YUxheW91dE1hc2sKKyAgICByZXR1cm4gbm90IG5vdCB2YWx1ZQogCiBkZWYgZ2V0bW9kdGltZShmaWxlKToKLQlmaWxlID0gRmlsZS5GU1JlZihmaWxlKQotCWNhdGluZm8sIGQxLCBkMiwgZDMgPSBmaWxlLkZTR2V0Q2F0YWxvZ0luZm8oRmlsZXMua0ZTQ2F0SW5mb0NvbnRlbnRNb2QpCi0JcmV0dXJuIGNhdGluZm8uY29udGVudE1vZERhdGUKKyAgICBmaWxlID0gRmlsZS5GU1JlZihmaWxlKQorICAgIGNhdGluZm8sIGQxLCBkMiwgZDMgPSBmaWxlLkZTR2V0Q2F0YWxvZ0luZm8oRmlsZXMua0ZTQ2F0SW5mb0NvbnRlbnRNb2QpCisgICAgcmV0dXJuIGNhdGluZm8uY29udGVudE1vZERhdGUKIAogY2xhc3MgUHl0aG9uSURFKFdhcHBsaWNhdGlvbi5BcHBsaWNhdGlvbik6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6Ci0JCQlpZiBsZW4oc3lzLmFyZ3YpID4gMSBhbmQgc3lzLmFyZ3ZbMV0uc3RhcnRzd2l0aCgiLXBzbiIpOgotCQkJCWhvbWUgPSBvcy5nZXRlbnYoIkhPTUUiKQotCQkJCWlmIGhvbWU6Ci0JCQkJCW9zLmNoZGlyKGhvbWUpCi0JCXNlbGYucHJlZmZpbGVwYXRoID0gb3MucGF0aC5qb2luKCJQeXRob24iLCAiUHl0aG9uSURFIHByZWZlcmVuY2VzIikKLQkJV2FwcGxpY2F0aW9uLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYsICdQaWRlJykKLQkJZnJvbSBDYXJib24gaW1wb3J0IEFFCi0JCWZyb20gQ2FyYm9uIGltcG9ydCBBcHBsZUV2ZW50cwotCQkKLQkJQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFT3BlbkFwcGxpY2F0aW9uLCAKLQkJCQlzZWxmLmlnbm9yZWV2ZW50KQotCQlBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVSZW9wZW5BcHBsaWNhdGlvbiwgCi0JCQkJc2VsZi5pZ25vcmVldmVudCkKLQkJQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFUHJpbnREb2N1bWVudHMsIAotCQkJCXNlbGYuaWdub3JlZXZlbnQpCi0JCUFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRU9wZW5Eb2N1bWVudHMsIAotCQkJCXNlbGYub3BlbmRvY3NldmVudCkKLQkJQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFUXVpdEFwcGxpY2F0aW9uLCAKLQkJCQlzZWxmLnF1aXRldmVudCkKLQkJaW1wb3J0IFB5Q29uc29sZSwgUHlFZGl0Ci0JCVNwbGFzaC53YWl0KCkKLQkJIyBXaXRoIC1EIG9wdGlvbiAoT1NYIGNvbW1hbmQgbGluZSBvbmx5KSBrZWVwIHN0ZGVyciwgZm9yIGRlYnVnZ2luZyB0aGUgSURFCi0JCSMgaXRzZWxmLgotCQlkZWJ1Z19zdGRlcnIgPSBOb25lCi0JCWlmIGxlbihzeXMuYXJndikgPj0gMiBhbmQgc3lzLmFyZ3ZbMV0gPT0gJy1EJzoKLQkJCWRlYnVnX3N0ZGVyciA9IHN5cy5zdGRlcnIKLQkJCWRlbCBzeXMuYXJndlsxXQotCQlQeUNvbnNvbGUuaW5zdGFsbG91dHB1dCgpCi0JCVB5Q29uc29sZS5pbnN0YWxsY29uc29sZSgpCi0JCWlmIGRlYnVnX3N0ZGVycjoKLQkJCXN5cy5zdGRlcnIgPSBkZWJ1Z19zdGRlcnIKLQkJZm9yIHBhdGggaW4gc3lzLmFyZ3ZbMTpdOgotCQkJaWYgcGF0aC5zdGFydHN3aXRoKCItcCIpOgotCQkJCSMgcHJvY2VzcyBudW1iZXIgYWRkZWQgYnkgdGhlIE9TCi0JCQkJY29udGludWUKLQkJCXNlbGYub3BlbmRvYyhwYXRoKQotCQlzZWxmLm1haW5sb29wKCkKLQkKLQlkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKLQkJbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQotCQluZXdpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJOZXciLCAiTiIsICduZXcnKQotCQlvcGVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3BlbiIrRUxMSVBTSVMsICJPIiwgJ29wZW4nKQotCQlvcGVuYnluYW1laXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3BlbiBGaWxlIGJ5IE5hbWUiK0VMTElQU0lTLCAiRCIsICdvcGVuYnluYW1lJykKLQkJc2VsZi5vcGVucmVjZW50bWVudSA9IEZyYW1lV29yay5TdWJNZW51KG0sICJPcGVuIFJlY2VudCIpCi0JCXNlbGYubWFrZW9wZW5yZWNlbnRtZW51KCkKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQljbG9zZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkNsb3NlIiwgIlciLCAnY2xvc2UnKQotCQlzYXZlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgJ3NhdmUnKQotCQlzYXZlYXNpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTYXZlIGFzIitFTExJUFNJUywgTm9uZSwgJ3NhdmVfYXMnKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCXNhdmVhc2FwcGxldGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNhdmUgYXMgQXBwbGV0IitFTExJUFNJUywgTm9uZSwgJ3NhdmVfYXNfYXBwbGV0JykKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQlpbnN0bWdyaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUGFja2FnZSBNYW5hZ2VyIiwgTm9uZSwgJ29wZW5wYWNrYWdlbWFuYWdlcicpCi0JCWdlbnN1aXRlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiR2VuZXJhdGUgT1NBIFN1aXRlLi4uIiwgTm9uZSwgJ2dlbnN1aXRlJykKLQkJaWYgbm90IHJ1bm5pbmdPbk9TWCgpOgotCQkJIyBPbiBPU1ggdGhlcmUncyBhIHNwZWNpYWwgIm1hZ2ljIiBxdWl0IG1lbnUsIHNvIHdlIHNob3VsZG4ndCBhZGQKLQkJCSMgaXQgdG8gdGhlIEZpbGUgbWVudS4KLQkJCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJCXF1aXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCAncXVpdCcpCi0JCQotCQltID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCi0JCXVuZG9pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJVbmRvIiwgJ1onLCAidW5kbyIpCi0JCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJY3V0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiQ3V0IiwgJ1gnLCAiY3V0IikKLQkJY29weWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkNvcHkiLCAiQyIsICJjb3B5IikKLQkJcGFzdGVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgInBhc3RlIikKLQkJRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDbGVhciIsIE5vbmUsICAiY2xlYXIiKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCXNlbGFsbGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNlbGVjdCBhbGwiLCAiQSIsICJzZWxlY3RhbGwiKQotCQlzZWxsaW5laXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2VsZWN0IGxpbmUiLCAiTCIsICJzZWxlY3RsaW5lIikKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQlmaW5kaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiRmluZCIrRUxMSVBTSVMsICJGIiwgImZpbmQiKQotCQlmaW5kYWdhaW5pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJGaW5kIGFnYWluIiwgJ0cnLCAiZmluZG5leHQiKQotCQllbnRlcnNlbGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkVudGVyIHNlYXJjaCBzdHJpbmciLCAiRSIsICJlbnRlcnNlYXJjaHN0cmluZyIpCi0JCXJlcGxhY2VpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJSZXBsYWNlIiwgTm9uZSwgInJlcGxhY2UiKQotCQlyZXBsYWNlZmluZGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlJlcGxhY2UgJiBmaW5kIGFnYWluIiwgJ1QnLCAicmVwbGFjZWZpbmQiKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCXNoaWZ0bGVmdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNoaWZ0IGxlZnQiLCAiWyIsICJzaGlmdGxlZnQiKQotCQlzaGlmdHJpZ2h0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2hpZnQgcmlnaHQiLCAiXSIsICJzaGlmdHJpZ2h0IikKLQkJCi0JCW0gPSBXYXBwbGljYXRpb24uTWVudShzZWxmLm1lbnViYXIsICJQeXRob24iKQotCQlydW5pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJSdW4gd2luZG93IiwgIlIiLCAncnVuJykKLQkJcnVuc2VsaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUnVuIHNlbGVjdGlvbiIsIE5vbmUsICdydW5zZWxlY3Rpb24nKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCW1vZGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk1vZHVsZSBicm93c2VyIitFTExJUFNJUywgIk0iLCBzZWxmLmRvbWVudV9tb2R1bGVicm93c2VyKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCW1tID0gRnJhbWVXb3JrLlN1Yk1lbnUobSwgIlByZWZlcmVuY2VzIikKLQkJRnJhbWVXb3JrLk1lbnVJdGVtKG1tLCAiU2V0IFNjcmlwdHMgZm9sZGVyIitFTExJUFNJUywgTm9uZSwgc2VsZi5kb19zZXRzY3JpcHRzZm9sZGVyKQotCQlGcmFtZVdvcmsuTWVudUl0ZW0obW0sICJFZGl0b3IgZGVmYXVsdCBzZXR0aW5ncyIrRUxMSVBTSVMsIE5vbmUsIHNlbGYuZG9fZWRpdG9ycHJlZnMpCi0JCUZyYW1lV29yay5NZW51SXRlbShtbSwgIlNldCBkZWZhdWx0IHdpbmRvdyBmb250IitFTExJUFNJUywgTm9uZSwgc2VsZi5kb19zZXR3aW5kb3dmb250KQotCQkKLQkJc2VsZi5vcGVud2luZG93c21lbnUgPSBXYXBwbGljYXRpb24uTWVudShzZWxmLm1lbnViYXIsICdXaW5kb3dzJykKLQkJc2VsZi5tYWtlb3BlbndpbmRvd3NtZW51KCkKLQkJc2VsZi5fbWVudXN0b2NoZWNrID0gW2Nsb3NlaXRlbSwgc2F2ZWl0ZW0sIHNhdmVhc2l0ZW0sIHNhdmVhc2FwcGxldGl0ZW0sCi0JCQkJdW5kb2l0ZW0sIGN1dGl0ZW0sIGNvcHlpdGVtLCBwYXN0ZWl0ZW0sIAotCQkJCXNlbGFsbGl0ZW0sIHNlbGxpbmVpdGVtLCAKLQkJCQlmaW5kaXRlbSwgZmluZGFnYWluaXRlbSwgZW50ZXJzZWxpdGVtLCByZXBsYWNlaXRlbSwgcmVwbGFjZWZpbmRpdGVtLAotCQkJCXNoaWZ0bGVmdGl0ZW0sIHNoaWZ0cmlnaHRpdGVtLCAKLQkJCQlydW5pdGVtLCBydW5zZWxpdGVtXQotCQkKLQkJcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKLQkJdHJ5OgotCQkJZnNyLCBkID0gRmlsZS5BbGlhcyhyYXdkYXRhPXByZWZzLnNjcmlwdHNmb2xkZXIpLkZTUmVzb2x2ZUFsaWFzKE5vbmUpCi0JCQlzZWxmLnNjcmlwdHNmb2xkZXIgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQotCQlleGNlcHQ6Ci0JCQlwYXRoID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCAiTWFjIiwgIklERSBzY3JpcHRzIikKLQkJCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLQkJCQlpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6Ci0JCQkJCXBhdGggPSBvcy5wYXRoLmpvaW4ob3MuZ2V0ZW52KCJIT01FIiksICJMaWJyYXJ5IiwgIlB5dGhvbiIsICJJREUtU2NyaXB0cyIpCi0JCQkJZWxzZToKLQkJCQkJcGF0aCA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgIlNjcmlwdHMiKQotCQkJCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLQkJCQkJb3MubWFrZWRpcnMocGF0aCkKLQkJCQkJZiA9IG9wZW4ob3MucGF0aC5qb2luKHBhdGgsICJQbGFjZSB5b3VyIHNjcmlwdHMgaGVyZSIrRUxMSVBTSVMpLCAidyIpCi0JCQkJCWYuY2xvc2UoKQotCQkJZnNyID0gRmlsZS5GU1JlZihwYXRoKQotCQkJc2VsZi5zY3JpcHRzZm9sZGVyID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKLQkJCXNlbGYuc2NyaXB0c2ZvbGRlcm1vZHRpbWUgPSBnZXRtb2R0aW1lKGZzcikKLQkJZWxzZToKLQkJCXNlbGYuc2NyaXB0c2ZvbGRlcm1vZHRpbWUgPSBnZXRtb2R0aW1lKGZzcikKLQkJcHJlZnMuc2NyaXB0c2ZvbGRlciA9IHNlbGYuc2NyaXB0c2ZvbGRlci5kYXRhCi0JCXNlbGYuX3NjcmlwdHMgPSB7fQotCQlzZWxmLnNjcmlwdHNtZW51ID0gTm9uZQotCQlzZWxmLm1ha2VzY3JpcHRzbWVudSgpCi0JCXNlbGYubWFrZWhlbHBtZW51KCkKLQkKLQlkZWYgcXVpdGV2ZW50KHNlbGYsIHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5KToKLQkJc2VsZi5fcXVpdCgpCi0JCi0JZGVmIHN1c3BlbmRyZXN1bWUoc2VsZiwgb25vZmYpOgotCQlpZiBvbm9mZjoKLQkJCWZzciwgY2hhbmdlZCA9IHNlbGYuc2NyaXB0c2ZvbGRlci5GU1Jlc29sdmVBbGlhcyhOb25lKQotCQkJbW9kdGltZSA9IGdldG1vZHRpbWUoZnNyKQotCQkJaWYgc2VsZi5zY3JpcHRzZm9sZGVybW9kdGltZSA8PiBtb2R0aW1lIG9yIGNoYW5nZWQ6Ci0JCQkJc2VsZi5zY3JpcHRzZm9sZGVybW9kdGltZSA9IG1vZHRpbWUKLQkJCQlXLlNldEN1cnNvcignd2F0Y2gnKQotCQkJCXNlbGYubWFrZXNjcmlwdHNtZW51KCkKLQkKLQlkZWYgaWdub3JlZXZlbnQoc2VsZiwgdGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgotCQlwYXNzCi0JCi0JZGVmIG9wZW5kb2NzZXZlbnQoc2VsZiwgdGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgotCQlXLlNldEN1cnNvcignd2F0Y2gnKQotCQlpbXBvcnQgYWV0b29scwotCQlwYXJhbWV0ZXJzLCBhcmdzID0gYWV0b29scy51bnBhY2tldmVudCh0aGVBcHBsZUV2ZW50KQotCQlkb2NzID0gcGFyYW1ldGVyc1snLS0tLSddCi0JCWlmIHR5cGUoZG9jcykgPD4gdHlwZShbXSk6Ci0JCQlkb2NzID0gW2RvY3NdCi0JCWZvciBkb2MgaW4gZG9jczoKLQkJCWZzciwgYSA9IGRvYy5GU1Jlc29sdmVBbGlhcyhOb25lKQotCQkJcGF0aCA9IGZzci5hc19wYXRobmFtZSgpCi0JCQlzZWxmLm9wZW5kb2MocGF0aCkKLQkKLQlkZWYgb3BlbmRvYyhzZWxmLCBwYXRoKToKLQkJZmNyZWF0b3IsIGZ0eXBlID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUocGF0aCkKLQkJaWYgZnR5cGUgPT0gJ1RFWFQnOgotCQkJc2VsZi5vcGVuc2NyaXB0KHBhdGgpCi0JCWVsaWYgZnR5cGUgPT0gJ1wwXDBcMFwwJyBhbmQgcGF0aFstMzpdID09ICcucHknOgotCQkJc2VsZi5vcGVuc2NyaXB0KHBhdGgpCi0JCWVsc2U6Ci0JCQlXLk1lc3NhZ2UoIkNhbid0IG9wZW4gZmlsZSBvZiB0eXBlICclcycuIiAlIGZ0eXBlKQotCQotCWRlZiBnZXRhYm91dHRleHQoc2VsZik6Ci0JCXJldHVybiAiQWJvdXQgUHl0aG9uIElERSIrRUxMSVBTSVMKLQkKLQlkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgotCQlTcGxhc2guYWJvdXQoKQotCQotCWRlZiBkb19zZXRzY3JpcHRzZm9sZGVyKHNlbGYsICphcmdzKToKLQkJZnNyID0gRWFzeURpYWxvZ3MuQXNrRm9sZGVyKG1lc3NhZ2U9IlNlbGVjdCBTY3JpcHRzIEZvbGRlciIsCi0JCQl3YW50ZWQ9RmlsZS5GU1JlZikKLQkJaWYgZnNyOgotCQkJcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKLQkJCWFsaXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQotCQkJcHJlZnMuc2NyaXB0c2ZvbGRlciA9IGFsaXMuZGF0YQotCQkJc2VsZi5zY3JpcHRzZm9sZGVyID0gYWxpcwotCQkJc2VsZi5tYWtlc2NyaXB0c21lbnUoKQotCQkJcHJlZnMuc2F2ZSgpCi0JCi0JZGVmIGRvbWVudV9tb2R1bGVicm93c2VyKHNlbGYsICphcmdzKToKLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJaW1wb3J0IE1vZHVsZUJyb3dzZXIKLQkJTW9kdWxlQnJvd3Nlci5Nb2R1bGVCcm93c2VyKCkKLQkKLQlkZWYgZG9tZW51X29wZW4oc2VsZiwgKmFyZ3MpOgotCQlmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgiVEVYVCIsKSkKLQkJaWYgZmlsZW5hbWU6Ci0JCQlzZWxmLm9wZW5zY3JpcHQoZmlsZW5hbWUpCi0JCi0JZGVmIGRvbWVudV9vcGVuYnluYW1lKHNlbGYsICphcmdzKToKLQkJIyBPcGVuIGEgZmlsZSBieSBuYW1lLiBJZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIGEgZmlsZW5hbWUKLQkJIyB1c2UgdGhhdCBhcyB0aGUgZGVmYXVsdC4KLQkJZnJvbSBDYXJib24gaW1wb3J0IFNjcmFwCi0JCXRyeToKLQkJCXNjID0gU2NyYXAuR2V0Q3VycmVudFNjcmFwKCkKLQkJCWRmdCA9IHNjLkdldFNjcmFwRmxhdm9yRGF0YSgiVEVYVCIpCi0JCWV4Y2VwdCBTY3JhcC5FcnJvcjoKLQkJCWRmdCA9ICIiCi0JCWVsc2U6Ci0JCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoZGZ0KToKLQkJCQlkZnQgPSAiIgotCQlmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza1N0cmluZygiT3BlbiBGaWxlIE5hbWVkOiIsIGRlZmF1bHQ9ZGZ0LCBvaz0iT3BlbiIpCi0JCWlmIGZpbGVuYW1lOgotCQkJc2VsZi5vcGVuc2NyaXB0KGZpbGVuYW1lKQotCQotCWRlZiBkb21lbnVfbmV3KHNlbGYsICphcmdzKToKLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJaW1wb3J0IFB5RWRpdAotCQlyZXR1cm4gUHlFZGl0LkVkaXRvcigpCi0JCi0JZGVmIG1ha2VzY3JpcHRzbWVudShzZWxmKToKLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJaWYgc2VsZi5fc2NyaXB0czoKLQkJCWZvciBpZCwgaXRlbSBpbiBzZWxmLl9zY3JpcHRzLmtleXMoKToKLQkJCQlpZiBzZWxmLm1lbnViYXIubWVudXMuaGFzX2tleShpZCk6Ci0JCQkJCW0gPSBzZWxmLm1lbnViYXIubWVudXNbaWRdCi0JCQkJCW0uZGVsZXRlKCkKLQkJCXNlbGYuX3NjcmlwdHMgPSB7fQotCQlpZiBzZWxmLnNjcmlwdHNtZW51OgotCQkJaWYgaGFzYXR0cihzZWxmLnNjcmlwdHNtZW51LCAnaWQnKSBhbmQgc2VsZi5tZW51YmFyLm1lbnVzLmhhc19rZXkoc2VsZi5zY3JpcHRzbWVudS5pZCk6Ci0JCQkJc2VsZi5zY3JpcHRzbWVudS5kZWxldGUoKQotCQlzZWxmLnNjcmlwdHNtZW51ID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5tZW51YmFyLCAiU2NyaXB0cyIpCi0JCSNGcmFtZVdvcmsuTWVudUl0ZW0oc2VsZi5zY3JpcHRzbWVudSwgIk5ldyBzY3JpcHQiLCBOb25lLCBzZWxmLmRvbWVudV9uZXcpCi0JCSNzZWxmLnNjcmlwdHNtZW51LmFkZHNlcGFyYXRvcigpCi0JCWZzciwgZDEgPSBzZWxmLnNjcmlwdHNmb2xkZXIuRlNSZXNvbHZlQWxpYXMoTm9uZSkKLQkJc2VsZi5zY3JpcHRzd2Fsayhmc3IuYXNfcGF0aG5hbWUoKSwgc2VsZi5zY3JpcHRzbWVudSkKLQkKLQlkZWYgbWFrZW9wZW53aW5kb3dzbWVudShzZWxmKToKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYub3BlbndpbmRvd3NtZW51Lml0ZW1zKSk6Ci0JCQlzZWxmLm9wZW53aW5kb3dzbWVudS5tZW51LkRlbGV0ZU1lbnVJdGVtKDEpCi0JCQlzZWxmLm9wZW53aW5kb3dzbWVudS5pdGVtcyA9IFtdCi0JCXdpbmRvd3MgPSBbXQotCQlzZWxmLl9vcGVud2luZG93cyA9IHt9Ci0JCWZvciB3aW5kb3cgaW4gc2VsZi5fd2luZG93cy5rZXlzKCk6Ci0JCQl0aXRsZSA9IHdpbmRvdy5HZXRXVGl0bGUoKQotCQkJaWYgbm90IHRpdGxlOgotCQkJCXRpdGxlID0gIjxubyB0aXRsZT4iCi0JCQl3aW5kb3dzLmFwcGVuZCgodGl0bGUsIHdpbmRvdykpCi0JCXdpbmRvd3Muc29ydCgpCi0JCWZvciB0aXRsZSwgd2luZG93IGluIHdpbmRvd3M6Ci0JCQlpZiB0aXRsZSA9PSAiUHl0aG9uIEludGVyYWN0aXZlIjoJIyB1Z2x5IGJ1dCB1c2VmdWwgaGFjayBieSBKb2UgU3Ryb3V0Ci0JCQkJc2hvcnRjdXQgPSAnMCcKLQkJCWVsc2U6IAotCQkJCXNob3J0Y3V0ID0gTm9uZQotCQkJaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShzZWxmLm9wZW53aW5kb3dzbWVudSwgdGl0bGUsIHNob3J0Y3V0LCBjYWxsYmFjayA9IHNlbGYuZG9tZW51X29wZW53aW5kb3dzKQotCQkJc2VsZi5fb3BlbndpbmRvd3NbaXRlbS5pdGVtXSA9IHdpbmRvdwotCQlzZWxmLl9vcGVud2luZG93c2NoZWNrbWFyayA9IDAKLQkJc2VsZi5jaGVja29wZW53aW5kb3dzbWVudSgpCi0JCQotCWRlZiBtYWtlb3BlbnJlY2VudG1lbnUoc2VsZik6Ci0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLm9wZW5yZWNlbnRtZW51Lml0ZW1zKSk6Ci0JCQlzZWxmLm9wZW5yZWNlbnRtZW51Lm1lbnUuRGVsZXRlTWVudUl0ZW0oMSkKLQkJCXNlbGYub3BlbnJlY2VudG1lbnUuaXRlbXMgPSBbXQotCQlwcmVmcyA9IHNlbGYuZ2V0cHJlZnMoKQotCQlmaWxlbGlzdCA9IHByZWZzLnJlY2VudGZpbGVzCi0JCWlmIG5vdCBmaWxlbGlzdDoKLQkJCXNlbGYub3BlbnJlY2VudG1lbnUuZW5hYmxlKDApCi0JCQlyZXR1cm4KLQkJc2VsZi5vcGVucmVjZW50bWVudS5lbmFibGUoMSkKLQkJZm9yIGZpbGVuYW1lIGluIGZpbGVsaXN0OgotCQkJaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShzZWxmLm9wZW5yZWNlbnRtZW51LCBmaWxlbmFtZSwgTm9uZSwgY2FsbGJhY2sgPSBzZWxmLmRvbWVudV9vcGVucmVjZW50KQotCQkKLQlkZWYgYWRkcmVjZW50ZmlsZShzZWxmLCBmaWxlKToKLQkJcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKLQkJZmlsZWxpc3QgPSBwcmVmcy5yZWNlbnRmaWxlcwotCQlpZiBub3QgZmlsZWxpc3Q6Ci0JCQlmaWxlbGlzdCA9IFtdCi0JCQotCQlpZiBmaWxlIGluIGZpbGVsaXN0OgotCQkJaWYgZmlsZSA9PSBmaWxlbGlzdFswXToKLQkJCQlyZXR1cm4KLQkJCWZpbGVsaXN0LnJlbW92ZShmaWxlKQotCQlmaWxlbGlzdC5pbnNlcnQoMCwgZmlsZSkKLQkJZmlsZWxpc3QgPSBmaWxlbGlzdFs6MTBdCi0JCXByZWZzLnJlY2VudGZpbGVzID0gZmlsZWxpc3QKLQkJcHJlZnMuc2F2ZSgpCi0JCXNlbGYubWFrZW9wZW5yZWNlbnRtZW51KCkKLQkJCi0JZGVmIGRvbWVudV9vcGVud2luZG93cyhzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6Ci0JCXcgPSBzZWxmLl9vcGVud2luZG93c1tpdGVtXQotCQl3LlNob3dXaW5kb3coKQotCQl3LlNlbGVjdFdpbmRvdygpCi0JCi0JZGVmIGRvbWVudV9vcGVucmVjZW50KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKLQkJcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKLQkJZmlsZWxpc3QgPSBwcmVmcy5yZWNlbnRmaWxlcwotCQlpZiBub3QgZmlsZWxpc3Q6Ci0JCQlmaWxlbGlzdCA9IFtdCi0JCWl0ZW0gPSBpdGVtIC0gMQotCQlmaWxlbmFtZSA9IGZpbGVsaXN0W2l0ZW1dCi0JCXNlbGYub3BlbnNjcmlwdChmaWxlbmFtZSkKLQkKLQlkZWYgZG9tZW51X3F1aXQoc2VsZik6Ci0JCXNlbGYuX3F1aXQoKQotCQotCWRlZiBkb21lbnVfc2F2ZShzZWxmLCAqYXJncyk6Ci0JCXByaW50ICJTYXZlIgotCQotCWRlZiBfcXVpdChzZWxmKToKLQkJaW1wb3J0IFB5Q29uc29sZSwgUHlFZGl0Ci0JCWZvciB3aW5kb3cgaW4gc2VsZi5fd2luZG93cy52YWx1ZXMoKToKLQkJCXRyeToKLQkJCQlydiA9IHdpbmRvdy5jbG9zZSgpICMgaWdub3JlIGFueSBlcnJvcnMgd2hpbGUgcXVpdHRpbmcKLQkJCWV4Y2VwdDoKLQkJCQlydiA9IDAgICAjIChvdGhlcndpc2UsIHdlIGNhbiBnZXQgc3R1Y2shKQotCQkJaWYgcnYgYW5kIHJ2ID4gMDoKLQkJCQlyZXR1cm4KLQkJdHJ5OgotCQkJUHlDb25zb2xlLmNvbnNvbGUud3JpdGVwcmVmcygpCi0JCQlQeUNvbnNvbGUub3V0cHV0LndyaXRlcHJlZnMoKQotCQkJUHlFZGl0LnNlYXJjaGVuZ2luZS53cml0ZXByZWZzKCkKLQkJZXhjZXB0OgotCQkJIyBXcml0ZSB0byBfX3N0ZGVycl9fIHNvIHRoZSBtc2cgZW5kIHVwIGluIENvbnNvbGUuYXBwIGFuZCBoYXMKLQkJCSMgYXQgbGVhc3QgX3NvbWVfIGNoYW5jZSBvZiBnZXR0aW5nIHJlYWQuLi4KLQkJCSMgQnV0OiB0aGlzIGlzIGEgd29ya2Fyb3VuZCBmb3Igd2F5IG1vcmUgc2VyaW91cyBwcm9ibGVtcyB3aXRoCi0JCQkjIHRoZSBQeXRob24gMi4yIEphZ3VhciBhZGRvbi4KLQkJCXN5cy5fX3N0ZGVycl9fLndyaXRlKCIqKiogUHl0aG9uSURFOiBDYW4ndCB3cml0ZSBwcmVmZXJlbmNlcyAqKipcbiIpCi0JCXNlbGYucXVpdHRpbmcgPSAxCi0JCQotCWRlZiBkb21lbnVfb3BlbnBhY2thZ2VtYW5hZ2VyKHNlbGYpOgotCQlpbXBvcnQgUGFja2FnZU1hbmFnZXIKLQkJUGFja2FnZU1hbmFnZXIuUGFja2FnZUJyb3dzZXIoKQotCQkKLQlkZWYgZG9tZW51X2dlbnN1aXRlKHNlbGYpOgotCQlpbXBvcnQgZ2Vuc3VpdGVtb2R1bGUKLQkJZ2Vuc3VpdGVtb2R1bGUubWFpbl9pbnRlcmFjdGl2ZSgpCi0JCQotCWRlZiBtYWtlaGVscG1lbnUoc2VsZik6Ci0JCWhhc2hlbHAsIGhhc2RvY3MgPSBzZWxmLmluc3RhbGxkb2N1bWVudGF0aW9uKCkKLQkJc2VsZi5oZWxwbWVudSA9IG0gPSBzZWxmLmdldGhlbHBtZW51KCkKLQkJaGVscGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk1hY1B5dGhvbiBIZWxwIiwgTm9uZSwgc2VsZi5kb21lbnVfbG9jYWxoZWxwKQotCQloZWxwaXRlbS5lbmFibGUoaGFzaGVscCkKLQkJZG9jaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUHl0aG9uIERvY3VtZW50YXRpb24iLCBOb25lLCBzZWxmLmRvbWVudV9sb2NhbGRvY3MpCi0JCWRvY2l0ZW0uZW5hYmxlKGhhc2RvY3MpCi0JCWZpbmRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJMb29rdXAgaW4gUHl0aG9uIERvY3VtZW50YXRpb24iLCBOb25lLCAnbG9va3VwcHl0aG9uJykKLQkJZmluZGl0ZW0uZW5hYmxlKGhhc2RvY3MpCi0JCWlmIHJ1bm5pbmdPbk9TWCgpOgotCQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQkJZG9jMml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkFwcGxlIERldmVsb3BlciBEb2N1bWVudGF0aW9uIiwgTm9uZSwgc2VsZi5kb21lbnVfYXBwbGVkb2NzKQotCQkJZmluZDJpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJMb29rdXAgaW4gQ2FyYm9uIERvY3VtZW50YXRpb24iLCBOb25lLCAnbG9va3VwY2FyYm9uJykKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQl3ZWJpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQeXRob24gRG9jdW1lbnRhdGlvbiBvbiB0aGUgV2ViIiwgTm9uZSwgc2VsZi5kb21lbnVfd2ViZG9jcykKLQkJd2ViMml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlB5dGhvbiBvbiB0aGUgV2ViIiwgTm9uZSwgc2VsZi5kb21lbnVfd2VicHl0aG9uKQotCQl3ZWIzaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTWFjUHl0aG9uIG9uIHRoZSBXZWIiLCBOb25lLCBzZWxmLmRvbWVudV93ZWJtYWNweXRob24pCi0JCQotCWRlZiBkb21lbnVfbG9jYWxkb2NzKHNlbGYsICphcmdzKToKLQkJZnJvbSBDYXJib24gaW1wb3J0IEFICi0JCUFILkFIR290b1BhZ2UoIlB5dGhvbiBEb2N1bWVudGF0aW9uIiwgTm9uZSwgTm9uZSkKLQkJCi0JZGVmIGRvbWVudV9sb2NhbGhlbHAoc2VsZiwgKmFyZ3MpOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgQUgKLQkJQUguQUhHb3RvUGFnZSgiTWFjUHl0aG9uIEhlbHAiLCBOb25lLCBOb25lKQotCQkKLQlkZWYgZG9tZW51X2FwcGxlZG9jcyhzZWxmLCAqYXJncyk6Ci0JCWZyb20gQ2FyYm9uIGltcG9ydCBBSCwgQXBwbGVIZWxwCi0JCXRyeToKLQkJCUFILkFIR290b01haW5UT0MoQXBwbGVIZWxwLmtBSFRPQ1R5cGVEZXZlbG9wZXIpCi0JCWV4Y2VwdCBBSC5FcnJvciwgYXJnOgotCQkJaWYgYXJnWzBdID09IC01MDoKLQkJCQlXLk1lc3NhZ2UoIkRldmVsb3BlciBkb2N1bWVudGF0aW9uIG5vdCBpbnN0YWxsZWQiKQotCQkJZWxzZToKLQkJCQlXLk1lc3NhZ2UoIkFwcGxlSGVscCBFcnJvcjogJXIiICUgKGFyZywpKQotCQkKLQlkZWYgZG9tZW51X2xvb2t1cHB5dGhvbihzZWxmLCAqYXJncyk6Ci0JCWZyb20gQ2FyYm9uIGltcG9ydCBBSAotCQlzZWFyY2hzdHJpbmcgPSBzZWxmLl9nZXRzZWFyY2hzdHJpbmcoKQotCQlpZiBub3Qgc2VhcmNoc3RyaW5nOgotCQkJcmV0dXJuCi0JCXRyeToKLQkJCUFILkFIU2VhcmNoKCJQeXRob24gRG9jdW1lbnRhdGlvbiIsIHNlYXJjaHN0cmluZykKLQkJZXhjZXB0IEFILkVycm9yLCBhcmc6Ci0JCQlXLk1lc3NhZ2UoIkFwcGxlSGVscCBFcnJvcjogJXIiICUgKGFyZywpKQotCQkJCi0JZGVmIGRvbWVudV9sb29rdXBjYXJib24oc2VsZiwgKmFyZ3MpOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgQUgKLQkJc2VhcmNoc3RyaW5nID0gc2VsZi5fZ2V0c2VhcmNoc3RyaW5nKCkKLQkJaWYgbm90IHNlYXJjaHN0cmluZzoKLQkJCXJldHVybgotCQl0cnk6Ci0JCQlBSC5BSFNlYXJjaCgiQ2FyYm9uIiwgc2VhcmNoc3RyaW5nKQotCQlleGNlcHQgQUguRXJyb3IsIGFyZzoKLQkJCVcuTWVzc2FnZSgiQXBwbGVIZWxwIEVycm9yOiAlciIgJSAoYXJnLCkpCi0JCQkKLQlkZWYgX2dldHNlYXJjaHN0cmluZyhzZWxmKToKLQkJIyBGaXJzdCB3ZSBnZXQgdGhlIGZyb250bW9zdCB3aW5kb3cKLQkJZnJvbnQgPSBzZWxmLmdldGZyb250d2luZG93KCkKLQkJaWYgZnJvbnQgYW5kIGhhc2F0dHIoZnJvbnQsICdnZXRzZWxlY3RlZHRleHQnKToKLQkJCXRleHQgPSBmcm9udC5nZXRzZWxlY3RlZHRleHQoKQotCQkJaWYgdGV4dDoKLQkJCQlyZXR1cm4gdGV4dAotCQkjIFRoaXMgaXMgYSBjb3Atb3V0LiBXZSBzaG91bGQgaGF2ZSBkaXNhYmxlZCB0aGUgbWVudXMKLQkJIyBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24sIGJ1dCB0aGUgY2FuXyBtZXRob2RzIG9ubHkgc2VlbQotCQkjIHRvIHdvcmsgZm9yIFdpbmRvd3MuIE9yIG5vdCBmb3IgdGhlIEhlbHAgbWVudSwgbWF5YmU/Ci0JCXRleHQgPSBFYXN5RGlhbG9ncy5Bc2tTdHJpbmcoIlNlYXJjaCBkb2N1bWVudGF0aW9uIGZvciIsIG9rPSJTZWFyY2giKQotCQlyZXR1cm4gdGV4dAotCQkKLQlkZWYgZG9tZW51X3dlYmRvY3Moc2VsZiwgKmFyZ3MpOgotCQlpbXBvcnQgd2ViYnJvd3NlcgotCQltYWpvciwgbWlub3IsIG1pY3JvLCBzdGF0ZSwgbmFubyA9IHN5cy52ZXJzaW9uX2luZm8KLQkJaWYgc3RhdGUgaW4gKCdhbHBoYScsICdiZXRhJyk6Ci0JCQlkb2N2ZXJzaW9uID0gJ2Rldi9kb2MvZGV2ZWwnCi0JCWVsaWYgbWljcm8gPT0gMDoKLQkJCWRvY3ZlcnNpb24gPSAnZG9jLyVkLiVkJyAlIChtYWpvciwgbWlub3IpCi0JCWVsc2U6Ci0JCQlkb2N2ZXJzaW9uID0gJ2RvYy8lZC4lZC4lZCcgJSAobWFqb3IsIG1pbm9yLCBtaWNybykKLQkJd2ViYnJvd3Nlci5vcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvJXMiICUgZG9jdmVyc2lvbikKLQkJCi0JZGVmIGRvbWVudV93ZWJweXRob24oc2VsZiwgKmFyZ3MpOgotCQlpbXBvcnQgd2ViYnJvd3NlcgotCQl3ZWJicm93c2VyLm9wZW4oImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQotCQkKLQlkZWYgZG9tZW51X3dlYm1hY3B5dGhvbihzZWxmLCAqYXJncyk6Ci0JCWltcG9ydCB3ZWJicm93c2VyCi0JCXdlYmJyb3dzZXIub3BlbigiaHR0cDovL3d3dy5jd2kubmwvfmphY2svbWFjcHl0aG9uLmh0bWwiKQotCQkKLQlkZWYgaW5zdGFsbGRvY3VtZW50YXRpb24oc2VsZik6Ci0JCSMgVGhpcyBpcyByYXRoZXIgbXVjaCBvZiBhIGhhY2suIFNvbWVvbmUgaGFzIHRvIHRlbGwgdGhlIEhlbHAgVmlld2VyCi0JCSMgYWJvdXQgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uLCBzbyB3aHkgbm90IHVzLiBUaGUgZG9jdW1lbnRhdGlvbgotCQkjIGlzIGxvY2F0ZWQgaW4gdGhlIGZyYW1ld29yaywgYnV0IHRoZXJlJ3MgYSBzeW1saW5rIGluIFB5dGhvbi5hcHAuCi0JCSMgQW5kIGFzIEFIUmVnaXN0ZXJIZWxwQm9vayB3YW50cyBhIGJ1bmRsZSAod2l0aCB0aGUgcmlnaHQgYml0cyBpbgotCQkjIHRoZSBwbGlzdCBmaWxlKSB3ZSByZWZlciBpdCB0byBQeXRob24uYXBwCi0JCSMKLQkJIyBUbyBtYWtlIG1hdHRlcnMgd29yc2Ugd2UgaGF2ZSB0byBsb29rIGluIHR3byBwbGFjZXM6IGZpcnN0IGluIHRoZSBJREUKLQkJIyBpdHNlbGYsIHRoZW4gaW4gdGhlIFB5dGhvbiBhcHBsaWNhdGlvbiBpbnNpZGUgdGhlIGZyYW1ld29yay4KLQkJaGFzX2hlbHAgPSBGYWxzZQotCQloYXNfZG9jID0gRmFsc2UKLQkJaWRlX3BhdGhfY29tcG9uZW50cyA9IHN5cy5hcmd2WzBdLnNwbGl0KCIvIikKLQkJaWYgaWRlX3BhdGhfY29tcG9uZW50c1stMzpdID09IFsiQ29udGVudHMiLCAiUmVzb3VyY2VzIiwgIlB5dGhvbklERS5weSJdOgotCQkJaWRlX2FwcCA9ICIvIi5qb2luKGlkZV9wYXRoX2NvbXBvbmVudHNbOi0zXSkKLQkJCWhlbHBfc291cmNlID0gb3MucGF0aC5qb2luKGlkZV9hcHAsICdDb250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9Eb2N1bWVudGF0aW9uJykKLQkJCWRvY19zb3VyY2UgPSBvcy5wYXRoLmpvaW4oaWRlX2FwcCwgJ0NvbnRlbnRzL1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL1B5dGhvbkRvY3VtZW50YXRpb24nKQotCQkJaGFzX2hlbHAgPSBvcy5wYXRoLmlzZGlyKGhlbHBfc291cmNlKQotCQkJaGFzX2RvYyA9IG9zLnBhdGguaXNkaXIoZG9jX3NvdXJjZSkKLQkJCWlmIGhhc19oZWxwIG9yIGhhc19kb2M6Ci0JCQkJdHJ5OgotCQkJCQlmcm9tIENhcmJvbiBpbXBvcnQgQUgKLQkJCQkJQUguQUhSZWdpc3RlckhlbHBCb29rKGlkZV9hcHApCi0JCQkJZXhjZXB0IChJbXBvcnRFcnJvciwgTWFjT1MuRXJyb3IpLCBhcmc6Ci0JCQkJCXBhc3MgIyBXLk1lc3NhZ2UoIkNhbm5vdCByZWdpc3RlciBQeXRob24gRG9jdW1lbnRhdGlvbjogJXMiICUgc3RyKGFyZykpCi0JCXB5dGhvbl9hcHAgPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJ1Jlc291cmNlcy9QeXRob24uYXBwJykKLQkJaWYgbm90IGhhc19oZWxwOgotCQkJaGVscF9zb3VyY2UgPSBvcy5wYXRoLmpvaW4ocHl0aG9uX2FwcCwgJ0NvbnRlbnRzL1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VtZW50YXRpb24nKQotCQkJaGFzX2hlbHAgPSBvcy5wYXRoLmlzZGlyKGhlbHBfc291cmNlKQotCQlpZiBub3QgaGFzX2RvYzoKLQkJCWRvY19zb3VyY2UgPSBvcy5wYXRoLmpvaW4ocHl0aG9uX2FwcCwgJ0NvbnRlbnRzL1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL1B5dGhvbkRvY3VtZW50YXRpb24nKQotCQkJaGFzX2RvYyA9IG9zLnBhdGguaXNkaXIoZG9jX3NvdXJjZSkKLQkJaWYgaGFzX2hlbHAgb3IgaGFzX2RvYzoKLQkJCXRyeToKLQkJCQlmcm9tIENhcmJvbiBpbXBvcnQgQUgKLQkJCQlBSC5BSFJlZ2lzdGVySGVscEJvb2socHl0aG9uX2FwcCkKLQkJCWV4Y2VwdCAoSW1wb3J0RXJyb3IsIE1hY09TLkVycm9yKSwgYXJnOgotCQkJCXBhc3MgIyBXLk1lc3NhZ2UoIkNhbm5vdCByZWdpc3RlciBQeXRob24gRG9jdW1lbnRhdGlvbjogJXMiICUgc3RyKGFyZykpCi0JCXJldHVybiBoYXNfaGVscCwgaGFzX2RvYworCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgICAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMSBhbmQgc3lzLmFyZ3ZbMV0uc3RhcnRzd2l0aCgiLXBzbiIpOgorICAgICAgICAgICAgICAgIGhvbWUgPSBvcy5nZXRlbnYoIkhPTUUiKQorICAgICAgICAgICAgICAgIGlmIGhvbWU6CisgICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKGhvbWUpCisgICAgICAgIHNlbGYucHJlZmZpbGVwYXRoID0gb3MucGF0aC5qb2luKCJQeXRob24iLCAiUHl0aG9uSURFIHByZWZlcmVuY2VzIikKKyAgICAgICAgV2FwcGxpY2F0aW9uLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYsICdQaWRlJykKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFFCisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBBcHBsZUV2ZW50cworCisgICAgICAgIEFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRU9wZW5BcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlZXZlbnQpCisgICAgICAgIEFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRVJlb3BlbkFwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVldmVudCkKKyAgICAgICAgQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFUHJpbnREb2N1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZWV2ZW50KQorICAgICAgICBBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVPcGVuRG9jdW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVuZG9jc2V2ZW50KQorICAgICAgICBBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVRdWl0QXBwbGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1aXRldmVudCkKKyAgICAgICAgaW1wb3J0IFB5Q29uc29sZSwgUHlFZGl0CisgICAgICAgIFNwbGFzaC53YWl0KCkKKyAgICAgICAgIyBXaXRoIC1EIG9wdGlvbiAoT1NYIGNvbW1hbmQgbGluZSBvbmx5KSBrZWVwIHN0ZGVyciwgZm9yIGRlYnVnZ2luZyB0aGUgSURFCisgICAgICAgICMgaXRzZWxmLgorICAgICAgICBkZWJ1Z19zdGRlcnIgPSBOb25lCisgICAgICAgIGlmIGxlbihzeXMuYXJndikgPj0gMiBhbmQgc3lzLmFyZ3ZbMV0gPT0gJy1EJzoKKyAgICAgICAgICAgIGRlYnVnX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgICAgIGRlbCBzeXMuYXJndlsxXQorICAgICAgICBQeUNvbnNvbGUuaW5zdGFsbG91dHB1dCgpCisgICAgICAgIFB5Q29uc29sZS5pbnN0YWxsY29uc29sZSgpCisgICAgICAgIGlmIGRlYnVnX3N0ZGVycjoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBkZWJ1Z19zdGRlcnIKKyAgICAgICAgZm9yIHBhdGggaW4gc3lzLmFyZ3ZbMTpdOgorICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCItcCIpOgorICAgICAgICAgICAgICAgICMgcHJvY2VzcyBudW1iZXIgYWRkZWQgYnkgdGhlIE9TCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYub3BlbmRvYyhwYXRoKQorICAgICAgICBzZWxmLm1haW5sb29wKCkKKworICAgIGRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgorICAgICAgICBtID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCisgICAgICAgIG5ld2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk5ldyIsICJOIiwgJ25ldycpCisgICAgICAgIG9wZW5pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJPcGVuIitFTExJUFNJUywgIk8iLCAnb3BlbicpCisgICAgICAgIG9wZW5ieW5hbWVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJPcGVuIEZpbGUgYnkgTmFtZSIrRUxMSVBTSVMsICJEIiwgJ29wZW5ieW5hbWUnKQorICAgICAgICBzZWxmLm9wZW5yZWNlbnRtZW51ID0gRnJhbWVXb3JrLlN1Yk1lbnUobSwgIk9wZW4gUmVjZW50IikKKyAgICAgICAgc2VsZi5tYWtlb3BlbnJlY2VudG1lbnUoKQorICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgIGNsb3NlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiQ2xvc2UiLCAiVyIsICdjbG9zZScpCisgICAgICAgIHNhdmVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTYXZlIiwgIlMiLCAnc2F2ZScpCisgICAgICAgIHNhdmVhc2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNhdmUgYXMiK0VMTElQU0lTLCBOb25lLCAnc2F2ZV9hcycpCisgICAgICAgIEZyYW1lV29yay5TZXBhcmF0b3IobSkKKyAgICAgICAgc2F2ZWFzYXBwbGV0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2F2ZSBhcyBBcHBsZXQiK0VMTElQU0lTLCBOb25lLCAnc2F2ZV9hc19hcHBsZXQnKQorICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgIGluc3RtZ3JpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQYWNrYWdlIE1hbmFnZXIiLCBOb25lLCAnb3BlbnBhY2thZ2VtYW5hZ2VyJykKKyAgICAgICAgZ2Vuc3VpdGVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJHZW5lcmF0ZSBPU0EgU3VpdGUuLi4iLCBOb25lLCAnZ2Vuc3VpdGUnKQorICAgICAgICBpZiBub3QgcnVubmluZ09uT1NYKCk6CisgICAgICAgICAgICAjIE9uIE9TWCB0aGVyZSdzIGEgc3BlY2lhbCAibWFnaWMiIHF1aXQgbWVudSwgc28gd2Ugc2hvdWxkbid0IGFkZAorICAgICAgICAgICAgIyBpdCB0byB0aGUgRmlsZSBtZW51LgorICAgICAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICAgICAgcXVpdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsICdxdWl0JykKKworICAgICAgICBtID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCisgICAgICAgIHVuZG9pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJVbmRvIiwgJ1onLCAidW5kbyIpCisgICAgICAgIEZyYW1lV29yay5TZXBhcmF0b3IobSkKKyAgICAgICAgY3V0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiQ3V0IiwgJ1gnLCAiY3V0IikKKyAgICAgICAgY29weWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkNvcHkiLCAiQyIsICJjb3B5IikKKyAgICAgICAgcGFzdGVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgInBhc3RlIikKKyAgICAgICAgRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDbGVhciIsIE5vbmUsICAiY2xlYXIiKQorICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgIHNlbGFsbGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNlbGVjdCBhbGwiLCAiQSIsICJzZWxlY3RhbGwiKQorICAgICAgICBzZWxsaW5laXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2VsZWN0IGxpbmUiLCAiTCIsICJzZWxlY3RsaW5lIikKKyAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICBmaW5kaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiRmluZCIrRUxMSVBTSVMsICJGIiwgImZpbmQiKQorICAgICAgICBmaW5kYWdhaW5pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJGaW5kIGFnYWluIiwgJ0cnLCAiZmluZG5leHQiKQorICAgICAgICBlbnRlcnNlbGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkVudGVyIHNlYXJjaCBzdHJpbmciLCAiRSIsICJlbnRlcnNlYXJjaHN0cmluZyIpCisgICAgICAgIHJlcGxhY2VpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJSZXBsYWNlIiwgTm9uZSwgInJlcGxhY2UiKQorICAgICAgICByZXBsYWNlZmluZGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlJlcGxhY2UgJiBmaW5kIGFnYWluIiwgJ1QnLCAicmVwbGFjZWZpbmQiKQorICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgIHNoaWZ0bGVmdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNoaWZ0IGxlZnQiLCAiWyIsICJzaGlmdGxlZnQiKQorICAgICAgICBzaGlmdHJpZ2h0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2hpZnQgcmlnaHQiLCAiXSIsICJzaGlmdHJpZ2h0IikKKworICAgICAgICBtID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAiUHl0aG9uIikKKyAgICAgICAgcnVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUnVuIHdpbmRvdyIsICJSIiwgJ3J1bicpCisgICAgICAgIHJ1bnNlbGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlJ1biBzZWxlY3Rpb24iLCBOb25lLCAncnVuc2VsZWN0aW9uJykKKyAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICBtb2RpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJNb2R1bGUgYnJvd3NlciIrRUxMSVBTSVMsICJNIiwgc2VsZi5kb21lbnVfbW9kdWxlYnJvd3NlcikKKyAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICBtbSA9IEZyYW1lV29yay5TdWJNZW51KG0sICJQcmVmZXJlbmNlcyIpCisgICAgICAgIEZyYW1lV29yay5NZW51SXRlbShtbSwgIlNldCBTY3JpcHRzIGZvbGRlciIrRUxMSVBTSVMsIE5vbmUsIHNlbGYuZG9fc2V0c2NyaXB0c2ZvbGRlcikKKyAgICAgICAgRnJhbWVXb3JrLk1lbnVJdGVtKG1tLCAiRWRpdG9yIGRlZmF1bHQgc2V0dGluZ3MiK0VMTElQU0lTLCBOb25lLCBzZWxmLmRvX2VkaXRvcnByZWZzKQorICAgICAgICBGcmFtZVdvcmsuTWVudUl0ZW0obW0sICJTZXQgZGVmYXVsdCB3aW5kb3cgZm9udCIrRUxMSVBTSVMsIE5vbmUsIHNlbGYuZG9fc2V0d2luZG93Zm9udCkKKworICAgICAgICBzZWxmLm9wZW53aW5kb3dzbWVudSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgJ1dpbmRvd3MnKQorICAgICAgICBzZWxmLm1ha2VvcGVud2luZG93c21lbnUoKQorICAgICAgICBzZWxmLl9tZW51c3RvY2hlY2sgPSBbY2xvc2VpdGVtLCBzYXZlaXRlbSwgc2F2ZWFzaXRlbSwgc2F2ZWFzYXBwbGV0aXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuZG9pdGVtLCBjdXRpdGVtLCBjb3B5aXRlbSwgcGFzdGVpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsYWxsaXRlbSwgc2VsbGluZWl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kaXRlbSwgZmluZGFnYWluaXRlbSwgZW50ZXJzZWxpdGVtLCByZXBsYWNlaXRlbSwgcmVwbGFjZWZpbmRpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRsZWZ0aXRlbSwgc2hpZnRyaWdodGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBydW5pdGVtLCBydW5zZWxpdGVtXQorCisgICAgICAgIHByZWZzID0gc2VsZi5nZXRwcmVmcygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZzciwgZCA9IEZpbGUuQWxpYXMocmF3ZGF0YT1wcmVmcy5zY3JpcHRzZm9sZGVyKS5GU1Jlc29sdmVBbGlhcyhOb25lKQorICAgICAgICAgICAgc2VsZi5zY3JpcHRzZm9sZGVyID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgIk1hYyIsICJJREUgc2NyaXB0cyIpCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKG9zLmdldGVudigiSE9NRSIpLCAiTGlicmFyeSIsICJQeXRob24iLCAiSURFLVNjcmlwdHMiKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICJTY3JpcHRzIikKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCisgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihwYXRoLCAiUGxhY2UgeW91ciBzY3JpcHRzIGhlcmUiK0VMTElQU0lTKSwgInciKQorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGZzciA9IEZpbGUuRlNSZWYocGF0aCkKKyAgICAgICAgICAgIHNlbGYuc2NyaXB0c2ZvbGRlciA9IGZzci5GU05ld0FsaWFzTWluaW1hbCgpCisgICAgICAgICAgICBzZWxmLnNjcmlwdHNmb2xkZXJtb2R0aW1lID0gZ2V0bW9kdGltZShmc3IpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNjcmlwdHNmb2xkZXJtb2R0aW1lID0gZ2V0bW9kdGltZShmc3IpCisgICAgICAgIHByZWZzLnNjcmlwdHNmb2xkZXIgPSBzZWxmLnNjcmlwdHNmb2xkZXIuZGF0YQorICAgICAgICBzZWxmLl9zY3JpcHRzID0ge30KKyAgICAgICAgc2VsZi5zY3JpcHRzbWVudSA9IE5vbmUKKyAgICAgICAgc2VsZi5tYWtlc2NyaXB0c21lbnUoKQorICAgICAgICBzZWxmLm1ha2VoZWxwbWVudSgpCisKKyAgICBkZWYgcXVpdGV2ZW50KHNlbGYsIHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5KToKKyAgICAgICAgc2VsZi5fcXVpdCgpCisKKyAgICBkZWYgc3VzcGVuZHJlc3VtZShzZWxmLCBvbm9mZik6CisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgZnNyLCBjaGFuZ2VkID0gc2VsZi5zY3JpcHRzZm9sZGVyLkZTUmVzb2x2ZUFsaWFzKE5vbmUpCisgICAgICAgICAgICBtb2R0aW1lID0gZ2V0bW9kdGltZShmc3IpCisgICAgICAgICAgICBpZiBzZWxmLnNjcmlwdHNmb2xkZXJtb2R0aW1lIDw+IG1vZHRpbWUgb3IgY2hhbmdlZDoKKyAgICAgICAgICAgICAgICBzZWxmLnNjcmlwdHNmb2xkZXJtb2R0aW1lID0gbW9kdGltZQorICAgICAgICAgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgICAgICAgICAgc2VsZi5tYWtlc2NyaXB0c21lbnUoKQorCisgICAgZGVmIGlnbm9yZWV2ZW50KHNlbGYsIHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIG9wZW5kb2NzZXZlbnQoc2VsZiwgdGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgorICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBpbXBvcnQgYWV0b29scworICAgICAgICBwYXJhbWV0ZXJzLCBhcmdzID0gYWV0b29scy51bnBhY2tldmVudCh0aGVBcHBsZUV2ZW50KQorICAgICAgICBkb2NzID0gcGFyYW1ldGVyc1snLS0tLSddCisgICAgICAgIGlmIHR5cGUoZG9jcykgPD4gdHlwZShbXSk6CisgICAgICAgICAgICBkb2NzID0gW2RvY3NdCisgICAgICAgIGZvciBkb2MgaW4gZG9jczoKKyAgICAgICAgICAgIGZzciwgYSA9IGRvYy5GU1Jlc29sdmVBbGlhcyhOb25lKQorICAgICAgICAgICAgcGF0aCA9IGZzci5hc19wYXRobmFtZSgpCisgICAgICAgICAgICBzZWxmLm9wZW5kb2MocGF0aCkKKworICAgIGRlZiBvcGVuZG9jKHNlbGYsIHBhdGgpOgorICAgICAgICBmY3JlYXRvciwgZnR5cGUgPSBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZShwYXRoKQorICAgICAgICBpZiBmdHlwZSA9PSAnVEVYVCc6CisgICAgICAgICAgICBzZWxmLm9wZW5zY3JpcHQocGF0aCkKKyAgICAgICAgZWxpZiBmdHlwZSA9PSAnXDBcMFwwXDAnIGFuZCBwYXRoWy0zOl0gPT0gJy5weSc6CisgICAgICAgICAgICBzZWxmLm9wZW5zY3JpcHQocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFcuTWVzc2FnZSgiQ2FuJ3Qgb3BlbiBmaWxlIG9mIHR5cGUgJyVzJy4iICUgZnR5cGUpCisKKyAgICBkZWYgZ2V0YWJvdXR0ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gIkFib3V0IFB5dGhvbiBJREUiK0VMTElQU0lTCisKKyAgICBkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBTcGxhc2guYWJvdXQoKQorCisgICAgZGVmIGRvX3NldHNjcmlwdHNmb2xkZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBmc3IgPSBFYXN5RGlhbG9ncy5Bc2tGb2xkZXIobWVzc2FnZT0iU2VsZWN0IFNjcmlwdHMgRm9sZGVyIiwKKyAgICAgICAgICAgICAgICB3YW50ZWQ9RmlsZS5GU1JlZikKKyAgICAgICAgaWYgZnNyOgorICAgICAgICAgICAgcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKKyAgICAgICAgICAgIGFsaXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQorICAgICAgICAgICAgcHJlZnMuc2NyaXB0c2ZvbGRlciA9IGFsaXMuZGF0YQorICAgICAgICAgICAgc2VsZi5zY3JpcHRzZm9sZGVyID0gYWxpcworICAgICAgICAgICAgc2VsZi5tYWtlc2NyaXB0c21lbnUoKQorICAgICAgICAgICAgcHJlZnMuc2F2ZSgpCisKKyAgICBkZWYgZG9tZW51X21vZHVsZWJyb3dzZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBpbXBvcnQgTW9kdWxlQnJvd3NlcgorICAgICAgICBNb2R1bGVCcm93c2VyLk1vZHVsZUJyb3dzZXIoKQorCisgICAgZGVmIGRvbWVudV9vcGVuKHNlbGYsICphcmdzKToKKyAgICAgICAgZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oIlRFWFQiLCkpCisgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgc2VsZi5vcGVuc2NyaXB0KGZpbGVuYW1lKQorCisgICAgZGVmIGRvbWVudV9vcGVuYnluYW1lKHNlbGYsICphcmdzKToKKyAgICAgICAgIyBPcGVuIGEgZmlsZSBieSBuYW1lLiBJZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIGEgZmlsZW5hbWUKKyAgICAgICAgIyB1c2UgdGhhdCBhcyB0aGUgZGVmYXVsdC4KKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IFNjcmFwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNjID0gU2NyYXAuR2V0Q3VycmVudFNjcmFwKCkKKyAgICAgICAgICAgIGRmdCA9IHNjLkdldFNjcmFwRmxhdm9yRGF0YSgiVEVYVCIpCisgICAgICAgIGV4Y2VwdCBTY3JhcC5FcnJvcjoKKyAgICAgICAgICAgIGRmdCA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGZ0KToKKyAgICAgICAgICAgICAgICBkZnQgPSAiIgorICAgICAgICBmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza1N0cmluZygiT3BlbiBGaWxlIE5hbWVkOiIsIGRlZmF1bHQ9ZGZ0LCBvaz0iT3BlbiIpCisgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgc2VsZi5vcGVuc2NyaXB0KGZpbGVuYW1lKQorCisgICAgZGVmIGRvbWVudV9uZXcoc2VsZiwgKmFyZ3MpOgorICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBpbXBvcnQgUHlFZGl0CisgICAgICAgIHJldHVybiBQeUVkaXQuRWRpdG9yKCkKKworICAgIGRlZiBtYWtlc2NyaXB0c21lbnUoc2VsZik6CisgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgIGlmIHNlbGYuX3NjcmlwdHM6CisgICAgICAgICAgICBmb3IgaWQsIGl0ZW0gaW4gc2VsZi5fc2NyaXB0cy5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5tZW51YmFyLm1lbnVzLmhhc19rZXkoaWQpOgorICAgICAgICAgICAgICAgICAgICBtID0gc2VsZi5tZW51YmFyLm1lbnVzW2lkXQorICAgICAgICAgICAgICAgICAgICBtLmRlbGV0ZSgpCisgICAgICAgICAgICBzZWxmLl9zY3JpcHRzID0ge30KKyAgICAgICAgaWYgc2VsZi5zY3JpcHRzbWVudToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5zY3JpcHRzbWVudSwgJ2lkJykgYW5kIHNlbGYubWVudWJhci5tZW51cy5oYXNfa2V5KHNlbGYuc2NyaXB0c21lbnUuaWQpOgorICAgICAgICAgICAgICAgIHNlbGYuc2NyaXB0c21lbnUuZGVsZXRlKCkKKyAgICAgICAgc2VsZi5zY3JpcHRzbWVudSA9IEZyYW1lV29yay5NZW51KHNlbGYubWVudWJhciwgIlNjcmlwdHMiKQorICAgICAgICAjRnJhbWVXb3JrLk1lbnVJdGVtKHNlbGYuc2NyaXB0c21lbnUsICJOZXcgc2NyaXB0IiwgTm9uZSwgc2VsZi5kb21lbnVfbmV3KQorICAgICAgICAjc2VsZi5zY3JpcHRzbWVudS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBmc3IsIGQxID0gc2VsZi5zY3JpcHRzZm9sZGVyLkZTUmVzb2x2ZUFsaWFzKE5vbmUpCisgICAgICAgIHNlbGYuc2NyaXB0c3dhbGsoZnNyLmFzX3BhdGhuYW1lKCksIHNlbGYuc2NyaXB0c21lbnUpCisKKyAgICBkZWYgbWFrZW9wZW53aW5kb3dzbWVudShzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYub3BlbndpbmRvd3NtZW51Lml0ZW1zKSk6CisgICAgICAgICAgICBzZWxmLm9wZW53aW5kb3dzbWVudS5tZW51LkRlbGV0ZU1lbnVJdGVtKDEpCisgICAgICAgICAgICBzZWxmLm9wZW53aW5kb3dzbWVudS5pdGVtcyA9IFtdCisgICAgICAgIHdpbmRvd3MgPSBbXQorICAgICAgICBzZWxmLl9vcGVud2luZG93cyA9IHt9CisgICAgICAgIGZvciB3aW5kb3cgaW4gc2VsZi5fd2luZG93cy5rZXlzKCk6CisgICAgICAgICAgICB0aXRsZSA9IHdpbmRvdy5HZXRXVGl0bGUoKQorICAgICAgICAgICAgaWYgbm90IHRpdGxlOgorICAgICAgICAgICAgICAgIHRpdGxlID0gIjxubyB0aXRsZT4iCisgICAgICAgICAgICB3aW5kb3dzLmFwcGVuZCgodGl0bGUsIHdpbmRvdykpCisgICAgICAgIHdpbmRvd3Muc29ydCgpCisgICAgICAgIGZvciB0aXRsZSwgd2luZG93IGluIHdpbmRvd3M6CisgICAgICAgICAgICBpZiB0aXRsZSA9PSAiUHl0aG9uIEludGVyYWN0aXZlIjogICAgICAgIyB1Z2x5IGJ1dCB1c2VmdWwgaGFjayBieSBKb2UgU3Ryb3V0CisgICAgICAgICAgICAgICAgc2hvcnRjdXQgPSAnMCcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2hvcnRjdXQgPSBOb25lCisgICAgICAgICAgICBpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKHNlbGYub3BlbndpbmRvd3NtZW51LCB0aXRsZSwgc2hvcnRjdXQsIGNhbGxiYWNrID0gc2VsZi5kb21lbnVfb3BlbndpbmRvd3MpCisgICAgICAgICAgICBzZWxmLl9vcGVud2luZG93c1tpdGVtLml0ZW1dID0gd2luZG93CisgICAgICAgIHNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrID0gMAorICAgICAgICBzZWxmLmNoZWNrb3BlbndpbmRvd3NtZW51KCkKKworICAgIGRlZiBtYWtlb3BlbnJlY2VudG1lbnUoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLm9wZW5yZWNlbnRtZW51Lml0ZW1zKSk6CisgICAgICAgICAgICBzZWxmLm9wZW5yZWNlbnRtZW51Lm1lbnUuRGVsZXRlTWVudUl0ZW0oMSkKKyAgICAgICAgICAgIHNlbGYub3BlbnJlY2VudG1lbnUuaXRlbXMgPSBbXQorICAgICAgICBwcmVmcyA9IHNlbGYuZ2V0cHJlZnMoKQorICAgICAgICBmaWxlbGlzdCA9IHByZWZzLnJlY2VudGZpbGVzCisgICAgICAgIGlmIG5vdCBmaWxlbGlzdDoKKyAgICAgICAgICAgIHNlbGYub3BlbnJlY2VudG1lbnUuZW5hYmxlKDApCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5vcGVucmVjZW50bWVudS5lbmFibGUoMSkKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVsaXN0OgorICAgICAgICAgICAgaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShzZWxmLm9wZW5yZWNlbnRtZW51LCBmaWxlbmFtZSwgTm9uZSwgY2FsbGJhY2sgPSBzZWxmLmRvbWVudV9vcGVucmVjZW50KQorCisgICAgZGVmIGFkZHJlY2VudGZpbGUoc2VsZiwgZmlsZSk6CisgICAgICAgIHByZWZzID0gc2VsZi5nZXRwcmVmcygpCisgICAgICAgIGZpbGVsaXN0ID0gcHJlZnMucmVjZW50ZmlsZXMKKyAgICAgICAgaWYgbm90IGZpbGVsaXN0OgorICAgICAgICAgICAgZmlsZWxpc3QgPSBbXQorCisgICAgICAgIGlmIGZpbGUgaW4gZmlsZWxpc3Q6CisgICAgICAgICAgICBpZiBmaWxlID09IGZpbGVsaXN0WzBdOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZmlsZWxpc3QucmVtb3ZlKGZpbGUpCisgICAgICAgIGZpbGVsaXN0Lmluc2VydCgwLCBmaWxlKQorICAgICAgICBmaWxlbGlzdCA9IGZpbGVsaXN0WzoxMF0KKyAgICAgICAgcHJlZnMucmVjZW50ZmlsZXMgPSBmaWxlbGlzdAorICAgICAgICBwcmVmcy5zYXZlKCkKKyAgICAgICAgc2VsZi5tYWtlb3BlbnJlY2VudG1lbnUoKQorCisgICAgZGVmIGRvbWVudV9vcGVud2luZG93cyhzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6CisgICAgICAgIHcgPSBzZWxmLl9vcGVud2luZG93c1tpdGVtXQorICAgICAgICB3LlNob3dXaW5kb3coKQorICAgICAgICB3LlNlbGVjdFdpbmRvdygpCisKKyAgICBkZWYgZG9tZW51X29wZW5yZWNlbnQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBwcmVmcyA9IHNlbGYuZ2V0cHJlZnMoKQorICAgICAgICBmaWxlbGlzdCA9IHByZWZzLnJlY2VudGZpbGVzCisgICAgICAgIGlmIG5vdCBmaWxlbGlzdDoKKyAgICAgICAgICAgIGZpbGVsaXN0ID0gW10KKyAgICAgICAgaXRlbSA9IGl0ZW0gLSAxCisgICAgICAgIGZpbGVuYW1lID0gZmlsZWxpc3RbaXRlbV0KKyAgICAgICAgc2VsZi5vcGVuc2NyaXB0KGZpbGVuYW1lKQorCisgICAgZGVmIGRvbWVudV9xdWl0KHNlbGYpOgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgIGRlZiBkb21lbnVfc2F2ZShzZWxmLCAqYXJncyk6CisgICAgICAgIHByaW50ICJTYXZlIgorCisgICAgZGVmIF9xdWl0KHNlbGYpOgorICAgICAgICBpbXBvcnQgUHlDb25zb2xlLCBQeUVkaXQKKyAgICAgICAgZm9yIHdpbmRvdyBpbiBzZWxmLl93aW5kb3dzLnZhbHVlcygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJ2ID0gd2luZG93LmNsb3NlKCkgIyBpZ25vcmUgYW55IGVycm9ycyB3aGlsZSBxdWl0dGluZworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJ2ID0gMCAgICMgKG90aGVyd2lzZSwgd2UgY2FuIGdldCBzdHVjayEpCisgICAgICAgICAgICBpZiBydiBhbmQgcnYgPiAwOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBQeUNvbnNvbGUuY29uc29sZS53cml0ZXByZWZzKCkKKyAgICAgICAgICAgIFB5Q29uc29sZS5vdXRwdXQud3JpdGVwcmVmcygpCisgICAgICAgICAgICBQeUVkaXQuc2VhcmNoZW5naW5lLndyaXRlcHJlZnMoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAjIFdyaXRlIHRvIF9fc3RkZXJyX18gc28gdGhlIG1zZyBlbmQgdXAgaW4gQ29uc29sZS5hcHAgYW5kIGhhcworICAgICAgICAgICAgIyBhdCBsZWFzdCBfc29tZV8gY2hhbmNlIG9mIGdldHRpbmcgcmVhZC4uLgorICAgICAgICAgICAgIyBCdXQ6IHRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB3YXkgbW9yZSBzZXJpb3VzIHByb2JsZW1zIHdpdGgKKyAgICAgICAgICAgICMgdGhlIFB5dGhvbiAyLjIgSmFndWFyIGFkZG9uLgorICAgICAgICAgICAgc3lzLl9fc3RkZXJyX18ud3JpdGUoIioqKiBQeXRob25JREU6IENhbid0IHdyaXRlIHByZWZlcmVuY2VzICoqKlxuIikKKyAgICAgICAgc2VsZi5xdWl0dGluZyA9IDEKKworICAgIGRlZiBkb21lbnVfb3BlbnBhY2thZ2VtYW5hZ2VyKHNlbGYpOgorICAgICAgICBpbXBvcnQgUGFja2FnZU1hbmFnZXIKKyAgICAgICAgUGFja2FnZU1hbmFnZXIuUGFja2FnZUJyb3dzZXIoKQorCisgICAgZGVmIGRvbWVudV9nZW5zdWl0ZShzZWxmKToKKyAgICAgICAgaW1wb3J0IGdlbnN1aXRlbW9kdWxlCisgICAgICAgIGdlbnN1aXRlbW9kdWxlLm1haW5faW50ZXJhY3RpdmUoKQorCisgICAgZGVmIG1ha2VoZWxwbWVudShzZWxmKToKKyAgICAgICAgaGFzaGVscCwgaGFzZG9jcyA9IHNlbGYuaW5zdGFsbGRvY3VtZW50YXRpb24oKQorICAgICAgICBzZWxmLmhlbHBtZW51ID0gbSA9IHNlbGYuZ2V0aGVscG1lbnUoKQorICAgICAgICBoZWxwaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTWFjUHl0aG9uIEhlbHAiLCBOb25lLCBzZWxmLmRvbWVudV9sb2NhbGhlbHApCisgICAgICAgIGhlbHBpdGVtLmVuYWJsZShoYXNoZWxwKQorICAgICAgICBkb2NpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQeXRob24gRG9jdW1lbnRhdGlvbiIsIE5vbmUsIHNlbGYuZG9tZW51X2xvY2FsZG9jcykKKyAgICAgICAgZG9jaXRlbS5lbmFibGUoaGFzZG9jcykKKyAgICAgICAgZmluZGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkxvb2t1cCBpbiBQeXRob24gRG9jdW1lbnRhdGlvbiIsIE5vbmUsICdsb29rdXBweXRob24nKQorICAgICAgICBmaW5kaXRlbS5lbmFibGUoaGFzZG9jcykKKyAgICAgICAgaWYgcnVubmluZ09uT1NYKCk6CisgICAgICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgICAgICBkb2MyaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiQXBwbGUgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iLCBOb25lLCBzZWxmLmRvbWVudV9hcHBsZWRvY3MpCisgICAgICAgICAgICBmaW5kMml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkxvb2t1cCBpbiBDYXJib24gRG9jdW1lbnRhdGlvbiIsIE5vbmUsICdsb29rdXBjYXJib24nKQorICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgIHdlYml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlB5dGhvbiBEb2N1bWVudGF0aW9uIG9uIHRoZSBXZWIiLCBOb25lLCBzZWxmLmRvbWVudV93ZWJkb2NzKQorICAgICAgICB3ZWIyaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUHl0aG9uIG9uIHRoZSBXZWIiLCBOb25lLCBzZWxmLmRvbWVudV93ZWJweXRob24pCisgICAgICAgIHdlYjNpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJNYWNQeXRob24gb24gdGhlIFdlYiIsIE5vbmUsIHNlbGYuZG9tZW51X3dlYm1hY3B5dGhvbikKKworICAgIGRlZiBkb21lbnVfbG9jYWxkb2NzKHNlbGYsICphcmdzKToKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFICisgICAgICAgIEFILkFIR290b1BhZ2UoIlB5dGhvbiBEb2N1bWVudGF0aW9uIiwgTm9uZSwgTm9uZSkKKworICAgIGRlZiBkb21lbnVfbG9jYWxoZWxwKHNlbGYsICphcmdzKToKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFICisgICAgICAgIEFILkFIR290b1BhZ2UoIk1hY1B5dGhvbiBIZWxwIiwgTm9uZSwgTm9uZSkKKworICAgIGRlZiBkb21lbnVfYXBwbGVkb2NzKHNlbGYsICphcmdzKToKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFILCBBcHBsZUhlbHAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgQUguQUhHb3RvTWFpblRPQyhBcHBsZUhlbHAua0FIVE9DVHlwZURldmVsb3BlcikKKyAgICAgICAgZXhjZXB0IEFILkVycm9yLCBhcmc6CisgICAgICAgICAgICBpZiBhcmdbMF0gPT0gLTUwOgorICAgICAgICAgICAgICAgIFcuTWVzc2FnZSgiRGV2ZWxvcGVyIGRvY3VtZW50YXRpb24gbm90IGluc3RhbGxlZCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFcuTWVzc2FnZSgiQXBwbGVIZWxwIEVycm9yOiAlciIgJSAoYXJnLCkpCisKKyAgICBkZWYgZG9tZW51X2xvb2t1cHB5dGhvbihzZWxmLCAqYXJncyk6CisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBBSAorICAgICAgICBzZWFyY2hzdHJpbmcgPSBzZWxmLl9nZXRzZWFyY2hzdHJpbmcoKQorICAgICAgICBpZiBub3Qgc2VhcmNoc3RyaW5nOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEFILkFIU2VhcmNoKCJQeXRob24gRG9jdW1lbnRhdGlvbiIsIHNlYXJjaHN0cmluZykKKyAgICAgICAgZXhjZXB0IEFILkVycm9yLCBhcmc6CisgICAgICAgICAgICBXLk1lc3NhZ2UoIkFwcGxlSGVscCBFcnJvcjogJXIiICUgKGFyZywpKQorCisgICAgZGVmIGRvbWVudV9sb29rdXBjYXJib24oc2VsZiwgKmFyZ3MpOgorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgQUgKKyAgICAgICAgc2VhcmNoc3RyaW5nID0gc2VsZi5fZ2V0c2VhcmNoc3RyaW5nKCkKKyAgICAgICAgaWYgbm90IHNlYXJjaHN0cmluZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBBSC5BSFNlYXJjaCgiQ2FyYm9uIiwgc2VhcmNoc3RyaW5nKQorICAgICAgICBleGNlcHQgQUguRXJyb3IsIGFyZzoKKyAgICAgICAgICAgIFcuTWVzc2FnZSgiQXBwbGVIZWxwIEVycm9yOiAlciIgJSAoYXJnLCkpCisKKyAgICBkZWYgX2dldHNlYXJjaHN0cmluZyhzZWxmKToKKyAgICAgICAgIyBGaXJzdCB3ZSBnZXQgdGhlIGZyb250bW9zdCB3aW5kb3cKKyAgICAgICAgZnJvbnQgPSBzZWxmLmdldGZyb250d2luZG93KCkKKyAgICAgICAgaWYgZnJvbnQgYW5kIGhhc2F0dHIoZnJvbnQsICdnZXRzZWxlY3RlZHRleHQnKToKKyAgICAgICAgICAgIHRleHQgPSBmcm9udC5nZXRzZWxlY3RlZHRleHQoKQorICAgICAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dAorICAgICAgICAjIFRoaXMgaXMgYSBjb3Atb3V0LiBXZSBzaG91bGQgaGF2ZSBkaXNhYmxlZCB0aGUgbWVudXMKKyAgICAgICAgIyBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24sIGJ1dCB0aGUgY2FuXyBtZXRob2RzIG9ubHkgc2VlbQorICAgICAgICAjIHRvIHdvcmsgZm9yIFdpbmRvd3MuIE9yIG5vdCBmb3IgdGhlIEhlbHAgbWVudSwgbWF5YmU/CisgICAgICAgIHRleHQgPSBFYXN5RGlhbG9ncy5Bc2tTdHJpbmcoIlNlYXJjaCBkb2N1bWVudGF0aW9uIGZvciIsIG9rPSJTZWFyY2giKQorICAgICAgICByZXR1cm4gdGV4dAorCisgICAgZGVmIGRvbWVudV93ZWJkb2NzKHNlbGYsICphcmdzKToKKyAgICAgICAgaW1wb3J0IHdlYmJyb3dzZXIKKyAgICAgICAgbWFqb3IsIG1pbm9yLCBtaWNybywgc3RhdGUsIG5hbm8gPSBzeXMudmVyc2lvbl9pbmZvCisgICAgICAgIGlmIHN0YXRlIGluICgnYWxwaGEnLCAnYmV0YScpOgorICAgICAgICAgICAgZG9jdmVyc2lvbiA9ICdkZXYvZG9jL2RldmVsJworICAgICAgICBlbGlmIG1pY3JvID09IDA6CisgICAgICAgICAgICBkb2N2ZXJzaW9uID0gJ2RvYy8lZC4lZCcgJSAobWFqb3IsIG1pbm9yKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZG9jdmVyc2lvbiA9ICdkb2MvJWQuJWQuJWQnICUgKG1ham9yLCBtaW5vciwgbWljcm8pCisgICAgICAgIHdlYmJyb3dzZXIub3BlbigiaHR0cDovL3d3dy5weXRob24ub3JnLyVzIiAlIGRvY3ZlcnNpb24pCisKKyAgICBkZWYgZG9tZW51X3dlYnB5dGhvbihzZWxmLCAqYXJncyk6CisgICAgICAgIGltcG9ydCB3ZWJicm93c2VyCisgICAgICAgIHdlYmJyb3dzZXIub3BlbigiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCisKKyAgICBkZWYgZG9tZW51X3dlYm1hY3B5dGhvbihzZWxmLCAqYXJncyk6CisgICAgICAgIGltcG9ydCB3ZWJicm93c2VyCisgICAgICAgIHdlYmJyb3dzZXIub3BlbigiaHR0cDovL3d3dy5jd2kubmwvfmphY2svbWFjcHl0aG9uLmh0bWwiKQorCisgICAgZGVmIGluc3RhbGxkb2N1bWVudGF0aW9uKHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgcmF0aGVyIG11Y2ggb2YgYSBoYWNrLiBTb21lb25lIGhhcyB0byB0ZWxsIHRoZSBIZWxwIFZpZXdlcgorICAgICAgICAjIGFib3V0IHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiwgc28gd2h5IG5vdCB1cy4gVGhlIGRvY3VtZW50YXRpb24KKyAgICAgICAgIyBpcyBsb2NhdGVkIGluIHRoZSBmcmFtZXdvcmssIGJ1dCB0aGVyZSdzIGEgc3ltbGluayBpbiBQeXRob24uYXBwLgorICAgICAgICAjIEFuZCBhcyBBSFJlZ2lzdGVySGVscEJvb2sgd2FudHMgYSBidW5kbGUgKHdpdGggdGhlIHJpZ2h0IGJpdHMgaW4KKyAgICAgICAgIyB0aGUgcGxpc3QgZmlsZSkgd2UgcmVmZXIgaXQgdG8gUHl0aG9uLmFwcAorICAgICAgICAjCisgICAgICAgICMgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlIHdlIGhhdmUgdG8gbG9vayBpbiB0d28gcGxhY2VzOiBmaXJzdCBpbiB0aGUgSURFCisgICAgICAgICMgaXRzZWxmLCB0aGVuIGluIHRoZSBQeXRob24gYXBwbGljYXRpb24gaW5zaWRlIHRoZSBmcmFtZXdvcmsuCisgICAgICAgIGhhc19oZWxwID0gRmFsc2UKKyAgICAgICAgaGFzX2RvYyA9IEZhbHNlCisgICAgICAgIGlkZV9wYXRoX2NvbXBvbmVudHMgPSBzeXMuYXJndlswXS5zcGxpdCgiLyIpCisgICAgICAgIGlmIGlkZV9wYXRoX2NvbXBvbmVudHNbLTM6XSA9PSBbIkNvbnRlbnRzIiwgIlJlc291cmNlcyIsICJQeXRob25JREUucHkiXToKKyAgICAgICAgICAgIGlkZV9hcHAgPSAiLyIuam9pbihpZGVfcGF0aF9jb21wb25lbnRzWzotM10pCisgICAgICAgICAgICBoZWxwX3NvdXJjZSA9IG9zLnBhdGguam9pbihpZGVfYXBwLCAnQ29udGVudHMvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbicpCisgICAgICAgICAgICBkb2Nfc291cmNlID0gb3MucGF0aC5qb2luKGlkZV9hcHAsICdDb250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9QeXRob25Eb2N1bWVudGF0aW9uJykKKyAgICAgICAgICAgIGhhc19oZWxwID0gb3MucGF0aC5pc2RpcihoZWxwX3NvdXJjZSkKKyAgICAgICAgICAgIGhhc19kb2MgPSBvcy5wYXRoLmlzZGlyKGRvY19zb3VyY2UpCisgICAgICAgICAgICBpZiBoYXNfaGVscCBvciBoYXNfZG9jOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFICisgICAgICAgICAgICAgICAgICAgIEFILkFIUmVnaXN0ZXJIZWxwQm9vayhpZGVfYXBwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIE1hY09TLkVycm9yKSwgYXJnOgorICAgICAgICAgICAgICAgICAgICBwYXNzICMgVy5NZXNzYWdlKCJDYW5ub3QgcmVnaXN0ZXIgUHl0aG9uIERvY3VtZW50YXRpb246ICVzIiAlIHN0cihhcmcpKQorICAgICAgICBweXRob25fYXBwID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdSZXNvdXJjZXMvUHl0aG9uLmFwcCcpCisgICAgICAgIGlmIG5vdCBoYXNfaGVscDoKKyAgICAgICAgICAgIGhlbHBfc291cmNlID0gb3MucGF0aC5qb2luKHB5dGhvbl9hcHAsICdDb250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9Eb2N1bWVudGF0aW9uJykKKyAgICAgICAgICAgIGhhc19oZWxwID0gb3MucGF0aC5pc2RpcihoZWxwX3NvdXJjZSkKKyAgICAgICAgaWYgbm90IGhhc19kb2M6CisgICAgICAgICAgICBkb2Nfc291cmNlID0gb3MucGF0aC5qb2luKHB5dGhvbl9hcHAsICdDb250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9QeXRob25Eb2N1bWVudGF0aW9uJykKKyAgICAgICAgICAgIGhhc19kb2MgPSBvcy5wYXRoLmlzZGlyKGRvY19zb3VyY2UpCisgICAgICAgIGlmIGhhc19oZWxwIG9yIGhhc19kb2M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFICisgICAgICAgICAgICAgICAgQUguQUhSZWdpc3RlckhlbHBCb29rKHB5dGhvbl9hcHApCisgICAgICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBNYWNPUy5FcnJvciksIGFyZzoKKyAgICAgICAgICAgICAgICBwYXNzICMgVy5NZXNzYWdlKCJDYW5ub3QgcmVnaXN0ZXIgUHl0aG9uIERvY3VtZW50YXRpb246ICVzIiAlIHN0cihhcmcpKQorICAgICAgICByZXR1cm4gaGFzX2hlbHAsIGhhc19kb2MKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvU3BsYXNoLnB5IGIvTWFjL1Rvb2xzL0lERS9TcGxhc2gucHkKaW5kZXggODYwMDlkMi4uYWIzNmZhNCAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9TcGxhc2gucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9TcGxhc2gucHkKQEAgLTI1LDg4ICsyNSw4OCBAQAogJXMKIFNlZTogPGh0dHA6Ly93d3cucHl0aG9uLm9yZy8+IGZvciBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4iIiIKIAotZmxhdXdla3VsID0gWwkiR29vZGRheSwgQnJ1Y2UuIiwgCi0JCQkiV2hhdCdzIG5ldz8iLAotCQkJIk51ZGdlLCBudWRnZSwgc2F5IG5vIG1vcmUhIiwgCi0JCQkiTm8sIG5vIHNpciwgaXQncyBub3QgZGVhZC4gSXQncyByZXN0aW5nLiIsCi0JCQkiQWxiYXRyb3MhIiwKLQkJCSJJdCdzIC4gLiAuIiwKLQkJCSJJcyB5b3VyIG5hbWUgbm90IEJydWNlLCB0aGVuPyIsCi0JCQkiIiJCdXQgTXIgRi5HLiBTdXBlcm1hbiBoYXMgYSBzZWNyZXQgaWRlbnRpdHkgLiAuIC4gCi13aGVuIHRyb3VibGUgc3RyaWtlcyBhdCBhbnkgdGltZSAuIC4gLiAKLWF0IGFueSBwbGFjZSAuIC4gLiBoZSBpcyByZWFkeSB0byBiZWNvbWUgLiAuIC4gCitmbGF1d2VrdWwgPSBbICAgIkdvb2RkYXksIEJydWNlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiV2hhdCdzIG5ldz8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIk51ZGdlLCBudWRnZSwgc2F5IG5vIG1vcmUhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJObywgbm8gc2lyLCBpdCdzIG5vdCBkZWFkLiBJdCdzIHJlc3RpbmcuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBbGJhdHJvcyEiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkl0J3MgLiAuIC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIklzIHlvdXIgbmFtZSBub3QgQnJ1Y2UsIHRoZW4/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIiIkJ1dCBNciBGLkcuIFN1cGVybWFuIGhhcyBhIHNlY3JldCBpZGVudGl0eSAuIC4gLgord2hlbiB0cm91YmxlIHN0cmlrZXMgYXQgYW55IHRpbWUgLiAuIC4KK2F0IGFueSBwbGFjZSAuIC4gLiBoZSBpcyByZWFkeSB0byBiZWNvbWUgLiAuIC4KIEJpY3ljbGUgUmVwYWlyIE1hbiEiIiIKLQkJCV0KKyAgICAgICAgICAgICAgICAgICAgICAgIF0KIAogZGVmIHNraXBkb3VibGVyZXR1cm5zKHRleHQpOgotCXJldHVybiBzdHJpbmcucmVwbGFjZSh0ZXh0LCAnXG5cbicsICdcbicpCisgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRleHQsICdcblxuJywgJ1xuJykKIAogZGVmIG5sMnJldHVybih0ZXh0KToKLQlyZXR1cm4gc3RyaW5nLnJlcGxhY2UodGV4dCwgJ1xuJywgJ1xyJykKKyAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodGV4dCwgJ1xuJywgJ1xyJykKIAogZGVmIFVwZGF0ZVNwbGFzaChkcmF3ZGlhbG9nID0gMCwgd2hhdCA9IDApOgotCWlmIGRyYXdkaWFsb2c6Ci0JCXNwbGFzaC5EcmF3RGlhbG9nKCkKLQlkcmF3dGV4dCh3aGF0KQotCXNwbGFzaC5HZXREaWFsb2dXaW5kb3coKS5WYWxpZFdpbmRvd1JlY3Qoc3BsYXNoLkdldERpYWxvZ1BvcnQoKS5HZXRQb3J0Qm91bmRzKCkpCi0Jc3BsYXNoLkdldERpYWxvZ1dpbmRvdygpLkdldFdpbmRvd1BvcnQoKS5RREZsdXNoUG9ydEJ1ZmZlcihOb25lKQorICAgIGlmIGRyYXdkaWFsb2c6CisgICAgICAgIHNwbGFzaC5EcmF3RGlhbG9nKCkKKyAgICBkcmF3dGV4dCh3aGF0KQorICAgIHNwbGFzaC5HZXREaWFsb2dXaW5kb3coKS5WYWxpZFdpbmRvd1JlY3Qoc3BsYXNoLkdldERpYWxvZ1BvcnQoKS5HZXRQb3J0Qm91bmRzKCkpCisgICAgc3BsYXNoLkdldERpYWxvZ1dpbmRvdygpLkdldFdpbmRvd1BvcnQoKS5RREZsdXNoUG9ydEJ1ZmZlcihOb25lKQogCiBkZWYgZHJhd3RleHQod2hhdCA9IDApOgotCVFkLlNldFBvcnQoc3BsYXNoKQotCWZvbnRJRCA9IEZtLkdldEZOdW0oIlB5dGhvbi1TYW5zIikKLQlpZiBub3QgZm9udElEOgotCQlmb250SUQgPSBnZW5ldmEKLQlRZC5UZXh0Rm9udChmb250SUQpCi0JUWQuVGV4dFNpemUoOSkKLQlyZWN0ID0gKDEwLCAxMTUsIF9hYm91dF93aWR0aCAtIDEwLCBfYWJvdXRfaGVpZ2h0IC0gMzApCi0JaWYgbm90IHdoYXQ6Ci0JCWltcG9ydCBfX21haW5fXwotCQlhYm91dHR4dCA9IG5sMnJldHVybihhYm91dHRleHQxICUgKAotCQkJCV9fbWFpbl9fLl9fdmVyc2lvbl9fLCBzeXMudmVyc2lvbiwgc2tpcGRvdWJsZXJldHVybnMoc3lzLmNvcHlyaWdodCkpKQotCWVsc2U6Ci0JCWltcG9ydCByYW5kb20KLQkJYWJvdXR0eHQgPSBubDJyZXR1cm4ocmFuZG9tLmNob2ljZShmbGF1d2VrdWwpKQotCVRFLlRFVGV4dEJveChhYm91dHR4dCwgcmVjdCwgdGVKdXN0Q2VudGVyKQorICAgIFFkLlNldFBvcnQoc3BsYXNoKQorICAgIGZvbnRJRCA9IEZtLkdldEZOdW0oIlB5dGhvbi1TYW5zIikKKyAgICBpZiBub3QgZm9udElEOgorICAgICAgICBmb250SUQgPSBnZW5ldmEKKyAgICBRZC5UZXh0Rm9udChmb250SUQpCisgICAgUWQuVGV4dFNpemUoOSkKKyAgICByZWN0ID0gKDEwLCAxMTUsIF9hYm91dF93aWR0aCAtIDEwLCBfYWJvdXRfaGVpZ2h0IC0gMzApCisgICAgaWYgbm90IHdoYXQ6CisgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICBhYm91dHR4dCA9IG5sMnJldHVybihhYm91dHRleHQxICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgX19tYWluX18uX192ZXJzaW9uX18sIHN5cy52ZXJzaW9uLCBza2lwZG91YmxlcmV0dXJucyhzeXMuY29weXJpZ2h0KSkpCisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICBhYm91dHR4dCA9IG5sMnJldHVybihyYW5kb20uY2hvaWNlKGZsYXV3ZWt1bCkpCisgICAgVEUuVEVUZXh0Qm94KGFib3V0dHh0LCByZWN0LCB0ZUp1c3RDZW50ZXIpCiAKIFVwZGF0ZVNwbGFzaCgxKQogCiBkZWYgd2FpdCgpOgotCWZyb20gQ2FyYm9uIGltcG9ydCBFdnQKLQlmcm9tIENhcmJvbiBpbXBvcnQgRXZlbnRzCi0JZ2xvYmFsIHNwbGFzaAotCXRyeToKLQkJc3BsYXNoCi0JZXhjZXB0IE5hbWVFcnJvcjoKLQkJcmV0dXJuCi0JUWQuSW5pdEN1cnNvcigpCi0JdGltZSA9IEV2dC5UaWNrQ291bnQoKQotCXdoYXR0ZXh0ID0gMAotCWRyYXd0ZXh0KHdoYXR0ZXh0KQotCXdoaWxlIF9rZWVwc3BsYXNoc2NyZWVub3BlbjoKLQkJb2ssIGV2ZW50ID0gRXZ0LkV2ZW50QXZhaWwoRXZlbnRzLmhpZ2hMZXZlbEV2ZW50TWFzaykKLQkJaWYgb2s6Ci0JCQkjIGdvdCBhcHBsZSBldmVudCwgYmFjayB0byBtYWlubG9vcAotCQkJYnJlYWsKLQkJb2ssIGV2ZW50ID0gRXZ0LkV2ZW50QXZhaWwoRXZlbnRzLm1Eb3duTWFzayB8IEV2ZW50cy5rZXlEb3duTWFzayB8IEV2ZW50cy51cGRhdGVNYXNrKQotCQlpZiBvazoKLQkJCW9rLCBldmVudCA9IEV2dC5XYWl0TmV4dEV2ZW50KEV2ZW50cy5tRG93bk1hc2sgfCBFdmVudHMua2V5RG93bk1hc2sgfCBFdmVudHMudXBkYXRlTWFzaywgMzApCi0JCQlpZiBvazoKLQkJCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQkJCWlmIHdoYXQgPT0gRXZlbnRzLnVwZGF0ZUV2dDoKLQkJCQkJaWYgV2luLldoaWNoV2luZG93KG1lc3NhZ2UpID09IHNwbGFzaDoKLQkJCQkJCVVwZGF0ZVNwbGFzaCgxLCB3aGF0dGV4dCkKLQkJCQllbHNlOgotCQkJCQlicmVhawotCQlpZiBFdnQuVGlja0NvdW50KCkgLSB0aW1lID4gMzYwOgotCQkJd2hhdHRleHQgPSBub3Qgd2hhdHRleHQKLQkJCWRyYXd0ZXh0KHdoYXR0ZXh0KQotCQkJdGltZSA9IEV2dC5UaWNrQ291bnQoKQotCWRlbCBzcGxhc2gKKyAgICBmcm9tIENhcmJvbiBpbXBvcnQgRXZ0CisgICAgZnJvbSBDYXJib24gaW1wb3J0IEV2ZW50cworICAgIGdsb2JhbCBzcGxhc2gKKyAgICB0cnk6CisgICAgICAgIHNwbGFzaAorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHJldHVybgorICAgIFFkLkluaXRDdXJzb3IoKQorICAgIHRpbWUgPSBFdnQuVGlja0NvdW50KCkKKyAgICB3aGF0dGV4dCA9IDAKKyAgICBkcmF3dGV4dCh3aGF0dGV4dCkKKyAgICB3aGlsZSBfa2VlcHNwbGFzaHNjcmVlbm9wZW46CisgICAgICAgIG9rLCBldmVudCA9IEV2dC5FdmVudEF2YWlsKEV2ZW50cy5oaWdoTGV2ZWxFdmVudE1hc2spCisgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgIyBnb3QgYXBwbGUgZXZlbnQsIGJhY2sgdG8gbWFpbmxvb3AKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG9rLCBldmVudCA9IEV2dC5FdmVudEF2YWlsKEV2ZW50cy5tRG93bk1hc2sgfCBFdmVudHMua2V5RG93bk1hc2sgfCBFdmVudHMudXBkYXRlTWFzaykKKyAgICAgICAgaWYgb2s6CisgICAgICAgICAgICBvaywgZXZlbnQgPSBFdnQuV2FpdE5leHRFdmVudChFdmVudHMubURvd25NYXNrIHwgRXZlbnRzLmtleURvd25NYXNrIHwgRXZlbnRzLnVwZGF0ZU1hc2ssIDMwKQorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgICAgICAgICBpZiB3aGF0ID09IEV2ZW50cy51cGRhdGVFdnQ6CisgICAgICAgICAgICAgICAgICAgIGlmIFdpbi5XaGljaFdpbmRvdyhtZXNzYWdlKSA9PSBzcGxhc2g6CisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVTcGxhc2goMSwgd2hhdHRleHQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgRXZ0LlRpY2tDb3VudCgpIC0gdGltZSA+IDM2MDoKKyAgICAgICAgICAgIHdoYXR0ZXh0ID0gbm90IHdoYXR0ZXh0CisgICAgICAgICAgICBkcmF3dGV4dCh3aGF0dGV4dCkKKyAgICAgICAgICAgIHRpbWUgPSBFdnQuVGlja0NvdW50KCkKKyAgICBkZWwgc3BsYXNoCiAKIAogZGVmIGFib3V0KCk6Ci0JZ2xvYmFsIHNwbGFzaCwgc3BsYXNocmVzZmlsZSwgX2tlZXBzcGxhc2hzY3JlZW5vcGVuCi0JX2tlZXBzcGxhc2hzY3JlZW5vcGVuID0gMQotCXNwbGFzaCA9IERsZy5HZXROZXdEaWFsb2coNDY4LCAtMSkKLQlzcGxhc2guRHJhd0RpYWxvZygpCi0Jd2FpdCgpCisgICAgZ2xvYmFsIHNwbGFzaCwgc3BsYXNocmVzZmlsZSwgX2tlZXBzcGxhc2hzY3JlZW5vcGVuCisgICAgX2tlZXBzcGxhc2hzY3JlZW5vcGVuID0gMQorICAgIHNwbGFzaCA9IERsZy5HZXROZXdEaWFsb2coNDY4LCAtMSkKKyAgICBzcGxhc2guRHJhd0RpYWxvZygpCisgICAgd2FpdCgpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1cucHkgYi9NYWMvVG9vbHMvSURFL1cucHkKaW5kZXggMzk3YjIxMS4uM2RkZWI3NiAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9XLnB5CisrKyBiL01hYy9Ub29scy9JREUvVy5weQpAQCAtMTUsMjcgKzE1LDI2IEBACiBBbGVydEVycm9yID0gJ0FsZXJ0RXJyb3InCiAKIGRlZiBzZXRhcHBsaWNhdGlvbihhcHAsIHNpZyk6Ci0JZ2xvYmFsIF9hcHBsaWNhdGlvbiwgX3NpZ25hdHVyZQotCV9hcHBsaWNhdGlvbiA9IGFwcAotCV9zaWduYXR1cmUgPSBzaWcKKyAgICBnbG9iYWwgX2FwcGxpY2F0aW9uLCBfc2lnbmF0dXJlCisgICAgX2FwcGxpY2F0aW9uID0gYXBwCisgICAgX3NpZ25hdHVyZSA9IHNpZwogCiBkZWYgZ2V0YXBwbGljYXRpb24oKToKLQlpZiBfYXBwbGljYXRpb24gaXMgTm9uZToKLQkJcmFpc2UgV2lkZ2V0c0Vycm9yLCAnVyBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQ6IHVua25vd24gQXBwbGljYXRpb24nCi0JcmV0dXJuIF9hcHBsaWNhdGlvbgorICAgIGlmIF9hcHBsaWNhdGlvbiBpcyBOb25lOgorICAgICAgICByYWlzZSBXaWRnZXRzRXJyb3IsICdXIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZDogdW5rbm93biBBcHBsaWNhdGlvbicKKyAgICByZXR1cm4gX2FwcGxpY2F0aW9uCiAKIGRlZiBnZXRkZWZhdWx0Zm9udCgpOgotCXByZWZzID0gZ2V0YXBwbGljYXRpb24oKS5nZXRwcmVmcygpCi0JaWYgbm90IHByZWZzLmRlZmF1bHRmb250OgotCQlwcmVmcy5kZWZhdWx0Zm9udCA9ICgiR2VuZXZhIiwgMCwgMTAsICgwLCAwLCAwKSkKLQlyZXR1cm4gcHJlZnMuZGVmYXVsdGZvbnQKKyAgICBwcmVmcyA9IGdldGFwcGxpY2F0aW9uKCkuZ2V0cHJlZnMoKQorICAgIGlmIG5vdCBwcmVmcy5kZWZhdWx0Zm9udDoKKyAgICAgICAgcHJlZnMuZGVmYXVsdGZvbnQgPSAoIkdlbmV2YSIsIDAsIDEwLCAoMCwgMCwgMCkpCisgICAgcmV0dXJuIHByZWZzLmRlZmF1bHRmb250CiAKIGRlZiBNZXNzYWdlKHRleHQpOgotCWltcG9ydCBFYXN5RGlhbG9ncywgc3RyaW5nCi0JZnJvbSBDYXJib24gaW1wb3J0IFFkCi0JUWQuSW5pdEN1cnNvcigpCi0JdGV4dCA9IHN0cmluZy5yZXBsYWNlKHRleHQsICJcbiIsICJcciIpCi0JaWYgbm90IHRleHQ6Ci0JCXRleHQgPSAnPEFsZXJ0IHRleHQgbm90IHNwZWNpZmllZD4nCi0JRWFzeURpYWxvZ3MuTWVzc2FnZSh0ZXh0KQotCisgICAgaW1wb3J0IEVhc3lEaWFsb2dzLCBzdHJpbmcKKyAgICBmcm9tIENhcmJvbiBpbXBvcnQgUWQKKyAgICBRZC5Jbml0Q3Vyc29yKCkKKyAgICB0ZXh0ID0gc3RyaW5nLnJlcGxhY2UodGV4dCwgIlxuIiwgIlxyIikKKyAgICBpZiBub3QgdGV4dDoKKyAgICAgICAgdGV4dCA9ICc8QWxlcnQgdGV4dCBub3Qgc3BlY2lmaWVkPicKKyAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKHRleHQpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1dhcHBsaWNhdGlvbi5weSBiL01hYy9Ub29scy9JREUvV2FwcGxpY2F0aW9uLnB5CmluZGV4IDU1MzM5MWUuLjRjZmM3N2IgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvV2FwcGxpY2F0aW9uLnB5CisrKyBiL01hYy9Ub29scy9JREUvV2FwcGxpY2F0aW9uLnB5CkBAIC0xMSw0NzIgKzExLDQ3MSBAQAogZnJvbSBDYXJib24gaW1wb3J0IEZpbGUKIAogaWYgaGFzYXR0cihXaW4sICJGcm9udE5vbkZsb2F0aW5nV2luZG93Iik6Ci0JTXlGcm9udFdpbmRvdyA9IFdpbi5Gcm9udE5vbkZsb2F0aW5nV2luZG93CisgICAgTXlGcm9udFdpbmRvdyA9IFdpbi5Gcm9udE5vbkZsb2F0aW5nV2luZG93CiBlbHNlOgotCU15RnJvbnRXaW5kb3cgPSBXaW4uRnJvbnRXaW5kb3cKKyAgICBNeUZyb250V2luZG93ID0gV2luLkZyb250V2luZG93CiAKIAogS0lMTFVOS05PV05XSU5ET1dTID0gMCAgIyBTZXQgdG8gMCBmb3IgZGVidWdnaW5nLgogCiBjbGFzcyBBcHBsaWNhdGlvbihGcmFtZVdvcmsuQXBwbGljYXRpb24pOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBzaWduYXR1cmU9J1B5dGgnKToKLQkJIyBPcGVuIG91ciByZXNvdXJjZSBmaWxlLCBpZiBpdCBpcyBub3Qgb3BlbiB5ZXQKLQkJbWFjcmVzb3VyY2UubmVlZCgnQ1VSUycsIDQ2OCwgIldpZGdldHMucnNyYyIpCi0JCWltcG9ydCBXCi0JCVcuc2V0YXBwbGljYXRpb24oc2VsZiwgc2lnbmF0dXJlKQotCQlGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJc2VsZi5fc3VzcGVuZGVkID0gMAotCQlzZWxmLnF1aXR0aW5nID0gMAotCQlzZWxmLmRlYnVnZ2VyX3F1aXR0aW5nID0gMQotCQlzZWxmLkRlYnVnZ2VyUXVpdCA9ICdEZWJ1Z2dlclF1aXREdW1teUV4Y2VwdGlvbicKLQkJc2VsZi5faWRsZWZ1bmNzID0gW10KLQkJIyBtYXAgY2VydGFpbiBGIGtleSBjb2RlcyB0byBlcXVpdmFsZW50IGNvbW1hbmQtbGV0dGVyIGNvbWJvcyAoSkpTKQotCQlzZWxmLmZrZXltYXBzID0gezEyMjoieiIsIDEyMDoieCIsIDk5OiJjIiwgMTE4OiJ2In0KLQkKLQlkZWYgbWFpbmxvb3Aoc2VsZiwgbWFzaz1GcmFtZVdvcmsuZXZlcnlFdmVudCwgd2FpdD1Ob25lKToKLQkJaW1wb3J0IFcKLQkJc2VsZi5xdWl0dGluZyA9IDAKLQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJc2F2ZXlpZWxkID0gTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQotCQl0cnk6Ci0JCQl3aGlsZSBub3Qgc2VsZi5xdWl0dGluZzoKLQkJCQl0cnk6Ci0JCQkJCXNlbGYuZG8xZXZlbnQobWFzaywgd2FpdCkKLQkJCQlleGNlcHQgVy5BbGVydEVycm9yLCBkZXRhaWw6Ci0JCQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkJCQkJVy5NZXNzYWdlKGRldGFpbCkKLQkJCQlleGNlcHQgc2VsZi5EZWJ1Z2dlclF1aXQ6Ci0JCQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkJCQlleGNlcHQ6Ci0JCQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkJCQkJaW1wb3J0IFB5RWRpdAotCQkJCQlQeUVkaXQudHJhY2ViYWNrd2luZG93LnRyYWNlYmFjaygpCi0JCWZpbmFsbHk6Ci0JCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJTWFjT1MuRW5hYmxlQXBwc3dpdGNoKDEpCi0JCi0JZGVmIGRlYnVnZ2VyX21haW5sb29wKHNlbGYsIG1hc2s9RnJhbWVXb3JrLmV2ZXJ5RXZlbnQsIHdhaXQ9Tm9uZSk6Ci0JCWltcG9ydCBXCi0JCXNlbGYuZGVidWdnZXJfcXVpdHRpbmcgPSAwCi0JCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCXNhdmV5aWVsZCA9IE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkJdHJ5OgotCQkJd2hpbGUgbm90IHNlbGYucXVpdHRpbmcgYW5kIG5vdCBzZWxmLmRlYnVnZ2VyX3F1aXR0aW5nOgotCQkJCXRyeToKLQkJCQkJc2VsZi5kbzFldmVudChtYXNrLCB3YWl0KQotCQkJCWV4Y2VwdCBXLkFsZXJ0RXJyb3IsIGRldGFpbDoKLQkJCQkJVy5NZXNzYWdlKGRldGFpbCkKLQkJCQlleGNlcHQ6Ci0JCQkJCWltcG9ydCBQeUVkaXQKLQkJCQkJUHlFZGl0LnRyYWNlYmFja3dpbmRvdy50cmFjZWJhY2soKQotCQlmaW5hbGx5OgotCQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaChzYXZleWllbGQpCi0JCi0JZGVmIGJyZWF0aGUoc2VsZiwgd2FpdD0xKToKLQkJaW1wb3J0IFcKLQkJb2ssIGV2ZW50ID0gRXZ0LldhaXROZXh0RXZlbnQoRnJhbWVXb3JrLnVwZGF0ZU1hc2sgfCAKLQkJCQlGcmFtZVdvcmsubURvd25NYXNrIHwgRnJhbWVXb3JrLm9zTWFzayB8Ci0JCQkJRnJhbWVXb3JrLmFjdGl2TWFzaywgCi0JCQkJd2FpdCkKLQkJaWYgb2s6Ci0JCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQkJI3ByaW50IEZyYW1lV29yay5ldmVudG5hbWVbd2hhdF0KLQkJCWlmIEZyYW1lV29yay5ldmVudG5hbWVbd2hhdF0gPT0gJ21vdXNlRG93bic6Ci0JCQkJcGFydGNvZGUsIHdpZCA9IFdpbi5GaW5kV2luZG93KHdoZXJlKQotCQkJCWlmIEZyYW1lV29yay5wYXJ0bmFtZVtwYXJ0Y29kZV0gPD4gJ2luRGVzayc6Ci0JCQkJCXJldHVybgotCQkJZWxzZToKLQkJCQlXLlNldEN1cnNvcignd2F0Y2gnKQotCQkJc2VsZi5kaXNwYXRjaChldmVudCkKLQkKLQlkZWYgcmVmcmVzaHdpbmRvd3Moc2VsZiwgd2FpdD0xKToKLQkJaW1wb3J0IFcKLQkJd2hpbGUgMToKLQkJCW9rLCBldmVudCA9IEV2dC5XYWl0TmV4dEV2ZW50KEZyYW1lV29yay51cGRhdGVNYXNrLCB3YWl0KQotCQkJaWYgbm90IG9rOgotCQkJCWJyZWFrCi0JCQlzZWxmLmRpc3BhdGNoKGV2ZW50KQotCQotCWRlZiBhZGRpZGxlZnVuYyhzZWxmLCBmdW5jKToKLQkJc2VsZi5faWRsZWZ1bmNzLmFwcGVuZChmdW5jKQotCQotCWRlZiByZW1vdmVpZGxlZnVuYyhzZWxmLCBmdW5jKToKLQkJc2VsZi5faWRsZWZ1bmNzLnJlbW92ZShmdW5jKQotCQotCWRlZiBpZGxlKHNlbGYsIGV2ZW50KToKLQkJaWYgbm90IHNlbGYuX3N1c3BlbmRlZDoKLQkJCWlmIG5vdCBzZWxmLmRvX2Zyb250V2luZG93TWV0aG9kKCJpZGxlIiwgZXZlbnQpOgotCQkJCVFkLkluaXRDdXJzb3IoKQotCQlpZiBzZWxmLl9pZGxlZnVuY3M6Ci0JCQlmb3IgZnVuYyBpbiBzZWxmLl9pZGxlZnVuY3M6Ci0JCQkJdHJ5OgotCQkJCQlmdW5jKCkKLQkJCQlleGNlcHQ6Ci0JCQkJCWltcG9ydCBzeXMKLQkJCQkJc3lzLnN0ZGVyci53cml0ZSgiZXhjZXB0aW9uIGluIGlkbGUgZnVuY3Rpb24gJXI7IGtpbGxlZDpcbiIgJSAoZnVuYywpKQotCQkJCQl0cmFjZWJhY2sucHJpbnRfZXhjKCkKLQkJCQkJc2VsZi5faWRsZWZ1bmNzLnJlbW92ZShmdW5jKQotCQkJCQlicmVhawotCQotCWRlZiBkb19mcm9udFdpbmRvd01ldGhvZChzZWxmLCBhdHRyLCAqYXJncyk6Ci0JCXdpZCA9IE15RnJvbnRXaW5kb3coKQotCQlpZiB3aWQgYW5kIHNlbGYuX3dpbmRvd3MuaGFzX2tleSh3aWQpOgotCQkJd2luZG93ID0gc2VsZi5fd2luZG93c1t3aWRdCi0JCQlpZiBoYXNhdHRyKHdpbmRvdywgYXR0cik6Ci0JCQkJaGFuZGxlciA9IGdldGF0dHIod2luZG93LCBhdHRyKQotCQkJCWFwcGx5KGhhbmRsZXIsIGFyZ3MpCi0JCQkJcmV0dXJuIDEKLQkJCQkKLQlkZWYgZ2V0ZnJvbnR3aW5kb3coc2VsZik6Ci0JCXdpZCA9IE15RnJvbnRXaW5kb3coKQotCQlpZiB3aWQgYW5kIHNlbGYuX3dpbmRvd3MuaGFzX2tleSh3aWQpOgotCQkJcmV0dXJuIHNlbGYuX3dpbmRvd3Nbd2lkXQotCQlyZXR1cm4gTm9uZQotCQotCWRlZiBhcHBlbmR3aW5kb3coc2VsZiwgd2lkLCB3aW5kb3cpOgotCQlzZWxmLl93aW5kb3dzW3dpZF0gPSB3aW5kb3cKLQkJc2VsZi5tYWtlb3BlbndpbmRvd3NtZW51KCkKLQkJCi0JZGVmIHJlbW92ZXdpbmRvdyhzZWxmLCB3aWQpOgotCQlkZWwgc2VsZi5fd2luZG93c1t3aWRdCi0JCXNlbGYubWFrZW9wZW53aW5kb3dzbWVudSgpCi0JCi0JZGVmIG1ha2VvcGVud2luZG93c21lbnUoc2VsZik6Ci0JCSMgZHVtbXk7IGNvdWxkIGJlIHRoZSBmdWxsIHZlcnNpb24gZnJvbSBQeXRob25JREVNYWluLnB5Ci0JCXNlbGYuX29wZW53aW5kb3dzID0ge30KLQkJc2VsZi5fb3BlbndpbmRvd3NjaGVja21hcmsgPSAwCi0JCWlmIG5vdCBoYXNhdHRyKHNlbGYsICJfbWVudXN0b2NoZWNrIik6Ci0JCQlzZWxmLl9tZW51c3RvY2hlY2sgPSBbXQotCQotCWRlZiBkb19rZXkoc2VsZiwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQljaCA9IGNocihtZXNzYWdlICYgRnJhbWVXb3JrLmNoYXJDb2RlTWFzaykKLQkJcmVzdCA9IG1lc3NhZ2UgJiB+RnJhbWVXb3JrLmNoYXJDb2RlTWFzawotCQlrZXljb2RlID0gKG1lc3NhZ2UgJiBGcmFtZVdvcmsua2V5Q29kZU1hc2spID4+IDgKLQkJaWYga2V5Y29kZSBpbiBzZWxmLmZrZXltYXBzLmtleXMoKToJCSMgSkpTCi0JCQljaCA9IHNlbGYuZmtleW1hcHNba2V5Y29kZV0KLQkJCW1vZGlmaWVycyA9IG1vZGlmaWVycyB8IEZyYW1lV29yay5jbWRLZXkKLQkJd2lkID0gTXlGcm9udFdpbmRvdygpCi0JCWlmIG1vZGlmaWVycyAmIEZyYW1lV29yay5jbWRLZXkgYW5kIG5vdCBtb2RpZmllcnMgJiBGcmFtZVdvcmsuc2hpZnRLZXk6Ci0JCQlpZiB3aWQgYW5kIHNlbGYuX3dpbmRvd3MuaGFzX2tleSh3aWQpOgotCQkJCXNlbGYuY2hlY2ttZW51cyhzZWxmLl93aW5kb3dzW3dpZF0pCi0JCQllbHNlOgotCQkJCXNlbGYuY2hlY2ttZW51cyhOb25lKQotCQkJZXZlbnQgPSAod2hhdCwgb3JkKGNoKSB8IHJlc3QsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpCi0JCQlyZXN1bHQgPSBNZW51VG9vbGJveC5NZW51S2V5KG9yZChjaCkpCi0JCQlpZCA9IChyZXN1bHQ+PjE2KSAmIDB4ZmZmZgkjIEhpIHdvcmQKLQkJCWl0ZW0gPSByZXN1bHQgJiAweGZmZmYJCSMgTG8gd29yZAotCQkJaWYgaWQ6Ci0JCQkJc2VsZi5kb19yYXdtZW51KGlkLCBpdGVtLCBOb25lLCBldmVudCkKLQkJCQlyZXR1cm4JIyBoZXJlISB3ZSBoYWQgYSBtZW51a2V5ISAKLQkJCSNlbHNlOgotCQkJIwlwcmludCAiWFhYIENvbW1hbmQtJXIiICUgY2gKLQkJIyBTZWUgd2hldGhlciB0aGUgZnJvbnQgd2luZG93IHdhbnRzIGl0Ci0JCWlmIHdpZCBhbmQgc2VsZi5fd2luZG93cy5oYXNfa2V5KHdpZCk6Ci0JCQl3aW5kb3cgPSBzZWxmLl93aW5kb3dzW3dpZF0KLQkJCXRyeToKLQkJCQlkb19jaGFyID0gd2luZG93LmRvX2NoYXIKLQkJCWV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLQkJCQlkb19jaGFyID0gc2VsZi5kb19jaGFyCi0JCQlkb19jaGFyKGNoLCBldmVudCkKLQkJIyBlbHNlIGl0IHdhc24ndCBmb3IgdXMsIHNpZ2guLi4KLQkKLQlkZWYgZG9faW5NZW51QmFyKHNlbGYsIHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KToKLQkJUWQuSW5pdEN1cnNvcigpCi0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCXNlbGYuY2hlY2tvcGVud2luZG93c21lbnUoKQotCQl3aWQgPSBNeUZyb250V2luZG93KCkKLQkJaWYgd2lkIGFuZCBzZWxmLl93aW5kb3dzLmhhc19rZXkod2lkKToKLQkJCXNlbGYuY2hlY2ttZW51cyhzZWxmLl93aW5kb3dzW3dpZF0pCi0JCWVsc2U6Ci0JCQlzZWxmLmNoZWNrbWVudXMoTm9uZSkKLQkJcmVzdWx0ID0gTWVudVRvb2xib3guTWVudVNlbGVjdCh3aGVyZSkKLQkJaWQgPSAocmVzdWx0Pj4xNikgJiAweGZmZmYJIyBIaSB3b3JkCi0JCWlmIGlkID49IDB4ODAwMDoKLQkJCWlkID0gLTB4MTAwMDAgKyBpZAotCQlpdGVtID0gcmVzdWx0ICYgMHhmZmZmCQkjIExvIHdvcmQKLQkJc2VsZi5kb19yYXdtZW51KGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KQotCQotCWRlZiBkb191cGRhdGVFdnQoc2VsZiwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQl3aWQgPSBXaW4uV2hpY2hXaW5kb3cobWVzc2FnZSkKLQkJaWYgd2lkIGFuZCBzZWxmLl93aW5kb3dzLmhhc19rZXkod2lkKToKLQkJCXdpbmRvdyA9IHNlbGYuX3dpbmRvd3Nbd2lkXQotCQkJd2luZG93LmRvX3Jhd3VwZGF0ZSh3aWQsIGV2ZW50KQotCQllbHNlOgotCQkJaWYgS0lMTFVOS05PV05XSU5ET1dTIGFuZCB3aWQ6Ci0JCQkJd2lkLkhpZGVXaW5kb3coKQotCQkJCWltcG9ydCBzeXMKLQkJCQlzeXMuc3RkZXJyLndyaXRlKCJYWFgga2lsbGVkIHVua25vd24gKGNyYXNoZWQ/KSBQeXRob24gd2luZG93LlxuIikKLQkJCWVsc2U6Ci0JCQkJaWYgaGFzYXR0cihNYWNPUywgJ0hhbmRsZUV2ZW50Jyk6Ci0JCQkJCU1hY09TLkhhbmRsZUV2ZW50KGV2ZW50KQotCQkJCWVsc2U6Ci0JCQkJCXByaW50ICdVbmV4cGVjdGVkIHVwZGF0ZUV2ZW50OicsIGV2ZW50Ci0JCi0JZGVmIHN1c3BlbmRyZXN1bWUoc2VsZiwgb25vZmYpOgotCQlwYXNzCi0JCi0JZGVmIGRvX3N1c3BlbmRyZXN1bWUoc2VsZiwgZXZlbnQpOgotCQlzZWxmLl9zdXNwZW5kZWQgPSBub3QgZXZlbnRbMV0gJiAxCi0JCUZyYW1lV29yay5BcHBsaWNhdGlvbi5kb19zdXNwZW5kcmVzdW1lKHNlbGYsIGV2ZW50KQotCQotCWRlZiBjaGVja29wZW53aW5kb3dzbWVudShzZWxmKToKLQkJaWYgc2VsZi5fb3BlbndpbmRvd3NjaGVja21hcms6Ci0JCQlzZWxmLm9wZW53aW5kb3dzbWVudS5tZW51LkNoZWNrTWVudUl0ZW0oc2VsZi5fb3BlbndpbmRvd3NjaGVja21hcmssIDApCi0JCXdpbmRvdyA9IE15RnJvbnRXaW5kb3coKQotCQlpZiB3aW5kb3c6Ci0JCQlmb3IgaXRlbSwgd2lkIGluIHNlbGYuX29wZW53aW5kb3dzLml0ZW1zKCk6Ci0JCQkJaWYgd2lkID09IHdpbmRvdzoKLQkJCQkJI3NlbGYucHl0aG9ud2luZG93c21lbnVpdGVtLmNoZWNrKDEpCi0JCQkJCXNlbGYub3BlbndpbmRvd3NtZW51Lm1lbnUuQ2hlY2tNZW51SXRlbShpdGVtLCAxKQotCQkJCQlzZWxmLl9vcGVud2luZG93c2NoZWNrbWFyayA9IGl0ZW0KLQkJCQkJYnJlYWsKLQkJZWxzZToKLQkJCXNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrID0gMAotCQkjaWYgc2VsZi5fb3BlbndpbmRvd3M6Ci0JCSMJc2VsZi5weXRob253aW5kb3dzbWVudWl0ZW0uZW5hYmxlKDEpCi0JCSNlbHNlOgotCQkjCXNlbGYucHl0aG9ud2luZG93c21lbnVpdGVtLmVuYWJsZSgwKQotCQotCWRlZiBjaGVja21lbnVzKHNlbGYsIHdpbmRvdyk6Ci0JCWZvciBpdGVtIGluIHNlbGYuX21lbnVzdG9jaGVjazoKLQkJCWNhbGxiYWNrID0gaXRlbS5tZW51Lml0ZW1zW2l0ZW0uaXRlbS0xXVsyXQotCQkJaWYgdHlwZShjYWxsYmFjaykgPD4gU3RyaW5nVHlwZToKLQkJCQlpdGVtLmVuYWJsZSgxKQotCQkJZWxpZiBoYXNhdHRyKHdpbmRvdywgImRvbWVudV8iICsgY2FsbGJhY2spOgotCQkJCWlmIGhhc2F0dHIod2luZG93LCAiY2FuXyIgKyBjYWxsYmFjayk6Ci0JCQkJCWNhbmhhbmRsZXIgPSBnZXRhdHRyKHdpbmRvdywgImNhbl8iICsgY2FsbGJhY2spCi0JCQkJCWlmIGNhbmhhbmRsZXIoaXRlbSk6Ci0JCQkJCQlpdGVtLmVuYWJsZSgxKQotCQkJCQllbHNlOgotCQkJCQkJaXRlbS5lbmFibGUoMCkKLQkJCQllbHNlOgotCQkJCQlpdGVtLmVuYWJsZSgxKQotCQkJZWxzZToKLQkJCQlpdGVtLmVuYWJsZSgwKQotCQotCWRlZiBlbmFibGVtZW51YmFyKHNlbGYsIG9ub2ZmKToKLQkJZm9yIG0gaW4gc2VsZi5tZW51YmFyLm1lbnVzLnZhbHVlcygpOgotCQkJaWYgb25vZmY6Ci0JCQkJbS5tZW51LkVuYWJsZU1lbnVJdGVtKDApCi0JCQllbGlmIG0ubWVudS5HZXRNZW51SXRlbVRleHQoMykgPD4gJ0N1dCc6ICMgZXcuLi4KLQkJCQltLm1lbnUuRGlzYWJsZU1lbnVJdGVtKDApCi0JCU1lbnVUb29sYm94LkRyYXdNZW51QmFyKCkKLQkKLQlkZWYgbWFrZW1lbnViYXIoc2VsZik6Ci0JCXNlbGYubWVudWJhciA9IE1lbnVCYXIoc2VsZikKLQkJRnJhbWVXb3JrLkFwcGxlTWVudShzZWxmLm1lbnViYXIsIHNlbGYuZ2V0YWJvdXR0ZXh0KCksIHNlbGYuZG9fYWJvdXQpCi0JCXNlbGYubWFrZXVzZXJtZW51cygpCi0JCi0JZGVmIHNjcmlwdHN3YWxrKHNlbGYsIHRvcCwgbWVudSwgZG9uZT1Ob25lKToKLQkJaWYgbWVudS5pZCA+IDIwMDoKLQkJCWltcG9ydCBXCi0JCQlXLk1lc3NhZ2UoIlNjcmlwdHMgZm9sZGVyIG5vdCBjb21wbGV0ZWx5IHRyYXZlcnNlZDogcnVubmluZyBvdXQgb2YgbWVudXMiKQotCQkJcmV0dXJuIEZhbHNlCi0JCWlmIGRvbmUgaXMgTm9uZToKLQkJCWRvbmUgPSB7fQotCQlpZiBkb25lLmhhc19rZXkodG9wKToKLQkJCXJldHVybiBUcnVlCi0JCWRvbmVbdG9wXSA9IDEKLQkJaW1wb3J0IG9zLCBzdHJpbmcKLQkJdHJ5OgotCQkJbmFtZXMgPSBvcy5saXN0ZGlyKHRvcCkKLQkJZXhjZXB0IG9zLmVycm9yOgotCQkJRnJhbWVXb3JrLk1lbnVJdGVtKG1lbnUsICcoU2NyaXB0cyBGb2xkZXIgbm90IGZvdW5kKScsIE5vbmUsIE5vbmUpCi0JCQlyZXR1cm4gVHJ1ZQotCQlzYXZlZGlyID0gb3MuZ2V0Y3dkKCkKLQkJb3MuY2hkaXIodG9wKQotCQlmb3IgbmFtZSBpbiBuYW1lczoKLQkJCWlmIG5hbWUgPT0gIkNWUyI6Ci0JCQkJY29udGludWUKLQkJCXRyeToKLQkJCQlmc3IsIGlzZGlyLCBpc2FsaWFzID0gRmlsZS5GU1Jlc29sdmVBbGlhc0ZpbGUobmFtZSwgMSkKLQkJCWV4Y2VwdDoKLQkJCQkjIG1heWJlIGEgYnJva2VuIGFsaWFzCi0JCQkJY29udGludWUKLQkJCXBhdGggPSBmc3IuYXNfcGF0aG5hbWUoKQotCQkJaWYgZG9uZS5oYXNfa2V5KHBhdGgpOgotCQkJCWNvbnRpbnVlCi0JCQluYW1lID0gc3RyaW5nLnN0cmlwKG5hbWUpCi0JCQlpZiBvcy5uYW1lID09ICJwb3NpeCI6Ci0JCQkJbmFtZSA9IHVuaWNvZGUobmFtZSwgInV0Zi04IikKLQkJCWlmIG5hbWVbLTM6XSA9PSAnLS0tJzoKLQkJCQltZW51LmFkZHNlcGFyYXRvcigpCi0JCQllbGlmIGlzZGlyOgotCQkJCXN1Ym1lbnUgPSBGcmFtZVdvcmsuU3ViTWVudShtZW51LCBuYW1lKQotCQkJCWlmIG5vdCBzZWxmLnNjcmlwdHN3YWxrKHBhdGgsIHN1Ym1lbnUsIGRvbmUpOgotCQkJCQlyZXR1cm4gRmFsc2UKLQkJCWVsc2U6Ci0JCQkJY3JlYXRvciwgdHlwZSA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKHBhdGgpCi0JCQkJaWYgdHlwZSA9PSAnVEVYVCc6Ci0JCQkJCWlmIG5hbWVbLTM6XSA9PSAnLnB5JzoKLQkJCQkJCW5hbWUgPSBuYW1lWzotM10KLQkJCQkJaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtZW51LCBuYW1lLCBOb25lLCBzZWxmLmRvbWVudV9zY3JpcHQpCi0JCQkJCXNlbGYuX3NjcmlwdHNbKG1lbnUuaWQsIGl0ZW0uaXRlbSldID0gcGF0aAotCQkJZG9uZVtwYXRoXSA9IDEKLQkJb3MuY2hkaXIoc2F2ZWRpcikKLQkJcmV0dXJuIFRydWUKLQkKLQlkZWYgZG9tZW51X3NjcmlwdChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCXBhdGggPSBzZWxmLl9zY3JpcHRzWyhpZCwgaXRlbSldCi0JCWltcG9ydCBvcwotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0JCQlzZWxmLm1ha2VzY3JpcHRzbWVudSgpCi0JCQlpbXBvcnQgVwotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiRmlsZSBub3QgZm91bmQuIgotCQlpZiBvcmQoRXZ0LkdldEtleXMoKVs3XSkgJiA0OgotCQkJc2VsZi5vcGVuc2NyaXB0KHBhdGgpCi0JCWVsc2U6Ci0JCQlpbXBvcnQgVywgTWFjT1MsIHN5cwotCQkJVy5TZXRDdXJzb3IoIndhdGNoIikKLQkJCXN5cy5hcmd2ID0gW3BhdGhdCi0JCQkjY3dkID0gb3MuZ2V0Y3dkKCkKLQkJCSNvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUocGF0aCkgKyAnOicpCi0JCQl0cnk6Ci0JCQkJIyB4eHggaWYgdGhlcmUgaXMgYSBzY3JpcHQgd2luZG93IGZvciB0aGlzIGZpbGUsCi0JCQkJIyBleGVjIGluIHRoYXQgd2luZG93J3MgbmFtZXNwYWNlLgotCQkJCSMgeHh4IHdoYXQgdG8gZG8gd2hlbiBpdCdzIG5vdCBzYXZlZD8/PwotCQkJCSMgcHJvbXQgdG8gc2F2ZT8KLQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgwKQotCQkJCWV4ZWNmaWxlKHBhdGgsIHsnX19uYW1lX18nOiAnX19tYWluX18nLCAnX19maWxlX18nOiBwYXRofSkKLQkJCWV4Y2VwdCBXLkFsZXJ0RXJyb3IsIGRldGFpbDoKLQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkJCQlyYWlzZSBXLkFsZXJ0RXJyb3IsIGRldGFpbAotCQkJZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotCQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQkJTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQotCQkJZXhjZXB0OgotCQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQkJTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQotCQkJCWltcG9ydCBQeUVkaXQKLQkJCQlQeUVkaXQudHJhY2ViYWNrd2luZG93LnRyYWNlYmFjaygxKQotCQkJZWxzZToKLQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkJCSNvcy5jaGRpcihjd2QpCi0JCi0JZGVmIG9wZW5zY3JpcHQoc2VsZiwgZmlsZW5hbWUsIGxpbmVubz1Ob25lLCBjaGFyb2Zmc2V0PTAsIG1vZG5hbWU9IiIpOgotCQlpbXBvcnQgb3MsIFB5RWRpdCwgVwotCQllZGl0b3IgPSBzZWxmLmdldHNjcmlwdChmaWxlbmFtZSkKLQkJaWYgZWRpdG9yOgotCQkJZWRpdG9yLnNlbGVjdCgpCi0JCWVsaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgotCQkJZWRpdG9yID0gUHlFZGl0LkVkaXRvcihmaWxlbmFtZSkKLQkJZWxpZiBmaWxlbmFtZVstMzpdID09ICcucHknIG9yIGZpbGVuYW1lWy00Ol0gPT0gJy5weWMnOgotCQkJaW1wb3J0IGltcAotCQkJaWYgbm90IG1vZG5hbWU6Ci0JCQkJaWYgZmlsZW5hbWVbLTFdID09ICdjJzoKLQkJCQkJbW9kbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpWzotNF0KLQkJCQllbHNlOgotCQkJCQltb2RuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSlbOi0zXQotCQkJdHJ5OgotCQkJCSMgWFhYIFRoaXMgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgd2l0aCBwYWNrYWdlcyEKLQkJCQkjIFhYWCBUaGUgZG9jcyBzYXkgd2Ugc2hvdWxkIGRvIGl0IG1hbnVhbGx5LCBwYWNrLCB0aGVuIHN1YiwgdGhlbiBzdWIyIGV0Yy4gCi0JCQkJIyBYWFggSXQgc2F5cyB3ZSBzaG91bGQgdXNlIGltcC5sb2FkX21vZHVsZSgpLCBidXQgdGhhdCAqcmVsb2FkcyogYSBwYWNrYWdlLAotCQkJCSMgWFhYIGFuZCB0aGF0J3MgdGhlIGxhc3QgdGhpbmcgd2Ugd2FudCBoZXJlLgotCQkJCWYsIGZpbGVuYW1lLCAoc3VmZiwgbW9kZSwgZHVtbXkpID0gaW1wLmZpbmRfbW9kdWxlKG1vZG5hbWUpCi0JCQlleGNlcHQgSW1wb3J0RXJyb3I6Ci0JCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBmaWxlIGZvciBcIiVzXCIiICUgbW9kbmFtZQotCQkJZWxzZToKLQkJCQlpZiBub3QgZjoKLQkJCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBmaWxlIGZvciBcIiVzXCIiICUgbW9kbmFtZQotCQkJCWYuY2xvc2UoKQotCQkJaWYgc3VmZiA9PSAnLnB5JzoKLQkJCQlzZWxmLm9wZW5zY3JpcHQoZmlsZW5hbWUsIGxpbmVubywgY2hhcm9mZnNldCkKLQkJCQlyZXR1cm4KLQkJCWVsc2U6Ci0JCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBmaWxlIGZvciBcIiVzXCIiICUgbW9kbmFtZQotCQllbHNlOgotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiIgJSBmaWxlbmFtZQotCQlpZiBsaW5lbm8gaXMgbm90IE5vbmU6Ci0JCQllZGl0b3Iuc2VsZWN0bGluZShsaW5lbm8sIGNoYXJvZmZzZXQpCi0JCXJldHVybiBlZGl0b3IKLQkKLQlkZWYgZ2V0c2NyaXB0KHNlbGYsIGZpbGVuYW1lKToKLQkJaWYgZmlsZW5hbWVbOjFdID09ICc8JyBhbmQgZmlsZW5hbWVbLTE6XSA9PSAnPic6Ci0JCQlmaWxlbmFtZSA9IGZpbGVuYW1lWzE6LTFdCi0JCWltcG9ydCBzdHJpbmcKLQkJbG93cGF0aCA9IHN0cmluZy5sb3dlcihmaWxlbmFtZSkKLQkJZm9yIHdpZCwgd2luZG93IGluIHNlbGYuX3dpbmRvd3MuaXRlbXMoKToKLQkJCWlmIGhhc2F0dHIod2luZG93LCAicGF0aCIpIGFuZCB0eXBlKHdpbmRvdy5wYXRoKSA9PSBTdHJpbmdUeXBlIGFuZCBcCi0JCQkJCWxvd3BhdGggPT0gc3RyaW5nLmxvd2VyKHdpbmRvdy5wYXRoKToKLQkJCQlyZXR1cm4gd2luZG93Ci0JCQllbGlmIGhhc2F0dHIod2luZG93LCAicGF0aCIpIGFuZCBmaWxlbmFtZSA9PSB3aWQuR2V0V1RpdGxlKCk6Ci0JCQkJcmV0dXJuIHdpbmRvdwotCQotCWRlZiBnZXRwcmVmcyhzZWxmKToKLQkJaW1wb3J0IE1hY1ByZWZzCi0JCXJldHVybiBNYWNQcmVmcy5HZXRQcmVmcyhzZWxmLnByZWZmaWxlcGF0aCkKLQkKLQlkZWYgZG9fZWRpdG9ycHJlZnMoc2VsZiwgKmFyZ3MpOgotCQlpbXBvcnQgUHlFZGl0Ci0JCVB5RWRpdC5FZGl0b3JEZWZhdWx0U2V0dGluZ3MoKQotCQotCWRlZiBkb19zZXR3aW5kb3dmb250KHNlbGYsICphcmdzKToKLQkJaW1wb3J0IEZvbnRTZXR0aW5ncywgVwotCQlwcmVmcyA9IHNlbGYuZ2V0cHJlZnMoKQotCQlzZXR0aW5ncyA9IEZvbnRTZXR0aW5ncy5Gb250RGlhbG9nKHByZWZzLmRlZmF1bHRmb250KQotCQlpZiBzZXR0aW5nczoKLQkJCXByZWZzLmRlZmF1bHRmb250LCB0YWJzZXR0aW5ncyA9IHNldHRpbmdzCi0JCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJOb3RlIHRoYXQgY2hhbmdlcyB3aWxsIG9ubHkgYWZmZWN0IG5ldyB3aW5kb3dzISIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaWduYXR1cmU9J1B5dGgnKToKKyAgICAgICAgIyBPcGVuIG91ciByZXNvdXJjZSBmaWxlLCBpZiBpdCBpcyBub3Qgb3BlbiB5ZXQKKyAgICAgICAgbWFjcmVzb3VyY2UubmVlZCgnQ1VSUycsIDQ2OCwgIldpZGdldHMucnNyYyIpCisgICAgICAgIGltcG9ydCBXCisgICAgICAgIFcuc2V0YXBwbGljYXRpb24oc2VsZiwgc2lnbmF0dXJlKQorICAgICAgICBGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fc3VzcGVuZGVkID0gMAorICAgICAgICBzZWxmLnF1aXR0aW5nID0gMAorICAgICAgICBzZWxmLmRlYnVnZ2VyX3F1aXR0aW5nID0gMQorICAgICAgICBzZWxmLkRlYnVnZ2VyUXVpdCA9ICdEZWJ1Z2dlclF1aXREdW1teUV4Y2VwdGlvbicKKyAgICAgICAgc2VsZi5faWRsZWZ1bmNzID0gW10KKyAgICAgICAgIyBtYXAgY2VydGFpbiBGIGtleSBjb2RlcyB0byBlcXVpdmFsZW50IGNvbW1hbmQtbGV0dGVyIGNvbWJvcyAoSkpTKQorICAgICAgICBzZWxmLmZrZXltYXBzID0gezEyMjoieiIsIDEyMDoieCIsIDk5OiJjIiwgMTE4OiJ2In0KKworICAgIGRlZiBtYWlubG9vcChzZWxmLCBtYXNrPUZyYW1lV29yay5ldmVyeUV2ZW50LCB3YWl0PU5vbmUpOgorICAgICAgICBpbXBvcnQgVworICAgICAgICBzZWxmLnF1aXR0aW5nID0gMAorICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICBzYXZleWllbGQgPSBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXR0aW5nOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kbzFldmVudChtYXNrLCB3YWl0KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBXLkFsZXJ0RXJyb3IsIGRldGFpbDoKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQorICAgICAgICAgICAgICAgICAgICBXLk1lc3NhZ2UoZGV0YWlsKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzZWxmLkRlYnVnZ2VyUXVpdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgUHlFZGl0CisgICAgICAgICAgICAgICAgICAgIFB5RWRpdC50cmFjZWJhY2t3aW5kb3cudHJhY2ViYWNrKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goMSkKKworICAgIGRlZiBkZWJ1Z2dlcl9tYWlubG9vcChzZWxmLCBtYXNrPUZyYW1lV29yay5ldmVyeUV2ZW50LCB3YWl0PU5vbmUpOgorICAgICAgICBpbXBvcnQgVworICAgICAgICBzZWxmLmRlYnVnZ2VyX3F1aXR0aW5nID0gMAorICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICBzYXZleWllbGQgPSBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXR0aW5nIGFuZCBub3Qgc2VsZi5kZWJ1Z2dlcl9xdWl0dGluZzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZG8xZXZlbnQobWFzaywgd2FpdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVy5BbGVydEVycm9yLCBkZXRhaWw6CisgICAgICAgICAgICAgICAgICAgIFcuTWVzc2FnZShkZXRhaWwpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgUHlFZGl0CisgICAgICAgICAgICAgICAgICAgIFB5RWRpdC50cmFjZWJhY2t3aW5kb3cudHJhY2ViYWNrKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goc2F2ZXlpZWxkKQorCisgICAgZGVmIGJyZWF0aGUoc2VsZiwgd2FpdD0xKToKKyAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgb2ssIGV2ZW50ID0gRXZ0LldhaXROZXh0RXZlbnQoRnJhbWVXb3JrLnVwZGF0ZU1hc2sgfAorICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVXb3JrLm1Eb3duTWFzayB8IEZyYW1lV29yay5vc01hc2sgfAorICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVXb3JrLmFjdGl2TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQpCisgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgICAgICNwcmludCBGcmFtZVdvcmsuZXZlbnRuYW1lW3doYXRdCisgICAgICAgICAgICBpZiBGcmFtZVdvcmsuZXZlbnRuYW1lW3doYXRdID09ICdtb3VzZURvd24nOgorICAgICAgICAgICAgICAgIHBhcnRjb2RlLCB3aWQgPSBXaW4uRmluZFdpbmRvdyh3aGVyZSkKKyAgICAgICAgICAgICAgICBpZiBGcmFtZVdvcmsucGFydG5hbWVbcGFydGNvZGVdIDw+ICdpbkRlc2snOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgVy5TZXRDdXJzb3IoJ3dhdGNoJykKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2goZXZlbnQpCisKKyAgICBkZWYgcmVmcmVzaHdpbmRvd3Moc2VsZiwgd2FpdD0xKToKKyAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIG9rLCBldmVudCA9IEV2dC5XYWl0TmV4dEV2ZW50KEZyYW1lV29yay51cGRhdGVNYXNrLCB3YWl0KQorICAgICAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGV2ZW50KQorCisgICAgZGVmIGFkZGlkbGVmdW5jKHNlbGYsIGZ1bmMpOgorICAgICAgICBzZWxmLl9pZGxlZnVuY3MuYXBwZW5kKGZ1bmMpCisKKyAgICBkZWYgcmVtb3ZlaWRsZWZ1bmMoc2VsZiwgZnVuYyk6CisgICAgICAgIHNlbGYuX2lkbGVmdW5jcy5yZW1vdmUoZnVuYykKKworICAgIGRlZiBpZGxlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IHNlbGYuX3N1c3BlbmRlZDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRvX2Zyb250V2luZG93TWV0aG9kKCJpZGxlIiwgZXZlbnQpOgorICAgICAgICAgICAgICAgIFFkLkluaXRDdXJzb3IoKQorICAgICAgICBpZiBzZWxmLl9pZGxlZnVuY3M6CisgICAgICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLl9pZGxlZnVuY3M6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiZXhjZXB0aW9uIGluIGlkbGUgZnVuY3Rpb24gJXI7IGtpbGxlZDpcbiIgJSAoZnVuYywpKQorICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faWRsZWZ1bmNzLnJlbW92ZShmdW5jKQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIGRvX2Zyb250V2luZG93TWV0aG9kKHNlbGYsIGF0dHIsICphcmdzKToKKyAgICAgICAgd2lkID0gTXlGcm9udFdpbmRvdygpCisgICAgICAgIGlmIHdpZCBhbmQgc2VsZi5fd2luZG93cy5oYXNfa2V5KHdpZCk6CisgICAgICAgICAgICB3aW5kb3cgPSBzZWxmLl93aW5kb3dzW3dpZF0KKyAgICAgICAgICAgIGlmIGhhc2F0dHIod2luZG93LCBhdHRyKToKKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gZ2V0YXR0cih3aW5kb3csIGF0dHIpCisgICAgICAgICAgICAgICAgYXBwbHkoaGFuZGxlciwgYXJncykKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGdldGZyb250d2luZG93KHNlbGYpOgorICAgICAgICB3aWQgPSBNeUZyb250V2luZG93KCkKKyAgICAgICAgaWYgd2lkIGFuZCBzZWxmLl93aW5kb3dzLmhhc19rZXkod2lkKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl93aW5kb3dzW3dpZF0KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBhcHBlbmR3aW5kb3coc2VsZiwgd2lkLCB3aW5kb3cpOgorICAgICAgICBzZWxmLl93aW5kb3dzW3dpZF0gPSB3aW5kb3cKKyAgICAgICAgc2VsZi5tYWtlb3BlbndpbmRvd3NtZW51KCkKKworICAgIGRlZiByZW1vdmV3aW5kb3coc2VsZiwgd2lkKToKKyAgICAgICAgZGVsIHNlbGYuX3dpbmRvd3Nbd2lkXQorICAgICAgICBzZWxmLm1ha2VvcGVud2luZG93c21lbnUoKQorCisgICAgZGVmIG1ha2VvcGVud2luZG93c21lbnUoc2VsZik6CisgICAgICAgICMgZHVtbXk7IGNvdWxkIGJlIHRoZSBmdWxsIHZlcnNpb24gZnJvbSBQeXRob25JREVNYWluLnB5CisgICAgICAgIHNlbGYuX29wZW53aW5kb3dzID0ge30KKyAgICAgICAgc2VsZi5fb3BlbndpbmRvd3NjaGVja21hcmsgPSAwCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICJfbWVudXN0b2NoZWNrIik6CisgICAgICAgICAgICBzZWxmLl9tZW51c3RvY2hlY2sgPSBbXQorCisgICAgZGVmIGRvX2tleShzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIGNoID0gY2hyKG1lc3NhZ2UgJiBGcmFtZVdvcmsuY2hhckNvZGVNYXNrKQorICAgICAgICByZXN0ID0gbWVzc2FnZSAmIH5GcmFtZVdvcmsuY2hhckNvZGVNYXNrCisgICAgICAgIGtleWNvZGUgPSAobWVzc2FnZSAmIEZyYW1lV29yay5rZXlDb2RlTWFzaykgPj4gOAorICAgICAgICBpZiBrZXljb2RlIGluIHNlbGYuZmtleW1hcHMua2V5cygpOiAgICAgICAgICAgICAjIEpKUworICAgICAgICAgICAgY2ggPSBzZWxmLmZrZXltYXBzW2tleWNvZGVdCisgICAgICAgICAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMgfCBGcmFtZVdvcmsuY21kS2V5CisgICAgICAgIHdpZCA9IE15RnJvbnRXaW5kb3coKQorICAgICAgICBpZiBtb2RpZmllcnMgJiBGcmFtZVdvcmsuY21kS2V5IGFuZCBub3QgbW9kaWZpZXJzICYgRnJhbWVXb3JrLnNoaWZ0S2V5OgorICAgICAgICAgICAgaWYgd2lkIGFuZCBzZWxmLl93aW5kb3dzLmhhc19rZXkod2lkKToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrbWVudXMoc2VsZi5fd2luZG93c1t3aWRdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrbWVudXMoTm9uZSkKKyAgICAgICAgICAgIGV2ZW50ID0gKHdoYXQsIG9yZChjaCkgfCByZXN0LCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKQorICAgICAgICAgICAgcmVzdWx0ID0gTWVudVRvb2xib3guTWVudUtleShvcmQoY2gpKQorICAgICAgICAgICAgaWQgPSAocmVzdWx0Pj4xNikgJiAweGZmZmYgICAgICAjIEhpIHdvcmQKKyAgICAgICAgICAgIGl0ZW0gPSByZXN1bHQgJiAweGZmZmYgICAgICAgICAgIyBMbyB3b3JkCisgICAgICAgICAgICBpZiBpZDoKKyAgICAgICAgICAgICAgICBzZWxmLmRvX3Jhd21lbnUoaWQsIGl0ZW0sIE5vbmUsIGV2ZW50KQorICAgICAgICAgICAgICAgIHJldHVybiAgIyBoZXJlISB3ZSBoYWQgYSBtZW51a2V5IQorICAgICAgICAgICAgI2Vsc2U6CisgICAgICAgICAgICAjICAgICAgIHByaW50ICJYWFggQ29tbWFuZC0lciIgJSBjaAorICAgICAgICAjIFNlZSB3aGV0aGVyIHRoZSBmcm9udCB3aW5kb3cgd2FudHMgaXQKKyAgICAgICAgaWYgd2lkIGFuZCBzZWxmLl93aW5kb3dzLmhhc19rZXkod2lkKToKKyAgICAgICAgICAgIHdpbmRvdyA9IHNlbGYuX3dpbmRvd3Nbd2lkXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRvX2NoYXIgPSB3aW5kb3cuZG9fY2hhcgorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGRvX2NoYXIgPSBzZWxmLmRvX2NoYXIKKyAgICAgICAgICAgIGRvX2NoYXIoY2gsIGV2ZW50KQorICAgICAgICAjIGVsc2UgaXQgd2Fzbid0IGZvciB1cywgc2lnaC4uLgorCisgICAgZGVmIGRvX2luTWVudUJhcihzZWxmLCBwYXJ0Y29kZSwgd2luZG93LCBldmVudCk6CisgICAgICAgIFFkLkluaXRDdXJzb3IoKQorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICBzZWxmLmNoZWNrb3BlbndpbmRvd3NtZW51KCkKKyAgICAgICAgd2lkID0gTXlGcm9udFdpbmRvdygpCisgICAgICAgIGlmIHdpZCBhbmQgc2VsZi5fd2luZG93cy5oYXNfa2V5KHdpZCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrbWVudXMoc2VsZi5fd2luZG93c1t3aWRdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jaGVja21lbnVzKE5vbmUpCisgICAgICAgIHJlc3VsdCA9IE1lbnVUb29sYm94Lk1lbnVTZWxlY3Qod2hlcmUpCisgICAgICAgIGlkID0gKHJlc3VsdD4+MTYpICYgMHhmZmZmICAgICAgIyBIaSB3b3JkCisgICAgICAgIGlmIGlkID49IDB4ODAwMDoKKyAgICAgICAgICAgIGlkID0gLTB4MTAwMDAgKyBpZAorICAgICAgICBpdGVtID0gcmVzdWx0ICYgMHhmZmZmICAgICAgICAgICMgTG8gd29yZAorICAgICAgICBzZWxmLmRvX3Jhd21lbnUoaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpCisKKyAgICBkZWYgZG9fdXBkYXRlRXZ0KHNlbGYsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgd2lkID0gV2luLldoaWNoV2luZG93KG1lc3NhZ2UpCisgICAgICAgIGlmIHdpZCBhbmQgc2VsZi5fd2luZG93cy5oYXNfa2V5KHdpZCk6CisgICAgICAgICAgICB3aW5kb3cgPSBzZWxmLl93aW5kb3dzW3dpZF0KKyAgICAgICAgICAgIHdpbmRvdy5kb19yYXd1cGRhdGUod2lkLCBldmVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIEtJTExVTktOT1dOV0lORE9XUyBhbmQgd2lkOgorICAgICAgICAgICAgICAgIHdpZC5IaWRlV2luZG93KCkKKyAgICAgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiWFhYIGtpbGxlZCB1bmtub3duIChjcmFzaGVkPykgUHl0aG9uIHdpbmRvdy5cbiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdIYW5kbGVFdmVudCcpOgorICAgICAgICAgICAgICAgICAgICBNYWNPUy5IYW5kbGVFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnVW5leHBlY3RlZCB1cGRhdGVFdmVudDonLCBldmVudAorCisgICAgZGVmIHN1c3BlbmRyZXN1bWUoc2VsZiwgb25vZmYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZG9fc3VzcGVuZHJlc3VtZShzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuX3N1c3BlbmRlZCA9IG5vdCBldmVudFsxXSAmIDEKKyAgICAgICAgRnJhbWVXb3JrLkFwcGxpY2F0aW9uLmRvX3N1c3BlbmRyZXN1bWUoc2VsZiwgZXZlbnQpCisKKyAgICBkZWYgY2hlY2tvcGVud2luZG93c21lbnUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrOgorICAgICAgICAgICAgc2VsZi5vcGVud2luZG93c21lbnUubWVudS5DaGVja01lbnVJdGVtKHNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrLCAwKQorICAgICAgICB3aW5kb3cgPSBNeUZyb250V2luZG93KCkKKyAgICAgICAgaWYgd2luZG93OgorICAgICAgICAgICAgZm9yIGl0ZW0sIHdpZCBpbiBzZWxmLl9vcGVud2luZG93cy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIHdpZCA9PSB3aW5kb3c6CisgICAgICAgICAgICAgICAgICAgICNzZWxmLnB5dGhvbndpbmRvd3NtZW51aXRlbS5jaGVjaygxKQorICAgICAgICAgICAgICAgICAgICBzZWxmLm9wZW53aW5kb3dzbWVudS5tZW51LkNoZWNrTWVudUl0ZW0oaXRlbSwgMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3BlbndpbmRvd3NjaGVja21hcmsgPSBpdGVtCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9vcGVud2luZG93c2NoZWNrbWFyayA9IDAKKyAgICAgICAgI2lmIHNlbGYuX29wZW53aW5kb3dzOgorICAgICAgICAjICAgICAgIHNlbGYucHl0aG9ud2luZG93c21lbnVpdGVtLmVuYWJsZSgxKQorICAgICAgICAjZWxzZToKKyAgICAgICAgIyAgICAgICBzZWxmLnB5dGhvbndpbmRvd3NtZW51aXRlbS5lbmFibGUoMCkKKworICAgIGRlZiBjaGVja21lbnVzKHNlbGYsIHdpbmRvdyk6CisgICAgICAgIGZvciBpdGVtIGluIHNlbGYuX21lbnVzdG9jaGVjazoKKyAgICAgICAgICAgIGNhbGxiYWNrID0gaXRlbS5tZW51Lml0ZW1zW2l0ZW0uaXRlbS0xXVsyXQorICAgICAgICAgICAgaWYgdHlwZShjYWxsYmFjaykgPD4gU3RyaW5nVHlwZToKKyAgICAgICAgICAgICAgICBpdGVtLmVuYWJsZSgxKQorICAgICAgICAgICAgZWxpZiBoYXNhdHRyKHdpbmRvdywgImRvbWVudV8iICsgY2FsbGJhY2spOgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIod2luZG93LCAiY2FuXyIgKyBjYWxsYmFjayk6CisgICAgICAgICAgICAgICAgICAgIGNhbmhhbmRsZXIgPSBnZXRhdHRyKHdpbmRvdywgImNhbl8iICsgY2FsbGJhY2spCisgICAgICAgICAgICAgICAgICAgIGlmIGNhbmhhbmRsZXIoaXRlbSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmVuYWJsZSgxKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5lbmFibGUoMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpdGVtLmVuYWJsZSgxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpdGVtLmVuYWJsZSgwKQorCisgICAgZGVmIGVuYWJsZW1lbnViYXIoc2VsZiwgb25vZmYpOgorICAgICAgICBmb3IgbSBpbiBzZWxmLm1lbnViYXIubWVudXMudmFsdWVzKCk6CisgICAgICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgICAgICBtLm1lbnUuRW5hYmxlTWVudUl0ZW0oMCkKKyAgICAgICAgICAgIGVsaWYgbS5tZW51LkdldE1lbnVJdGVtVGV4dCgzKSA8PiAnQ3V0JzogIyBldy4uLgorICAgICAgICAgICAgICAgIG0ubWVudS5EaXNhYmxlTWVudUl0ZW0oMCkKKyAgICAgICAgTWVudVRvb2xib3guRHJhd01lbnVCYXIoKQorCisgICAgZGVmIG1ha2VtZW51YmFyKHNlbGYpOgorICAgICAgICBzZWxmLm1lbnViYXIgPSBNZW51QmFyKHNlbGYpCisgICAgICAgIEZyYW1lV29yay5BcHBsZU1lbnUoc2VsZi5tZW51YmFyLCBzZWxmLmdldGFib3V0dGV4dCgpLCBzZWxmLmRvX2Fib3V0KQorICAgICAgICBzZWxmLm1ha2V1c2VybWVudXMoKQorCisgICAgZGVmIHNjcmlwdHN3YWxrKHNlbGYsIHRvcCwgbWVudSwgZG9uZT1Ob25lKToKKyAgICAgICAgaWYgbWVudS5pZCA+IDIwMDoKKyAgICAgICAgICAgIGltcG9ydCBXCisgICAgICAgICAgICBXLk1lc3NhZ2UoIlNjcmlwdHMgZm9sZGVyIG5vdCBjb21wbGV0ZWx5IHRyYXZlcnNlZDogcnVubmluZyBvdXQgb2YgbWVudXMiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGRvbmUgaXMgTm9uZToKKyAgICAgICAgICAgIGRvbmUgPSB7fQorICAgICAgICBpZiBkb25lLmhhc19rZXkodG9wKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGRvbmVbdG9wXSA9IDEKKyAgICAgICAgaW1wb3J0IG9zLCBzdHJpbmcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHRvcCkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgRnJhbWVXb3JrLk1lbnVJdGVtKG1lbnUsICcoU2NyaXB0cyBGb2xkZXIgbm90IGZvdW5kKScsIE5vbmUsIE5vbmUpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBzYXZlZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG9wKQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gIkNWUyI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmc3IsIGlzZGlyLCBpc2FsaWFzID0gRmlsZS5GU1Jlc29sdmVBbGlhc0ZpbGUobmFtZSwgMSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIG1heWJlIGEgYnJva2VuIGFsaWFzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHBhdGggPSBmc3IuYXNfcGF0aG5hbWUoKQorICAgICAgICAgICAgaWYgZG9uZS5oYXNfa2V5KHBhdGgpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBuYW1lID0gc3RyaW5nLnN0cmlwKG5hbWUpCisgICAgICAgICAgICBpZiBvcy5uYW1lID09ICJwb3NpeCI6CisgICAgICAgICAgICAgICAgbmFtZSA9IHVuaWNvZGUobmFtZSwgInV0Zi04IikKKyAgICAgICAgICAgIGlmIG5hbWVbLTM6XSA9PSAnLS0tJzoKKyAgICAgICAgICAgICAgICBtZW51LmFkZHNlcGFyYXRvcigpCisgICAgICAgICAgICBlbGlmIGlzZGlyOgorICAgICAgICAgICAgICAgIHN1Ym1lbnUgPSBGcmFtZVdvcmsuU3ViTWVudShtZW51LCBuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNjcmlwdHN3YWxrKHBhdGgsIHN1Ym1lbnUsIGRvbmUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY3JlYXRvciwgdHlwZSA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKHBhdGgpCisgICAgICAgICAgICAgICAgaWYgdHlwZSA9PSAnVEVYVCc6CisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWVbLTM6XSA9PSAnLnB5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotM10KKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtZW51LCBuYW1lLCBOb25lLCBzZWxmLmRvbWVudV9zY3JpcHQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NjcmlwdHNbKG1lbnUuaWQsIGl0ZW0uaXRlbSldID0gcGF0aAorICAgICAgICAgICAgZG9uZVtwYXRoXSA9IDEKKyAgICAgICAgb3MuY2hkaXIoc2F2ZWRpcikKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBkb21lbnVfc2NyaXB0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgcGF0aCA9IHNlbGYuX3NjcmlwdHNbKGlkLCBpdGVtKV0KKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgIHNlbGYubWFrZXNjcmlwdHNtZW51KCkKKyAgICAgICAgICAgIGltcG9ydCBXCisgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICJGaWxlIG5vdCBmb3VuZC4iCisgICAgICAgIGlmIG9yZChFdnQuR2V0S2V5cygpWzddKSAmIDQ6CisgICAgICAgICAgICBzZWxmLm9wZW5zY3JpcHQocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGltcG9ydCBXLCBNYWNPUywgc3lzCisgICAgICAgICAgICBXLlNldEN1cnNvcigid2F0Y2giKQorICAgICAgICAgICAgc3lzLmFyZ3YgPSBbcGF0aF0KKyAgICAgICAgICAgICNjd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgI29zLmNoZGlyKG9zLnBhdGguZGlybmFtZShwYXRoKSArICc6JykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIHh4eCBpZiB0aGVyZSBpcyBhIHNjcmlwdCB3aW5kb3cgZm9yIHRoaXMgZmlsZSwKKyAgICAgICAgICAgICAgICAjIGV4ZWMgaW4gdGhhdCB3aW5kb3cncyBuYW1lc3BhY2UuCisgICAgICAgICAgICAgICAgIyB4eHggd2hhdCB0byBkbyB3aGVuIGl0J3Mgbm90IHNhdmVkPz8/CisgICAgICAgICAgICAgICAgIyBwcm9tdCB0byBzYXZlPworICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKDApCisgICAgICAgICAgICAgICAgZXhlY2ZpbGUocGF0aCwgeydfX25hbWVfXyc6ICdfX21haW5fXycsICdfX2ZpbGVfXyc6IHBhdGh9KQorICAgICAgICAgICAgZXhjZXB0IFcuQWxlcnRFcnJvciwgZGV0YWlsOgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQorICAgICAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgZGV0YWlsCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCisgICAgICAgICAgICAgICAgaW1wb3J0IFB5RWRpdAorICAgICAgICAgICAgICAgIFB5RWRpdC50cmFjZWJhY2t3aW5kb3cudHJhY2ViYWNrKDEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQorICAgICAgICAgICAgI29zLmNoZGlyKGN3ZCkKKworICAgIGRlZiBvcGVuc2NyaXB0KHNlbGYsIGZpbGVuYW1lLCBsaW5lbm89Tm9uZSwgY2hhcm9mZnNldD0wLCBtb2RuYW1lPSIiKToKKyAgICAgICAgaW1wb3J0IG9zLCBQeUVkaXQsIFcKKyAgICAgICAgZWRpdG9yID0gc2VsZi5nZXRzY3JpcHQoZmlsZW5hbWUpCisgICAgICAgIGlmIGVkaXRvcjoKKyAgICAgICAgICAgIGVkaXRvci5zZWxlY3QoKQorICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKKyAgICAgICAgICAgIGVkaXRvciA9IFB5RWRpdC5FZGl0b3IoZmlsZW5hbWUpCisgICAgICAgIGVsaWYgZmlsZW5hbWVbLTM6XSA9PSAnLnB5JyBvciBmaWxlbmFtZVstNDpdID09ICcucHljJzoKKyAgICAgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgICAgIGlmIG5vdCBtb2RuYW1lOgorICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lWy0xXSA9PSAnYyc6CisgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKVs6LTRdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpWzotM10KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFhYWCBUaGlzIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IHdpdGggcGFja2FnZXMhCisgICAgICAgICAgICAgICAgIyBYWFggVGhlIGRvY3Mgc2F5IHdlIHNob3VsZCBkbyBpdCBtYW51YWxseSwgcGFjaywgdGhlbiBzdWIsIHRoZW4gc3ViMiBldGMuCisgICAgICAgICAgICAgICAgIyBYWFggSXQgc2F5cyB3ZSBzaG91bGQgdXNlIGltcC5sb2FkX21vZHVsZSgpLCBidXQgdGhhdCAqcmVsb2FkcyogYSBwYWNrYWdlLAorICAgICAgICAgICAgICAgICMgWFhYIGFuZCB0aGF0J3MgdGhlIGxhc3QgdGhpbmcgd2Ugd2FudCBoZXJlLgorICAgICAgICAgICAgICAgIGYsIGZpbGVuYW1lLCAoc3VmZiwgbW9kZSwgZHVtbXkpID0gaW1wLmZpbmRfbW9kdWxlKG1vZG5hbWUpCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBmaWxlIGZvciBcIiVzXCIiICUgbW9kbmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBub3QgZjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBmaWxlIGZvciBcIiVzXCIiICUgbW9kbmFtZQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgaWYgc3VmZiA9PSAnLnB5JzoKKyAgICAgICAgICAgICAgICBzZWxmLm9wZW5zY3JpcHQoZmlsZW5hbWUsIGxpbmVubywgY2hhcm9mZnNldCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBmaWxlIGZvciBcIiVzXCIiICUgbW9kbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBmaWxlIFwiJXNcIiIgJSBmaWxlbmFtZQorICAgICAgICBpZiBsaW5lbm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBlZGl0b3Iuc2VsZWN0bGluZShsaW5lbm8sIGNoYXJvZmZzZXQpCisgICAgICAgIHJldHVybiBlZGl0b3IKKworICAgIGRlZiBnZXRzY3JpcHQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBpZiBmaWxlbmFtZVs6MV0gPT0gJzwnIGFuZCBmaWxlbmFtZVstMTpdID09ICc+JzoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbMTotMV0KKyAgICAgICAgaW1wb3J0IHN0cmluZworICAgICAgICBsb3dwYXRoID0gc3RyaW5nLmxvd2VyKGZpbGVuYW1lKQorICAgICAgICBmb3Igd2lkLCB3aW5kb3cgaW4gc2VsZi5fd2luZG93cy5pdGVtcygpOgorICAgICAgICAgICAgaWYgaGFzYXR0cih3aW5kb3csICJwYXRoIikgYW5kIHR5cGUod2luZG93LnBhdGgpID09IFN0cmluZ1R5cGUgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dwYXRoID09IHN0cmluZy5sb3dlcih3aW5kb3cucGF0aCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdworICAgICAgICAgICAgZWxpZiBoYXNhdHRyKHdpbmRvdywgInBhdGgiKSBhbmQgZmlsZW5hbWUgPT0gd2lkLkdldFdUaXRsZSgpOgorICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cKKworICAgIGRlZiBnZXRwcmVmcyhzZWxmKToKKyAgICAgICAgaW1wb3J0IE1hY1ByZWZzCisgICAgICAgIHJldHVybiBNYWNQcmVmcy5HZXRQcmVmcyhzZWxmLnByZWZmaWxlcGF0aCkKKworICAgIGRlZiBkb19lZGl0b3JwcmVmcyhzZWxmLCAqYXJncyk6CisgICAgICAgIGltcG9ydCBQeUVkaXQKKyAgICAgICAgUHlFZGl0LkVkaXRvckRlZmF1bHRTZXR0aW5ncygpCisKKyAgICBkZWYgZG9fc2V0d2luZG93Zm9udChzZWxmLCAqYXJncyk6CisgICAgICAgIGltcG9ydCBGb250U2V0dGluZ3MsIFcKKyAgICAgICAgcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKKyAgICAgICAgc2V0dGluZ3MgPSBGb250U2V0dGluZ3MuRm9udERpYWxvZyhwcmVmcy5kZWZhdWx0Zm9udCkKKyAgICAgICAgaWYgc2V0dGluZ3M6CisgICAgICAgICAgICBwcmVmcy5kZWZhdWx0Zm9udCwgdGFic2V0dGluZ3MgPSBzZXR0aW5ncworICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiTm90ZSB0aGF0IGNoYW5nZXMgd2lsbCBvbmx5IGFmZmVjdCBuZXcgd2luZG93cyEiCiAKIAogCiBjbGFzcyBNZW51QmFyKEZyYW1lV29yay5NZW51QmFyKToKLQkKLQlwb3NzaWJsZUlEcyA9IHJhbmdlKDEwLCAyNTYpCi0JCi0JZGVmIGdldG5leHRpZChzZWxmKToKLQkJaWQgPSBzZWxmLnBvc3NpYmxlSURzWzBdCi0JCWRlbCBzZWxmLnBvc3NpYmxlSURzWzBdCi0JCXJldHVybiBpZAotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQgPSBOb25lKToKLQkJc2VsZi5iYXIgPSBNZW51VG9vbGJveC5HZXRNZW51QmFyKCkKLQkJTWVudVRvb2xib3guQ2xlYXJNZW51QmFyKCkKLQkJc2VsZi5tZW51cyA9IHt9Ci0JCXNlbGYucGFyZW50ID0gcGFyZW50Ci0JCi0JZGVmIGRpc3BhdGNoKHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKLQkJaWYgc2VsZi5tZW51cy5oYXNfa2V5KGlkKToKLQkJCXNlbGYubWVudXNbaWRdLmRpc3BhdGNoKGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KQotCQotCWRlZiBkZWxtZW51KHNlbGYsIGlkKToKLQkJTWVudVRvb2xib3guRGVsZXRlTWVudShpZCkKLQkJaWYgaWQgaW4gc2VsZi5wb3NzaWJsZUlEczoKLQkJCXByaW50ICJYWFggZHVwbGljYXRlIG1lbnUgSUQhIiwgaWQKLQkJc2VsZi5wb3NzaWJsZUlEcy5hcHBlbmQoaWQpCi0JCisKKyAgICBwb3NzaWJsZUlEcyA9IHJhbmdlKDEwLCAyNTYpCisKKyAgICBkZWYgZ2V0bmV4dGlkKHNlbGYpOgorICAgICAgICBpZCA9IHNlbGYucG9zc2libGVJRHNbMF0KKyAgICAgICAgZGVsIHNlbGYucG9zc2libGVJRHNbMF0KKyAgICAgICAgcmV0dXJuIGlkCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50ID0gTm9uZSk6CisgICAgICAgIHNlbGYuYmFyID0gTWVudVRvb2xib3guR2V0TWVudUJhcigpCisgICAgICAgIE1lbnVUb29sYm94LkNsZWFyTWVudUJhcigpCisgICAgICAgIHNlbGYubWVudXMgPSB7fQorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgaWYgc2VsZi5tZW51cy5oYXNfa2V5KGlkKToKKyAgICAgICAgICAgIHNlbGYubWVudXNbaWRdLmRpc3BhdGNoKGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KQorCisgICAgZGVmIGRlbG1lbnUoc2VsZiwgaWQpOgorICAgICAgICBNZW51VG9vbGJveC5EZWxldGVNZW51KGlkKQorICAgICAgICBpZiBpZCBpbiBzZWxmLnBvc3NpYmxlSURzOgorICAgICAgICAgICAgcHJpbnQgIlhYWCBkdXBsaWNhdGUgbWVudSBJRCEiLCBpZAorICAgICAgICBzZWxmLnBvc3NpYmxlSURzLmFwcGVuZChpZCkKKwogCiBjbGFzcyBNZW51KEZyYW1lV29yay5NZW51KToKLQkKLQlkZWYgZGlzcGF0Y2goc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgotCQl0aXRsZSwgc2hvcnRjdXQsIGNhbGxiYWNrLCBraW5kID0gc2VsZi5pdGVtc1tpdGVtLTFdCi0JCWlmIHR5cGUoY2FsbGJhY2spID09IFN0cmluZ1R5cGU6Ci0JCQljYWxsYmFjayA9IHNlbGYuX2dldG1lbnVoYW5kbGVyKGNhbGxiYWNrKQotCQlpZiBjYWxsYmFjazoKLQkJCWltcG9ydCBXCi0JCQlXLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpCi0JCi0JZGVmIF9nZXRtZW51aGFuZGxlcihzZWxmLCBjYWxsYmFjayk6Ci0JCW1lbnVoYW5kbGVyID0gTm9uZQotCQl3aWQgPSBNeUZyb250V2luZG93KCkKLQkJaWYgd2lkIGFuZCBzZWxmLmJhci5wYXJlbnQuX3dpbmRvd3MuaGFzX2tleSh3aWQpOgotCQkJd2luZG93ID0gc2VsZi5iYXIucGFyZW50Ll93aW5kb3dzW3dpZF0KLQkJCWlmIGhhc2F0dHIod2luZG93LCAiZG9tZW51XyIgKyBjYWxsYmFjayk6Ci0JCQkJbWVudWhhbmRsZXIgPSBnZXRhdHRyKHdpbmRvdywgImRvbWVudV8iICsgY2FsbGJhY2spCi0JCQllbGlmIGhhc2F0dHIoc2VsZi5iYXIucGFyZW50LCAiZG9tZW51XyIgKyBjYWxsYmFjayk6Ci0JCQkJbWVudWhhbmRsZXIgPSBnZXRhdHRyKHNlbGYuYmFyLnBhcmVudCwgImRvbWVudV8iICsgY2FsbGJhY2spCi0JCWVsaWYgaGFzYXR0cihzZWxmLmJhci5wYXJlbnQsICJkb21lbnVfIiArIGNhbGxiYWNrKToKLQkJCW1lbnVoYW5kbGVyID0gZ2V0YXR0cihzZWxmLmJhci5wYXJlbnQsICJkb21lbnVfIiArIGNhbGxiYWNrKQotCQlyZXR1cm4gbWVudWhhbmRsZXIKIAorICAgIGRlZiBkaXNwYXRjaChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6CisgICAgICAgIHRpdGxlLCBzaG9ydGN1dCwgY2FsbGJhY2ssIGtpbmQgPSBzZWxmLml0ZW1zW2l0ZW0tMV0KKyAgICAgICAgaWYgdHlwZShjYWxsYmFjaykgPT0gU3RyaW5nVHlwZToKKyAgICAgICAgICAgIGNhbGxiYWNrID0gc2VsZi5fZ2V0bWVudWhhbmRsZXIoY2FsbGJhY2spCisgICAgICAgIGlmIGNhbGxiYWNrOgorICAgICAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgICAgIFcuQ2FsbGJhY2tDYWxsKGNhbGxiYWNrLCAwLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCkKKworICAgIGRlZiBfZ2V0bWVudWhhbmRsZXIoc2VsZiwgY2FsbGJhY2spOgorICAgICAgICBtZW51aGFuZGxlciA9IE5vbmUKKyAgICAgICAgd2lkID0gTXlGcm9udFdpbmRvdygpCisgICAgICAgIGlmIHdpZCBhbmQgc2VsZi5iYXIucGFyZW50Ll93aW5kb3dzLmhhc19rZXkod2lkKToKKyAgICAgICAgICAgIHdpbmRvdyA9IHNlbGYuYmFyLnBhcmVudC5fd2luZG93c1t3aWRdCisgICAgICAgICAgICBpZiBoYXNhdHRyKHdpbmRvdywgImRvbWVudV8iICsgY2FsbGJhY2spOgorICAgICAgICAgICAgICAgIG1lbnVoYW5kbGVyID0gZ2V0YXR0cih3aW5kb3csICJkb21lbnVfIiArIGNhbGxiYWNrKQorICAgICAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGYuYmFyLnBhcmVudCwgImRvbWVudV8iICsgY2FsbGJhY2spOgorICAgICAgICAgICAgICAgIG1lbnVoYW5kbGVyID0gZ2V0YXR0cihzZWxmLmJhci5wYXJlbnQsICJkb21lbnVfIiArIGNhbGxiYWNrKQorICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZi5iYXIucGFyZW50LCAiZG9tZW51XyIgKyBjYWxsYmFjayk6CisgICAgICAgICAgICBtZW51aGFuZGxlciA9IGdldGF0dHIoc2VsZi5iYXIucGFyZW50LCAiZG9tZW51XyIgKyBjYWxsYmFjaykKKyAgICAgICAgcmV0dXJuIG1lbnVoYW5kbGVyCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1diYXNlLnB5IGIvTWFjL1Rvb2xzL0lERS9XYmFzZS5weQppbmRleCBhNWQ1NTZiLi40ZWVmMTIwIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1diYXNlLnB5CisrKyBiL01hYy9Ub29scy9JREUvV2Jhc2UucHkKQEAgLTksNzkwICs5LDc5MCBAQAogCiAKIGRlZiBfaW50UmVjdCgobCwgdCwgciwgYikpOgotCXJldHVybiAoaW50KGwpLCBpbnQodCksIGludChyKSwgaW50KGIpKQorICAgIHJldHVybiAoaW50KGwpLCBpbnQodCksIGludChyKSwgaW50KGIpKQogCiAKIGNsYXNzIFdpZGdldDoKLQkKLQkiIiJCYXNlIGNsYXNzIGZvciBhbGwgd2lkZ2V0cy4iIiIKLQkKLQlfc2VsZWN0YWJsZSA9IDAKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSk6Ci0JCXNlbGYuX3dpZGdldHMgPSBbXQotCQlzZWxmLl93aWRnZXRzZGljdCA9IHt9Ci0JCXNlbGYuX3Bvc3NpemUgPSBwb3NzaXplCi0JCXNlbGYuX2JvdW5kcyA9IE5vbmUKLQkJc2VsZi5fdmlzaWJsZSA9IDEKLQkJc2VsZi5fZW5hYmxlZCA9IDAKLQkJc2VsZi5fc2VsZWN0ZWQgPSAwCi0JCXNlbGYuX2FjdGl2YXRlZCA9IDAKLQkJc2VsZi5fY2FsbGJhY2sgPSBOb25lCi0JCXNlbGYuX3BhcmVudCA9IE5vbmUKLQkJc2VsZi5fcGFyZW50d2luZG93ID0gTm9uZQotCQlzZWxmLl9iaW5kaW5ncyA9IHt9Ci0JCXNlbGYuX2JhY2tjb2xvciA9IE5vbmUKLQkKLQlkZWYgc2hvdyhzZWxmLCBvbm9mZik6Ci0JCXNlbGYuX3Zpc2libGUgPSBvbm9mZgotCQlmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgotCQkJdy5zaG93KG9ub2ZmKQotCQlpZiBzZWxmLl9wYXJlbnR3aW5kb3cgaXMgbm90IE5vbmUgYW5kIHNlbGYuX3BhcmVudHdpbmRvdy53aWQgaXMgbm90IE5vbmU6Ci0JCQlzZWxmLlNldFBvcnQoKQotCQkJaWYgb25vZmY6Ci0JCQkJc2VsZi5kcmF3KCkKLQkJCWVsc2U6Ci0JCQkJUWQuRXJhc2VSZWN0KHNlbGYuX2JvdW5kcykKLQkKLQlkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCSMgZHJhdyB5b3VyIHN0dWZmIGhlcmUKLQkJCXBhc3MKLQkKLQlkZWYgZ2V0cG9zc2l6ZShzZWxmKToKLQkJcmV0dXJuIHNlbGYuX3Bvc3NpemUKLQkKLQlkZWYgZ2V0Ym91bmRzKHNlbGYpOgotCQlyZXR1cm4gc2VsZi5fYm91bmRzCi0JCi0JZGVmIG1vdmUoc2VsZiwgeCwgeSA9IE5vbmUpOgotCQkiIiJhYnNvbHV0ZSBtb3ZlIiIiCi0JCWlmIHkgPT0gTm9uZToKLQkJCXgsIHkgPSB4Ci0JCWlmIHR5cGUoc2VsZi5fcG9zc2l6ZSkgPD4gVHVwbGVUeXBlOgotCQkJcmFpc2UgV2lkZ2V0c0Vycm9yLCAiY2FuJ3QgbW92ZSB3aWRnZXQgd2l0aCBib3VuZHMgZnVuY3Rpb24iCi0JCWwsIHQsIHIsIGIgPSBzZWxmLl9wb3NzaXplCi0JCXNlbGYucmVzaXplKHgsIHksIHIsIGIpCi0JCi0JZGVmIHJtb3ZlKHNlbGYsIHgsIHkgPSBOb25lKToKLQkJIiIicmVsYXRpdmUgbW92ZSIiIgotCQlpZiB5ID09IE5vbmU6Ci0JCQl4LCB5ID0geAotCQlpZiB0eXBlKHNlbGYuX3Bvc3NpemUpIDw+IFR1cGxlVHlwZToKLQkJCXJhaXNlIFdpZGdldHNFcnJvciwgImNhbid0IG1vdmUgd2lkZ2V0IHdpdGggYm91bmRzIGZ1bmN0aW9uIgotCQlsLCB0LCByLCBiID0gc2VsZi5fcG9zc2l6ZQotCQlzZWxmLnJlc2l6ZShsICsgeCwgdCArIHksIHIsIGIpCi0JCQotCWRlZiByZXNpemUoc2VsZiwgKmFyZ3MpOgotCQlpZiBsZW4oYXJncykgPT0gMToKLQkJCWlmIHR5cGUoYXJnc1swXSkgPT0gRnVuY3Rpb25UeXBlIG9yIHR5cGUoYXJnc1swXSkgPT0gTWV0aG9kVHlwZToKLQkJCQlzZWxmLl9wb3NzaXplID0gYXJnc1swXQotCQkJZWxzZToKLQkJCQlhcHBseShzZWxmLnJlc2l6ZSwgYXJnc1swXSkKLQkJZWxpZiBsZW4oYXJncykgPT0gMjoKLQkJCXNlbGYuX3Bvc3NpemUgPSAoMCwgMCkgKyBhcmdzCi0JCWVsaWYgbGVuKGFyZ3MpID09IDQ6Ci0JCQlzZWxmLl9wb3NzaXplID0gYXJncwotCQllbHNlOgotCQkJcmFpc2UgVHlwZUVycm9yLCAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyIKLQkJc2VsZi5fY2FsY2JvdW5kcygpCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJZGVsIHNlbGYuX2NhbGxiYWNrCi0JCWRlbCBzZWxmLl9wb3NzaXplCi0JCWRlbCBzZWxmLl9iaW5kaW5ncwotCQlkZWwgc2VsZi5fcGFyZW50Ci0JCWRlbCBzZWxmLl9wYXJlbnR3aW5kb3cKLQkKLQlkZWYgYmluZChzZWxmLCBrZXksIGNhbGxiYWNrKToKLQkJIiIiYmluZCBhIGtleSBvciBhbiAnZXZlbnQnIHRvIGEgY2FsbGJhY2siIiIKLQkJaWYgY2FsbGJhY2s6Ci0JCQlzZWxmLl9iaW5kaW5nc1trZXldID0gY2FsbGJhY2sKLQkJZWxpZiBzZWxmLl9iaW5kaW5ncy5oYXNfa2V5KGtleSk6Ci0JCQlkZWwgc2VsZi5fYmluZGluZ3Nba2V5XQotCQotCWRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qob2xkYm91bmRzKQotCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCi0JCi0JZGVmIF9jYWxjYm91bmRzKHNlbGYpOgotCQkjIGNhbGN1bGF0ZSBhYnNvbHV0ZSBib3VuZHMgcmVsYXRpdmUgdG8gdGhlIHdpbmRvdyBvcmlnaW4gZnJvbSBvdXIKLQkJIyBhYnN0cmFjdCBfcG9zc2l6ZSBhdHRyaWJ1dGUsIHdoaWNoIGlzIGVpdGhlciBhIDQtdHVwbGUgb3IgYSBjYWxsYWJsZSBvYmplY3QKLQkJb2xkYm91bmRzID0gc2VsZi5fYm91bmRzCi0JCXBsLCBwdCwgcHIsIHBiID0gc2VsZi5fcGFyZW50Ll9ib3VuZHMKLQkJaWYgY2FsbGFibGUoc2VsZi5fcG9zc2l6ZSk6Ci0JCQkjIF9wb3NzaXplIGlzIGNhbGxhYmxlLCBsZXQgaXQgZmlndXJlIGl0IG91dCBieSBpdHNlbGY6IGl0IHNob3VsZCByZXR1cm4gCi0JCQkjIHRoZSBib3VuZHMgcmVsYXRpdmUgdG8gb3VyIHBhcmVudCB3aWRnZXQuCi0JCQl3aWR0aCA9IHByIC0gcGwKLQkJCWhlaWdodCA9IHBiIC0gcHQKLQkJCXNlbGYuX2JvdW5kcyA9IFFkLk9mZnNldFJlY3QoX2ludFJlY3Qoc2VsZi5fcG9zc2l6ZSh3aWR0aCwgaGVpZ2h0KSksIHBsLCBwdCkKLQkJZWxzZToKLQkJCSMgX3Bvc3NpemUgbXVzdCBiZSBhIDQtdHVwbGUuIFRoaXMgaXMgd2hlcmUgdGhlIGFsZ29yaXRobSBieSBQZXRlciBLcmllbnMgYW5kCi0JCQkjIFBldHIgdmFuIEJsb2tsYW5kIGtpY2tzIGluLiAoKioqIFBhcnRzIG9mIHRoaXMgYWxnb3JpdGhtIGFyZSBhcHBsaWVkIGZvciAKLQkJCSMgcGF0ZW50cyBieSBFcmljc3NvbiwgU3dlZGVuICoqKikKLQkJCWwsIHQsIHIsIGIgPSBzZWxmLl9wb3NzaXplCi0JCQkjIGRlcGVuZGluZyBvbiB0aGUgdmFsdWVzIG9mIGwoZWZ0KSwgdChvcCksIHIocmlnaHQpIGFuZCBiKG90dG9tKSwgCi0JCQkjIHRoZXkgbWVhbiBkaWZmZXJlbnQgdGhpbmdzOgotCQkJaWYgbCA8IC0xOgotCQkJCSMgbCBpcyBsZXNzIHRoYW4gLTEsIHRoaXMgbWVhbiBpdCBtZWFzdXJlcyBmcm9tIHRoZSAqcmlnaHQqIG9mIGl0J3MgcGFyZW50Ci0JCQkJbCA9IHByICsgbAotCQkJZWxzZToKLQkJCQkjIGwgaXMgLTEgb3IgZ3JlYXRlciwgdGhpcyBtZWFuIGl0IG1lYXN1cmVzIGZyb20gdGhlICpsZWZ0KiBvZiBpdCdzIHBhcmVudAotCQkJCWwgPSBwbCArIGwKLQkJCWlmIHQgPCAtMToKLQkJCQkjIHQgaXMgbGVzcyB0aGFuIC0xLCB0aGlzIG1lYW4gaXQgbWVhc3VyZXMgZnJvbSB0aGUgKmJvdHRvbSogb2YgaXQncyBwYXJlbnQKLQkJCQl0ID0gcGIgKyB0Ci0JCQllbHNlOgotCQkJCSMgdCBpcyAtMSBvciBncmVhdGVyLCB0aGlzIG1lYW4gaXQgbWVhc3VyZXMgZnJvbSB0aGUgKnRvcCogb2YgaXQncyBwYXJlbnQKLQkJCQl0ID0gcHQgKyB0Ci0JCQlpZiByID4gMToKLQkJCQkjIHIgaXMgZ3JlYXRlciB0aGFuIDEsIHRoaXMgbWVhbnMgciBpcyB0aGUgKndpZHRoKiBvZiB0aGUgd2lkZ2V0Ci0JCQkJciA9IGwgKyByCi0JCQllbHNlOgotCQkJCSMgciBpcyBsZXNzIHRoYW4gMSwgdGhpcyBtZWFucyBpdCBtZWFzdXJlcyBmcm9tIHRoZSAqcmlnaHQqIG9mIGl0J3MgcGFyZW50Ci0JCQkJciA9IHByICsgcgotCQkJaWYgYiA+IDE6Ci0JCQkJIyBiIGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGlzIG1lYW5zIGIgaXMgdGhlICpoZWlnaHQqIG9mIHRoZSB3aWRnZXQKLQkJCQliID0gdCArIGIKLQkJCWVsc2U6Ci0JCQkJIyBiIGlzIGxlc3MgdGhhbiAxLCB0aGlzIG1lYW5zIGl0IG1lYXN1cmVzIGZyb20gdGhlICpib3R0b20qIG9mIGl0J3MgcGFyZW50Ci0JCQkJYiA9IHBiICsgYgotCQkJc2VsZi5fYm91bmRzID0gKGwsIHQsIHIsIGIpCi0JCWlmIG9sZGJvdW5kcyBhbmQgb2xkYm91bmRzIDw+IHNlbGYuX2JvdW5kczoKLQkJCXNlbGYuYWRqdXN0KG9sZGJvdW5kcykKLQkJZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCXcuX2NhbGNib3VuZHMoKQotCQotCWRlZiB0ZXN0KHNlbGYsIHBvaW50KToKLQkJaWYgUWQuUHRJblJlY3QocG9pbnQsIHNlbGYuX2JvdW5kcyk6Ci0JCQlyZXR1cm4gMQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJcGFzcwotCQotCWRlZiBmaW5kd2lkZ2V0KHNlbGYsIHBvaW50LCBvbmx5ZW5hYmxlZCA9IDEpOgotCQlpZiBzZWxmLnRlc3QocG9pbnQpOgotCQkJZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCQl3aWRnZXQgPSB3LmZpbmR3aWRnZXQocG9pbnQpCi0JCQkJaWYgd2lkZ2V0IGlzIG5vdCBOb25lOgotCQkJCQlyZXR1cm4gd2lkZ2V0Ci0JCQlpZiBzZWxmLl9lbmFibGVkIG9yIG5vdCBvbmx5ZW5hYmxlZDoKLQkJCQlyZXR1cm4gc2VsZgotCQotCWRlZiBmb3JhbGwoc2VsZiwgbWV0aG9kbmFtZSwgKmFyZ3MpOgotCQlmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgotCQkJcnYgPSBhcHBseSh3LmZvcmFsbCwgKG1ldGhvZG5hbWUsKSArIGFyZ3MpCi0JCQlpZiBydjogCi0JCQkJcmV0dXJuIHJ2Ci0JCWlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjwiICsgbWV0aG9kbmFtZSArICI+Iik6Ci0JCQljYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8IiArIG1ldGhvZG5hbWUgKyAiPiJdCi0JCQlydiA9IGFwcGx5KGNhbGxiYWNrLCBhcmdzKQotCQkJaWYgcnY6IAotCQkJCXJldHVybiBydgotCQlpZiBoYXNhdHRyKHNlbGYsIG1ldGhvZG5hbWUpOgotCQkJbWV0aG9kID0gZ2V0YXR0cihzZWxmLCBtZXRob2RuYW1lKQotCQkJcmV0dXJuIGFwcGx5KG1ldGhvZCwgYXJncykKLQkKLQlkZWYgZm9yYWxsX2J1dHNlbGYoc2VsZiwgbWV0aG9kbmFtZSwgKmFyZ3MpOgotCQlmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgotCQkJcnYgPSBhcHBseSh3LmZvcmFsbCwgKG1ldGhvZG5hbWUsKSArIGFyZ3MpCi0JCQlpZiBydjogCi0JCQkJcmV0dXJuIHJ2Ci0JCi0JZGVmIGZvcmFsbF9mcm9tYm90dG9tKHNlbGYsIG1ldGhvZG5hbWUsICphcmdzKToKLQkJaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPCIgKyBtZXRob2RuYW1lICsgIj4iKToKLQkJCWNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjwiICsgbWV0aG9kbmFtZSArICI+Il0KLQkJCXJ2ID0gYXBwbHkoY2FsbGJhY2ssIGFyZ3MpCi0JCQlpZiBydjogCi0JCQkJcmV0dXJuIHJ2Ci0JCWlmIGhhc2F0dHIoc2VsZiwgbWV0aG9kbmFtZSk6Ci0JCQltZXRob2QgPSBnZXRhdHRyKHNlbGYsIG1ldGhvZG5hbWUpCi0JCQlydiA9IGFwcGx5KG1ldGhvZCwgYXJncykKLQkJCWlmIHJ2OiAKLQkJCQlyZXR1cm4gcnYKLQkJZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCXJ2ID0gYXBwbHkody5mb3JhbGxfZnJvbWJvdHRvbSwgKG1ldGhvZG5hbWUsKSArIGFyZ3MpCi0JCQlpZiBydjogCi0JCQkJcmV0dXJuIHJ2Ci0JCi0JZGVmIF9hZGR3aWRnZXQoc2VsZiwga2V5LCB3aWRnZXQpOgotCQlpZiB3aWRnZXQgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCXJhaXNlIFZhbHVlRXJyb3IsICJkdXBsaWNhdGUgd2lkZ2V0IgotCQlpZiBzZWxmLl93aWRnZXRzZGljdC5oYXNfa2V5KGtleSk6Ci0JCQlzZWxmLl9yZW1vdmV3aWRnZXQoa2V5KQotCQlzZWxmLl93aWRnZXRzLmFwcGVuZCh3aWRnZXQpCi0JCXNlbGYuX3dpZGdldHNkaWN0W2tleV0gPSB3aWRnZXQKLQkJd2lkZ2V0Ll9wYXJlbnQgPSBzZWxmCi0JCXNlbGYuX3NldHBhcmVudHdpbmRvdyh3aWRnZXQpCi0JCWlmIHNlbGYuX3BhcmVudHdpbmRvdyBhbmQgc2VsZi5fcGFyZW50d2luZG93LndpZDoKLQkJCXdpZGdldC5mb3JhbGxfZnJvbWJvdHRvbSgib3BlbiIpCi0JCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdCh3aWRnZXQuX2JvdW5kcykKLQkKLQlkZWYgX3NldHBhcmVudHdpbmRvdyhzZWxmLCB3aWRnZXQpOgotCQl3aWRnZXQuX3BhcmVudHdpbmRvdyA9IHNlbGYuX3BhcmVudHdpbmRvdwotCQlmb3IgdyBpbiB3aWRnZXQuX3dpZGdldHM6Ci0JCQlzZWxmLl9zZXRwYXJlbnR3aW5kb3codykKLQkKLQlkZWYgX3JlbW92ZXdpZGdldChzZWxmLCBrZXkpOgotCQlpZiBub3Qgc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShrZXkpOgotCQkJcmFpc2UgS2V5RXJyb3IsICJubyB3aWRnZXQgd2l0aCBrZXkgJXIiICUgKGtleSwpCi0JCXdpZGdldCA9IHNlbGYuX3dpZGdldHNkaWN0W2tleV0KLQkJZm9yIGsgaW4gd2lkZ2V0Ll93aWRnZXRzZGljdC5rZXlzKCk6Ci0JCQl3aWRnZXQuX3JlbW92ZXdpZGdldChrKQotCQlpZiBzZWxmLl9wYXJlbnR3aW5kb3cuX2N1cnJlbnR3aWRnZXQgPT0gd2lkZ2V0OgotCQkJd2lkZ2V0LnNlbGVjdCgwKQotCQkJc2VsZi5fcGFyZW50d2luZG93Ll9jdXJyZW50d2lkZ2V0ID0gTm9uZQotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdCh3aWRnZXQuX2JvdW5kcykKLQkJd2lkZ2V0LmNsb3NlKCkKLQkJZGVsIHNlbGYuX3dpZGdldHNkaWN0W2tleV0KLQkJc2VsZi5fd2lkZ2V0cy5yZW1vdmUod2lkZ2V0KQotCQotCWRlZiBfX3NldGF0dHJfXyhzZWxmLCBhdHRyLCB2YWx1ZSk6Ci0JCWlmIHR5cGUodmFsdWUpID09IEluc3RhbmNlVHlwZSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgV2lkZ2V0KSBhbmQJXAotCQkJCWF0dHIgbm90IGluICgiX2N1cnJlbnR3aWRnZXQiLCAiX2xhc3Ryb2xsb3ZlciIsIAotCQkJCSJfcGFyZW50IiwgIl9wYXJlbnR3aW5kb3ciLCAiX2RlZmF1bHRidXR0b24iKToKLQkJCWlmIGhhc2F0dHIoc2VsZiwgYXR0cik6Ci0JCQkJcmFpc2UgVmFsdWVFcnJvciwgIkNhbid0IHJlcGxhY2UgZXhpc3RpbmcgYXR0cmlidXRlOiAiICsgYXR0cgotCQkJc2VsZi5fYWRkd2lkZ2V0KGF0dHIsIHZhbHVlKQotCQlzZWxmLl9fZGljdF9fW2F0dHJdID0gdmFsdWUKLQkKLQlkZWYgX19kZWxhdHRyX18oc2VsZiwgYXR0cik6Ci0JCWlmIGF0dHIgPT0gIl93aWRnZXRzZGljdCI6Ci0JCQlyYWlzZSBBdHRyaWJ1dGVFcnJvciwgImNhbm5vdCBkZWxldGUgYXR0cmlidXRlIF93aWRnZXRzZGljdCIKLQkJaWYgc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShhdHRyKToKLQkJCXNlbGYuX3JlbW92ZXdpZGdldChhdHRyKQotCQkJaWYgc2VsZi5fX2RpY3RfXy5oYXNfa2V5KGF0dHIpOgotCQkJCWRlbCBzZWxmLl9fZGljdF9fW2F0dHJdCi0JCWVsaWYgc2VsZi5fX2RpY3RfXy5oYXNfa2V5KGF0dHIpOgotCQkJZGVsIHNlbGYuX19kaWN0X19bYXR0cl0KLQkJZWxzZToKLQkJCXJhaXNlIEF0dHJpYnV0ZUVycm9yLCBhdHRyCi0JCi0JZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgotCQlzZWxmLl9hZGR3aWRnZXQoa2V5LCB2YWx1ZSkKLQkKLQlkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKLQkJaWYgbm90IHNlbGYuX3dpZGdldHNkaWN0Lmhhc19rZXkoa2V5KToKLQkJCXJhaXNlIEtleUVycm9yLCBrZXkKLQkJcmV0dXJuIHNlbGYuX3dpZGdldHNkaWN0W2tleV0KLQkKLQlkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKLQkJc2VsZi5fcmVtb3Zld2lkZ2V0KGtleSkKLQkKLQlkZWYgU2V0UG9ydChzZWxmKToKLQkJc2VsZi5fcGFyZW50d2luZG93LlNldFBvcnQoKQotCQkKIAotCWRlZiBHZXRXaW5kb3coc2VsZik6Ci0JCXJldHVybiBzZWxmLl9wYXJlbnR3aW5kb3cuR2V0V2luZG93KCkKLQkJCi0JZGVmIF9fZGVsX18oc2VsZik6Ci0JCWlmIERFQlVHOgotCQkJcHJpbnQgIiVzIGluc3RhbmNlIGRlbGV0ZWQiICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KLQkKLQlkZWYgX2RyYXdib3VuZHMoc2VsZik6Ci0JCVFkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIHdpZGdldHMuIiIiCisKKyAgICBfc2VsZWN0YWJsZSA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplKToKKyAgICAgICAgc2VsZi5fd2lkZ2V0cyA9IFtdCisgICAgICAgIHNlbGYuX3dpZGdldHNkaWN0ID0ge30KKyAgICAgICAgc2VsZi5fcG9zc2l6ZSA9IHBvc3NpemUKKyAgICAgICAgc2VsZi5fYm91bmRzID0gTm9uZQorICAgICAgICBzZWxmLl92aXNpYmxlID0gMQorICAgICAgICBzZWxmLl9lbmFibGVkID0gMAorICAgICAgICBzZWxmLl9zZWxlY3RlZCA9IDAKKyAgICAgICAgc2VsZi5fYWN0aXZhdGVkID0gMAorICAgICAgICBzZWxmLl9jYWxsYmFjayA9IE5vbmUKKyAgICAgICAgc2VsZi5fcGFyZW50ID0gTm9uZQorICAgICAgICBzZWxmLl9wYXJlbnR3aW5kb3cgPSBOb25lCisgICAgICAgIHNlbGYuX2JpbmRpbmdzID0ge30KKyAgICAgICAgc2VsZi5fYmFja2NvbG9yID0gTm9uZQorCisgICAgZGVmIHNob3coc2VsZiwgb25vZmYpOgorICAgICAgICBzZWxmLl92aXNpYmxlID0gb25vZmYKKyAgICAgICAgZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKKyAgICAgICAgICAgIHcuc2hvdyhvbm9mZikKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50d2luZG93IGlzIG5vdCBOb25lIGFuZCBzZWxmLl9wYXJlbnR3aW5kb3cud2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgICAgIHNlbGYuZHJhdygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFFkLkVyYXNlUmVjdChzZWxmLl9ib3VuZHMpCisKKyAgICBkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKKyAgICAgICAgaWYgc2VsZi5fdmlzaWJsZToKKyAgICAgICAgICAgICMgZHJhdyB5b3VyIHN0dWZmIGhlcmUKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBnZXRwb3NzaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcG9zc2l6ZQorCisgICAgZGVmIGdldGJvdW5kcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2JvdW5kcworCisgICAgZGVmIG1vdmUoc2VsZiwgeCwgeSA9IE5vbmUpOgorICAgICAgICAiIiJhYnNvbHV0ZSBtb3ZlIiIiCisgICAgICAgIGlmIHkgPT0gTm9uZToKKyAgICAgICAgICAgIHgsIHkgPSB4CisgICAgICAgIGlmIHR5cGUoc2VsZi5fcG9zc2l6ZSkgPD4gVHVwbGVUeXBlOgorICAgICAgICAgICAgcmFpc2UgV2lkZ2V0c0Vycm9yLCAiY2FuJ3QgbW92ZSB3aWRnZXQgd2l0aCBib3VuZHMgZnVuY3Rpb24iCisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9wb3NzaXplCisgICAgICAgIHNlbGYucmVzaXplKHgsIHksIHIsIGIpCisKKyAgICBkZWYgcm1vdmUoc2VsZiwgeCwgeSA9IE5vbmUpOgorICAgICAgICAiIiJyZWxhdGl2ZSBtb3ZlIiIiCisgICAgICAgIGlmIHkgPT0gTm9uZToKKyAgICAgICAgICAgIHgsIHkgPSB4CisgICAgICAgIGlmIHR5cGUoc2VsZi5fcG9zc2l6ZSkgPD4gVHVwbGVUeXBlOgorICAgICAgICAgICAgcmFpc2UgV2lkZ2V0c0Vycm9yLCAiY2FuJ3QgbW92ZSB3aWRnZXQgd2l0aCBib3VuZHMgZnVuY3Rpb24iCisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9wb3NzaXplCisgICAgICAgIHNlbGYucmVzaXplKGwgKyB4LCB0ICsgeSwgciwgYikKKworICAgIGRlZiByZXNpemUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgICAgIGlmIHR5cGUoYXJnc1swXSkgPT0gRnVuY3Rpb25UeXBlIG9yIHR5cGUoYXJnc1swXSkgPT0gTWV0aG9kVHlwZToKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3NzaXplID0gYXJnc1swXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhcHBseShzZWxmLnJlc2l6ZSwgYXJnc1swXSkKKyAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKKyAgICAgICAgICAgIHNlbGYuX3Bvc3NpemUgPSAoMCwgMCkgKyBhcmdzCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDQ6CisgICAgICAgICAgICBzZWxmLl9wb3NzaXplID0gYXJncworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyIKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGRlbCBzZWxmLl9jYWxsYmFjaworICAgICAgICBkZWwgc2VsZi5fcG9zc2l6ZQorICAgICAgICBkZWwgc2VsZi5fYmluZGluZ3MKKyAgICAgICAgZGVsIHNlbGYuX3BhcmVudAorICAgICAgICBkZWwgc2VsZi5fcGFyZW50d2luZG93CisKKyAgICBkZWYgYmluZChzZWxmLCBrZXksIGNhbGxiYWNrKToKKyAgICAgICAgIiIiYmluZCBhIGtleSBvciBhbiAnZXZlbnQnIHRvIGEgY2FsbGJhY2siIiIKKyAgICAgICAgaWYgY2FsbGJhY2s6CisgICAgICAgICAgICBzZWxmLl9iaW5kaW5nc1trZXldID0gY2FsbGJhY2sKKyAgICAgICAgZWxpZiBzZWxmLl9iaW5kaW5ncy5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICBkZWwgc2VsZi5fYmluZGluZ3Nba2V5XQorCisgICAgZGVmIGFkanVzdChzZWxmLCBvbGRib3VuZHMpOgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChvbGRib3VuZHMpCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuX2JvdW5kcykKKworICAgIGRlZiBfY2FsY2JvdW5kcyhzZWxmKToKKyAgICAgICAgIyBjYWxjdWxhdGUgYWJzb2x1dGUgYm91bmRzIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3cgb3JpZ2luIGZyb20gb3VyCisgICAgICAgICMgYWJzdHJhY3QgX3Bvc3NpemUgYXR0cmlidXRlLCB3aGljaCBpcyBlaXRoZXIgYSA0LXR1cGxlIG9yIGEgY2FsbGFibGUgb2JqZWN0CisgICAgICAgIG9sZGJvdW5kcyA9IHNlbGYuX2JvdW5kcworICAgICAgICBwbCwgcHQsIHByLCBwYiA9IHNlbGYuX3BhcmVudC5fYm91bmRzCisgICAgICAgIGlmIGNhbGxhYmxlKHNlbGYuX3Bvc3NpemUpOgorICAgICAgICAgICAgIyBfcG9zc2l6ZSBpcyBjYWxsYWJsZSwgbGV0IGl0IGZpZ3VyZSBpdCBvdXQgYnkgaXRzZWxmOiBpdCBzaG91bGQgcmV0dXJuCisgICAgICAgICAgICAjIHRoZSBib3VuZHMgcmVsYXRpdmUgdG8gb3VyIHBhcmVudCB3aWRnZXQuCisgICAgICAgICAgICB3aWR0aCA9IHByIC0gcGwKKyAgICAgICAgICAgIGhlaWdodCA9IHBiIC0gcHQKKyAgICAgICAgICAgIHNlbGYuX2JvdW5kcyA9IFFkLk9mZnNldFJlY3QoX2ludFJlY3Qoc2VsZi5fcG9zc2l6ZSh3aWR0aCwgaGVpZ2h0KSksIHBsLCBwdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgX3Bvc3NpemUgbXVzdCBiZSBhIDQtdHVwbGUuIFRoaXMgaXMgd2hlcmUgdGhlIGFsZ29yaXRobSBieSBQZXRlciBLcmllbnMgYW5kCisgICAgICAgICAgICAjIFBldHIgdmFuIEJsb2tsYW5kIGtpY2tzIGluLiAoKioqIFBhcnRzIG9mIHRoaXMgYWxnb3JpdGhtIGFyZSBhcHBsaWVkIGZvcgorICAgICAgICAgICAgIyBwYXRlbnRzIGJ5IEVyaWNzc29uLCBTd2VkZW4gKioqKQorICAgICAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYuX3Bvc3NpemUKKyAgICAgICAgICAgICMgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgbChlZnQpLCB0KG9wKSwgcihyaWdodCkgYW5kIGIob3R0b20pLAorICAgICAgICAgICAgIyB0aGV5IG1lYW4gZGlmZmVyZW50IHRoaW5nczoKKyAgICAgICAgICAgIGlmIGwgPCAtMToKKyAgICAgICAgICAgICAgICAjIGwgaXMgbGVzcyB0aGFuIC0xLCB0aGlzIG1lYW4gaXQgbWVhc3VyZXMgZnJvbSB0aGUgKnJpZ2h0KiBvZiBpdCdzIHBhcmVudAorICAgICAgICAgICAgICAgIGwgPSBwciArIGwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBsIGlzIC0xIG9yIGdyZWF0ZXIsIHRoaXMgbWVhbiBpdCBtZWFzdXJlcyBmcm9tIHRoZSAqbGVmdCogb2YgaXQncyBwYXJlbnQKKyAgICAgICAgICAgICAgICBsID0gcGwgKyBsCisgICAgICAgICAgICBpZiB0IDwgLTE6CisgICAgICAgICAgICAgICAgIyB0IGlzIGxlc3MgdGhhbiAtMSwgdGhpcyBtZWFuIGl0IG1lYXN1cmVzIGZyb20gdGhlICpib3R0b20qIG9mIGl0J3MgcGFyZW50CisgICAgICAgICAgICAgICAgdCA9IHBiICsgdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHQgaXMgLTEgb3IgZ3JlYXRlciwgdGhpcyBtZWFuIGl0IG1lYXN1cmVzIGZyb20gdGhlICp0b3AqIG9mIGl0J3MgcGFyZW50CisgICAgICAgICAgICAgICAgdCA9IHB0ICsgdAorICAgICAgICAgICAgaWYgciA+IDE6CisgICAgICAgICAgICAgICAgIyByIGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGlzIG1lYW5zIHIgaXMgdGhlICp3aWR0aCogb2YgdGhlIHdpZGdldAorICAgICAgICAgICAgICAgIHIgPSBsICsgcgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHIgaXMgbGVzcyB0aGFuIDEsIHRoaXMgbWVhbnMgaXQgbWVhc3VyZXMgZnJvbSB0aGUgKnJpZ2h0KiBvZiBpdCdzIHBhcmVudAorICAgICAgICAgICAgICAgIHIgPSBwciArIHIKKyAgICAgICAgICAgIGlmIGIgPiAxOgorICAgICAgICAgICAgICAgICMgYiBpcyBncmVhdGVyIHRoYW4gMSwgdGhpcyBtZWFucyBiIGlzIHRoZSAqaGVpZ2h0KiBvZiB0aGUgd2lkZ2V0CisgICAgICAgICAgICAgICAgYiA9IHQgKyBiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgYiBpcyBsZXNzIHRoYW4gMSwgdGhpcyBtZWFucyBpdCBtZWFzdXJlcyBmcm9tIHRoZSAqYm90dG9tKiBvZiBpdCdzIHBhcmVudAorICAgICAgICAgICAgICAgIGIgPSBwYiArIGIKKyAgICAgICAgICAgIHNlbGYuX2JvdW5kcyA9IChsLCB0LCByLCBiKQorICAgICAgICBpZiBvbGRib3VuZHMgYW5kIG9sZGJvdW5kcyA8PiBzZWxmLl9ib3VuZHM6CisgICAgICAgICAgICBzZWxmLmFkanVzdChvbGRib3VuZHMpCisgICAgICAgIGZvciB3IGluIHNlbGYuX3dpZGdldHM6CisgICAgICAgICAgICB3Ll9jYWxjYm91bmRzKCkKKworICAgIGRlZiB0ZXN0KHNlbGYsIHBvaW50KToKKyAgICAgICAgaWYgUWQuUHRJblJlY3QocG9pbnQsIHNlbGYuX2JvdW5kcyk6CisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZmluZHdpZGdldChzZWxmLCBwb2ludCwgb25seWVuYWJsZWQgPSAxKToKKyAgICAgICAgaWYgc2VsZi50ZXN0KHBvaW50KToKKyAgICAgICAgICAgIGZvciB3IGluIHNlbGYuX3dpZGdldHM6CisgICAgICAgICAgICAgICAgd2lkZ2V0ID0gdy5maW5kd2lkZ2V0KHBvaW50KQorICAgICAgICAgICAgICAgIGlmIHdpZGdldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpZGdldAorICAgICAgICAgICAgaWYgc2VsZi5fZW5hYmxlZCBvciBub3Qgb25seWVuYWJsZWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBmb3JhbGwoc2VsZiwgbWV0aG9kbmFtZSwgKmFyZ3MpOgorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgcnYgPSBhcHBseSh3LmZvcmFsbCwgKG1ldGhvZG5hbWUsKSArIGFyZ3MpCisgICAgICAgICAgICBpZiBydjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcnYKKyAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPCIgKyBtZXRob2RuYW1lICsgIj4iKToKKyAgICAgICAgICAgIGNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjwiICsgbWV0aG9kbmFtZSArICI+Il0KKyAgICAgICAgICAgIHJ2ID0gYXBwbHkoY2FsbGJhY2ssIGFyZ3MpCisgICAgICAgICAgICBpZiBydjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcnYKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCBtZXRob2RuYW1lKToKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgbWV0aG9kbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBhcHBseShtZXRob2QsIGFyZ3MpCisKKyAgICBkZWYgZm9yYWxsX2J1dHNlbGYoc2VsZiwgbWV0aG9kbmFtZSwgKmFyZ3MpOgorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgcnYgPSBhcHBseSh3LmZvcmFsbCwgKG1ldGhvZG5hbWUsKSArIGFyZ3MpCisgICAgICAgICAgICBpZiBydjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBmb3JhbGxfZnJvbWJvdHRvbShzZWxmLCBtZXRob2RuYW1lLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjwiICsgbWV0aG9kbmFtZSArICI+Iik6CisgICAgICAgICAgICBjYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8IiArIG1ldGhvZG5hbWUgKyAiPiJdCisgICAgICAgICAgICBydiA9IGFwcGx5KGNhbGxiYWNrLCBhcmdzKQorICAgICAgICAgICAgaWYgcnY6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJ2CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgbWV0aG9kbmFtZSk6CisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsIG1ldGhvZG5hbWUpCisgICAgICAgICAgICBydiA9IGFwcGx5KG1ldGhvZCwgYXJncykKKyAgICAgICAgICAgIGlmIHJ2OgorICAgICAgICAgICAgICAgIHJldHVybiBydgorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgcnYgPSBhcHBseSh3LmZvcmFsbF9mcm9tYm90dG9tLCAobWV0aG9kbmFtZSwpICsgYXJncykKKyAgICAgICAgICAgIGlmIHJ2OgorICAgICAgICAgICAgICAgIHJldHVybiBydgorCisgICAgZGVmIF9hZGR3aWRnZXQoc2VsZiwga2V5LCB3aWRnZXQpOgorICAgICAgICBpZiB3aWRnZXQgaW4gc2VsZi5fd2lkZ2V0czoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJkdXBsaWNhdGUgd2lkZ2V0IgorICAgICAgICBpZiBzZWxmLl93aWRnZXRzZGljdC5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICBzZWxmLl9yZW1vdmV3aWRnZXQoa2V5KQorICAgICAgICBzZWxmLl93aWRnZXRzLmFwcGVuZCh3aWRnZXQpCisgICAgICAgIHNlbGYuX3dpZGdldHNkaWN0W2tleV0gPSB3aWRnZXQKKyAgICAgICAgd2lkZ2V0Ll9wYXJlbnQgPSBzZWxmCisgICAgICAgIHNlbGYuX3NldHBhcmVudHdpbmRvdyh3aWRnZXQpCisgICAgICAgIGlmIHNlbGYuX3BhcmVudHdpbmRvdyBhbmQgc2VsZi5fcGFyZW50d2luZG93LndpZDoKKyAgICAgICAgICAgIHdpZGdldC5mb3JhbGxfZnJvbWJvdHRvbSgib3BlbiIpCisgICAgICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdCh3aWRnZXQuX2JvdW5kcykKKworICAgIGRlZiBfc2V0cGFyZW50d2luZG93KHNlbGYsIHdpZGdldCk6CisgICAgICAgIHdpZGdldC5fcGFyZW50d2luZG93ID0gc2VsZi5fcGFyZW50d2luZG93CisgICAgICAgIGZvciB3IGluIHdpZGdldC5fd2lkZ2V0czoKKyAgICAgICAgICAgIHNlbGYuX3NldHBhcmVudHdpbmRvdyh3KQorCisgICAgZGVmIF9yZW1vdmV3aWRnZXQoc2VsZiwga2V5KToKKyAgICAgICAgaWYgbm90IHNlbGYuX3dpZGdldHNkaWN0Lmhhc19rZXkoa2V5KToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yLCAibm8gd2lkZ2V0IHdpdGgga2V5ICVyIiAlIChrZXksKQorICAgICAgICB3aWRnZXQgPSBzZWxmLl93aWRnZXRzZGljdFtrZXldCisgICAgICAgIGZvciBrIGluIHdpZGdldC5fd2lkZ2V0c2RpY3Qua2V5cygpOgorICAgICAgICAgICAgd2lkZ2V0Ll9yZW1vdmV3aWRnZXQoaykKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50d2luZG93Ll9jdXJyZW50d2lkZ2V0ID09IHdpZGdldDoKKyAgICAgICAgICAgIHdpZGdldC5zZWxlY3QoMCkKKyAgICAgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy5fY3VycmVudHdpZGdldCA9IE5vbmUKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qod2lkZ2V0Ll9ib3VuZHMpCisgICAgICAgIHdpZGdldC5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLl93aWRnZXRzZGljdFtrZXldCisgICAgICAgIHNlbGYuX3dpZGdldHMucmVtb3ZlKHdpZGdldCkKKworICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBhdHRyLCB2YWx1ZSk6CisgICAgICAgIGlmIHR5cGUodmFsdWUpID09IEluc3RhbmNlVHlwZSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgV2lkZ2V0KSBhbmQgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgbm90IGluICgiX2N1cnJlbnR3aWRnZXQiLCAiX2xhc3Ryb2xsb3ZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAiX3BhcmVudCIsICJfcGFyZW50d2luZG93IiwgIl9kZWZhdWx0YnV0dG9uIik6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIGF0dHIpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJDYW4ndCByZXBsYWNlIGV4aXN0aW5nIGF0dHJpYnV0ZTogIiArIGF0dHIKKyAgICAgICAgICAgIHNlbGYuX2FkZHdpZGdldChhdHRyLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5fX2RpY3RfX1thdHRyXSA9IHZhbHVlCisKKyAgICBkZWYgX19kZWxhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIGlmIGF0dHIgPT0gIl93aWRnZXRzZGljdCI6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgImNhbm5vdCBkZWxldGUgYXR0cmlidXRlIF93aWRnZXRzZGljdCIKKyAgICAgICAgaWYgc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShhdHRyKToKKyAgICAgICAgICAgIHNlbGYuX3JlbW92ZXdpZGdldChhdHRyKQorICAgICAgICAgICAgaWYgc2VsZi5fX2RpY3RfXy5oYXNfa2V5KGF0dHIpOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9fZGljdF9fW2F0dHJdCisgICAgICAgIGVsaWYgc2VsZi5fX2RpY3RfXy5oYXNfa2V5KGF0dHIpOgorICAgICAgICAgICAgZGVsIHNlbGYuX19kaWN0X19bYXR0cl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBhdHRyCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHNlbGYuX2FkZHdpZGdldChrZXksIHZhbHVlKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl93aWRnZXRzZGljdC5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvciwga2V5CisgICAgICAgIHJldHVybiBzZWxmLl93aWRnZXRzZGljdFtrZXldCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5fcmVtb3Zld2lkZ2V0KGtleSkKKworICAgIGRlZiBTZXRQb3J0KHNlbGYpOgorICAgICAgICBzZWxmLl9wYXJlbnR3aW5kb3cuU2V0UG9ydCgpCisKKworICAgIGRlZiBHZXRXaW5kb3coc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wYXJlbnR3aW5kb3cuR2V0V2luZG93KCkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgIHByaW50ICIlcyBpbnN0YW5jZSBkZWxldGVkIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICBkZWYgX2RyYXdib3VuZHMoc2VsZik6CisgICAgICAgIFFkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCiAKIAogY2xhc3MgQ2xpY2thYmxlV2lkZ2V0KFdpZGdldCk6Ci0JCi0JIiIiQmFzZSBjbGFzcyBmb3IgY2xpY2thYmxlIHdpZGdldHMuIChub3RlOiBzZWxmLl9lbmFibGVkIG11c3QgYmUgdHJ1ZSB0byByZWNlaXZlIGNsaWNrIGV2ZW50cy4pIiIiCi0JCi0JZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlwYXNzCi0JCi0JZGVmIGVuYWJsZShzZWxmLCBvbm9mZik6Ci0JCXNlbGYuX2VuYWJsZWQgPSBvbm9mZgotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLmRyYXcoKQotCQotCWRlZiBjYWxsYmFjayhzZWxmKToKLQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQlyZXR1cm4gQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxKQotCQorCisgICAgIiIiQmFzZSBjbGFzcyBmb3IgY2xpY2thYmxlIHdpZGdldHMuIChub3RlOiBzZWxmLl9lbmFibGVkIG11c3QgYmUgdHJ1ZSB0byByZWNlaXZlIGNsaWNrIGV2ZW50cy4pIiIiCisKKyAgICBkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBlbmFibGUoc2VsZiwgb25vZmYpOgorICAgICAgICBzZWxmLl9lbmFibGVkID0gb25vZmYKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgc2VsZi5kcmF3KCkKKworICAgIGRlZiBjYWxsYmFjayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICByZXR1cm4gQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxKQorCiAKIGNsYXNzIFNlbGVjdGFibGVXaWRnZXQoQ2xpY2thYmxlV2lkZ2V0KToKIAotCSIiIkJhc2UgY2xhc3MgZm9yIHNlbGVjdGFibGUgd2lkZ2V0cy4iIiIKLQkKLQlfc2VsZWN0YWJsZSA9IDEKLQkKLQlkZWYgc2VsZWN0KHNlbGYsIG9ub2ZmLCBpc2NsaWNrID0gMCk6Ci0JCWlmIG9ub2ZmID09IHNlbGYuX3NlbGVjdGVkOgotCQkJcmV0dXJuIDEKLQkJaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPHNlbGVjdD4iKToKLQkJCWNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxzZWxlY3Q+Il0KLQkJCWlmIGNhbGxiYWNrKG9ub2ZmKToKLQkJCQlyZXR1cm4gMQotCQlzZWxmLl9zZWxlY3RlZCA9IG9ub2ZmCi0JCWlmIG9ub2ZmOgotCQkJaWYgc2VsZi5fcGFyZW50d2luZG93Ll9jdXJyZW50d2lkZ2V0IGlzIG5vdCBOb25lOgotCQkJCXNlbGYuX3BhcmVudHdpbmRvdy5fY3VycmVudHdpZGdldC5zZWxlY3QoMCkKLQkJCXNlbGYuX3BhcmVudHdpbmRvdy5fY3VycmVudHdpZGdldCA9IHNlbGYKLQkJZWxzZToKLQkJCXNlbGYuX3BhcmVudHdpbmRvdy5fY3VycmVudHdpZGdldCA9IE5vbmUKLQkKLQlkZWYga2V5KHNlbGYsIGNoYXIsIGV2ZW50KToKLQkJcGFzcwotCQotCWRlZiBkcmF3c2VsZnJhbWUoc2VsZiwgb25vZmYpOgotCQlpZiBub3Qgc2VsZi5fcGFyZW50d2luZG93Ll9oYXNzZWxmcmFtZXM6Ci0JCQlyZXR1cm4KLQkJQXBwLkRyYXdUaGVtZUZvY3VzUmVjdChzZWxmLl9ib3VuZHMsIG9ub2ZmKQotCQotCWRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJaWYgc2VsZi5fc2VsZWN0ZWQ6Ci0JCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChRZC5JbnNldFJlY3Qob2xkYm91bmRzLCAtMywgLTMpKQotCQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3QoUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgLTMsIC0zKSkKLQkJZWxzZToKLQkJCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG9sZGJvdW5kcykKLQkJCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuX2JvdW5kcykKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBzZWxlY3RhYmxlIHdpZGdldHMuIiIiCisKKyAgICBfc2VsZWN0YWJsZSA9IDEKKworICAgIGRlZiBzZWxlY3Qoc2VsZiwgb25vZmYsIGlzY2xpY2sgPSAwKToKKyAgICAgICAgaWYgb25vZmYgPT0gc2VsZi5fc2VsZWN0ZWQ6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBpZiBzZWxmLl9iaW5kaW5ncy5oYXNfa2V5KCI8c2VsZWN0PiIpOgorICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1siPHNlbGVjdD4iXQorICAgICAgICAgICAgaWYgY2FsbGJhY2sob25vZmYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHNlbGYuX3NlbGVjdGVkID0gb25vZmYKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnR3aW5kb3cuX2N1cnJlbnR3aWRnZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50d2luZG93Ll9jdXJyZW50d2lkZ2V0LnNlbGVjdCgwKQorICAgICAgICAgICAgc2VsZi5fcGFyZW50d2luZG93Ll9jdXJyZW50d2lkZ2V0ID0gc2VsZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcGFyZW50d2luZG93Ll9jdXJyZW50d2lkZ2V0ID0gTm9uZQorCisgICAgZGVmIGtleShzZWxmLCBjaGFyLCBldmVudCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBkcmF3c2VsZnJhbWUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fcGFyZW50d2luZG93Ll9oYXNzZWxmcmFtZXM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgQXBwLkRyYXdUaGVtZUZvY3VzUmVjdChzZWxmLl9ib3VuZHMsIG9ub2ZmKQorCisgICAgZGVmIGFkanVzdChzZWxmLCBvbGRib3VuZHMpOgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBpZiBzZWxmLl9zZWxlY3RlZDoKKyAgICAgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChvbGRib3VuZHMsIC0zLCAtMykpCisgICAgICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCAtMywgLTMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qob2xkYm91bmRzKQorICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qoc2VsZi5fYm91bmRzKQogCiAKIGNsYXNzIF9MaW5lKFdpZGdldCk6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRoaWNrbmVzcyA9IDEpOgotCQlXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKLQkJc2VsZi5fdGhpY2tuZXNzID0gdGhpY2tuZXNzCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLmRyYXcoKQotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJUWQuUGFpbnRSZWN0KHNlbGYuX2JvdW5kcykKLQkKLQlkZWYgX2RyYXdib3VuZHMoc2VsZik6Ci0JCXBhc3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0aGlja25lc3MgPSAxKToKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCisgICAgICAgIHNlbGYuX3RoaWNrbmVzcyA9IHRoaWNrbmVzcworCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX2NhbGNib3VuZHMoKQorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLmRyYXcoKQorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBRZC5QYWludFJlY3Qoc2VsZi5fYm91bmRzKQorCisgICAgZGVmIF9kcmF3Ym91bmRzKHNlbGYpOgorICAgICAgICBwYXNzCiAKIGNsYXNzIEhvcml6b250YWxMaW5lKF9MaW5lKToKLQkKLQlkZWYgX2NhbGNib3VuZHMoc2VsZik6Ci0JCVdpZGdldC5fY2FsY2JvdW5kcyhzZWxmKQotCQlsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCi0JCXNlbGYuX2JvdW5kcyA9IGwsIHQsIHIsIHQgKyBzZWxmLl90aGlja25lc3MKKworICAgIGRlZiBfY2FsY2JvdW5kcyhzZWxmKToKKyAgICAgICAgV2lkZ2V0Ll9jYWxjYm91bmRzKHNlbGYpCisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgc2VsZi5fYm91bmRzID0gbCwgdCwgciwgdCArIHNlbGYuX3RoaWNrbmVzcwogCiBjbGFzcyBWZXJ0aWNhbExpbmUoX0xpbmUpOgotCQotCWRlZiBfY2FsY2JvdW5kcyhzZWxmKToKLQkJV2lkZ2V0Ll9jYWxjYm91bmRzKHNlbGYpCi0JCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJc2VsZi5fYm91bmRzID0gbCwgdCwgbCArIHNlbGYuX3RoaWNrbmVzcywgYgorCisgICAgZGVmIF9jYWxjYm91bmRzKHNlbGYpOgorICAgICAgICBXaWRnZXQuX2NhbGNib3VuZHMoc2VsZikKKyAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcworICAgICAgICBzZWxmLl9ib3VuZHMgPSBsLCB0LCBsICsgc2VsZi5fdGhpY2tuZXNzLCBiCiAKIAogY2xhc3MgRnJhbWUoV2lkZ2V0KToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgcGF0dGVybiA9IFFkLkdldFFER2xvYmFsc0JsYWNrKCksIGNvbG9yID0gKDAsIDAsIDApKToKLQkJV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCi0JCXNlbGYuX2ZyYW1lcGF0dGVybiA9IHBhdHRlcm4KLQkJc2VsZi5fZnJhbWVjb2xvciA9IGNvbG9yCi0JCi0JZGVmIHNldGNvbG9yKHNlbGYsIGNvbG9yKToKLQkJc2VsZi5fZnJhbWVjb2xvciA9IGNvbG9yCi0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuZHJhdygpCi0JCi0JZGVmIHNldHBhdHRlcm4oc2VsZiwgcGF0dGVybik6Ci0JCXNlbGYuX2ZyYW1lcGF0dGVybiA9IHBhdHRlcm4KLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi5kcmF3KCkKLQkJCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQlwZW5zdGF0ZSA9IFFkLkdldFBlblN0YXRlKCkKLQkJCVFkLlBlblBhdChzZWxmLl9mcmFtZXBhdHRlcm4pCi0JCQlRZC5SR0JGb3JlQ29sb3Ioc2VsZi5fZnJhbWVjb2xvcikKLQkJCVFkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCi0JCQlRZC5SR0JGb3JlQ29sb3IoKDAsIDAsIDApKQotCQkJUWQuU2V0UGVuU3RhdGUocGVuc3RhdGUpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgcGF0dGVybiA9IFFkLkdldFFER2xvYmFsc0JsYWNrKCksIGNvbG9yID0gKDAsIDAsIDApKToKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCisgICAgICAgIHNlbGYuX2ZyYW1lcGF0dGVybiA9IHBhdHRlcm4KKyAgICAgICAgc2VsZi5fZnJhbWVjb2xvciA9IGNvbG9yCisKKyAgICBkZWYgc2V0Y29sb3Ioc2VsZiwgY29sb3IpOgorICAgICAgICBzZWxmLl9mcmFtZWNvbG9yID0gY29sb3IKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgc2VsZi5kcmF3KCkKKworICAgIGRlZiBzZXRwYXR0ZXJuKHNlbGYsIHBhdHRlcm4pOgorICAgICAgICBzZWxmLl9mcmFtZXBhdHRlcm4gPSBwYXR0ZXJuCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuZHJhdygpCisKKyAgICBkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKKyAgICAgICAgaWYgc2VsZi5fdmlzaWJsZToKKyAgICAgICAgICAgIHBlbnN0YXRlID0gUWQuR2V0UGVuU3RhdGUoKQorICAgICAgICAgICAgUWQuUGVuUGF0KHNlbGYuX2ZyYW1lcGF0dGVybikKKyAgICAgICAgICAgIFFkLlJHQkZvcmVDb2xvcihzZWxmLl9mcmFtZWNvbG9yKQorICAgICAgICAgICAgUWQuRnJhbWVSZWN0KHNlbGYuX2JvdW5kcykKKyAgICAgICAgICAgIFFkLlJHQkZvcmVDb2xvcigoMCwgMCwgMCkpCisgICAgICAgICAgICBRZC5TZXRQZW5TdGF0ZShwZW5zdGF0ZSkKIAogZGVmIF9kYXJrZW5jb2xvcigociwgZywgYikpOgotCXJldHVybiBpbnQoMC43NSAqIHIpLCBpbnQoMC43NSAqIGcpLCBpbnQoMC43NSAqIGIpCisgICAgcmV0dXJuIGludCgwLjc1ICogciksIGludCgwLjc1ICogZyksIGludCgwLjc1ICogYikKIAogY2xhc3MgQmV2ZWxCb3goV2lkZ2V0KToKLQkKLQkiIiInUGxhdGludW0nIGJldmVsZWQgcmVjdGFuZ2xlLiIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCBjb2xvciA9ICgweGUwMDAsIDB4ZTAwMCwgMHhlMDAwKSk6Ci0JCVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQotCQlzZWxmLl9jb2xvciA9IGNvbG9yCi0JCXNlbGYuX2RhcmtlcmNvbG9yID0gX2RhcmtlbmNvbG9yKGNvbG9yKQotCQotCWRlZiBzZXRjb2xvcihzZWxmLCBjb2xvcik6Ci0JCXNlbGYuX2NvbG9yID0gY29sb3IKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi5kcmF3KCkKLQkKLQlkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCWwsIHQsIHIsIGIgPSBRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCAxLCAxKQotCQkJUWQuUkdCRm9yZUNvbG9yKHNlbGYuX2NvbG9yKQotCQkJUWQuUGFpbnRSZWN0KChsLCB0LCByLCBiKSkKLQkJCVFkLlJHQkZvcmVDb2xvcihzZWxmLl9kYXJrZXJjb2xvcikKLQkJCVFkLk1vdmVUbyhsLCBiKQotCQkJUWQuTGluZVRvKHIsIGIpCi0JCQlRZC5MaW5lVG8ociwgdCkKLQkJCVFkLlJHQkZvcmVDb2xvcigoMCwgMCwgMCkpCisKKyAgICAiIiInUGxhdGludW0nIGJldmVsZWQgcmVjdGFuZ2xlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIGNvbG9yID0gKDB4ZTAwMCwgMHhlMDAwLCAweGUwMDApKToKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCisgICAgICAgIHNlbGYuX2NvbG9yID0gY29sb3IKKyAgICAgICAgc2VsZi5fZGFya2VyY29sb3IgPSBfZGFya2VuY29sb3IoY29sb3IpCisKKyAgICBkZWYgc2V0Y29sb3Ioc2VsZiwgY29sb3IpOgorICAgICAgICBzZWxmLl9jb2xvciA9IGNvbG9yCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuZHJhdygpCisKKyAgICBkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKKyAgICAgICAgaWYgc2VsZi5fdmlzaWJsZToKKyAgICAgICAgICAgIGwsIHQsIHIsIGIgPSBRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCAxLCAxKQorICAgICAgICAgICAgUWQuUkdCRm9yZUNvbG9yKHNlbGYuX2NvbG9yKQorICAgICAgICAgICAgUWQuUGFpbnRSZWN0KChsLCB0LCByLCBiKSkKKyAgICAgICAgICAgIFFkLlJHQkZvcmVDb2xvcihzZWxmLl9kYXJrZXJjb2xvcikKKyAgICAgICAgICAgIFFkLk1vdmVUbyhsLCBiKQorICAgICAgICAgICAgUWQuTGluZVRvKHIsIGIpCisgICAgICAgICAgICBRZC5MaW5lVG8ociwgdCkKKyAgICAgICAgICAgIFFkLlJHQkZvcmVDb2xvcigoMCwgMCwgMCkpCiAKIAogY2xhc3MgR3JvdXAoV2lkZ2V0KToKLQkKLQkiIiJBIGNvbnRhaW5lciBmb3Igc3Vid2lkZ2V0cyIiIgorCisgICAgIiIiQSBjb250YWluZXIgZm9yIHN1YndpZGdldHMiIiIKIAogCiBjbGFzcyBIb3Jpem9udGFsUGFuZXMoV2lkZ2V0KToKLQkKLQkiIiJQYW5lcywgYS5rLmEuIGZyYW1lcy4gV29ya3MgYSBiaXQgbGlrZSBhIGdyb3VwLiBEZXZpZGVzIHRoZSB3aWRnZXQgYXJlYSBpbnRvICJwYW5lcyIsCi0Jd2hpY2ggY2FuIGJlIHJlc2l6ZWQgYnkgdGhlIHVzZXIgYnkgY2xpY2tpbmcgYW5kIGRyYWdnaW5nIGJldHdlZW4gdGhlIHN1YndpZGdldHMuIiIiCi0JCi0JX2RpcmVjdGlvbiA9IDEKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgcGFuZXNpemVzID0gTm9uZSwgZ3V0dGVyID0gOCk6Ci0JCSIiInBhbmVzaXplcyBzaG91bGQgYmUgYSB0dXBsZSBvZiBudW1iZXJzLiBUaGUgbGVuZ3RoIG9mIHRoZSB0dXBsZSBpcyB0aGUgbnVtYmVyIG9mIHBhbmVzLCAKLQkJdGhlIGl0ZW1zIGluIHRoZSB0dXBsZSBhcmUgdGhlIHJlbGF0aXZlIHNpemVzIG9mIHRoZXNlIHBhbmVzOyB0aGVzZSBudW1iZXJzIHNob3VsZCBhZGQgdXAgCi0JCXRvIDEgKHRoZSB0b3RhbCBzaXplIG9mIGFsbCBwYW5lcykuIiIiCi0JCVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQotCQlzZWxmLl9wYW5lc2l6ZXMgPSBwYW5lc2l6ZXMKLQkJc2VsZi5fZ3V0dGVyID0gZ3V0dGVyCi0JCXNlbGYuX2VuYWJsZWQgPSAxCi0JCXNlbGYuc2V0dXBwYW5lcygpCi0JCi0JI2RlZiBvcGVuKHNlbGYpOgotCSMJc2VsZi5pbnN0YWxsYm91bmRzKCkKLQkjCUNsaWNrYWJsZVdpZGdldC5vcGVuKHNlbGYpCi0JCi0JZGVmIF9jYWxjYm91bmRzKHNlbGYpOgotCQkjIGhtbW0uIEl0IHNob3VsZCBub3QgbmVjY2VzYXJ5IGJlIG92ZXJyaWRlIF9jYWxjYm91bmRzIDotKAotCQlzZWxmLmluc3RhbGxib3VuZHMoKQotCQlXaWRnZXQuX2NhbGNib3VuZHMoc2VsZikKLQkKLQlkZWYgc2V0dXBwYW5lcyhzZWxmKToKLQkJcGFuZXNpemVzID0gc2VsZi5fcGFuZXNpemVzCi0JCXRvdGFsID0gMAotCQlpZiBwYW5lc2l6ZXMgaXMgbm90IE5vbmU6Ci0JCQkjaWYgbGVuKHNlbGYuX3dpZGdldHMpIDw+IGxlbihwYW5lc2l6ZXMpOgotCQkJIwlyYWlzZSBUeXBlRXJyb3IsICdudW1iZXIgb2Ygd2lkZ2V0cyBkb2VzIG5vdCBtYXRjaCBudW1iZXIgb2YgcGFuZXMnCi0JCQlmb3IgcGFuZXNpemUgaW4gcGFuZXNpemVzOgotCQkJCWlmIG5vdCAwIDwgcGFuZXNpemUgPCAxOgotCQkJCQlyYWlzZSBUeXBlRXJyb3IsICdwYW5lIHNpemVzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLCBub3QgaW5jbHVkaW5nLicKLQkJCQl0b3RhbCA9IHRvdGFsICsgcGFuZXNpemUKLQkJCWlmIHJvdW5kKHRvdGFsLCA0KSA8PiAxLjA6Ci0JCQkJcmFpc2UgVHlwZUVycm9yLCAncGFuZSBzaXplcyBtdXN0IGFkZCB1cCB0byAxJwotCQllbHNlOgotCQkJIyBYWFggZG9lcyBub3Qgd29yayEKLQkJCXN0ZXAgPSAxLjAgLyBsZW4oc2VsZi5fd2lkZ2V0cykKLQkJCXBhbmVzaXplcyA9IFtdCi0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5fd2lkZ2V0cykpOgotCQkJCXBhbmVzaXplcy5hcHBlbmQoc3RlcCkKLQkJY3VycmVudCA9IDAKLQkJc2VsZi5fcGFuZXNpemVzID0gW10KLQkJc2VsZi5fZ3V0dGVycyA9IFtdCi0JCWZvciBwYW5lc2l6ZSBpbiBwYW5lc2l6ZXM6Ci0JCQlpZiBjdXJyZW50OgotCQkJCXNlbGYuX2d1dHRlcnMuYXBwZW5kKGN1cnJlbnQpCi0JCQlzZWxmLl9wYW5lc2l6ZXMuYXBwZW5kKChjdXJyZW50LCBjdXJyZW50ICsgcGFuZXNpemUpKQotCQkJY3VycmVudCA9IGN1cnJlbnQgKyBwYW5lc2l6ZQotCQlzZWxmLm1ha2VwYW5lYm91bmRzKCkKLQkKLQlkZWYgZ2V0cGFuZXNpemVzKHNlbGYpOgotCQlyZXR1cm4gbWFwKGxhbWJkYSAoZnIsIHRvKTogdG8tZnIsICBzZWxmLl9wYW5lc2l6ZXMpCi0JCi0JYm91bmRzdGVtcGxhdGUgPSAibGFtYmRhIHdpZHRoLCBoZWlnaHQ6ICgwLCBoZWlnaHQgKiAlcyArICVkLCB3aWR0aCwgaGVpZ2h0ICogJXMgKyAlZCkiCi0JCi0JZGVmIG1ha2VwYW5lYm91bmRzKHNlbGYpOgotCQloYWxmZ3V0dGVyID0gc2VsZi5fZ3V0dGVyIC8gMgotCQlzZWxmLl9wYW5lYm91bmRzID0gW10KLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX3BhbmVzaXplcykpOgotCQkJcGFuZXN0YXJ0LCBwYW5lZW5kID0gc2VsZi5fcGFuZXNpemVzW2ldCi0JCQlib3VuZHNzdHJpbmcgPSBzZWxmLmJvdW5kc3RlbXBsYXRlICUgKHJlcHIocGFuZXN0YXJ0KSwgcGFuZXN0YXJ0IGFuZCBoYWxmZ3V0dGVyLCAKLQkJCQkJCQlyZXByKHBhbmVlbmQpLCAocGFuZWVuZCA8PiAxLjApIGFuZCAtaGFsZmd1dHRlcikKLQkJCXNlbGYuX3BhbmVib3VuZHMuYXBwZW5kKGV2YWwoYm91bmRzc3RyaW5nKSkKLQkKLQlkZWYgaW5zdGFsbGJvdW5kcyhzZWxmKToKLQkJI3NlbGYuc2V0dXBwYW5lcygpCi0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLl93aWRnZXRzKSk6Ci0JCQl3ID0gc2VsZi5fd2lkZ2V0c1tpXQotCQkJdy5fcG9zc2l6ZSA9IHNlbGYuX3BhbmVib3VuZHNbaV0KLQkJCSNpZiBoYXNhdHRyKHcsICJzZXR1cHBhbmVzIik6Ci0JCQkjCXcuc2V0dXBwYW5lcygpCi0JCQlpZiBoYXNhdHRyKHcsICJpbnN0YWxsYm91bmRzIik6Ci0JCQkJdy5pbnN0YWxsYm91bmRzKCkKLQkKLQlkZWYgcm9sbG92ZXIoc2VsZiwgcG9pbnQsIG9ub2ZmKToKLQkJaWYgb25vZmY6Ci0JCQlvcmdtb3VzZSA9IHBvaW50W3NlbGYuX2RpcmVjdGlvbl0KLQkJCWhhbGZndXR0ZXIgPSBzZWxmLl9ndXR0ZXIgLyAyCi0JCQlsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCi0JCQlpZiBzZWxmLl9kaXJlY3Rpb246Ci0JCQkJYmVnaW4sIGVuZCA9IHQsIGIKLQkJCWVsc2U6Ci0JCQkJYmVnaW4sIGVuZCA9IGwsIHIKLQkJCQotCQkJaSA9IHNlbGYuZmluZGd1dHRlcihvcmdtb3VzZSwgYmVnaW4sIGVuZCkKLQkJCWlmIGkgaXMgTm9uZToKLQkJCQlTZXRDdXJzb3IoImFycm93IikKLQkJCWVsc2U6Ci0JCQkJU2V0Q3Vyc29yKHNlbGYuX2RpcmVjdGlvbiBhbmQgJ3Ztb3Zlcicgb3IgJ2htb3ZlcicpCi0JCi0JZGVmIGZpbmRndXR0ZXIoc2VsZiwgb3JnbW91c2UsIGJlZ2luLCBlbmQpOgotCQl0b2xlcmFuY2UgPSBtYXgoNCwgc2VsZi5fZ3V0dGVyKSAvIDIKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX2d1dHRlcnMpKToKLQkJCXBvcyA9IGJlZ2luICsgKGVuZCAtIGJlZ2luKSAqIHNlbGYuX2d1dHRlcnNbaV0KLQkJCWlmIGFicyhvcmdtb3VzZSAtIHBvcykgPD0gdG9sZXJhbmNlOgotCQkJCWJyZWFrCi0JCWVsc2U6Ci0JCQlyZXR1cm4KLQkJcmV0dXJuIGkKLQkKLQlkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCSMgd2hhdCBhIG1lc3MuLi4KLQkJb3JnbW91c2UgPSBwb2ludFtzZWxmLl9kaXJlY3Rpb25dCi0JCWhhbGZndXR0ZXIgPSBzZWxmLl9ndXR0ZXIgLyAyCi0JCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJaWYgc2VsZi5fZGlyZWN0aW9uOgotCQkJYmVnaW4sIGVuZCA9IHQsIGIKLQkJZWxzZToKLQkJCWJlZ2luLCBlbmQgPSBsLCByCi0JCQotCQlpID0gc2VsZi5maW5kZ3V0dGVyKG9yZ21vdXNlLCBiZWdpbiwgZW5kKQotCQlpZiBpIGlzIE5vbmU6Ci0JCQlyZXR1cm4KLQkJCi0JCXBvcyA9IG9yZ3BvcyA9IGJlZ2luICsgKGVuZCAtIGJlZ2luKSAqIHNlbGYuX2d1dHRlcnNbaV0JIyBpbml0IHBvcyB0b28sIGZvciBmYXN0IGNsaWNrIG9uIGJvcmRlciwgYnVnIGRvbmUgYnkgUGV0cgotCQkKLQkJbWlucG9zID0gc2VsZi5fcGFuZXNpemVzW2ldWzBdCi0JCW1heHBvcyA9IHNlbGYuX3BhbmVzaXplc1tpKzFdWzFdCi0JCW1pbnBvcyA9IGJlZ2luICsgKGVuZCAtIGJlZ2luKSAqIG1pbnBvcyArIDY0Ci0JCW1heHBvcyA9IGJlZ2luICsgKGVuZCAtIGJlZ2luKSAqIG1heHBvcyAtIDY0Ci0JCWlmIG1pbnBvcyA+IG9yZ3BvcyBhbmQgbWF4cG9zIDwgb3JncG9zOgotCQkJcmV0dXJuCi0JCQotCQkjU2V0Q3Vyc29yKCJmaXN0IikKLQkJc2VsZi5TZXRQb3J0KCkKLQkJaWYgc2VsZi5fZGlyZWN0aW9uOgotCQkJcmVjdCA9IGwsIG9yZ3BvcyAtIDEsIHIsIG9yZ3BvcwotCQllbHNlOgotCQkJcmVjdCA9IG9yZ3BvcyAtIDEsIHQsIG9yZ3BvcywgYgotCQkKLQkJIyB0cmFjayBtb3VzZSAtLS0gWFhYICBtb3ZlIHRvIHNlcGFyYXRlIG1ldGhvZD8KLQkJUWQuUGVuTW9kZShRdWlja0RyYXcuc3JjWG9yKQotCQlRZC5QZW5QYXQoUWQuR2V0UURHbG9iYWxzR3JheSgpKQotCQlRZC5QYWludFJlY3QoX2ludFJlY3QocmVjdCkpCi0JCWxhc3Rwb3MgPSBOb25lCi0JCXdoaWxlIEV2dC5CdXR0b24oKToKLQkJCXBvcyA9IG9yZ3BvcyAtIG9yZ21vdXNlICsgRXZ0LkdldE1vdXNlKClbc2VsZi5fZGlyZWN0aW9uXQotCQkJcG9zID0gbWF4KHBvcywgbWlucG9zKQotCQkJcG9zID0gbWluKHBvcywgbWF4cG9zKQotCQkJaWYgcG9zID09IGxhc3Rwb3M6Ci0JCQkJY29udGludWUKLQkJCVFkLlBlblBhdChRZC5HZXRRREdsb2JhbHNHcmF5KCkpCi0JCQlRZC5QYWludFJlY3QoX2ludFJlY3QocmVjdCkpCi0JCQlpZiBzZWxmLl9kaXJlY3Rpb246Ci0JCQkJcmVjdCA9IGwsIHBvcyAtIDEsIHIsIHBvcwotCQkJZWxzZToKLQkJCQlyZWN0ID0gcG9zIC0gMSwgdCwgcG9zLCBiCi0JCQlRZC5QZW5QYXQoUWQuR2V0UURHbG9iYWxzR3JheSgpKQotCQkJUWQuUGFpbnRSZWN0KF9pbnRSZWN0KHJlY3QpKQotCQkJbGFzdHBvcyA9IHBvcwotCQkJc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkuUURGbHVzaFBvcnRCdWZmZXIoTm9uZSkKLQkJCUV2dC5XYWl0TmV4dEV2ZW50KDAsIDMpCi0JCVFkLlBhaW50UmVjdChfaW50UmVjdChyZWN0KSkKLQkJUWQuUGVuTm9ybWFsKCkKLQkJU2V0Q3Vyc29yKCJ3YXRjaCIpCi0JCQotCQluZXdwb3MgPSAocG9zIC0gYmVnaW4pIC8gZmxvYXQoZW5kIC0gYmVnaW4pCi0JCXNlbGYuX2d1dHRlcnNbaV0gPSBuZXdwb3MKLQkJc2VsZi5fcGFuZXNpemVzW2ldID0gc2VsZi5fcGFuZXNpemVzW2ldWzBdLCBuZXdwb3MKLQkJc2VsZi5fcGFuZXNpemVzW2krMV0gPSBuZXdwb3MsIHNlbGYuX3BhbmVzaXplc1tpKzFdWzFdCi0JCXNlbGYubWFrZXBhbmVib3VuZHMoKQotCQlzZWxmLmluc3RhbGxib3VuZHMoKQotCQlzZWxmLl9jYWxjYm91bmRzKCkKKworICAgICIiIlBhbmVzLCBhLmsuYS4gZnJhbWVzLiBXb3JrcyBhIGJpdCBsaWtlIGEgZ3JvdXAuIERldmlkZXMgdGhlIHdpZGdldCBhcmVhIGludG8gInBhbmVzIiwKKyAgICB3aGljaCBjYW4gYmUgcmVzaXplZCBieSB0aGUgdXNlciBieSBjbGlja2luZyBhbmQgZHJhZ2dpbmcgYmV0d2VlbiB0aGUgc3Vid2lkZ2V0cy4iIiIKKworICAgIF9kaXJlY3Rpb24gPSAxCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgcGFuZXNpemVzID0gTm9uZSwgZ3V0dGVyID0gOCk6CisgICAgICAgICIiInBhbmVzaXplcyBzaG91bGQgYmUgYSB0dXBsZSBvZiBudW1iZXJzLiBUaGUgbGVuZ3RoIG9mIHRoZSB0dXBsZSBpcyB0aGUgbnVtYmVyIG9mIHBhbmVzLAorICAgICAgICB0aGUgaXRlbXMgaW4gdGhlIHR1cGxlIGFyZSB0aGUgcmVsYXRpdmUgc2l6ZXMgb2YgdGhlc2UgcGFuZXM7IHRoZXNlIG51bWJlcnMgc2hvdWxkIGFkZCB1cAorICAgICAgICB0byAxICh0aGUgdG90YWwgc2l6ZSBvZiBhbGwgcGFuZXMpLiIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKKyAgICAgICAgc2VsZi5fcGFuZXNpemVzID0gcGFuZXNpemVzCisgICAgICAgIHNlbGYuX2d1dHRlciA9IGd1dHRlcgorICAgICAgICBzZWxmLl9lbmFibGVkID0gMQorICAgICAgICBzZWxmLnNldHVwcGFuZXMoKQorCisgICAgI2RlZiBvcGVuKHNlbGYpOgorICAgICMgICAgICAgc2VsZi5pbnN0YWxsYm91bmRzKCkKKyAgICAjICAgICAgIENsaWNrYWJsZVdpZGdldC5vcGVuKHNlbGYpCisKKyAgICBkZWYgX2NhbGNib3VuZHMoc2VsZik6CisgICAgICAgICMgaG1tbS4gSXQgc2hvdWxkIG5vdCBuZWNjZXNhcnkgYmUgb3ZlcnJpZGUgX2NhbGNib3VuZHMgOi0oCisgICAgICAgIHNlbGYuaW5zdGFsbGJvdW5kcygpCisgICAgICAgIFdpZGdldC5fY2FsY2JvdW5kcyhzZWxmKQorCisgICAgZGVmIHNldHVwcGFuZXMoc2VsZik6CisgICAgICAgIHBhbmVzaXplcyA9IHNlbGYuX3BhbmVzaXplcworICAgICAgICB0b3RhbCA9IDAKKyAgICAgICAgaWYgcGFuZXNpemVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgI2lmIGxlbihzZWxmLl93aWRnZXRzKSA8PiBsZW4ocGFuZXNpemVzKToKKyAgICAgICAgICAgICMgICAgICAgcmFpc2UgVHlwZUVycm9yLCAnbnVtYmVyIG9mIHdpZGdldHMgZG9lcyBub3QgbWF0Y2ggbnVtYmVyIG9mIHBhbmVzJworICAgICAgICAgICAgZm9yIHBhbmVzaXplIGluIHBhbmVzaXplczoKKyAgICAgICAgICAgICAgICBpZiBub3QgMCA8IHBhbmVzaXplIDwgMToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAncGFuZSBzaXplcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSwgbm90IGluY2x1ZGluZy4nCisgICAgICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIHBhbmVzaXplCisgICAgICAgICAgICBpZiByb3VuZCh0b3RhbCwgNCkgPD4gMS4wOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgJ3BhbmUgc2l6ZXMgbXVzdCBhZGQgdXAgdG8gMScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgWFhYIGRvZXMgbm90IHdvcmshCisgICAgICAgICAgICBzdGVwID0gMS4wIC8gbGVuKHNlbGYuX3dpZGdldHMpCisgICAgICAgICAgICBwYW5lc2l6ZXMgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX3dpZGdldHMpKToKKyAgICAgICAgICAgICAgICBwYW5lc2l6ZXMuYXBwZW5kKHN0ZXApCisgICAgICAgIGN1cnJlbnQgPSAwCisgICAgICAgIHNlbGYuX3BhbmVzaXplcyA9IFtdCisgICAgICAgIHNlbGYuX2d1dHRlcnMgPSBbXQorICAgICAgICBmb3IgcGFuZXNpemUgaW4gcGFuZXNpemVzOgorICAgICAgICAgICAgaWYgY3VycmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLl9ndXR0ZXJzLmFwcGVuZChjdXJyZW50KQorICAgICAgICAgICAgc2VsZi5fcGFuZXNpemVzLmFwcGVuZCgoY3VycmVudCwgY3VycmVudCArIHBhbmVzaXplKSkKKyAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50ICsgcGFuZXNpemUKKyAgICAgICAgc2VsZi5tYWtlcGFuZWJvdW5kcygpCisKKyAgICBkZWYgZ2V0cGFuZXNpemVzKHNlbGYpOgorICAgICAgICByZXR1cm4gbWFwKGxhbWJkYSAoZnIsIHRvKTogdG8tZnIsICBzZWxmLl9wYW5lc2l6ZXMpCisKKyAgICBib3VuZHN0ZW1wbGF0ZSA9ICJsYW1iZGEgd2lkdGgsIGhlaWdodDogKDAsIGhlaWdodCAqICVzICsgJWQsIHdpZHRoLCBoZWlnaHQgKiAlcyArICVkKSIKKworICAgIGRlZiBtYWtlcGFuZWJvdW5kcyhzZWxmKToKKyAgICAgICAgaGFsZmd1dHRlciA9IHNlbGYuX2d1dHRlciAvIDIKKyAgICAgICAgc2VsZi5fcGFuZWJvdW5kcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLl9wYW5lc2l6ZXMpKToKKyAgICAgICAgICAgIHBhbmVzdGFydCwgcGFuZWVuZCA9IHNlbGYuX3BhbmVzaXplc1tpXQorICAgICAgICAgICAgYm91bmRzc3RyaW5nID0gc2VsZi5ib3VuZHN0ZW1wbGF0ZSAlIChyZXByKHBhbmVzdGFydCksIHBhbmVzdGFydCBhbmQgaGFsZmd1dHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihwYW5lZW5kKSwgKHBhbmVlbmQgPD4gMS4wKSBhbmQgLWhhbGZndXR0ZXIpCisgICAgICAgICAgICBzZWxmLl9wYW5lYm91bmRzLmFwcGVuZChldmFsKGJvdW5kc3N0cmluZykpCisKKyAgICBkZWYgaW5zdGFsbGJvdW5kcyhzZWxmKToKKyAgICAgICAgI3NlbGYuc2V0dXBwYW5lcygpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLl93aWRnZXRzKSk6CisgICAgICAgICAgICB3ID0gc2VsZi5fd2lkZ2V0c1tpXQorICAgICAgICAgICAgdy5fcG9zc2l6ZSA9IHNlbGYuX3BhbmVib3VuZHNbaV0KKyAgICAgICAgICAgICNpZiBoYXNhdHRyKHcsICJzZXR1cHBhbmVzIik6CisgICAgICAgICAgICAjICAgICAgIHcuc2V0dXBwYW5lcygpCisgICAgICAgICAgICBpZiBoYXNhdHRyKHcsICJpbnN0YWxsYm91bmRzIik6CisgICAgICAgICAgICAgICAgdy5pbnN0YWxsYm91bmRzKCkKKworICAgIGRlZiByb2xsb3ZlcihzZWxmLCBwb2ludCwgb25vZmYpOgorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIG9yZ21vdXNlID0gcG9pbnRbc2VsZi5fZGlyZWN0aW9uXQorICAgICAgICAgICAgaGFsZmd1dHRlciA9IHNlbGYuX2d1dHRlciAvIDIKKyAgICAgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgICAgIGlmIHNlbGYuX2RpcmVjdGlvbjoKKyAgICAgICAgICAgICAgICBiZWdpbiwgZW5kID0gdCwgYgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBiZWdpbiwgZW5kID0gbCwgcgorCisgICAgICAgICAgICBpID0gc2VsZi5maW5kZ3V0dGVyKG9yZ21vdXNlLCBiZWdpbiwgZW5kKQorICAgICAgICAgICAgaWYgaSBpcyBOb25lOgorICAgICAgICAgICAgICAgIFNldEN1cnNvcigiYXJyb3ciKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTZXRDdXJzb3Ioc2VsZi5fZGlyZWN0aW9uIGFuZCAndm1vdmVyJyBvciAnaG1vdmVyJykKKworICAgIGRlZiBmaW5kZ3V0dGVyKHNlbGYsIG9yZ21vdXNlLCBiZWdpbiwgZW5kKToKKyAgICAgICAgdG9sZXJhbmNlID0gbWF4KDQsIHNlbGYuX2d1dHRlcikgLyAyCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLl9ndXR0ZXJzKSk6CisgICAgICAgICAgICBwb3MgPSBiZWdpbiArIChlbmQgLSBiZWdpbikgKiBzZWxmLl9ndXR0ZXJzW2ldCisgICAgICAgICAgICBpZiBhYnMob3JnbW91c2UgLSBwb3MpIDw9IHRvbGVyYW5jZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJldHVybiBpCisKKyAgICBkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6CisgICAgICAgICMgd2hhdCBhIG1lc3MuLi4KKyAgICAgICAgb3JnbW91c2UgPSBwb2ludFtzZWxmLl9kaXJlY3Rpb25dCisgICAgICAgIGhhbGZndXR0ZXIgPSBzZWxmLl9ndXR0ZXIgLyAyCisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgaWYgc2VsZi5fZGlyZWN0aW9uOgorICAgICAgICAgICAgYmVnaW4sIGVuZCA9IHQsIGIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJlZ2luLCBlbmQgPSBsLCByCisKKyAgICAgICAgaSA9IHNlbGYuZmluZGd1dHRlcihvcmdtb3VzZSwgYmVnaW4sIGVuZCkKKyAgICAgICAgaWYgaSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcG9zID0gb3JncG9zID0gYmVnaW4gKyAoZW5kIC0gYmVnaW4pICogc2VsZi5fZ3V0dGVyc1tpXSAjIGluaXQgcG9zIHRvbywgZm9yIGZhc3QgY2xpY2sgb24gYm9yZGVyLCBidWcgZG9uZSBieSBQZXRyCisKKyAgICAgICAgbWlucG9zID0gc2VsZi5fcGFuZXNpemVzW2ldWzBdCisgICAgICAgIG1heHBvcyA9IHNlbGYuX3BhbmVzaXplc1tpKzFdWzFdCisgICAgICAgIG1pbnBvcyA9IGJlZ2luICsgKGVuZCAtIGJlZ2luKSAqIG1pbnBvcyArIDY0CisgICAgICAgIG1heHBvcyA9IGJlZ2luICsgKGVuZCAtIGJlZ2luKSAqIG1heHBvcyAtIDY0CisgICAgICAgIGlmIG1pbnBvcyA+IG9yZ3BvcyBhbmQgbWF4cG9zIDwgb3JncG9zOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgI1NldEN1cnNvcigiZmlzdCIpCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIGlmIHNlbGYuX2RpcmVjdGlvbjoKKyAgICAgICAgICAgIHJlY3QgPSBsLCBvcmdwb3MgLSAxLCByLCBvcmdwb3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlY3QgPSBvcmdwb3MgLSAxLCB0LCBvcmdwb3MsIGIKKworICAgICAgICAjIHRyYWNrIG1vdXNlIC0tLSBYWFggIG1vdmUgdG8gc2VwYXJhdGUgbWV0aG9kPworICAgICAgICBRZC5QZW5Nb2RlKFF1aWNrRHJhdy5zcmNYb3IpCisgICAgICAgIFFkLlBlblBhdChRZC5HZXRRREdsb2JhbHNHcmF5KCkpCisgICAgICAgIFFkLlBhaW50UmVjdChfaW50UmVjdChyZWN0KSkKKyAgICAgICAgbGFzdHBvcyA9IE5vbmUKKyAgICAgICAgd2hpbGUgRXZ0LkJ1dHRvbigpOgorICAgICAgICAgICAgcG9zID0gb3JncG9zIC0gb3JnbW91c2UgKyBFdnQuR2V0TW91c2UoKVtzZWxmLl9kaXJlY3Rpb25dCisgICAgICAgICAgICBwb3MgPSBtYXgocG9zLCBtaW5wb3MpCisgICAgICAgICAgICBwb3MgPSBtaW4ocG9zLCBtYXhwb3MpCisgICAgICAgICAgICBpZiBwb3MgPT0gbGFzdHBvczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgUWQuUGVuUGF0KFFkLkdldFFER2xvYmFsc0dyYXkoKSkKKyAgICAgICAgICAgIFFkLlBhaW50UmVjdChfaW50UmVjdChyZWN0KSkKKyAgICAgICAgICAgIGlmIHNlbGYuX2RpcmVjdGlvbjoKKyAgICAgICAgICAgICAgICByZWN0ID0gbCwgcG9zIC0gMSwgciwgcG9zCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlY3QgPSBwb3MgLSAxLCB0LCBwb3MsIGIKKyAgICAgICAgICAgIFFkLlBlblBhdChRZC5HZXRRREdsb2JhbHNHcmF5KCkpCisgICAgICAgICAgICBRZC5QYWludFJlY3QoX2ludFJlY3QocmVjdCkpCisgICAgICAgICAgICBsYXN0cG9zID0gcG9zCisgICAgICAgICAgICBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS5RREZsdXNoUG9ydEJ1ZmZlcihOb25lKQorICAgICAgICAgICAgRXZ0LldhaXROZXh0RXZlbnQoMCwgMykKKyAgICAgICAgUWQuUGFpbnRSZWN0KF9pbnRSZWN0KHJlY3QpKQorICAgICAgICBRZC5QZW5Ob3JtYWwoKQorICAgICAgICBTZXRDdXJzb3IoIndhdGNoIikKKworICAgICAgICBuZXdwb3MgPSAocG9zIC0gYmVnaW4pIC8gZmxvYXQoZW5kIC0gYmVnaW4pCisgICAgICAgIHNlbGYuX2d1dHRlcnNbaV0gPSBuZXdwb3MKKyAgICAgICAgc2VsZi5fcGFuZXNpemVzW2ldID0gc2VsZi5fcGFuZXNpemVzW2ldWzBdLCBuZXdwb3MKKyAgICAgICAgc2VsZi5fcGFuZXNpemVzW2krMV0gPSBuZXdwb3MsIHNlbGYuX3BhbmVzaXplc1tpKzFdWzFdCisgICAgICAgIHNlbGYubWFrZXBhbmVib3VuZHMoKQorICAgICAgICBzZWxmLmluc3RhbGxib3VuZHMoKQorICAgICAgICBzZWxmLl9jYWxjYm91bmRzKCkKIAogCiBjbGFzcyBWZXJ0aWNhbFBhbmVzKEhvcml6b250YWxQYW5lcyk6Ci0JIiIic2VlIEhvcml6b250YWxQYW5lcyIiIgotCV9kaXJlY3Rpb24gPSAwCi0JYm91bmRzdGVtcGxhdGUgPSAibGFtYmRhIHdpZHRoLCBoZWlnaHQ6ICh3aWR0aCAqICVzICsgJWQsIDAsIHdpZHRoICogJXMgKyAlZCwgaGVpZ2h0KSIKKyAgICAiIiJzZWUgSG9yaXpvbnRhbFBhbmVzIiIiCisgICAgX2RpcmVjdGlvbiA9IDAKKyAgICBib3VuZHN0ZW1wbGF0ZSA9ICJsYW1iZGEgd2lkdGgsIGhlaWdodDogKHdpZHRoICogJXMgKyAlZCwgMCwgd2lkdGggKiAlcyArICVkLCBoZWlnaHQpIgogCiAKIGNsYXNzIENvbG9yUGlja2VyKENsaWNrYWJsZVdpZGdldCk6Ci0JCi0JIiIiQ29sb3IgcGlja2VyIHdpZGdldC4gQWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIGNvbG9yLiIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCBjb2xvciA9ICgwLCAwLCAwKSwgY2FsbGJhY2sgPSBOb25lKToKLQkJQ2xpY2thYmxlV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCi0JCXNlbGYuX2NvbG9yID0gY29sb3IKLQkJc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjawotCQlzZWxmLl9lbmFibGVkID0gMQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJaW1wb3J0IENvbG9yUGlja2VyCi0JCW5ld2NvbG9yLCBvayA9IENvbG9yUGlja2VyLkdldENvbG9yKCIiLCBzZWxmLl9jb2xvcikKLQkJaWYgb2s6Ci0JCQlzZWxmLl9jb2xvciA9IG5ld2NvbG9yCi0JCQlzZWxmLlNldFBvcnQoKQotCQkJc2VsZi5kcmF3KCkKLQkJCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJCXJldHVybiBDYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsIHNlbGYuX2NvbG9yKQotCQotCWRlZiBzZXQoc2VsZiwgY29sb3IpOgotCQlzZWxmLl9jb2xvciA9IGNvbG9yCi0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuZHJhdygpCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYuX2NvbG9yCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduPU5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJaWYgbm90IHZpc1JnbjoKLQkJCQl2aXNSZ24gPSBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KLQkJCVFkLlBlblBhdChRZC5HZXRRREdsb2JhbHNHcmF5KCkpCi0JCQlyZWN0ID0gc2VsZi5fYm91bmRzCi0JCQlRZC5GcmFtZVJlY3QocmVjdCkKLQkJCXJlY3QgPSBRZC5JbnNldFJlY3QocmVjdCwgMywgMykKLQkJCVFkLlBlbk5vcm1hbCgpCi0JCQlRZC5SR0JGb3JlQ29sb3Ioc2VsZi5fY29sb3IpCi0JCQlRZC5QYWludFJlY3QocmVjdCkKLQkJCVFkLlJHQkZvcmVDb2xvcigoMCwgMCwgMCkpCi0JCQkKKworICAgICIiIkNvbG9yIHBpY2tlciB3aWRnZXQuIEFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSBjb2xvci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCBjb2xvciA9ICgwLCAwLCAwKSwgY2FsbGJhY2sgPSBOb25lKToKKyAgICAgICAgQ2xpY2thYmxlV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCisgICAgICAgIHNlbGYuX2NvbG9yID0gY29sb3IKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjaworICAgICAgICBzZWxmLl9lbmFibGVkID0gMQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpbXBvcnQgQ29sb3JQaWNrZXIKKyAgICAgICAgbmV3Y29sb3IsIG9rID0gQ29sb3JQaWNrZXIuR2V0Q29sb3IoIiIsIHNlbGYuX2NvbG9yKQorICAgICAgICBpZiBvazoKKyAgICAgICAgICAgIHNlbGYuX2NvbG9yID0gbmV3Y29sb3IKKyAgICAgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgICAgICBzZWxmLmRyYXcoKQorICAgICAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICAgICAgcmV0dXJuIENhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgc2VsZi5fY29sb3IpCisKKyAgICBkZWYgc2V0KHNlbGYsIGNvbG9yKToKKyAgICAgICAgc2VsZi5fY29sb3IgPSBjb2xvcgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLmRyYXcoKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbG9yCisKKyAgICBkZWYgZHJhdyhzZWxmLCB2aXNSZ249Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBpZiBub3QgdmlzUmduOgorICAgICAgICAgICAgICAgIHZpc1JnbiA9IHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbgorICAgICAgICAgICAgUWQuUGVuUGF0KFFkLkdldFFER2xvYmFsc0dyYXkoKSkKKyAgICAgICAgICAgIHJlY3QgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgICAgIFFkLkZyYW1lUmVjdChyZWN0KQorICAgICAgICAgICAgcmVjdCA9IFFkLkluc2V0UmVjdChyZWN0LCAzLCAzKQorICAgICAgICAgICAgUWQuUGVuTm9ybWFsKCkKKyAgICAgICAgICAgIFFkLlJHQkZvcmVDb2xvcihzZWxmLl9jb2xvcikKKyAgICAgICAgICAgIFFkLlBhaW50UmVjdChyZWN0KQorICAgICAgICAgICAgUWQuUkdCRm9yZUNvbG9yKCgwLCAwLCAwKSkKKwogCiAjIG1pc2MgdXRpbHMKIAogZGVmIENhbGxiYWNrQ2FsbChjYWxsYmFjaywgbXVzdGZpdCwgKmFyZ3MpOgotCSIiImludGVybmFsIGhlbHBlciByb3V0aW5lIGZvciBXIiIiCi0JIyBYWFggdGhpcyBmdW5jdGlvbiBzaG91bGQgZGllLgotCWlmIHR5cGUoY2FsbGJhY2spID09IEZ1bmN0aW9uVHlwZToKLQkJZnVuYyA9IGNhbGxiYWNrCi0JCW1heGFyZ3MgPSBmdW5jLmZ1bmNfY29kZS5jb19hcmdjb3VudAotCWVsaWYgdHlwZShjYWxsYmFjaykgPT0gTWV0aG9kVHlwZToKLQkJZnVuYyA9IGNhbGxiYWNrLmltX2Z1bmMKLQkJbWF4YXJncyA9IGZ1bmMuZnVuY19jb2RlLmNvX2FyZ2NvdW50IC0gMQotCWVsc2U6Ci0JCWlmIGNhbGxhYmxlKGNhbGxiYWNrKToKLQkJCXJldHVybiBhcHBseShjYWxsYmFjaywgYXJncykKLQkJZWxzZToKLQkJCXJhaXNlIFR5cGVFcnJvciwgInVuY2FsbGFibGUgY2FsbGJhY2sgb2JqZWN0IgotCQotCWlmIGZ1bmMuZnVuY19kZWZhdWx0czoKLQkJbWluYXJncyA9IG1heGFyZ3MgLSBsZW4oZnVuYy5mdW5jX2RlZmF1bHRzKQotCWVsc2U6Ci0JCW1pbmFyZ3MgPSBtYXhhcmdzCi0JaWYgbWluYXJncyA8PSBsZW4oYXJncykgPD0gbWF4YXJnczoKLQkJcmV0dXJuIGFwcGx5KGNhbGxiYWNrLCBhcmdzKQotCWVsaWYgbm90IG11c3RmaXQgYW5kIG1pbmFyZ3MgPT0gMDoKLQkJcmV0dXJuIGNhbGxiYWNrKCkKLQllbHNlOgotCQlpZiBtdXN0Zml0OgotCQkJcmFpc2UgVHlwZUVycm9yLCAiY2FsbGJhY2sgYWNjZXB0cyB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzOiAlciIgJSBsZW4oYXJncykKLQkJZWxzZToKLQkJCXJhaXNlIFR5cGVFcnJvciwgImNhbGxiYWNrIGFjY2VwdHMgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50czogMCBvciAlciIgJSBsZW4oYXJncykKKyAgICAiIiJpbnRlcm5hbCBoZWxwZXIgcm91dGluZSBmb3IgVyIiIgorICAgICMgWFhYIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGRpZS4KKyAgICBpZiB0eXBlKGNhbGxiYWNrKSA9PSBGdW5jdGlvblR5cGU6CisgICAgICAgIGZ1bmMgPSBjYWxsYmFjaworICAgICAgICBtYXhhcmdzID0gZnVuYy5mdW5jX2NvZGUuY29fYXJnY291bnQKKyAgICBlbGlmIHR5cGUoY2FsbGJhY2spID09IE1ldGhvZFR5cGU6CisgICAgICAgIGZ1bmMgPSBjYWxsYmFjay5pbV9mdW5jCisgICAgICAgIG1heGFyZ3MgPSBmdW5jLmZ1bmNfY29kZS5jb19hcmdjb3VudCAtIDEKKyAgICBlbHNlOgorICAgICAgICBpZiBjYWxsYWJsZShjYWxsYmFjayk6CisgICAgICAgICAgICByZXR1cm4gYXBwbHkoY2FsbGJhY2ssIGFyZ3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJ1bmNhbGxhYmxlIGNhbGxiYWNrIG9iamVjdCIKKworICAgIGlmIGZ1bmMuZnVuY19kZWZhdWx0czoKKyAgICAgICAgbWluYXJncyA9IG1heGFyZ3MgLSBsZW4oZnVuYy5mdW5jX2RlZmF1bHRzKQorICAgIGVsc2U6CisgICAgICAgIG1pbmFyZ3MgPSBtYXhhcmdzCisgICAgaWYgbWluYXJncyA8PSBsZW4oYXJncykgPD0gbWF4YXJnczoKKyAgICAgICAgcmV0dXJuIGFwcGx5KGNhbGxiYWNrLCBhcmdzKQorICAgIGVsaWYgbm90IG11c3RmaXQgYW5kIG1pbmFyZ3MgPT0gMDoKKyAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCkKKyAgICBlbHNlOgorICAgICAgICBpZiBtdXN0Zml0OgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiY2FsbGJhY2sgYWNjZXB0cyB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzOiAlciIgJSBsZW4oYXJncykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbGxiYWNrIGFjY2VwdHMgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50czogMCBvciAlciIgJSBsZW4oYXJncykKIAogCiBkZWYgSGFzQmFzZUNsYXNzKG9iaiwgY2xhc3NfKToKLQl0cnk6Ci0JCXJhaXNlIG9iagotCWV4Y2VwdCBjbGFzc186Ci0JCXJldHVybiAxCi0JZXhjZXB0OgotCQlwYXNzCi0JcmV0dXJuIDAKKyAgICB0cnk6CisgICAgICAgIHJhaXNlIG9iagorICAgIGV4Y2VwdCBjbGFzc186CisgICAgICAgIHJldHVybiAxCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIDAKIAogCiAjCiAjIFRvIHJlbW92ZSB0aGUgZGVwZW5kZW5jZSBvZiBXaWRnZXRzLnJzcmMgd2UgaGFyZGNvZGUgdGhlIGN1cnNvcgogIyBkYXRhIGJlbG93LgogI19jdXJzb3JzID0gewotIwkid2F0Y2giCTogUWQuR2V0Q3Vyc29yKFF1aWNrRHJhdy53YXRjaEN1cnNvcikuZGF0YSwKLSMJImFycm93Igk6IFFkLkdldFFER2xvYmFsc0Fycm93KCksCi0jCSJpQmVhbSIJOiBRZC5HZXRDdXJzb3IoUXVpY2tEcmF3LmlCZWFtQ3Vyc29yKS5kYXRhLAotIwkiY3Jvc3MiCTogUWQuR2V0Q3Vyc29yKFF1aWNrRHJhdy5jcm9zc0N1cnNvcikuZGF0YSwKLSMJInBsdXMiCQk6IFFkLkdldEN1cnNvcihRdWlja0RyYXcucGx1c0N1cnNvcikuZGF0YSwKLSMJImhhbmQiCTogUWQuR2V0Q3Vyc29yKDQ2OCkuZGF0YSwKLSMJImZpc3QiCQk6IFFkLkdldEN1cnNvcig0NjkpLmRhdGEsCi0jCSJobW92ZXIiCTogUWQuR2V0Q3Vyc29yKDQ3MCkuZGF0YSwKLSMJInZtb3ZlciIJOiBRZC5HZXRDdXJzb3IoNDcxKS5kYXRhLAotIwkiem9vbWluIgk6IFFkLkdldEN1cnNvcig0NzIpLmRhdGEsCi0jCSJ6b29tb3V0Igk6IFFkLkdldEN1cnNvcig0NzMpLmRhdGEsCi0jCSJ6b29tIgk6IFFkLkdldEN1cnNvcig0NzQpLmRhdGEsCisjICAgICAgICJ3YXRjaCIgOiBRZC5HZXRDdXJzb3IoUXVpY2tEcmF3LndhdGNoQ3Vyc29yKS5kYXRhLAorIyAgICAgICAiYXJyb3ciIDogUWQuR2V0UURHbG9iYWxzQXJyb3coKSwKKyMgICAgICAgImlCZWFtIiA6IFFkLkdldEN1cnNvcihRdWlja0RyYXcuaUJlYW1DdXJzb3IpLmRhdGEsCisjICAgICAgICJjcm9zcyIgOiBRZC5HZXRDdXJzb3IoUXVpY2tEcmF3LmNyb3NzQ3Vyc29yKS5kYXRhLAorIyAgICAgICAicGx1cyIgICAgICAgICAgOiBRZC5HZXRDdXJzb3IoUXVpY2tEcmF3LnBsdXNDdXJzb3IpLmRhdGEsCisjICAgICAgICJoYW5kIiAgOiBRZC5HZXRDdXJzb3IoNDY4KS5kYXRhLAorIyAgICAgICAiZmlzdCIgICAgICAgICAgOiBRZC5HZXRDdXJzb3IoNDY5KS5kYXRhLAorIyAgICAgICAiaG1vdmVyIiAgICAgICAgOiBRZC5HZXRDdXJzb3IoNDcwKS5kYXRhLAorIyAgICAgICAidm1vdmVyIiAgICAgICAgOiBRZC5HZXRDdXJzb3IoNDcxKS5kYXRhLAorIyAgICAgICAiem9vbWluIiAgICAgICAgOiBRZC5HZXRDdXJzb3IoNDcyKS5kYXRhLAorIyAgICAgICAiem9vbW91dCIgICAgICAgOiBRZC5HZXRDdXJzb3IoNDczKS5kYXRhLAorIyAgICAgICAiem9vbSIgIDogUWQuR2V0Q3Vyc29yKDQ3NCkuZGF0YSwKICN9CiAKIF9jdXJzb3JzID0gewotCSdhcnJvdyc6Ci0JJ1x4MDBceDAwXHg0MFx4MDBceDYwXHgwMFx4NzBceDAwXHg3OFx4MDBceDdjXHgwMFx4N2VceDAwXHg3Zlx4MDAnCi0JJ1x4N2ZceDgwXHg3Y1x4MDBceDZjXHgwMFx4NDZceDAwXHgwNlx4MDBceDAzXHgwMFx4MDNceDAwXHgwMFx4MDAnCi0JJ1x4YzBceDAwXHhlMFx4MDBceGYwXHgwMFx4ZjhceDAwXHhmY1x4MDBceGZlXHgwMFx4ZmZceDAwXHhmZlx4ODAnCi0JJ1x4ZmZceGMwXHhmZlx4ZTBceGZlXHgwMFx4ZWZceDAwXHhjZlx4MDBceDg3XHg4MFx4MDdceDgwXHgwM1x4ODAnCi0JJ1x4MDBceDAxXHgwMFx4MDEnLAotCSdjcm9zcyc6Ci0JJ1x4MDRceDAwXHgwNFx4MDBceDA0XHgwMFx4MDRceDAwXHgwNFx4MDBceGZmXHhlMFx4MDRceDAwXHgwNFx4MDAnCi0JJ1x4MDRceDAwXHgwNFx4MDBceDA0XHgwMFx4MDRceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCi0JJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCi0JJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCi0JJ1x4MDBceDA1XHgwMFx4MDUnLAotCSdmaXN0JzoKLQknXHgwMFx4MDBceDAwXHgwMFx4MGRceDgwXHgxMlx4NzBceDEyXHg0Y1x4MTJceDRhXHgyOFx4MGFceDI4XHgwMicKLQknXHg0OFx4MDJceDQwXHgwMlx4MjBceDAyXHgyMFx4MDRceDEwXHgwNFx4MDhceDA4XHgwNFx4MDhceDA0XHgwOCcKLQknXHgwMFx4MDBceDAwXHgwMFx4MGRceDgwXHgxZlx4ZjBceDFmXHhmY1x4MWZceGZlXHgzZlx4ZmVceDNmXHhmZScKLQknXHg3Zlx4ZmVceDdmXHhmZVx4M2ZceGZlXHgzZlx4ZmNceDFmXHhmY1x4MGZceGY4XHgwN1x4ZjhceDA3XHhmOCcKLQknXHgwMFx4MDlceDAwXHgwOCcsCi0JJ2hhbmQnOgotCSdceDAxXHg4MFx4MWFceDcwXHgyNlx4NDhceDI2XHg0YVx4MTJceDRkXHgxMlx4NDlceDY4XHgwOVx4OThceDAxJwotCSdceDg4XHgwMlx4NDBceDAyXHgyMFx4MDJceDIwXHgwNFx4MTBceDA0XHgwOFx4MDhceDA0XHgwOFx4MDRceDA4JwotCSdceDAxXHg4MFx4MWJceGYwXHgzZlx4ZjhceDNmXHhmYVx4MWZceGZmXHgxZlx4ZmZceDZmXHhmZlx4ZmZceGZmJwotCSdceGZmXHhmZVx4N2ZceGZlXHgzZlx4ZmVceDNmXHhmY1x4MWZceGZjXHgwZlx4ZjhceDA3XHhmOFx4MDdceGY4JwotCSdceDAwXHgwOVx4MDBceDA4JywKLQknaG1vdmVyJzoKLQknXHgwMFx4MDBceDAxXHg4MFx4MDFceDgwXHgwMVx4ODBceDAxXHg4MFx4MTFceDg4XHgzMVx4OGNceDdmXHhmZScKLQknXHgzMVx4OGNceDExXHg4OFx4MDFceDgwXHgwMVx4ODBceDAxXHg4MFx4MDFceDgwXHgwMFx4MDBceDAwXHgwMCcKLQknXHgwM1x4YzBceDAzXHhjMFx4MDNceGMwXHgwM1x4YzBceDFiXHhkOFx4M2JceGRjXHg3Zlx4ZmVceGZmXHhmZicKLQknXHg3Zlx4ZmVceDNiXHhkY1x4MWJceGQ4XHgwM1x4YzBceDAzXHhjMFx4MDNceGMwXHgwM1x4YzBceDAwXHgwMCcKLQknXHgwMFx4MDdceDAwXHgwNycsCi0JJ2lCZWFtJzoKLQknXHgwY1x4NjBceDAyXHg4MFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMCcKLQknXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMlx4ODBceDBjXHg2MCcKLQknXHgwY1x4NjBceDAyXHg4MFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMCcKLQknXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMlx4ODBceDBjXHg2MCcKLQknXHgwMFx4MDRceDAwXHgwNycsCi0JJ3BsdXMnOgotCSdceDAwXHgwMFx4MDdceGMwXHgwNFx4NjBceDA0XHg2MFx4MDRceDYwXHg3Y1x4N2NceDQzXHg4Nlx4NDJceDg2JwotCSdceDQzXHg4Nlx4N2NceDdlXHgzY1x4N2VceDA0XHg2MFx4MDRceDYwXHgwN1x4ZTBceDAzXHhlMFx4MDBceDAwJwotCSdceDBmXHhjMFx4MGZceGUwXHgwZlx4ZjBceDBmXHhmMFx4ZmZceGZmXHhmZlx4ZmVceGZjXHg3Zlx4ZmNceDdmJwotCSdceGZjXHg3Zlx4ZmZceGZmXHg3Zlx4ZmZceDdmXHhmZlx4MGZceGYwXHgwZlx4ZjBceDA3XHhmMFx4MDNceGUwJwotCSdceDAwXHgwOFx4MDBceDA4JywKLQkndm1vdmVyJzoKLQknXHgwMFx4MDBceDAxXHgwMFx4MDNceDgwXHgwN1x4YzBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDdmXHhmYycKLQknXHg3Zlx4ZmNceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDA3XHhjMFx4MDNceDgwXHgwMVx4MDBceDAwXHgwMCcKLQknXHgwMVx4MDBceDAzXHg4MFx4MDdceGMwXHgwZlx4ZTBceDBmXHhlMFx4MDNceDgwXHhmZlx4ZmVceGZmXHhmZScKLQknXHhmZlx4ZmVceGZmXHhmZVx4MDNceDgwXHgwZlx4ZTBceDBmXHhlMFx4MDdceGMwXHgwM1x4ODBceDAxXHgwMCcKLQknXHgwMFx4MDdceDAwXHgwNycsCi0JJ3dhdGNoJzoKLQknXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDBceDQwXHg4MFx4ODRceDQwXHg4NFx4NDBceDg0XHg2MCcKLQknXHg5Y1x4NjBceDgwXHg0MFx4ODBceDQwXHg0MFx4ODBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDBceDNmXHgwMCcKLQknXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDBceDdmXHg4MFx4ZmZceGMwXHhmZlx4YzBceGZmXHhjMCcKLQknXHhmZlx4YzBceGZmXHhjMFx4ZmZceGMwXHg3Zlx4ODBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDBceDNmXHgwMCcKLQknXHgwMFx4MDhceDAwXHgwOCcsCi0JJ3pvb20nOgotCSdceDBmXHgwMFx4MzBceGMwXHg0MFx4MjBceDQwXHgyMFx4ODBceDEwXHg4MFx4MTBceDgwXHgxMFx4ODBceDEwJwotCSdceDQwXHgyMFx4NDBceDIwXHgzMFx4ZjBceDBmXHgzOFx4MDBceDFjXHgwMFx4MGVceDAwXHgwN1x4MDBceDAyJwotCSdceDBmXHgwMFx4M2ZceGMwXHg3Zlx4ZTBceDdmXHhlMFx4ZmZceGYwXHhmZlx4ZjBceGZmXHhmMFx4ZmZceGYwJwotCSdceDdmXHhlMFx4N2ZceGUwXHgzZlx4ZjBceDBmXHgzOFx4MDBceDFjXHgwMFx4MGVceDAwXHgwN1x4MDBceDAyJwotCSdceDAwXHgwNlx4MDBceDA2JywKLQknem9vbWluJzoKLQknXHgwZlx4MDBceDMwXHhjMFx4NDBceDIwXHg0Nlx4MjBceDg2XHgxMFx4OWZceDkwXHg5Zlx4OTBceDg2XHgxMCcKLQknXHg0Nlx4MjBceDQwXHgyMFx4MzBceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKLQknXHgwZlx4MDBceDNmXHhjMFx4N2ZceGUwXHg3Zlx4ZTBceGZmXHhmMFx4ZmZceGYwXHhmZlx4ZjBceGZmXHhmMCcKLQknXHg3Zlx4ZTBceDdmXHhlMFx4M2ZceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKLQknXHgwMFx4MDZceDAwXHgwNicsCi0JJ3pvb21vdXQnOgotCSdceDBmXHgwMFx4MzBceGMwXHg0MFx4MjBceDQwXHgyMFx4ODBceDEwXHg5Zlx4OTBceDlmXHg5MFx4ODBceDEwJwotCSdceDQwXHgyMFx4NDBceDIwXHgzMFx4ZjBceDBmXHgzOFx4MDBceDFjXHgwMFx4MGVceDAwXHgwN1x4MDBceDAyJwotCSdceDBmXHgwMFx4M2ZceGMwXHg3Zlx4ZTBceDdmXHhlMFx4ZmZceGYwXHhmZlx4ZjBceGZmXHhmMFx4ZmZceGYwJwotCSdceDdmXHhlMFx4N2ZceGUwXHgzZlx4ZjBceDBmXHgzOFx4MDBceDFjXHgwMFx4MGVceDAwXHgwN1x4MDBceDAyJwotCSdceDAwXHgwNlx4MDBceDA2JywKKyAgICAgICAgJ2Fycm93JzoKKyAgICAgICAgJ1x4MDBceDAwXHg0MFx4MDBceDYwXHgwMFx4NzBceDAwXHg3OFx4MDBceDdjXHgwMFx4N2VceDAwXHg3Zlx4MDAnCisgICAgICAgICdceDdmXHg4MFx4N2NceDAwXHg2Y1x4MDBceDQ2XHgwMFx4MDZceDAwXHgwM1x4MDBceDAzXHgwMFx4MDBceDAwJworICAgICAgICAnXHhjMFx4MDBceGUwXHgwMFx4ZjBceDAwXHhmOFx4MDBceGZjXHgwMFx4ZmVceDAwXHhmZlx4MDBceGZmXHg4MCcKKyAgICAgICAgJ1x4ZmZceGMwXHhmZlx4ZTBceGZlXHgwMFx4ZWZceDAwXHhjZlx4MDBceDg3XHg4MFx4MDdceDgwXHgwM1x4ODAnCisgICAgICAgICdceDAwXHgwMVx4MDBceDAxJywKKyAgICAgICAgJ2Nyb3NzJzoKKyAgICAgICAgJ1x4MDRceDAwXHgwNFx4MDBceDA0XHgwMFx4MDRceDAwXHgwNFx4MDBceGZmXHhlMFx4MDRceDAwXHgwNFx4MDAnCisgICAgICAgICdceDA0XHgwMFx4MDRceDAwXHgwNFx4MDBceDA0XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJworICAgICAgICAnXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKKyAgICAgICAgJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCisgICAgICAgICdceDAwXHgwNVx4MDBceDA1JywKKyAgICAgICAgJ2Zpc3QnOgorICAgICAgICAnXHgwMFx4MDBceDAwXHgwMFx4MGRceDgwXHgxMlx4NzBceDEyXHg0Y1x4MTJceDRhXHgyOFx4MGFceDI4XHgwMicKKyAgICAgICAgJ1x4NDhceDAyXHg0MFx4MDJceDIwXHgwMlx4MjBceDA0XHgxMFx4MDRceDA4XHgwOFx4MDRceDA4XHgwNFx4MDgnCisgICAgICAgICdceDAwXHgwMFx4MDBceDAwXHgwZFx4ODBceDFmXHhmMFx4MWZceGZjXHgxZlx4ZmVceDNmXHhmZVx4M2ZceGZlJworICAgICAgICAnXHg3Zlx4ZmVceDdmXHhmZVx4M2ZceGZlXHgzZlx4ZmNceDFmXHhmY1x4MGZceGY4XHgwN1x4ZjhceDA3XHhmOCcKKyAgICAgICAgJ1x4MDBceDA5XHgwMFx4MDgnLAorICAgICAgICAnaGFuZCc6CisgICAgICAgICdceDAxXHg4MFx4MWFceDcwXHgyNlx4NDhceDI2XHg0YVx4MTJceDRkXHgxMlx4NDlceDY4XHgwOVx4OThceDAxJworICAgICAgICAnXHg4OFx4MDJceDQwXHgwMlx4MjBceDAyXHgyMFx4MDRceDEwXHgwNFx4MDhceDA4XHgwNFx4MDhceDA0XHgwOCcKKyAgICAgICAgJ1x4MDFceDgwXHgxYlx4ZjBceDNmXHhmOFx4M2ZceGZhXHgxZlx4ZmZceDFmXHhmZlx4NmZceGZmXHhmZlx4ZmYnCisgICAgICAgICdceGZmXHhmZVx4N2ZceGZlXHgzZlx4ZmVceDNmXHhmY1x4MWZceGZjXHgwZlx4ZjhceDA3XHhmOFx4MDdceGY4JworICAgICAgICAnXHgwMFx4MDlceDAwXHgwOCcsCisgICAgICAgICdobW92ZXInOgorICAgICAgICAnXHgwMFx4MDBceDAxXHg4MFx4MDFceDgwXHgwMVx4ODBceDAxXHg4MFx4MTFceDg4XHgzMVx4OGNceDdmXHhmZScKKyAgICAgICAgJ1x4MzFceDhjXHgxMVx4ODhceDAxXHg4MFx4MDFceDgwXHgwMVx4ODBceDAxXHg4MFx4MDBceDAwXHgwMFx4MDAnCisgICAgICAgICdceDAzXHhjMFx4MDNceGMwXHgwM1x4YzBceDAzXHhjMFx4MWJceGQ4XHgzYlx4ZGNceDdmXHhmZVx4ZmZceGZmJworICAgICAgICAnXHg3Zlx4ZmVceDNiXHhkY1x4MWJceGQ4XHgwM1x4YzBceDAzXHhjMFx4MDNceGMwXHgwM1x4YzBceDAwXHgwMCcKKyAgICAgICAgJ1x4MDBceDA3XHgwMFx4MDcnLAorICAgICAgICAnaUJlYW0nOgorICAgICAgICAnXHgwY1x4NjBceDAyXHg4MFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMCcKKyAgICAgICAgJ1x4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDJceDgwXHgwY1x4NjAnCisgICAgICAgICdceDBjXHg2MFx4MDJceDgwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwJworICAgICAgICAnXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMlx4ODBceDBjXHg2MCcKKyAgICAgICAgJ1x4MDBceDA0XHgwMFx4MDcnLAorICAgICAgICAncGx1cyc6CisgICAgICAgICdceDAwXHgwMFx4MDdceGMwXHgwNFx4NjBceDA0XHg2MFx4MDRceDYwXHg3Y1x4N2NceDQzXHg4Nlx4NDJceDg2JworICAgICAgICAnXHg0M1x4ODZceDdjXHg3ZVx4M2NceDdlXHgwNFx4NjBceDA0XHg2MFx4MDdceGUwXHgwM1x4ZTBceDAwXHgwMCcKKyAgICAgICAgJ1x4MGZceGMwXHgwZlx4ZTBceDBmXHhmMFx4MGZceGYwXHhmZlx4ZmZceGZmXHhmZVx4ZmNceDdmXHhmY1x4N2YnCisgICAgICAgICdceGZjXHg3Zlx4ZmZceGZmXHg3Zlx4ZmZceDdmXHhmZlx4MGZceGYwXHgwZlx4ZjBceDA3XHhmMFx4MDNceGUwJworICAgICAgICAnXHgwMFx4MDhceDAwXHgwOCcsCisgICAgICAgICd2bW92ZXInOgorICAgICAgICAnXHgwMFx4MDBceDAxXHgwMFx4MDNceDgwXHgwN1x4YzBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDdmXHhmYycKKyAgICAgICAgJ1x4N2ZceGZjXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwN1x4YzBceDAzXHg4MFx4MDFceDAwXHgwMFx4MDAnCisgICAgICAgICdceDAxXHgwMFx4MDNceDgwXHgwN1x4YzBceDBmXHhlMFx4MGZceGUwXHgwM1x4ODBceGZmXHhmZVx4ZmZceGZlJworICAgICAgICAnXHhmZlx4ZmVceGZmXHhmZVx4MDNceDgwXHgwZlx4ZTBceDBmXHhlMFx4MDdceGMwXHgwM1x4ODBceDAxXHgwMCcKKyAgICAgICAgJ1x4MDBceDA3XHgwMFx4MDcnLAorICAgICAgICAnd2F0Y2gnOgorICAgICAgICAnXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDBceDQwXHg4MFx4ODRceDQwXHg4NFx4NDBceDg0XHg2MCcKKyAgICAgICAgJ1x4OWNceDYwXHg4MFx4NDBceDgwXHg0MFx4NDBceDgwXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDAnCisgICAgICAgICdceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDBceDNmXHgwMFx4N2ZceDgwXHhmZlx4YzBceGZmXHhjMFx4ZmZceGMwJworICAgICAgICAnXHhmZlx4YzBceGZmXHhjMFx4ZmZceGMwXHg3Zlx4ODBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDBceDNmXHgwMCcKKyAgICAgICAgJ1x4MDBceDA4XHgwMFx4MDgnLAorICAgICAgICAnem9vbSc6CisgICAgICAgICdceDBmXHgwMFx4MzBceGMwXHg0MFx4MjBceDQwXHgyMFx4ODBceDEwXHg4MFx4MTBceDgwXHgxMFx4ODBceDEwJworICAgICAgICAnXHg0MFx4MjBceDQwXHgyMFx4MzBceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKKyAgICAgICAgJ1x4MGZceDAwXHgzZlx4YzBceDdmXHhlMFx4N2ZceGUwXHhmZlx4ZjBceGZmXHhmMFx4ZmZceGYwXHhmZlx4ZjAnCisgICAgICAgICdceDdmXHhlMFx4N2ZceGUwXHgzZlx4ZjBceDBmXHgzOFx4MDBceDFjXHgwMFx4MGVceDAwXHgwN1x4MDBceDAyJworICAgICAgICAnXHgwMFx4MDZceDAwXHgwNicsCisgICAgICAgICd6b29taW4nOgorICAgICAgICAnXHgwZlx4MDBceDMwXHhjMFx4NDBceDIwXHg0Nlx4MjBceDg2XHgxMFx4OWZceDkwXHg5Zlx4OTBceDg2XHgxMCcKKyAgICAgICAgJ1x4NDZceDIwXHg0MFx4MjBceDMwXHhmMFx4MGZceDM4XHgwMFx4MWNceDAwXHgwZVx4MDBceDA3XHgwMFx4MDInCisgICAgICAgICdceDBmXHgwMFx4M2ZceGMwXHg3Zlx4ZTBceDdmXHhlMFx4ZmZceGYwXHhmZlx4ZjBceGZmXHhmMFx4ZmZceGYwJworICAgICAgICAnXHg3Zlx4ZTBceDdmXHhlMFx4M2ZceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKKyAgICAgICAgJ1x4MDBceDA2XHgwMFx4MDYnLAorICAgICAgICAnem9vbW91dCc6CisgICAgICAgICdceDBmXHgwMFx4MzBceGMwXHg0MFx4MjBceDQwXHgyMFx4ODBceDEwXHg5Zlx4OTBceDlmXHg5MFx4ODBceDEwJworICAgICAgICAnXHg0MFx4MjBceDQwXHgyMFx4MzBceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKKyAgICAgICAgJ1x4MGZceDAwXHgzZlx4YzBceDdmXHhlMFx4N2ZceGUwXHhmZlx4ZjBceGZmXHhmMFx4ZmZceGYwXHhmZlx4ZjAnCisgICAgICAgICdceDdmXHhlMFx4N2ZceGUwXHgzZlx4ZjBceDBmXHgzOFx4MDBceDFjXHgwMFx4MGVceDAwXHgwN1x4MDBceDAyJworICAgICAgICAnXHgwMFx4MDZceDAwXHgwNicsCiB9CiAKIGRlZiBTZXRDdXJzb3Iod2hhdCk6Ci0JIiIiU2V0IHRoZSBjdXJzb3JzaGFwZSB0byBhbnkgb2YgdGhlc2U6ICdhcnJvdycsICdjcm9zcycsICdmaXN0JywgJ2hhbmQnLCAnaG1vdmVyJywgJ2lCZWFtJywgCi0JJ3BsdXMnLCAndm1vdmVyJywgJ3dhdGNoJywgJ3pvb20nLCAnem9vbWluJywgJ3pvb21vdXQnLiIiIgotCVFkLlNldEN1cnNvcihfY3Vyc29yc1t3aGF0XSkKKyAgICAiIiJTZXQgdGhlIGN1cnNvcnNoYXBlIHRvIGFueSBvZiB0aGVzZTogJ2Fycm93JywgJ2Nyb3NzJywgJ2Zpc3QnLCAnaGFuZCcsICdobW92ZXInLCAnaUJlYW0nLAorICAgICdwbHVzJywgJ3Ztb3ZlcicsICd3YXRjaCcsICd6b29tJywgJ3pvb21pbicsICd6b29tb3V0Jy4iIiIKKyAgICBRZC5TZXRDdXJzb3IoX2N1cnNvcnNbd2hhdF0pCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1djb250cm9scy5weSBiL01hYy9Ub29scy9JREUvV2NvbnRyb2xzLnB5CmluZGV4IDU4ZmMzMWJmLi4wMGIwNmFjIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1djb250cm9scy5weQorKysgYi9NYWMvVG9vbHMvSURFL1djb250cm9scy5weQpAQCAtNCw0MzAgKzQsNDI5IEBACiAKIAogY2xhc3MgQ29udHJvbFdpZGdldChXYmFzZS5DbGlja2FibGVXaWRnZXQpOgotCQotCSIiIkJhc2VjbGFzcyBmb3IgYWxsIG5hdGl2ZSBjb250cm9scy4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUgPSAiQ29udHJvbCIsIHByb2NJRCA9IDAsIGNhbGxiYWNrID0gTm9uZSwgdmFsdWUgPSAwLCBtaW4gPSAwLCBtYXggPSAxLCB2aWV3c2l6ZSA9IDApOgotCQlXYmFzZS5DbGlja2FibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKLQkJc2VsZi5fY29udHJvbCA9IE5vbmUKLQkJc2VsZi5fdGl0bGUgPSB0aXRsZQotCQlzZWxmLl9jYWxsYmFjayA9IGNhbGxiYWNrCi0JCXNlbGYuX3Byb2NJRCA9IHByb2NJRAotCQlzZWxmLl92YWx1ZSA9IHZhbHVlCi0JCXNlbGYuX21pbiA9IG1pbgotCQlzZWxmLl9tYXggPSBtYXgKLQkJc2VsZi5fZW5hYmxlZCA9IDEKLQkJc2VsZi5fdmlld3NpemUgPSB2aWV3c2l6ZQotCQotCWRlZiBvcGVuKHNlbGYpOgotCQlzZWxmLl9jYWxjYm91bmRzKCkKLQkJCi0JCSMgTmV3Q29udHJvbCBkb2Vzbid0IGFjY2VwdCAzMi1iaXQgdmFsdWUsIG1pbiwgb3IgbWF4LCBzbyBmb3IgY29uc2lzdGVuY3kKLQkJIyB3aXRoIHRoZSBuZXcgMzItYml0IHNldC9nZXQgbWV0aG9kcywgb3V0LW9mLXJhbmdlIHZhbHVlcyBhcmUgaW5pdGlhbGx5Ci0JCSMgc2V0IGFzIHplcm8sIGZvbGxvd2VkIGJ5IGEgMzItYml0IHNldCBvZiB0aGUgYWN0dWFsIHZhbHVlLgotCQkjIFZhbHVlcyBub3QgcmVwcmVzZW50YWJsZSBpbiAxNiBiaXRzIHdpbGwgZmFpbCBvbiBNYWNPUyA4LjEsIGhvd2V2ZXIKLQkJIyB0aGUgdmFzdCBtYWpvcml0eSBvZiBjb250cm9sIHVzYWdlIHNob3VsZCBzdGlsbCBiZSBjb21wYXRpYmxlLgotCQlfdmFsdWUsIF9taW4sIF9tYXggPSBzZWxmLl92YWx1ZSwgc2VsZi5fbWluLCBzZWxmLl9tYXgKLQkJaWYgLTMyNzY4IDw9IF92YWx1ZSA8PSAzMjc2NzoKLQkJCWJpZ3ZhbHVlID0gTm9uZQotCQllbHNlOgotCQkJYmlndmFsdWUgPSBfdmFsdWUKLQkJCV92YWx1ZSA9IDAKLQkJaWYgLTMyNzY4IDw9IF9taW4gPD0gMzI3Njc6Ci0JCQliaWdtaW4gPSBOb25lCi0JCWVsc2U6Ci0JCQliaWdtaW4gPSBfbWluCi0JCQlfbWluID0gMAotCQlpZiAtMzI3NjggPD0gX21heCA8PSAzMjc2NzoKLQkJCWJpZ21heCA9IE5vbmUKLQkJZWxzZToKLQkJCWJpZ21heCA9IF9tYXgKLQkJCV9tYXggPSAwCi0JCXNlbGYuX2NvbnRyb2wgPSBDdGwuTmV3Q29udHJvbChzZWxmLl9wYXJlbnR3aW5kb3cud2lkLCAKLQkJCQkJCXNlbGYuX2JvdW5kcywgCi0JCQkJCQlzZWxmLl90aXRsZSwgCi0JCQkJCQkxLCAKLQkJCQkJCV92YWx1ZSwgCi0JCQkJCQlfbWluLCAKLQkJCQkJCV9tYXgsIAotCQkJCQkJc2VsZi5fcHJvY0lELCAKLQkJCQkJCTApCi0JCWlmIGJpZ3ZhbHVlOgotCQkJc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRWYWx1ZShiaWd2YWx1ZSkKLQkJaWYgYmlnbWluOgotCQkJc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNaW5pbXVtKGJpZ21pbikKLQkJaWYgYmlnbWF4OgotCQkJc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNYXhpbXVtKGJpZ21heCkKLQkJaWYgc2VsZi5fdmlld3NpemU6Ci0JCQl0cnk6Ci0JCQkJc2VsZi5fY29udHJvbC5TZXRDb250cm9sVmlld1NpemUoc2VsZi5fdmlld3NpemUpCi0JCQkJIyBOb3QgYXZhaWxhYmxlIGluIE1hY09TIDguMSwgYnV0IHRoYXQncyBPSyBzaW5jZSBpdCBvbmx5IGFmZmVjdHMKLQkJCQkjIHByb3BvcnRpb25hbCBzY3JvbGxiYXJzIHdoaWNoIHdlcmVuJ3QgYXZhaWxhYmxlIGluIDguMSBlaXRoZXIuCi0JCQlleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKLQkJCQlwYXNzCi0JCXNlbGYuZW5hYmxlKHNlbGYuX2VuYWJsZWQpCi0JCi0JZGVmIGFkanVzdChzZWxmLCBvbGRib3VuZHMpOgotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLl9jb250cm9sLkhpZGVDb250cm9sKCkKLQkJc2VsZi5fY29udHJvbC5Nb3ZlQ29udHJvbChzZWxmLl9ib3VuZHNbMF0sIHNlbGYuX2JvdW5kc1sxXSkKLQkJc2VsZi5fY29udHJvbC5TaXplQ29udHJvbChzZWxmLl9ib3VuZHNbMl0gLSBzZWxmLl9ib3VuZHNbMF0sIHNlbGYuX2JvdW5kc1szXSAtIHNlbGYuX2JvdW5kc1sxXSkKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCVFkLkVyYXNlUmVjdChzZWxmLl9ib3VuZHMpCi0JCQlzZWxmLl9jb250cm9sLlNob3dDb250cm9sKCkKLQkJCXNlbGYuR2V0V2luZG93KCkuVmFsaWRXaW5kb3dSZWN0KHNlbGYuX2JvdW5kcykKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYuX2NvbnRyb2wuSGlkZUNvbnRyb2woKQotCQlzZWxmLl9jb250cm9sID0gTm9uZQotCQlXYmFzZS5DbGlja2FibGVXaWRnZXQuY2xvc2Uoc2VsZikKLQkKLQlkZWYgZW5hYmxlKHNlbGYsIG9ub2ZmKToKLQkJaWYgc2VsZi5fY29udHJvbCBhbmQgc2VsZi5fZW5hYmxlZCA8PiBvbm9mZjoKLQkJCXNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbCgobm90IG9ub2ZmKSBhbmQgMjU1KQotCQkJc2VsZi5fZW5hYmxlZCA9IG9ub2ZmCi0JCi0JZGVmIHNob3coc2VsZiwgb25vZmYpOgotCQlzZWxmLl92aXNpYmxlID0gb25vZmYKLQkJZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCXcuc2hvdyhvbm9mZikKLQkJaWYgb25vZmY6Ci0JCQlzZWxmLl9jb250cm9sLlNob3dDb250cm9sKCkKLQkJZWxzZToKLQkJCXNlbGYuX2NvbnRyb2wuSGlkZUNvbnRyb2woKQotCQotCWRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6Ci0JCXNlbGYuX2FjdGl2YXRlZCA9IG9ub2ZmCi0JCWlmIHNlbGYuX2VuYWJsZWQ6Ci0JCQlpZiBvbm9mZjoKLQkJCQlzZWxmLl9jb250cm9sLkFjdGl2YXRlQ29udHJvbCgpCi0JCQllbHNlOgotCQkJCXNlbGYuX2NvbnRyb2wuRGVhY3RpdmF0ZUNvbnRyb2woKQotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJc2VsZi5fY29udHJvbC5EcmF3MUNvbnRyb2woKQotCQotCWRlZiB0ZXN0KHNlbGYsIHBvaW50KToKLQkJaWYgUWQuUHRJblJlY3QocG9pbnQsIHNlbGYuX2JvdW5kcykgYW5kIHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4gMQotCQkjY3RsdHlwZSwgY29udHJvbCA9IEN0bC5GaW5kQ29udHJvbChwb2ludCwgc2VsZi5fcGFyZW50d2luZG93LndpZCkKLQkJI2lmIHNlbGYuX2VuYWJsZWQgYW5kIGNvbnRyb2wgPT0gc2VsZi5fY29udHJvbDoKLQkJIwlyZXR1cm4gMQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJcGFydCA9IHNlbGYuX2NvbnRyb2wuVHJhY2tDb250cm9sKHBvaW50KQotCQlpZiBwYXJ0OgotCQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwKQotCQotCWRlZiBzZXR0aXRsZShzZWxmLCB0aXRsZSk6Ci0JCWlmIHNlbGYuX2NvbnRyb2w6Ci0JCQlzZWxmLl9jb250cm9sLlNldENvbnRyb2xUaXRsZSh0aXRsZSkKLQkJc2VsZi5fdGl0bGUgPSB0aXRsZQotCQotCWRlZiBnZXR0aXRsZShzZWxmKToKLQkJcmV0dXJuIHNlbGYuX3RpdGxlCi0JCi0JZGVmIHNldChzZWxmLCB2YWx1ZSk6Ci0JCWlmIHNlbGYuX2NvbnRyb2w6Ci0JCQlpZiAtMzI3NjggPD0gdmFsdWUgPD0gMzI3Njc6Ci0JCQkJIyBObyAzMi1iaXQgY29udHJvbCBzdXBwb3J0IGluIE1hY09TIDguMSwgc28gdXNlCi0JCQkJIyB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIHBvc3NpYmxlLgotCQkJCXNlbGYuX2NvbnRyb2wuU2V0Q29udHJvbFZhbHVlKHZhbHVlKQotCQkJZWxzZToKLQkJCQlzZWxmLl9jb250cm9sLlNldENvbnRyb2wzMkJpdFZhbHVlKHZhbHVlKQotCQllbHNlOgotCQkJc2VsZi5fdmFsdWUgPSB2YWx1ZQotCQotCWRlZiBnZXQoc2VsZik6Ci0JCWlmIHNlbGYuX2NvbnRyb2w6Ci0JCQl0cnk6Ci0JCQkJcmV0dXJuIHNlbGYuX2NvbnRyb2wuR2V0Q29udHJvbDMyQml0VmFsdWUoKQotCQkJCSMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIGZhbGwKLQkJCQkjIGJhY2sgdG8gdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBuZWVkZWQuCi0JCQlleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKLQkJCQlyZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sVmFsdWUoKQotCQllbHNlOgotCQkJcmV0dXJuIHNlbGYuX3ZhbHVlCisKKyAgICAiIiJCYXNlY2xhc3MgZm9yIGFsbCBuYXRpdmUgY29udHJvbHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUgPSAiQ29udHJvbCIsIHByb2NJRCA9IDAsIGNhbGxiYWNrID0gTm9uZSwgdmFsdWUgPSAwLCBtaW4gPSAwLCBtYXggPSAxLCB2aWV3c2l6ZSA9IDApOgorICAgICAgICBXYmFzZS5DbGlja2FibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKKyAgICAgICAgc2VsZi5fY29udHJvbCA9IE5vbmUKKyAgICAgICAgc2VsZi5fdGl0bGUgPSB0aXRsZQorICAgICAgICBzZWxmLl9jYWxsYmFjayA9IGNhbGxiYWNrCisgICAgICAgIHNlbGYuX3Byb2NJRCA9IHByb2NJRAorICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYuX21pbiA9IG1pbgorICAgICAgICBzZWxmLl9tYXggPSBtYXgKKyAgICAgICAgc2VsZi5fZW5hYmxlZCA9IDEKKyAgICAgICAgc2VsZi5fdmlld3NpemUgPSB2aWV3c2l6ZQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX2NhbGNib3VuZHMoKQorCisgICAgICAgICMgTmV3Q29udHJvbCBkb2Vzbid0IGFjY2VwdCAzMi1iaXQgdmFsdWUsIG1pbiwgb3IgbWF4LCBzbyBmb3IgY29uc2lzdGVuY3kKKyAgICAgICAgIyB3aXRoIHRoZSBuZXcgMzItYml0IHNldC9nZXQgbWV0aG9kcywgb3V0LW9mLXJhbmdlIHZhbHVlcyBhcmUgaW5pdGlhbGx5CisgICAgICAgICMgc2V0IGFzIHplcm8sIGZvbGxvd2VkIGJ5IGEgMzItYml0IHNldCBvZiB0aGUgYWN0dWFsIHZhbHVlLgorICAgICAgICAjIFZhbHVlcyBub3QgcmVwcmVzZW50YWJsZSBpbiAxNiBiaXRzIHdpbGwgZmFpbCBvbiBNYWNPUyA4LjEsIGhvd2V2ZXIKKyAgICAgICAgIyB0aGUgdmFzdCBtYWpvcml0eSBvZiBjb250cm9sIHVzYWdlIHNob3VsZCBzdGlsbCBiZSBjb21wYXRpYmxlLgorICAgICAgICBfdmFsdWUsIF9taW4sIF9tYXggPSBzZWxmLl92YWx1ZSwgc2VsZi5fbWluLCBzZWxmLl9tYXgKKyAgICAgICAgaWYgLTMyNzY4IDw9IF92YWx1ZSA8PSAzMjc2NzoKKyAgICAgICAgICAgIGJpZ3ZhbHVlID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmlndmFsdWUgPSBfdmFsdWUKKyAgICAgICAgICAgIF92YWx1ZSA9IDAKKyAgICAgICAgaWYgLTMyNzY4IDw9IF9taW4gPD0gMzI3Njc6CisgICAgICAgICAgICBiaWdtaW4gPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiaWdtaW4gPSBfbWluCisgICAgICAgICAgICBfbWluID0gMAorICAgICAgICBpZiAtMzI3NjggPD0gX21heCA8PSAzMjc2NzoKKyAgICAgICAgICAgIGJpZ21heCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJpZ21heCA9IF9tYXgKKyAgICAgICAgICAgIF9tYXggPSAwCisgICAgICAgIHNlbGYuX2NvbnRyb2wgPSBDdGwuTmV3Q29udHJvbChzZWxmLl9wYXJlbnR3aW5kb3cud2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgICAgIGlmIGJpZ3ZhbHVlOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRWYWx1ZShiaWd2YWx1ZSkKKyAgICAgICAgaWYgYmlnbWluOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNaW5pbXVtKGJpZ21pbikKKyAgICAgICAgaWYgYmlnbWF4OgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNYXhpbXVtKGJpZ21heCkKKyAgICAgICAgaWYgc2VsZi5fdmlld3NpemU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sVmlld1NpemUoc2VsZi5fdmlld3NpemUpCisgICAgICAgICAgICAgICAgIyBOb3QgYXZhaWxhYmxlIGluIE1hY09TIDguMSwgYnV0IHRoYXQncyBPSyBzaW5jZSBpdCBvbmx5IGFmZmVjdHMKKyAgICAgICAgICAgICAgICAjIHByb3BvcnRpb25hbCBzY3JvbGxiYXJzIHdoaWNoIHdlcmVuJ3QgYXZhaWxhYmxlIGluIDguMSBlaXRoZXIuCisgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuZW5hYmxlKHNlbGYuX2VuYWJsZWQpCisKKyAgICBkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuX2NvbnRyb2wuSGlkZUNvbnRyb2woKQorICAgICAgICBzZWxmLl9jb250cm9sLk1vdmVDb250cm9sKHNlbGYuX2JvdW5kc1swXSwgc2VsZi5fYm91bmRzWzFdKQorICAgICAgICBzZWxmLl9jb250cm9sLlNpemVDb250cm9sKHNlbGYuX2JvdW5kc1syXSAtIHNlbGYuX2JvdW5kc1swXSwgc2VsZi5fYm91bmRzWzNdIC0gc2VsZi5fYm91bmRzWzFdKQorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgUWQuRXJhc2VSZWN0KHNlbGYuX2JvdW5kcykKKyAgICAgICAgICAgIHNlbGYuX2NvbnRyb2wuU2hvd0NvbnRyb2woKQorICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5WYWxpZFdpbmRvd1JlY3Qoc2VsZi5fYm91bmRzKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9jb250cm9sLkhpZGVDb250cm9sKCkKKyAgICAgICAgc2VsZi5fY29udHJvbCA9IE5vbmUKKyAgICAgICAgV2Jhc2UuQ2xpY2thYmxlV2lkZ2V0LmNsb3NlKHNlbGYpCisKKyAgICBkZWYgZW5hYmxlKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgc2VsZi5fY29udHJvbCBhbmQgc2VsZi5fZW5hYmxlZCA8PiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbCgobm90IG9ub2ZmKSBhbmQgMjU1KQorICAgICAgICAgICAgc2VsZi5fZW5hYmxlZCA9IG9ub2ZmCisKKyAgICBkZWYgc2hvdyhzZWxmLCBvbm9mZik6CisgICAgICAgIHNlbGYuX3Zpc2libGUgPSBvbm9mZgorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgdy5zaG93KG9ub2ZmKQorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYuX2NvbnRyb2wuU2hvd0NvbnRyb2woKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5IaWRlQ29udHJvbCgpCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBzZWxmLl9hY3RpdmF0ZWQgPSBvbm9mZgorICAgICAgICBpZiBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5BY3RpdmF0ZUNvbnRyb2woKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9jb250cm9sLkRlYWN0aXZhdGVDb250cm9sKCkKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5EcmF3MUNvbnRyb2woKQorCisgICAgZGVmIHRlc3Qoc2VsZiwgcG9pbnQpOgorICAgICAgICBpZiBRZC5QdEluUmVjdChwb2ludCwgc2VsZi5fYm91bmRzKSBhbmQgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICNjdGx0eXBlLCBjb250cm9sID0gQ3RsLkZpbmRDb250cm9sKHBvaW50LCBzZWxmLl9wYXJlbnR3aW5kb3cud2lkKQorICAgICAgICAjaWYgc2VsZi5fZW5hYmxlZCBhbmQgY29udHJvbCA9PSBzZWxmLl9jb250cm9sOgorICAgICAgICAjICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBhcnQgPSBzZWxmLl9jb250cm9sLlRyYWNrQ29udHJvbChwb2ludCkKKyAgICAgICAgaWYgcGFydDoKKyAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCkKKworICAgIGRlZiBzZXR0aXRsZShzZWxmLCB0aXRsZSk6CisgICAgICAgIGlmIHNlbGYuX2NvbnRyb2w6CisgICAgICAgICAgICBzZWxmLl9jb250cm9sLlNldENvbnRyb2xUaXRsZSh0aXRsZSkKKyAgICAgICAgc2VsZi5fdGl0bGUgPSB0aXRsZQorCisgICAgZGVmIGdldHRpdGxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdGl0bGUKKworICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiBzZWxmLl9jb250cm9sOgorICAgICAgICAgICAgaWYgLTMyNzY4IDw9IHZhbHVlIDw9IDMyNzY3OgorICAgICAgICAgICAgICAgICMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIHVzZQorICAgICAgICAgICAgICAgICMgdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBzZWxmLl9jb250cm9sLlNldENvbnRyb2xWYWx1ZSh2YWx1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRWYWx1ZSh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NvbnRyb2w6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRyb2wuR2V0Q29udHJvbDMyQml0VmFsdWUoKQorICAgICAgICAgICAgICAgICMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIGZhbGwKKyAgICAgICAgICAgICAgICAjIGJhY2sgdG8gdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBuZWVkZWQuCisgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sVmFsdWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlCiAKIAogY2xhc3MgQnV0dG9uKENvbnRyb2xXaWRnZXQpOgotCQotCSIiIlN0YW5kYXJkIHB1c2ggYnV0dG9uLiIiIgotCQotCXByb2NJRCA9IENvbnRyb2xzLnB1c2hCdXRQcm9jIHwgQ29udHJvbHMudXNlV0ZvbnQKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUgPSAiQnV0dG9uIiwgY2FsbGJhY2sgPSBOb25lKToKLQkJQ29udHJvbFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0aXRsZSwgc2VsZi5wcm9jSUQsIGNhbGxiYWNrLCAwLCAwLCAxKQotCQlzZWxmLl9pc2RlZmF1bHQgPSAwCi0JCi0JZGVmIHB1c2goc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9lbmFibGVkOgotCQkJcmV0dXJuCi0JCSMgZW11bGF0ZSB0aGUgcHVzaGluZyBvZiB0aGUgYnV0dG9uCi0JCWltcG9ydCB0aW1lCi0JCXNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbChDb250cm9scy5rQ29udHJvbEJ1dHRvblBhcnQpCi0JCXNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLlFERmx1c2hQb3J0QnVmZmVyKE5vbmUpICAjIG5lZWRlZCB1bmRlciBPU1gKLQkJdGltZS5zbGVlcCgwLjEpCi0JCXNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbCgwKQotCQlpZiBzZWxmLl9jYWxsYmFjazoKLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCkKLQkKLQlkZWYgZW5hYmxlKHNlbGYsIG9ub2ZmKToKLQkJaWYgc2VsZi5fY29udHJvbCBhbmQgc2VsZi5fZW5hYmxlZCA8PiBvbm9mZjoKLQkJCXNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbCgobm90IG9ub2ZmKSBhbmQgMjU1KQotCQkJc2VsZi5fZW5hYmxlZCA9IG9ub2ZmCi0JCi0JZGVmIHNob3coc2VsZiwgb25vZmYpOgotCQlDb250cm9sV2lkZ2V0LnNob3coc2VsZiwgb25vZmYpCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQlzZWxmLl9jb250cm9sLkRyYXcxQ29udHJvbCgpCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCUNvbnRyb2xXaWRnZXQub3BlbihzZWxmKQotCQlpZiBzZWxmLl9pc2RlZmF1bHQ6Ci0JCQlzZWxmLl9zZXRkZWZhdWx0KHNlbGYuX2lzZGVmYXVsdCkKLQkKLQlkZWYgX3NldGRlZmF1bHQoc2VsZiwgb25vZmYpOgotCQljID0gc2VsZi5fY29udHJvbAotCQlpZiBjIGlzIG5vdCBOb25lOgotCQkJaWYgb25vZmY6Ci0JCQkJZGF0YSA9ICJceEZGIgotCQkJZWxzZToKLQkJCQlkYXRhID0gIlwwIgotCQkJIyBoaWRlIGJlZm9yZSBjaGFuZ2luZyBzdGF0ZSwgb3RoZXJ3aXNlIHRoZSBidXR0b24gaXNuJ3QgYWx3YXlzCi0JCQkjIHJlZHJhd24gY29ycmVjdGx5LCBhbHRob3VnaCBpdCdzIHF1aXRlIGRpZmZlcmVudCB1bmRlciBBcXVhCi0JCQkjIGFuZCBDbGFzc2ljLi4uCi0JCQljLkhpZGVDb250cm9sKCkKLQkJCWMuU2V0Q29udHJvbERhdGEoQ29udHJvbHMua0NvbnRyb2xOb1BhcnQsCi0JCQkJCUNvbnRyb2xzLmtDb250cm9sUHVzaEJ1dHRvbkRlZmF1bHRUYWcsIGRhdGEpCi0JCQljLlNob3dDb250cm9sKCkKLQkJc2VsZi5faXNkZWZhdWx0ID0gb25vZmYKLQkKLQlkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6Ci0JCWlmIHNlbGYuX2lzZGVmYXVsdDoKLQkJCW9sZCA9IFFkLkluc2V0UmVjdChvbGRib3VuZHMsIC00LCAtNCkKLQkJCW5ldyA9IFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIC00LCAtNCkKLQkJCVFkLkVyYXNlUmVjdChvbGQpCi0JCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChvbGQpCi0JCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChuZXcpCi0JCUNvbnRyb2xXaWRnZXQuYWRqdXN0KHNlbGYsIG9sZGJvdW5kcykKKworICAgICIiIlN0YW5kYXJkIHB1c2ggYnV0dG9uLiIiIgorCisgICAgcHJvY0lEID0gQ29udHJvbHMucHVzaEJ1dFByb2MgfCBDb250cm9scy51c2VXRm9udAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIkJ1dHRvbiIsIGNhbGxiYWNrID0gTm9uZSk6CisgICAgICAgIENvbnRyb2xXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUsIHNlbGYucHJvY0lELCBjYWxsYmFjaywgMCwgMCwgMSkKKyAgICAgICAgc2VsZi5faXNkZWZhdWx0ID0gMAorCisgICAgZGVmIHB1c2goc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgZW11bGF0ZSB0aGUgcHVzaGluZyBvZiB0aGUgYnV0dG9uCisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIHNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbChDb250cm9scy5rQ29udHJvbEJ1dHRvblBhcnQpCisgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLlFERmx1c2hQb3J0QnVmZmVyKE5vbmUpICAjIG5lZWRlZCB1bmRlciBPU1gKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgIHNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbCgwKQorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKKyAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCkKKworICAgIGRlZiBlbmFibGUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBzZWxmLl9jb250cm9sIGFuZCBzZWxmLl9lbmFibGVkIDw+IG9ub2ZmOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5IaWxpdGVDb250cm9sKChub3Qgb25vZmYpIGFuZCAyNTUpCisgICAgICAgICAgICBzZWxmLl9lbmFibGVkID0gb25vZmYKKworICAgIGRlZiBzaG93KHNlbGYsIG9ub2ZmKToKKyAgICAgICAgQ29udHJvbFdpZGdldC5zaG93KHNlbGYsIG9ub2ZmKQorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBzZWxmLl9jb250cm9sLkRyYXcxQ29udHJvbCgpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgQ29udHJvbFdpZGdldC5vcGVuKHNlbGYpCisgICAgICAgIGlmIHNlbGYuX2lzZGVmYXVsdDoKKyAgICAgICAgICAgIHNlbGYuX3NldGRlZmF1bHQoc2VsZi5faXNkZWZhdWx0KQorCisgICAgZGVmIF9zZXRkZWZhdWx0KHNlbGYsIG9ub2ZmKToKKyAgICAgICAgYyA9IHNlbGYuX2NvbnRyb2wKKyAgICAgICAgaWYgYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgICAgIGRhdGEgPSAiXHhGRiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGF0YSA9ICJcMCIKKyAgICAgICAgICAgICMgaGlkZSBiZWZvcmUgY2hhbmdpbmcgc3RhdGUsIG90aGVyd2lzZSB0aGUgYnV0dG9uIGlzbid0IGFsd2F5cworICAgICAgICAgICAgIyByZWRyYXduIGNvcnJlY3RseSwgYWx0aG91Z2ggaXQncyBxdWl0ZSBkaWZmZXJlbnQgdW5kZXIgQXF1YQorICAgICAgICAgICAgIyBhbmQgQ2xhc3NpYy4uLgorICAgICAgICAgICAgYy5IaWRlQ29udHJvbCgpCisgICAgICAgICAgICBjLlNldENvbnRyb2xEYXRhKENvbnRyb2xzLmtDb250cm9sTm9QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xzLmtDb250cm9sUHVzaEJ1dHRvbkRlZmF1bHRUYWcsIGRhdGEpCisgICAgICAgICAgICBjLlNob3dDb250cm9sKCkKKyAgICAgICAgc2VsZi5faXNkZWZhdWx0ID0gb25vZmYKKworICAgIGRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKKyAgICAgICAgaWYgc2VsZi5faXNkZWZhdWx0OgorICAgICAgICAgICAgb2xkID0gUWQuSW5zZXRSZWN0KG9sZGJvdW5kcywgLTQsIC00KQorICAgICAgICAgICAgbmV3ID0gUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgLTQsIC00KQorICAgICAgICAgICAgUWQuRXJhc2VSZWN0KG9sZCkKKyAgICAgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG9sZCkKKyAgICAgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG5ldykKKyAgICAgICAgQ29udHJvbFdpZGdldC5hZGp1c3Qoc2VsZiwgb2xkYm91bmRzKQogCiAKIGNsYXNzIEJldmVsQnV0dG9uKEJ1dHRvbik6Ci0JcHJvY0lEID0gQ29udHJvbHMua0NvbnRyb2xCZXZlbEJ1dHRvbk5vcm1hbEJldmVsUHJvYyB8IENvbnRyb2xzLnVzZVdGb250CisgICAgcHJvY0lEID0gQ29udHJvbHMua0NvbnRyb2xCZXZlbEJ1dHRvbk5vcm1hbEJldmVsUHJvYyB8IENvbnRyb2xzLnVzZVdGb250CiAKIAogY2xhc3MgQ2hlY2tCb3goQ29udHJvbFdpZGdldCk6Ci0JCi0JIiIiU3RhbmRhcmQgY2hlY2tib3guIiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIkNoZWNrYm94IiwgY2FsbGJhY2sgPSBOb25lLCB2YWx1ZSA9IDApOgotCQlwcm9jSUQgPSBDb250cm9scy5jaGVja0JveFByb2MgfCBDb250cm9scy51c2VXRm9udAotCQlDb250cm9sV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlLCBwcm9jSUQsIGNhbGxiYWNrLCB2YWx1ZSwgMCwgMSkKLQkKLQlkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCWlmIG5vdCBzZWxmLl9lbmFibGVkOgotCQkJcmV0dXJuCi0JCXBhcnQgPSBzZWxmLl9jb250cm9sLlRyYWNrQ29udHJvbChwb2ludCkKLQkJaWYgcGFydDoKLQkJCXNlbGYudG9nZ2xlKCkKLQkJCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgc2VsZi5nZXQoKSkKLQkKLQlkZWYgcHVzaChzZWxmKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJc2VsZi50b2dnbGUoKQotCQlpZiBzZWxmLl9jYWxsYmFjazoKLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgc2VsZi5nZXQoKSkKLQkKLQlkZWYgdG9nZ2xlKHNlbGYpOgotCQlzZWxmLnNldChub3Qgc2VsZi5nZXQoKSkKKworICAgICIiIlN0YW5kYXJkIGNoZWNrYm94LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIkNoZWNrYm94IiwgY2FsbGJhY2sgPSBOb25lLCB2YWx1ZSA9IDApOgorICAgICAgICBwcm9jSUQgPSBDb250cm9scy5jaGVja0JveFByb2MgfCBDb250cm9scy51c2VXRm9udAorICAgICAgICBDb250cm9sV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlLCBwcm9jSUQsIGNhbGxiYWNrLCB2YWx1ZSwgMCwgMSkKKworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2VuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcGFydCA9IHNlbGYuX2NvbnRyb2wuVHJhY2tDb250cm9sKHBvaW50KQorICAgICAgICBpZiBwYXJ0OgorICAgICAgICAgICAgc2VsZi50b2dnbGUoKQorICAgICAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCBzZWxmLmdldCgpKQorCisgICAgZGVmIHB1c2goc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudG9nZ2xlKCkKKyAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICBXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsIHNlbGYuZ2V0KCkpCisKKyAgICBkZWYgdG9nZ2xlKHNlbGYpOgorICAgICAgICBzZWxmLnNldChub3Qgc2VsZi5nZXQoKSkKIAogCiBjbGFzcyBSYWRpb0J1dHRvbihDb250cm9sV2lkZ2V0KToKLQkKLQkiIiJTdGFuZGFyZCByYWRpb2J1dHRvbi4iIiIKLQkKLQkjIFhYWCBXZSBuZWVkIGEgcmFkaW9ncm91cCB3aWRnZXQ7IHRoaXMgaXMgdG9vIGtsdWRneS4KLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUsIHRoZWJ1dHRvbnMsIGNhbGxiYWNrID0gTm9uZSwgdmFsdWUgPSAwKToKLQkJcHJvY0lEID0gQ29udHJvbHMucmFkaW9CdXRQcm9jIHwgQ29udHJvbHMudXNlV0ZvbnQKLQkJQ29udHJvbFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0aXRsZSwgcHJvY0lELCBjYWxsYmFjaywgdmFsdWUsIDAsIDEpCi0JCXNlbGYudGhlYnV0dG9ucyA9IHRoZWJ1dHRvbnMKLQkJdGhlYnV0dG9ucy5hcHBlbmQoc2VsZikKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYudGhlYnV0dG9ucyA9IE5vbmUKLQkJQ29udHJvbFdpZGdldC5jbG9zZShzZWxmKQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJcGFydCA9IHNlbGYuX2NvbnRyb2wuVHJhY2tDb250cm9sKHBvaW50KQotCQlpZiBwYXJ0OgotCQkJc2VsZi5zZXQoMSkKLQkJCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgMSkKLQkKLQlkZWYgcHVzaChzZWxmKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJc2VsZi5zZXQoMSkKLQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQlXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsIDEpCi0JCi0JZGVmIHNldChzZWxmLCB2YWx1ZSk6Ci0JCWZvciBidXR0b24gaW4gc2VsZi50aGVidXR0b25zOgotCQkJaWYgYnV0dG9uLl9jb250cm9sOgotCQkJCWJ1dHRvbi5fY29udHJvbC5TZXRDb250cm9sVmFsdWUoYnV0dG9uID09IHNlbGYpCi0JCQllbHNlOgotCQkJCWJ1dHRvbi5fdmFsdWUgPSAoYnV0dG9uID09IHNlbGYpCisKKyAgICAiIiJTdGFuZGFyZCByYWRpb2J1dHRvbi4iIiIKKworICAgICMgWFhYIFdlIG5lZWQgYSByYWRpb2dyb3VwIHdpZGdldDsgdGhpcyBpcyB0b28ga2x1ZGd5LgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlLCB0aGVidXR0b25zLCBjYWxsYmFjayA9IE5vbmUsIHZhbHVlID0gMCk6CisgICAgICAgIHByb2NJRCA9IENvbnRyb2xzLnJhZGlvQnV0UHJvYyB8IENvbnRyb2xzLnVzZVdGb250CisgICAgICAgIENvbnRyb2xXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUsIHByb2NJRCwgY2FsbGJhY2ssIHZhbHVlLCAwLCAxKQorICAgICAgICBzZWxmLnRoZWJ1dHRvbnMgPSB0aGVidXR0b25zCisgICAgICAgIHRoZWJ1dHRvbnMuYXBwZW5kKHNlbGYpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYudGhlYnV0dG9ucyA9IE5vbmUKKyAgICAgICAgQ29udHJvbFdpZGdldC5jbG9zZShzZWxmKQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBwYXJ0ID0gc2VsZi5fY29udHJvbC5UcmFja0NvbnRyb2wocG9pbnQpCisgICAgICAgIGlmIHBhcnQ6CisgICAgICAgICAgICBzZWxmLnNldCgxKQorICAgICAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAxKQorCisgICAgZGVmIHB1c2goc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuc2V0KDEpCisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAxKQorCisgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6CisgICAgICAgIGZvciBidXR0b24gaW4gc2VsZi50aGVidXR0b25zOgorICAgICAgICAgICAgaWYgYnV0dG9uLl9jb250cm9sOgorICAgICAgICAgICAgICAgIGJ1dHRvbi5fY29udHJvbC5TZXRDb250cm9sVmFsdWUoYnV0dG9uID09IHNlbGYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJ1dHRvbi5fdmFsdWUgPSAoYnV0dG9uID09IHNlbGYpCiAKIAogY2xhc3MgU2Nyb2xsYmFyKENvbnRyb2xXaWRnZXQpOgotCQotCSIiIlN0YW5kYXJkIHNjcm9sbGJhci4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgY2FsbGJhY2s9Tm9uZSwgdmFsdWU9MCwgbWluPTAsIG1heD0wLCBsaXZlZmVlZGJhY2s9MSk6Ci0JCWlmIGxpdmVmZWVkYmFjazoKLQkJCXByb2NJRCA9IENvbnRyb2xzLmtDb250cm9sU2Nyb2xsQmFyTGl2ZVByb2MKLQkJZWxzZToKLQkJCXByb2NJRCA9IENvbnRyb2xzLnNjcm9sbEJhclByb2MKLQkJQ29udHJvbFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCAiIiwgcHJvY0lELCBjYWxsYmFjaywgdmFsdWUsIG1pbiwgbWF4KQotCQotCSMgaW50ZXJmYWNlCi0jCWRlZiBzZXQoc2VsZiwgdmFsdWUpOgotIwkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0jCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCB2YWx1ZSkKLQkKLQlkZWYgdXAoc2VsZik6Ci0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCAnKycpCi0JCi0JZGVmIGRvd24oc2VsZik6Ci0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCAnLScpCi0JCi0JZGVmIHBhZ2V1cChzZWxmKToKLQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQlXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDEsICcrKycpCi0JCi0JZGVmIHBhZ2Vkb3duKHNlbGYpOgotCQlpZiBzZWxmLl9jYWxsYmFjazoKLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMSwgJy0tJykKLQkKLQlkZWYgc2V0bWluKHNlbGYsIG1pbik6Ci0JCWlmIHNlbGYuX2NvbnRyb2wgaXMgbm90IE5vbmU6Ci0JCQlpZiAtMzI3NjggPD0gbWluIDw9IDMyNzY3OgotCQkJCSMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIHVzZQotCQkJCSMgdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBwb3NzaWJsZS4KLQkJCQlzZWxmLl9jb250cm9sLlNldENvbnRyb2xNaW5pbXVtKG1pbikKLQkJCWVsc2U6Ci0JCQkJc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNaW5pbXVtKG1pbikKLQkJZWxzZToKLQkJCXNlbGYuX21pbiA9IG1pbgotCQotCWRlZiBzZXRtYXgoc2VsZiwgbWF4KToKLQkJaWYgc2VsZi5fY29udHJvbCBpcyBub3QgTm9uZToKLQkJCWlmIC0zMjc2OCA8PSBtYXggPD0gMzI3Njc6Ci0JCQkJIyBObyAzMi1iaXQgY29udHJvbCBzdXBwb3J0IGluIE1hY09TIDguMSwgc28gdXNlCi0JCQkJIyB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIHBvc3NpYmxlLgotCQkJCXNlbGYuX2NvbnRyb2wuU2V0Q29udHJvbE1heGltdW0obWF4KQotCQkJZWxzZToKLQkJCQlzZWxmLl9jb250cm9sLlNldENvbnRyb2wzMkJpdE1heGltdW0obWF4KQotCQllbHNlOgotCQkJc2VsZi5fbWF4ID0gbWF4Ci0JCi0JZGVmIHNldHZpZXdzaXplKHNlbGYsIHZpZXdzaXplKToKLQkJaWYgc2VsZi5fY29udHJvbCBpcyBub3QgTm9uZToKLQkJCXRyeToKLQkJCQlzZWxmLl9jb250cm9sLlNldENvbnRyb2xWaWV3U2l6ZSh2aWV3c2l6ZSkKLQkJCQkjIE5vdCBhdmFpbGFibGUgaW4gTWFjT1MgOC4xLCBidXQgdGhhdCdzIE9LIHNpbmNlIGl0IG9ubHkgYWZmZWN0cwotCQkJCSMgcHJvcG9ydGlvbmFsIHNjcm9sbGJhcnMgd2hpY2ggd2VyZW4ndCBhdmFpbGFibGUgaW4gOC4xIGVpdGhlci4KLQkJCWV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgotCQkJCXBhc3MKLQkJZWxzZToKLQkJCXNlbGYuX3ZpZXdzaXplID0gdmlld3NpemUKLQkKLQlkZWYgZ2V0bWluKHNlbGYpOgotCQl0cnk6Ci0JCQlyZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sMzJCaXRNaW5pbXVtKCkKLQkJCSMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIGZhbGwKLQkJCSMgYmFjayB0byB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIG5lZWRlZC4KLQkJZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6Ci0JCQlyZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sTWluaW11bSgpCi0JCi0JZGVmIGdldG1heChzZWxmKToKLQkJdHJ5OgotCQkJcmV0dXJuIHNlbGYuX2NvbnRyb2wuR2V0Q29udHJvbDMyQml0TWF4aW11bSgpCi0JCQkjIE5vIDMyLWJpdCBjb250cm9sIHN1cHBvcnQgaW4gTWFjT1MgOC4xLCBzbyBmYWxsCi0JCQkjIGJhY2sgdG8gdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBuZWVkZWQuCi0JCWV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgotCQkJcmV0dXJuIHNlbGYuX2NvbnRyb2wuR2V0Q29udHJvbE1heGltdW0oKQotCQotCSMgaW50ZXJuYWxzCi0JZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlpZiBub3Qgc2VsZi5fZW5hYmxlZDoKLQkJCXJldHVybgotCQlkZWYgaGl0dGVyKGN0bCwgcGFydCwgc2VsZj1zZWxmKToKLQkJCWlmIHBhcnQ6Ci0JCQkJc2VsZi5faGl0KHBhcnQpCi0JCXBhcnQgPSBzZWxmLl9jb250cm9sLlRyYWNrQ29udHJvbChwb2ludCwgaGl0dGVyKQotCQotCWRlZiBfaGl0KHNlbGYsIHBhcnQpOgotCQl2YWx1ZSA9IE5vbmUKLQkJaWYgcGFydCA9PSBDb250cm9scy5pblRodW1iOgotCQkJdHJ5OgotCQkJCXZhbHVlID0gc2VsZi5fY29udHJvbC5HZXRDb250cm9sMzJCaXRWYWx1ZSgpCi0JCQkJIyBObyAzMi1iaXQgY29udHJvbCBzdXBwb3J0IGluIE1hY09TIDguMSwgc28gZmFsbAotCQkJCSMgYmFjayB0byB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIG5lZWRlZC4KLQkJCWV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgotCQkJCXZhbHVlID0gc2VsZi5fY29udHJvbC5HZXRDb250cm9sVmFsdWUoKQotCQllbGlmIHBhcnQgPT0gQ29udHJvbHMuaW5VcEJ1dHRvbjoKLQkJCXZhbHVlID0gIisiCi0JCWVsaWYgcGFydCA9PSBDb250cm9scy5pbkRvd25CdXR0b246Ci0JCQl2YWx1ZSA9ICItIgotCQllbGlmIHBhcnQgPT0gQ29udHJvbHMuaW5QYWdlVXA6Ci0JCQl2YWx1ZSA9ICIrKyIKLQkJZWxpZiBwYXJ0ID09IENvbnRyb2xzLmluUGFnZURvd246Ci0JCQl2YWx1ZSA9ICItLSIKLQkJaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCB2YWx1ZSkKLQkKLQlkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCXNlbGYuX2NvbnRyb2wuRHJhdzFDb250cm9sKCkKLQkJCSNRZC5GcmFtZVJlY3Qoc2VsZi5fYm91bmRzKQotCQotCWRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qob2xkYm91bmRzKQotCQlzZWxmLl9jb250cm9sLkhpZGVDb250cm9sKCkKLQkJc2VsZi5fY29udHJvbC5Nb3ZlQ29udHJvbChzZWxmLl9ib3VuZHNbMF0sIHNlbGYuX2JvdW5kc1sxXSkKLQkJc2VsZi5fY29udHJvbC5TaXplQ29udHJvbChzZWxmLl9ib3VuZHNbMl0gLSBzZWxmLl9ib3VuZHNbMF0sIHNlbGYuX2JvdW5kc1szXSAtIHNlbGYuX2JvdW5kc1sxXSkKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCVFkLkVyYXNlUmVjdChzZWxmLl9ib3VuZHMpCi0JCQlpZiBzZWxmLl9hY3RpdmF0ZWQ6Ci0JCQkJc2VsZi5fY29udHJvbC5TaG93Q29udHJvbCgpCi0JCQllbHNlOgotCQkJCVFkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCi0JCQlzZWxmLkdldFdpbmRvdygpLlZhbGlkV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCisKKyAgICAiIiJTdGFuZGFyZCBzY3JvbGxiYXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgY2FsbGJhY2s9Tm9uZSwgdmFsdWU9MCwgbWluPTAsIG1heD0wLCBsaXZlZmVlZGJhY2s9MSk6CisgICAgICAgIGlmIGxpdmVmZWVkYmFjazoKKyAgICAgICAgICAgIHByb2NJRCA9IENvbnRyb2xzLmtDb250cm9sU2Nyb2xsQmFyTGl2ZVByb2MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByb2NJRCA9IENvbnRyb2xzLnNjcm9sbEJhclByb2MKKyAgICAgICAgQ29udHJvbFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCAiIiwgcHJvY0lELCBjYWxsYmFjaywgdmFsdWUsIG1pbiwgbWF4KQorCisgICAgIyBpbnRlcmZhY2UKKyMgICAgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6CisjICAgICAgICAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisjICAgICAgICAgICAgICAgICAgICAgICBXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDEsIHZhbHVlKQorCisgICAgZGVmIHVwKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKKyAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMSwgJysnKQorCisgICAgZGVmIGRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCAnLScpCisKKyAgICBkZWYgcGFnZXVwKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKKyAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMSwgJysrJykKKworICAgIGRlZiBwYWdlZG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICBXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDEsICctLScpCisKKyAgICBkZWYgc2V0bWluKHNlbGYsIG1pbik6CisgICAgICAgIGlmIHNlbGYuX2NvbnRyb2wgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiAtMzI3NjggPD0gbWluIDw9IDMyNzY3OgorICAgICAgICAgICAgICAgICMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIHVzZQorICAgICAgICAgICAgICAgICMgdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBzZWxmLl9jb250cm9sLlNldENvbnRyb2xNaW5pbXVtKG1pbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNaW5pbXVtKG1pbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX21pbiA9IG1pbgorCisgICAgZGVmIHNldG1heChzZWxmLCBtYXgpOgorICAgICAgICBpZiBzZWxmLl9jb250cm9sIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgLTMyNzY4IDw9IG1heCA8PSAzMjc2NzoKKyAgICAgICAgICAgICAgICAjIE5vIDMyLWJpdCBjb250cm9sIHN1cHBvcnQgaW4gTWFjT1MgOC4xLCBzbyB1c2UKKyAgICAgICAgICAgICAgICAjIHRoZSAxNi1iaXQgaW50ZXJmYWNlIHdoZW4gcG9zc2libGUuCisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sTWF4aW11bShtYXgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRyb2wuU2V0Q29udHJvbDMyQml0TWF4aW11bShtYXgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9tYXggPSBtYXgKKworICAgIGRlZiBzZXR2aWV3c2l6ZShzZWxmLCB2aWV3c2l6ZSk6CisgICAgICAgIGlmIHNlbGYuX2NvbnRyb2wgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sVmlld1NpemUodmlld3NpemUpCisgICAgICAgICAgICAgICAgIyBOb3QgYXZhaWxhYmxlIGluIE1hY09TIDguMSwgYnV0IHRoYXQncyBPSyBzaW5jZSBpdCBvbmx5IGFmZmVjdHMKKyAgICAgICAgICAgICAgICAjIHByb3BvcnRpb25hbCBzY3JvbGxiYXJzIHdoaWNoIHdlcmVuJ3QgYXZhaWxhYmxlIGluIDguMSBlaXRoZXIuCisgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl92aWV3c2l6ZSA9IHZpZXdzaXplCisKKyAgICBkZWYgZ2V0bWluKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sMzJCaXRNaW5pbXVtKCkKKyAgICAgICAgICAgICMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIGZhbGwKKyAgICAgICAgICAgICMgYmFjayB0byB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIG5lZWRlZC4KKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sTWluaW11bSgpCisKKyAgICBkZWYgZ2V0bWF4KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sMzJCaXRNYXhpbXVtKCkKKyAgICAgICAgICAgICMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIGZhbGwKKyAgICAgICAgICAgICMgYmFjayB0byB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIG5lZWRlZC4KKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sTWF4aW11bSgpCisKKyAgICAjIGludGVybmFscworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2VuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZGVmIGhpdHRlcihjdGwsIHBhcnQsIHNlbGY9c2VsZik6CisgICAgICAgICAgICBpZiBwYXJ0OgorICAgICAgICAgICAgICAgIHNlbGYuX2hpdChwYXJ0KQorICAgICAgICBwYXJ0ID0gc2VsZi5fY29udHJvbC5UcmFja0NvbnRyb2wocG9pbnQsIGhpdHRlcikKKworICAgIGRlZiBfaGl0KHNlbGYsIHBhcnQpOgorICAgICAgICB2YWx1ZSA9IE5vbmUKKyAgICAgICAgaWYgcGFydCA9PSBDb250cm9scy5pblRodW1iOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fY29udHJvbC5HZXRDb250cm9sMzJCaXRWYWx1ZSgpCisgICAgICAgICAgICAgICAgIyBObyAzMi1iaXQgY29udHJvbCBzdXBwb3J0IGluIE1hY09TIDguMSwgc28gZmFsbAorICAgICAgICAgICAgICAgICMgYmFjayB0byB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIG5lZWRlZC4KKyAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fY29udHJvbC5HZXRDb250cm9sVmFsdWUoKQorICAgICAgICBlbGlmIHBhcnQgPT0gQ29udHJvbHMuaW5VcEJ1dHRvbjoKKyAgICAgICAgICAgIHZhbHVlID0gIisiCisgICAgICAgIGVsaWYgcGFydCA9PSBDb250cm9scy5pbkRvd25CdXR0b246CisgICAgICAgICAgICB2YWx1ZSA9ICItIgorICAgICAgICBlbGlmIHBhcnQgPT0gQ29udHJvbHMuaW5QYWdlVXA6CisgICAgICAgICAgICB2YWx1ZSA9ICIrKyIKKyAgICAgICAgZWxpZiBwYXJ0ID09IENvbnRyb2xzLmluUGFnZURvd246CisgICAgICAgICAgICB2YWx1ZSA9ICItLSIKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCB2YWx1ZSkKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5EcmF3MUNvbnRyb2woKQorICAgICAgICAgICAgI1FkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCisKKyAgICBkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG9sZGJvdW5kcykKKyAgICAgICAgc2VsZi5fY29udHJvbC5IaWRlQ29udHJvbCgpCisgICAgICAgIHNlbGYuX2NvbnRyb2wuTW92ZUNvbnRyb2woc2VsZi5fYm91bmRzWzBdLCBzZWxmLl9ib3VuZHNbMV0pCisgICAgICAgIHNlbGYuX2NvbnRyb2wuU2l6ZUNvbnRyb2woc2VsZi5fYm91bmRzWzJdIC0gc2VsZi5fYm91bmRzWzBdLCBzZWxmLl9ib3VuZHNbM10gLSBzZWxmLl9ib3VuZHNbMV0pCisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBRZC5FcmFzZVJlY3Qoc2VsZi5fYm91bmRzKQorICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZhdGVkOgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRyb2wuU2hvd0NvbnRyb2woKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBRZC5GcmFtZVJlY3Qoc2VsZi5fYm91bmRzKQorICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5WYWxpZFdpbmRvd1JlY3Qoc2VsZi5fYm91bmRzKQogCiAKIGRlZiBfc2NhbGViYXJ2YWx1ZShhYnNtaW4sIGFic21heCwgY3VybWluLCBjdXJtYXgpOgotCWlmIGN1cm1pbiA8PSBhYnNtaW4gYW5kIGN1cm1heCA+PSBhYnNtYXg6Ci0JCXJldHVybiBOb25lCi0JaWYgY3VybWluIDw9IGFic21pbjoKLQkJcmV0dXJuIDAKLQlpZiBjdXJtYXggPj0gYWJzbWF4OgotCQlyZXR1cm4gMzI3NjcKLQlwZXJjID0gZmxvYXQoY3VybWluLWFic21pbikgLyBmbG9hdCgoYWJzbWF4IC0gYWJzbWluKSAtIChjdXJtYXggLSBjdXJtaW4pKQotCXJldHVybiBpbnQocGVyYyozMjc2NykKLQorICAgIGlmIGN1cm1pbiA8PSBhYnNtaW4gYW5kIGN1cm1heCA+PSBhYnNtYXg6CisgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgY3VybWluIDw9IGFic21pbjoKKyAgICAgICAgcmV0dXJuIDAKKyAgICBpZiBjdXJtYXggPj0gYWJzbWF4OgorICAgICAgICByZXR1cm4gMzI3NjcKKyAgICBwZXJjID0gZmxvYXQoY3VybWluLWFic21pbikgLyBmbG9hdCgoYWJzbWF4IC0gYWJzbWluKSAtIChjdXJtYXggLSBjdXJtaW4pKQorICAgIHJldHVybiBpbnQocGVyYyozMjc2NykKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvV2tleXMucHkgYi9NYWMvVG9vbHMvSURFL1drZXlzLnB5CmluZGV4IDg3NmYwMmYuLjliYzQ1MjIgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvV2tleXMucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9Xa2V5cy5weQpAQCAtMSw0NSArMSw0NSBAQAotc3BhY2VrZXkJCT0gJyAnCi1yZXR1cm5rZXkgCQk9ICdccicKLXRhYmtleSAJCT0gJ1x0JwotZW50ZXJrZXkgCQk9ICdcMDAzJwotYmFja3NwYWNla2V5IAk9ICdcMDEwJwotZGVsZXRla2V5IAkJPSAnXDE3NycKLWNsZWFya2V5CQk9ICdcMDMzJwotaGVscGtleSAJCT0gJ1wwMDUnCitzcGFjZWtleSAgICAgICAgICAgICAgICA9ICcgJworcmV0dXJua2V5ICAgICAgICAgICAgICAgPSAnXHInCit0YWJrZXkgICAgICAgICAgPSAnXHQnCitlbnRlcmtleSAgICAgICAgICAgICAgICA9ICdcMDAzJworYmFja3NwYWNla2V5ICAgID0gJ1wwMTAnCitkZWxldGVrZXkgICAgICAgICAgICAgICA9ICdcMTc3JworY2xlYXJrZXkgICAgICAgICAgICAgICAgPSAnXDAzMycKK2hlbHBrZXkgICAgICAgICAgICAgICAgID0gJ1wwMDUnCiAKLWxlZnRhcnJvd2tleSAJPSAnXDAzNCcKLXJpZ2h0YXJyb3drZXkgCT0gJ1wwMzUnCi11cGFycm93a2V5IAkJPSAnXDAzNicKLWRvd25hcnJvd2tleSAJPSAnXDAzNycKLWFycm93a2V5cyAJCT0gW2xlZnRhcnJvd2tleSwgcmlnaHRhcnJvd2tleSwgdXBhcnJvd2tleSwgZG93bmFycm93a2V5XQorbGVmdGFycm93a2V5ICAgID0gJ1wwMzQnCityaWdodGFycm93a2V5ICAgPSAnXDAzNScKK3VwYXJyb3drZXkgICAgICAgICAgICAgID0gJ1wwMzYnCitkb3duYXJyb3drZXkgICAgPSAnXDAzNycKK2Fycm93a2V5cyAgICAgICAgICAgICAgID0gW2xlZnRhcnJvd2tleSwgcmlnaHRhcnJvd2tleSwgdXBhcnJvd2tleSwgZG93bmFycm93a2V5XQogCi10b3BrZXkgCQk9ICdcMDAxJwotYm90dG9ta2V5IAkJPSAnXDAwNCcKLXBhZ2V1cGtleSAJCT0gJ1wwMTMnCi1wYWdlZG93bmtleSAJPSAnXDAxNCcKLXNjcm9sbGtleXMgCQk9IFt0b3BrZXksIGJvdHRvbWtleSwgcGFnZXVwa2V5LCBwYWdlZG93bmtleV0KK3RvcGtleSAgICAgICAgICA9ICdcMDAxJworYm90dG9ta2V5ICAgICAgICAgICAgICAgPSAnXDAwNCcKK3BhZ2V1cGtleSAgICAgICAgICAgICAgID0gJ1wwMTMnCitwYWdlZG93bmtleSAgICAgPSAnXDAxNCcKK3Njcm9sbGtleXMgICAgICAgICAgICAgID0gW3RvcGtleSwgYm90dG9ta2V5LCBwYWdldXBrZXksIHBhZ2Vkb3dua2V5XQogCiBuYXZpZ2F0aW9ua2V5cyA9IGFycm93a2V5cyArIHNjcm9sbGtleXMKIAoga2V5Y29kZXMgPSB7Ci0JInNwYWNlIgkJOiAnICcsCi0JInJldHVybiIJCTogJ1xyJywKLQkidGFiIiAJCQk6ICdcdCcsCi0JImVudGVyIiAJCTogJ1wwMDMnLAotCSJiYWNrc3BhY2UiCTogJ1wwMTAnLAotCSJkZWxldGUiCQk6ICdcMTc3JywKLQkiaGVscCIgCQk6ICdcMDA1JywKLQkibGVmdGFycm93IgkJOiAnXDAzNCcsCi0JInJpZ2h0YXJyb3ciIAk6ICdcMDM1JywKLQkidXBhcnJvdyIgCQk6ICdcMDM2JywKLQkiZG93bmFycm93Igk6ICdcMDM3JywKLQkidG9wIiAJCQk6ICdcMDAxJywKLQkiYm90dG9tIiAJCTogJ1wwMDQnLAotCSJwYWdldXAiIAkJOiAnXDAxMycsCi0JInBhZ2Vkb3duIiAJOiAnXDAxNCcKKyAgICAgICAgInNwYWNlIiAgICAgICAgIDogJyAnLAorICAgICAgICAicmV0dXJuIiAgICAgICAgICAgICAgICA6ICdccicsCisgICAgICAgICJ0YWIiICAgICAgICAgICAgICAgICAgIDogJ1x0JywKKyAgICAgICAgImVudGVyIiAgICAgICAgICAgICAgICAgOiAnXDAwMycsCisgICAgICAgICJiYWNrc3BhY2UiICAgICA6ICdcMDEwJywKKyAgICAgICAgImRlbGV0ZSIgICAgICAgICAgICAgICAgOiAnXDE3NycsCisgICAgICAgICJoZWxwIiAgICAgICAgICA6ICdcMDA1JywKKyAgICAgICAgImxlZnRhcnJvdyIgICAgICAgICAgICAgOiAnXDAzNCcsCisgICAgICAgICJyaWdodGFycm93IiAgICA6ICdcMDM1JywKKyAgICAgICAgInVwYXJyb3ciICAgICAgICAgICAgICAgOiAnXDAzNicsCisgICAgICAgICJkb3duYXJyb3ciICAgICA6ICdcMDM3JywKKyAgICAgICAgInRvcCIgICAgICAgICAgICAgICAgICAgOiAnXDAwMScsCisgICAgICAgICJib3R0b20iICAgICAgICAgICAgICAgIDogJ1wwMDQnLAorICAgICAgICAicGFnZXVwIiAgICAgICAgICAgICAgICA6ICdcMDEzJywKKyAgICAgICAgInBhZ2Vkb3duIiAgICAgIDogJ1wwMTQnCiB9CiAKIGtleW5hbWVzID0ge30KIGZvciBrLCB2IGluIGtleWNvZGVzLml0ZW1zKCk6Ci0Ja2V5bmFtZXNbdl0gPSBrCisgICAga2V5bmFtZXNbdl0gPSBrCiBkZWwgaywgdgpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9XbGlzdHMucHkgYi9NYWMvVG9vbHMvSURFL1dsaXN0cy5weQppbmRleCAxYjY2YThiLi45YWViN2M0IDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1dsaXN0cy5weQorKysgYi9NYWMvVG9vbHMvSURFL1dsaXN0cy5weQpAQCAtMTAsNTczICsxMCw1NzIgQEAKIAogCiBjbGFzcyBMaXN0KFdiYXNlLlNlbGVjdGFibGVXaWRnZXQpOgotCQotCSIiIlN0YW5kYXJkIGxpc3Qgd2lkZ2V0LiIiIgotCQotCUxERUZfSUQgPSAwCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIGl0ZW1zID0gTm9uZSwgY2FsbGJhY2sgPSBOb25lLCBmbGFncyA9IDAsIGNvbHMgPSAxLCB0eXBpbmdjYXNlc2Vucz0wKToKLQkJaWYgaXRlbXMgaXMgTm9uZToKLQkJCWl0ZW1zID0gW10KLQkJc2VsZi5pdGVtcyA9IGl0ZW1zCi0JCVdiYXNlLlNlbGVjdGFibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKLQkJc2VsZi5fc2VsZWN0ZWQgPSAwCi0JCXNlbGYuX2VuYWJsZWQgPSAxCi0JCXNlbGYuX2xpc3QgPSBOb25lCi0JCXNlbGYuX2NvbHMgPSBjb2xzCi0JCXNlbGYuX2NhbGxiYWNrID0gY2FsbGJhY2sKLQkJc2VsZi5fZmxhZ3MgPSBmbGFncwotCQlzZWxmLnR5cGluZ2Nhc2VzZW5zID0gdHlwaW5nY2FzZXNlbnMKLQkJc2VsZi5sYXN0dHlwaW5nID0gIiIKLQkJc2VsZi5sYXN0dGltZSA9IEV2dC5UaWNrQ291bnQoKQotCQlzZWxmLnRpbWVsaW1pdCA9IDMwCi0JCXNlbGYuc2V0aXRlbXMoaXRlbXMpCi0JCXNlbGYuZHJhd2luZ21vZGUgPSAwCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKLQkJc2VsZi5jcmVhdGVsaXN0KCkKLQkJc2VsZi5zZXRkcmF3aW5nbW9kZSgxKQotCQotCWRlZiBjcmVhdGVsaXN0KHNlbGYpOgotCQlzZWxmLl9jYWxjYm91bmRzKCkKLQkJc2VsZi5TZXRQb3J0KCkKLQkJcmVjdCA9IHNlbGYuX2JvdW5kcwotCQlyZWN0ID0gcmVjdFswXSsxLCByZWN0WzFdKzEsIHJlY3RbMl0tMTYsIHJlY3RbM10tMQotCQlzZWxmLl92aWV3Ym91bmRzID0gcmVjdAotCQlzZWxmLl9saXN0ID0gTE5ldyhyZWN0LCAoMCwgMCwgc2VsZi5fY29scywgMCksICgwLCAwKSwgc2VsZi5MREVGX0lELCBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLAotCQkJCQkwLCAxLCAwLCAxKQotCQlpZiBzZWxmLmRyYXdpbmdtb2RlOgotCQkJc2VsZi5fbGlzdC5MU2V0RHJhd2luZ01vZGUoMCkKLQkJc2VsZi5fbGlzdC5zZWxGbGFncyA9IHNlbGYuX2ZsYWdzCi0JCXNlbGYuc2V0aXRlbXMoc2VsZi5pdGVtcykKLQkJaWYgaGFzYXR0cihzZWxmLCAiX3NlbCIpOgotCQkJc2VsZi5zZXRzZWxlY3Rpb24oc2VsZi5fc2VsKQotCQkJZGVsIHNlbGYuX3NlbAotCQotCWRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJIyBBcHBlYXJhbmNlIGZyYW1lcyBhcmUgZHJhd24gb3V0c2lkZSB0aGUgc3BlY2lmaWVkIGJvdW5kcywKLQkJIyBzbyB3ZSBhbHdheXMgbmVlZCB0byBvdXRzZXQgdGhlIGludmFsaWRhdGVkIGFyZWEuCi0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChvbGRib3VuZHMsIC0zLCAtMykpCi0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIC0zLCAtMykpCiAKLQkJaWYgb2xkYm91bmRzWzoyXSA9PSBzZWxmLl9ib3VuZHNbOjJdOgotCQkJIyBzZXQgdmlzUmduIHRvIGVtcHR5LCB0byBwcmV2ZW50IG5hc3R5IGRyYXdpbmcgc2lkZSBlZmZlY3Qgb2YgTFNpemUoKQotCQkJUWQuUmVjdFJnbihzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24sICgwLCAwLCAwLCAwKSkKLQkJCSMgbGlzdCBzdGlsbCBoYXMgdGhlIHNhbWUgdXBwZXIvbGVmdCBjb29yZGluYXRlcywgdXNlIExTaXplCi0JCQlsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCi0JCQl3aWR0aCA9IHIgLSBsIC0gMTcKLQkJCWhlaWdodCA9IGIgLSB0IC0gMgotCQkJdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLl92aWV3Ym91bmRzCi0JCQlzZWxmLl92aWV3Ym91bmRzID0gdmwsIHZ0LCB2bCArIHdpZHRoLCB2dCArIGhlaWdodAotCQkJc2VsZi5fbGlzdC5MU2l6ZSh3aWR0aCwgaGVpZ2h0KQotCQkJIyBub3cgKndoeSogZG9lc24ndCB0aGUgbGlzdCBtYW5hZ2VyIHJlY2FsYyB0aGUgY2VsbHJlY3Q/Pz8KLQkJCWwsIHQsIHIsIGIgPSBzZWxmLl9saXN0LkxSZWN0KCgwLDApKQotCQkJY2VsbGhlaWdodCA9IGIgLSB0Ci0JCQlzZWxmLl9saXN0LkxDZWxsU2l6ZSgod2lkdGgvc2VsZi5fY29scywgY2VsbGhlaWdodCkpCi0JCQkjIHJlc2V0IHZpc1JnbgotCQkJc2VsZi5fcGFyZW50d2luZG93LndpZC5DYWxjVmlzKCkKLQkJZWxzZToKLQkJCSMgb2ggd2VsbCwgc2luY2UgdGhlIGxpc3QgbWFuYWdlciBkb2Vzbid0IGhhdmUgYSBMTW92ZSBjYWxsLAotCQkJIyB3ZSBoYXZlIHRvIG1ha2UgdGhlIGxpc3QgYWxsIG92ZXIgYWdhaW4uLi4KLQkJCXNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJCXRvcGNlbGwgPSBzZWxmLmdldHRvcGNlbGwoKQotCQkJc2VsZi5fbGlzdCA9IE5vbmUKLQkJCXNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKLQkJCXNlbGYuY3JlYXRlbGlzdCgpCi0JCQlzZWxmLnNldHNlbGVjdGlvbihzZWwpCi0JCQlzZWxmLnNldHRvcGNlbGwodG9wY2VsbCkKLQkJCXNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYuX2xpc3QgPSBOb25lCi0JCXNlbGYuX2NhbGxiYWNrID0gTm9uZQotCQlzZWxmLml0ZW1zID0gW10KLQkJV2Jhc2UuU2VsZWN0YWJsZVdpZGdldC5jbG9zZShzZWxmKQotCQotCWRlZiBzZXQoc2VsZiwgaXRlbXMpOgotCQlzZWxmLnNldGl0ZW1zKGl0ZW1zKQotCQotCWRlZiBzZXRpdGVtcyhzZWxmLCBpdGVtcyk6Ci0JCXNlbGYuaXRlbXMgPSBpdGVtcwotCQl0aGVfbGlzdCA9IHNlbGYuX2xpc3QKLQkJaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKLQkJCXJldHVybgotCQlzZWxmLnNldGRyYXdpbmdtb2RlKDApCi0JCXRvcGNlbGwgPSBzZWxmLmdldHRvcGNlbGwoKQotCQl0aGVfbGlzdC5MRGVsUm93KDAsIDEpCi0JCXRoZV9saXN0LkxBZGRSb3cobGVuKHNlbGYuaXRlbXMpLCAwKQotCQlzZWxmX2l0ZW1yZXByID0gc2VsZi5pdGVtcmVwcgotCQlzZXRfY2VsbCA9IHRoZV9saXN0LkxTZXRDZWxsCi0JCWZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgotCQkJc2V0X2NlbGwoc2VsZl9pdGVtcmVwcihpdGVtc1tpXSksICgwLCBpKSkKLQkJc2VsZi5zZXR0b3BjZWxsKHRvcGNlbGwpCi0JCXNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKLQkKLQlkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCWlmIG5vdCBzZWxmLl9lbmFibGVkOgotCQkJcmV0dXJuCi0JCWlzZG91YmxlY2xpY2sgPSBzZWxmLl9saXN0LkxDbGljayhwb2ludCwgbW9kaWZpZXJzKQotCQlpZiBzZWxmLl9jYWxsYmFjazoKLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgaXNkb3VibGVjbGljaykKLQkJcmV0dXJuIDEKLQkKLQlkZWYga2V5KHNlbGYsIGNoYXIsIGV2ZW50KToKLQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKLQkJc2VsID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQluZXdzZWxlY3Rpb24gPSBbXQotCQlpZiBjaGFyID09IFdrZXlzLnVwYXJyb3drZXk6Ci0JCQlpZiBsZW4oc2VsKSA+PSAxIGFuZCBtaW4oc2VsKSA+IDA6Ci0JCQkJbmV3c2VsZWN0aW9uID0gW21pbihzZWwpIC0gMV0KLQkJCWVsc2U6Ci0JCQkJbmV3c2VsZWN0aW9uID0gWzBdCi0JCWVsaWYgY2hhciA9PSBXa2V5cy5kb3duYXJyb3drZXk6Ci0JCQlpZiBsZW4oc2VsKSA+PSAxIGFuZCBtYXgoc2VsKSA8IChsZW4oc2VsZi5pdGVtcykgLSAxKToKLQkJCQkJbmV3c2VsZWN0aW9uID0gW21heChzZWwpICsgMV0KLQkJCWVsc2U6Ci0JCQkJbmV3c2VsZWN0aW9uID0gW2xlbihzZWxmLml0ZW1zKSAtIDFdCi0JCWVsc2U6Ci0JCQltb2RpZmllcnMgPSAwCi0JCQlpZiAoc2VsZi5sYXN0dGltZSArIHNlbGYudGltZWxpbWl0KSA8IEV2dC5UaWNrQ291bnQoKToKLQkJCQlzZWxmLmxhc3R0eXBpbmcgPSAiIgotCQkJaWYgc2VsZi50eXBpbmdjYXNlc2VuczoKLQkJCQlzZWxmLmxhc3R0eXBpbmcgPSBzZWxmLmxhc3R0eXBpbmcgKyBjaGFyCi0JCQllbHNlOgotCQkJCXNlbGYubGFzdHR5cGluZyA9IHNlbGYubGFzdHR5cGluZyArIHN0cmluZy5sb3dlcihjaGFyKQotCQkJc2VsZi5sYXN0dGltZSA9IEV2dC5UaWNrQ291bnQoKQotCQkJaSA9IHNlbGYuZmluZG1hdGNoKHNlbGYubGFzdHR5cGluZykKLQkJCW5ld3NlbGVjdGlvbiA9IFtpXQotCQlpZiBtb2RpZmllcnMgJiBFdmVudHMuc2hpZnRLZXkgYW5kIG5vdCBzZWxmLl9saXN0LnNlbEZsYWdzICYgTGlzdHMubE9ubHlPbmU6Ci0JCQluZXdzZWxlY3Rpb24gPSBuZXdzZWxlY3Rpb24gKyBzZWwKLQkJc2VsZi5zZXRzZWxlY3Rpb24obmV3c2VsZWN0aW9uKQotCQlzZWxmLl9saXN0LkxBdXRvU2Nyb2xsKCkKLQkJc2VsZi5jbGljaygoLTEsIC0xKSwgMCkKLQkKLQlkZWYgZmluZG1hdGNoKHNlbGYsIHRhZyk6Ci0JCWxvd2VyID0gc3RyaW5nLmxvd2VyCi0JCWl0ZW1zID0gc2VsZi5pdGVtcwotCQl0eXBpbmdjYXNlc2VucyA9IHNlbGYudHlwaW5nY2FzZXNlbnMKLQkJdGFnbGVuID0gbGVuKHRhZykKLQkJbWF0Y2ggPSAnXDM3NycgKiAxMDAKLQkJbWF0Y2hfaSA9IC0xCi0JCWZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgotCQkJaXRlbSA9IHN0cihpdGVtc1tpXSkKLQkJCWlmIG5vdCB0eXBpbmdjYXNlc2VuczoKLQkJCQlpdGVtID0gbG93ZXIoaXRlbSkKLQkJCWlmIHRhZyA8PSBpdGVtIDwgbWF0Y2g6Ci0JCQkJbWF0Y2ggPSBpdGVtCi0JCQkJbWF0Y2hfaSA9IGkKLQkJaWYgbWF0Y2hfaSA+PSAwOgotCQkJcmV0dXJuIG1hdGNoX2kKLQkJZWxzZToKLQkJCXJldHVybiBsZW4oaXRlbXMpIC0gMQotCQotCWRlZiBkb21lbnVfY29weShzZWxmLCAqYXJncyk6Ci0JCXNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJc2VsaXRlbXMgPSBbXQotCQlmb3IgaSBpbiBzZWw6Ci0JCQlzZWxpdGVtcy5hcHBlbmQoc3RyKHNlbGYuaXRlbXNbaV0pKQotCQl0ZXh0ID0gc3RyaW5nLmpvaW4oc2VsaXRlbXMsICdccicpCi0JCWlmIHRleHQ6Ci0JCQlpZiBoYXNhdHRyKFNjcmFwLCAnUHV0U2NyYXAnKToKLQkJCQlTY3JhcC5aZXJvU2NyYXAoKQotCQkJCVNjcmFwLlB1dFNjcmFwKCdURVhUJywgdGV4dCkKLQkJCWVsc2U6Ci0JCQkJU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQotCQkJCXNjID0gU2NyYXAuR2V0Q3VycmVudFNjcmFwKCkKLQkJCQlzYy5QdXRTY3JhcEZsYXZvcignVEVYVCcsIDAsIHRleHQpCi0JCi0JZGVmIGNhbl9jb3B5KHNlbGYsICphcmdzKToKLQkJcmV0dXJuIGxlbihzZWxmLmdldHNlbGVjdGlvbigpKSA8PiAwCi0JCi0JZGVmIGRvbWVudV9zZWxlY3RhbGwoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLnNlbGVjdGFsbCgpCi0JCi0JZGVmIGNhbl9zZWxlY3RhbGwoc2VsZiwgKmFyZ3MpOgotCQlyZXR1cm4gbm90IHNlbGYuX2xpc3Quc2VsRmxhZ3MgJiBMaXN0cy5sT25seU9uZQotCQotCWRlZiBzZWxlY3RhbGwoc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9saXN0LnNlbEZsYWdzICYgTGlzdHMubE9ubHlPbmU6Ci0JCQlzZWxmLnNldHNlbGVjdGlvbihyYW5nZShsZW4oc2VsZi5pdGVtcykpKQotCQkJc2VsZi5fbGlzdC5MQXV0b1Njcm9sbCgpCi0JCQlzZWxmLmNsaWNrKCgtMSwgLTEpLCAwKQotCQotCWRlZiBnZXRzZWxlY3Rpb24oc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9wYXJlbnQgb3Igbm90IHNlbGYuX2xpc3Q6Ci0JCQlpZiBoYXNhdHRyKHNlbGYsICJfc2VsIik6Ci0JCQkJcmV0dXJuIHNlbGYuX3NlbAotCQkJcmV0dXJuIFtdCi0JCWl0ZW1zID0gW10KLQkJcG9pbnQgPSAoMCwwKQotCQl3aGlsZSAxOgotCQkJb2ssIHBvaW50ID0gc2VsZi5fbGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQotCQkJaWYgbm90IG9rOgotCQkJCWJyZWFrCi0JCQlpdGVtcy5hcHBlbmQocG9pbnRbMV0pCi0JCQlwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCi0JCXJldHVybiBpdGVtcwotCQotCWRlZiBzZXRzZWxlY3Rpb24oc2VsZiwgc2VsZWN0aW9uKToKLQkJaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKLQkJCXNlbGYuX3NlbCA9IHNlbGVjdGlvbgotCQkJcmV0dXJuCi0JCXNldF9zZWwgPSBzZWxmLl9saXN0LkxTZXRTZWxlY3QKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuaXRlbXMpKToKLQkJCWlmIGkgaW4gc2VsZWN0aW9uOgotCQkJCXNldF9zZWwoMSwgKDAsIGkpKQotCQkJZWxzZToKLQkJCQlzZXRfc2VsKDAsICgwLCBpKSkKLQkJc2VsZi5fbGlzdC5MQXV0b1Njcm9sbCgpCi0JCi0JZGVmIGdldHNlbGVjdGVkb2JqZWN0cyhzZWxmKToKLQkJc2VsID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQlvYmplY3RzID0gW10KLQkJZm9yIGkgaW4gc2VsOgotCQkJb2JqZWN0cy5hcHBlbmQoc2VsZi5pdGVtc1tpXSkKLQkJcmV0dXJuIG9iamVjdHMKLQkKLQlkZWYgc2V0c2VsZWN0ZWRvYmplY3RzKHNlbGYsIG9iamVjdHMpOgotCQlzZWwgPSBbXQotCQlmb3IgbyBpbiBvYmplY3RzOgotCQkJdHJ5OgotCQkJCXNlbC5hcHBlbmQoc2VsZi5pdGVtcy5pbmRleChvKSkKLQkJCWV4Y2VwdDoKLQkJCQlwYXNzCi0JCXNlbGYuc2V0c2VsZWN0aW9uKHNlbCkKLQkKLQlkZWYgZ2V0dG9wY2VsbChzZWxmKToKLQkJbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcwotCQl0ID0gdCArIDEKLQkJY2wsIGN0LCBjciwgY2IgPSBzZWxmLl9saXN0LkxSZWN0KCgwLCAwKSkKLQkJY2VsbGhlaWdodCA9IGNiIC0gY3QKLQkJcmV0dXJuICh0IC0gY3QpIC8gY2VsbGhlaWdodAotCQotCWRlZiBzZXR0b3BjZWxsKHNlbGYsIHRvcGNlbGwpOgotCQl0b3AgPSBzZWxmLmdldHRvcGNlbGwoKQotCQlkaWZmID0gdG9wY2VsbCAtIHRvcAotCQlzZWxmLl9saXN0LkxTY3JvbGwoMCwgZGlmZikKLQkKLQlkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCWlmIG5vdCB2aXNSZ246Ci0JCQkJdmlzUmduID0gc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduCi0JCQlzZWxmLl9saXN0LkxVcGRhdGUodmlzUmduKQotCQkJc3RhdGUgPSBba1RoZW1lU3RhdGVBY3RpdmUsIGtUaGVtZVN0YXRlSW5hY3RpdmVdW25vdCBzZWxmLl9hY3RpdmF0ZWRdCi0JCQlBcHAuRHJhd1RoZW1lTGlzdEJveEZyYW1lKFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpLCBzdGF0ZSkKLQkJCWlmIHNlbGYuX3NlbGVjdGVkIGFuZCBzZWxmLl9hY3RpdmF0ZWQ6Ci0JCQkJc2VsZi5kcmF3c2VsZnJhbWUoMSkKLQkKLQlkZWYgc2VsZWN0KHNlbGYsIG9ub2ZmLCBpc2NsaWNrID0gMCk6Ci0JCWlmIFdiYXNlLlNlbGVjdGFibGVXaWRnZXQuc2VsZWN0KHNlbGYsIG9ub2ZmKToKLQkJCXJldHVybgotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLmRyYXdzZWxmcmFtZShvbm9mZikKLQkKLQlkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgotCQlzZWxmLl9hY3RpdmF0ZWQgPSBvbm9mZgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJc2VsZi5fbGlzdC5MQWN0aXZhdGUob25vZmYpCi0JCQkjc3RhdGUgPSBba1RoZW1lU3RhdGVBY3RpdmUsIGtUaGVtZVN0YXRlSW5hY3RpdmVdW25vdCBvbm9mZl0KLQkJCSNBcHAuRHJhd1RoZW1lTGlzdEJveEZyYW1lKFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpLCBzdGF0ZSkKLQkJCWlmIHNlbGYuX3NlbGVjdGVkOgotCQkJCXNlbGYuZHJhd3NlbGZyYW1lKG9ub2ZmKQotCQotCWRlZiBnZXQoc2VsZik6Ci0JCXJldHVybiBzZWxmLml0ZW1zCi0JCi0JZGVmIGl0ZW1yZXByKHNlbGYsIGl0ZW0pOgotCQlyZXR1cm4gc3RyKGl0ZW0pWzoyNTVdCi0JCi0JZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKLQkJcmV0dXJuIHNlbGYuaXRlbXNbaW5kZXhdCi0JCi0JZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCBpdGVtKToKLQkJaWYgc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9saXN0OgotCQkJc2VsZi5fbGlzdC5MU2V0Q2VsbChzZWxmLml0ZW1yZXByKGl0ZW0pLCAoMCwgaW5kZXgpKQotCQlzZWxmLml0ZW1zW2luZGV4XSA9IGl0ZW0KLQkKLQlkZWYgX19kZWxpdGVtX18oc2VsZiwgaW5kZXgpOgotCQlpZiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX2xpc3Q6Ci0JCQlzZWxmLl9saXN0LkxEZWxSb3coMSwgaW5kZXgpCi0JCWRlbCBzZWxmLml0ZW1zW2luZGV4XQotCQotCWRlZiBfX2dldHNsaWNlX18oc2VsZiwgYSwgYik6Ci0JCXJldHVybiBzZWxmLml0ZW1zW2E6Yl0KLQkKLQlkZWYgX19kZWxzbGljZV9fKHNlbGYsIGEsIGIpOgotCQlpZiBiLWE6Ci0JCQlpZiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX2xpc3Q6Ci0JCQkJc2VsZi5fbGlzdC5MRGVsUm93KGItYSwgYSkKLQkJCWRlbCBzZWxmLml0ZW1zW2E6Yl0KLQkKLQlkZWYgX19zZXRzbGljZV9fKHNlbGYsIGEsIGIsIGl0ZW1zKToKLQkJaWYgc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9saXN0OgotCQkJbCA9IGxlbihpdGVtcykKLQkJCXRoZV9saXN0ID0gc2VsZi5fbGlzdAotCQkJc2VsZi5zZXRkcmF3aW5nbW9kZSgwKQotCQkJaWYgYi1hOgotCQkJCWlmIGIgPiBsZW4oc2VsZi5pdGVtcyk6Ci0JCQkJCSMgZml4IGZvciBuZXcgMS41ICJmZWF0dXJlIiB3aGVyZSBiIGlzIHN5cy5tYXhpbnQgaW5zdGVhZCBvZiBsZW4oc2VsZikuLi4KLQkJCQkJIyBMRGVsUm93IGRvZXNuJ3QgbGlrZSBtYXhpbnQuCi0JCQkJCWIgPSBsZW4oc2VsZi5pdGVtcykKLQkJCQl0aGVfbGlzdC5MRGVsUm93KGItYSwgYSkKLQkJCXRoZV9saXN0LkxBZGRSb3cobCwgYSkKLQkJCXNlbGZfaXRlbXJlcHIgPSBzZWxmLml0ZW1yZXByCi0JCQlzZXRfY2VsbCA9IHRoZV9saXN0LkxTZXRDZWxsCi0JCQlmb3IgaSBpbiByYW5nZShsZW4oaXRlbXMpKToKLQkJCQlzZXRfY2VsbChzZWxmX2l0ZW1yZXByKGl0ZW1zW2ldKSwgKDAsIGkgKyBhKSkKLQkJCXNlbGYuaXRlbXNbYTpiXSA9IGl0ZW1zCi0JCQlzZWxmLnNldGRyYXdpbmdtb2RlKDEpCi0JCWVsc2U6Ci0JCQlzZWxmLml0ZW1zW2E6Yl0gPSBpdGVtcwotCQotCWRlZiBfX2xlbl9fKHNlbGYpOgotCQlyZXR1cm4gbGVuKHNlbGYuaXRlbXMpCi0JCi0JZGVmIGFwcGVuZChzZWxmLCBpdGVtKToKLQkJaWYgc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9saXN0OgotCQkJaW5kZXggPSBsZW4oc2VsZi5pdGVtcykKLQkJCXNlbGYuX2xpc3QuTEFkZFJvdygxLCBpbmRleCkKLQkJCXNlbGYuX2xpc3QuTFNldENlbGwoc2VsZi5pdGVtcmVwcihpdGVtKSwgKDAsIGluZGV4KSkKLQkJc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSkKLQkKLQlkZWYgcmVtb3ZlKHNlbGYsIGl0ZW0pOgotCQlpbmRleCA9IHNlbGYuaXRlbXMuaW5kZXgoaXRlbSkKLQkJc2VsZi5fX2RlbGl0ZW1fXyhpbmRleCkKLQkKLQlkZWYgaW5kZXgoc2VsZiwgaXRlbSk6Ci0JCXJldHVybiBzZWxmLml0ZW1zLmluZGV4KGl0ZW0pCi0JCi0JZGVmIGluc2VydChzZWxmLCBpbmRleCwgaXRlbSk6Ci0JCWlmIGluZGV4IDwgMDoKLQkJCWluZGV4ID0gMAotCQlpZiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX2xpc3Q6Ci0JCQlzZWxmLl9saXN0LkxBZGRSb3coMSwgaW5kZXgpCi0JCQlzZWxmLl9saXN0LkxTZXRDZWxsKHNlbGYuaXRlbXJlcHIoaXRlbSksICgwLCBpbmRleCkpCi0JCXNlbGYuaXRlbXMuaW5zZXJ0KGluZGV4LCBpdGVtKQotCQotCWRlZiBzZXRkcmF3aW5nbW9kZShzZWxmLCBvbm9mZik6Ci0JCWlmIG9ub2ZmOgotCQkJc2VsZi5kcmF3aW5nbW9kZSA9IHNlbGYuZHJhd2luZ21vZGUgLSAxCi0JCQlpZiBzZWxmLmRyYXdpbmdtb2RlID09IDAgYW5kIHNlbGYuX2xpc3QgaXMgbm90IE5vbmU6Ci0JCQkJc2VsZi5fbGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKLQkJCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJCQlib3VuZHMgPSBsLCB0LCByLCBiID0gUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSkKLQkJCQkJY2wsIGN0LCBjciwgY2IgPSBzZWxmLl9saXN0LkxSZWN0KCgwLCBsZW4oc2VsZi5pdGVtcyktMSkpCi0JCQkJCWlmIGNiIDwgYjoKLQkJCQkJCXNlbGYuU2V0UG9ydCgpCi0JCQkJCQlRZC5FcmFzZVJlY3QoKGwsIGNiLCBjciwgYikpCi0JCQkJCXNlbGYuX2xpc3QuTFVwZGF0ZShzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCi0JCQkJCXNlbGYuR2V0V2luZG93KCkuVmFsaWRXaW5kb3dSZWN0KGJvdW5kcykKLQkJZWxzZToKLQkJCWlmIHNlbGYuZHJhd2luZ21vZGUgPT0gMCBhbmQgc2VsZi5fbGlzdCBpcyBub3QgTm9uZToKLQkJCQlzZWxmLl9saXN0LkxTZXREcmF3aW5nTW9kZSgwKQotCQkJc2VsZi5kcmF3aW5nbW9kZSA9IHNlbGYuZHJhd2luZ21vZGUgKyAxCisgICAgIiIiU3RhbmRhcmQgbGlzdCB3aWRnZXQuIiIiCisKKyAgICBMREVGX0lEID0gMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIGl0ZW1zID0gTm9uZSwgY2FsbGJhY2sgPSBOb25lLCBmbGFncyA9IDAsIGNvbHMgPSAxLCB0eXBpbmdjYXNlc2Vucz0wKToKKyAgICAgICAgaWYgaXRlbXMgaXMgTm9uZToKKyAgICAgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgc2VsZi5pdGVtcyA9IGl0ZW1zCisgICAgICAgIFdiYXNlLlNlbGVjdGFibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKKyAgICAgICAgc2VsZi5fc2VsZWN0ZWQgPSAwCisgICAgICAgIHNlbGYuX2VuYWJsZWQgPSAxCisgICAgICAgIHNlbGYuX2xpc3QgPSBOb25lCisgICAgICAgIHNlbGYuX2NvbHMgPSBjb2xzCisgICAgICAgIHNlbGYuX2NhbGxiYWNrID0gY2FsbGJhY2sKKyAgICAgICAgc2VsZi5fZmxhZ3MgPSBmbGFncworICAgICAgICBzZWxmLnR5cGluZ2Nhc2VzZW5zID0gdHlwaW5nY2FzZXNlbnMKKyAgICAgICAgc2VsZi5sYXN0dHlwaW5nID0gIiIKKyAgICAgICAgc2VsZi5sYXN0dGltZSA9IEV2dC5UaWNrQ291bnQoKQorICAgICAgICBzZWxmLnRpbWVsaW1pdCA9IDMwCisgICAgICAgIHNlbGYuc2V0aXRlbXMoaXRlbXMpCisgICAgICAgIHNlbGYuZHJhd2luZ21vZGUgPSAwCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5zZXRkcmF3aW5nbW9kZSgwKQorICAgICAgICBzZWxmLmNyZWF0ZWxpc3QoKQorICAgICAgICBzZWxmLnNldGRyYXdpbmdtb2RlKDEpCisKKyAgICBkZWYgY3JlYXRlbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHJlY3QgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgcmVjdCA9IHJlY3RbMF0rMSwgcmVjdFsxXSsxLCByZWN0WzJdLTE2LCByZWN0WzNdLTEKKyAgICAgICAgc2VsZi5fdmlld2JvdW5kcyA9IHJlY3QKKyAgICAgICAgc2VsZi5fbGlzdCA9IExOZXcocmVjdCwgKDAsIDAsIHNlbGYuX2NvbHMsIDApLCAoMCwgMCksIHNlbGYuTERFRl9JRCwgc2VsZi5fcGFyZW50d2luZG93LndpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMCwgMSkKKyAgICAgICAgaWYgc2VsZi5kcmF3aW5nbW9kZToKKyAgICAgICAgICAgIHNlbGYuX2xpc3QuTFNldERyYXdpbmdNb2RlKDApCisgICAgICAgIHNlbGYuX2xpc3Quc2VsRmxhZ3MgPSBzZWxmLl9mbGFncworICAgICAgICBzZWxmLnNldGl0ZW1zKHNlbGYuaXRlbXMpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgIl9zZWwiKToKKyAgICAgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uKHNlbGYuX3NlbCkKKyAgICAgICAgICAgIGRlbCBzZWxmLl9zZWwKKworICAgIGRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgIyBBcHBlYXJhbmNlIGZyYW1lcyBhcmUgZHJhd24gb3V0c2lkZSB0aGUgc3BlY2lmaWVkIGJvdW5kcywKKyAgICAgICAgIyBzbyB3ZSBhbHdheXMgbmVlZCB0byBvdXRzZXQgdGhlIGludmFsaWRhdGVkIGFyZWEuCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChvbGRib3VuZHMsIC0zLCAtMykpCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIC0zLCAtMykpCisKKyAgICAgICAgaWYgb2xkYm91bmRzWzoyXSA9PSBzZWxmLl9ib3VuZHNbOjJdOgorICAgICAgICAgICAgIyBzZXQgdmlzUmduIHRvIGVtcHR5LCB0byBwcmV2ZW50IG5hc3R5IGRyYXdpbmcgc2lkZSBlZmZlY3Qgb2YgTFNpemUoKQorICAgICAgICAgICAgUWQuUmVjdFJnbihzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24sICgwLCAwLCAwLCAwKSkKKyAgICAgICAgICAgICMgbGlzdCBzdGlsbCBoYXMgdGhlIHNhbWUgdXBwZXIvbGVmdCBjb29yZGluYXRlcywgdXNlIExTaXplCisgICAgICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgICAgICB3aWR0aCA9IHIgLSBsIC0gMTcKKyAgICAgICAgICAgIGhlaWdodCA9IGIgLSB0IC0gMgorICAgICAgICAgICAgdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLl92aWV3Ym91bmRzCisgICAgICAgICAgICBzZWxmLl92aWV3Ym91bmRzID0gdmwsIHZ0LCB2bCArIHdpZHRoLCB2dCArIGhlaWdodAorICAgICAgICAgICAgc2VsZi5fbGlzdC5MU2l6ZSh3aWR0aCwgaGVpZ2h0KQorICAgICAgICAgICAgIyBub3cgKndoeSogZG9lc24ndCB0aGUgbGlzdCBtYW5hZ2VyIHJlY2FsYyB0aGUgY2VsbHJlY3Q/Pz8KKyAgICAgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9saXN0LkxSZWN0KCgwLDApKQorICAgICAgICAgICAgY2VsbGhlaWdodCA9IGIgLSB0CisgICAgICAgICAgICBzZWxmLl9saXN0LkxDZWxsU2l6ZSgod2lkdGgvc2VsZi5fY29scywgY2VsbGhlaWdodCkpCisgICAgICAgICAgICAjIHJlc2V0IHZpc1JnbgorICAgICAgICAgICAgc2VsZi5fcGFyZW50d2luZG93LndpZC5DYWxjVmlzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgb2ggd2VsbCwgc2luY2UgdGhlIGxpc3QgbWFuYWdlciBkb2Vzbid0IGhhdmUgYSBMTW92ZSBjYWxsLAorICAgICAgICAgICAgIyB3ZSBoYXZlIHRvIG1ha2UgdGhlIGxpc3QgYWxsIG92ZXIgYWdhaW4uLi4KKyAgICAgICAgICAgIHNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgICAgIHRvcGNlbGwgPSBzZWxmLmdldHRvcGNlbGwoKQorICAgICAgICAgICAgc2VsZi5fbGlzdCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlbGlzdCgpCisgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihzZWwpCisgICAgICAgICAgICBzZWxmLnNldHRvcGNlbGwodG9wY2VsbCkKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fbGlzdCA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBOb25lCisgICAgICAgIHNlbGYuaXRlbXMgPSBbXQorICAgICAgICBXYmFzZS5TZWxlY3RhYmxlV2lkZ2V0LmNsb3NlKHNlbGYpCisKKyAgICBkZWYgc2V0KHNlbGYsIGl0ZW1zKToKKyAgICAgICAgc2VsZi5zZXRpdGVtcyhpdGVtcykKKworICAgIGRlZiBzZXRpdGVtcyhzZWxmLCBpdGVtcyk6CisgICAgICAgIHNlbGYuaXRlbXMgPSBpdGVtcworICAgICAgICB0aGVfbGlzdCA9IHNlbGYuX2xpc3QKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnNldGRyYXdpbmdtb2RlKDApCisgICAgICAgIHRvcGNlbGwgPSBzZWxmLmdldHRvcGNlbGwoKQorICAgICAgICB0aGVfbGlzdC5MRGVsUm93KDAsIDEpCisgICAgICAgIHRoZV9saXN0LkxBZGRSb3cobGVuKHNlbGYuaXRlbXMpLCAwKQorICAgICAgICBzZWxmX2l0ZW1yZXByID0gc2VsZi5pdGVtcmVwcgorICAgICAgICBzZXRfY2VsbCA9IHRoZV9saXN0LkxTZXRDZWxsCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgorICAgICAgICAgICAgc2V0X2NlbGwoc2VsZl9pdGVtcmVwcihpdGVtc1tpXSksICgwLCBpKSkKKyAgICAgICAgc2VsZi5zZXR0b3BjZWxsKHRvcGNlbGwpCisgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKKworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2VuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaXNkb3VibGVjbGljayA9IHNlbGYuX2xpc3QuTENsaWNrKHBvaW50LCBtb2RpZmllcnMpCisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCBpc2RvdWJsZWNsaWNrKQorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGtleShzZWxmLCBjaGFyLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIHNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgbmV3c2VsZWN0aW9uID0gW10KKyAgICAgICAgaWYgY2hhciA9PSBXa2V5cy51cGFycm93a2V5OgorICAgICAgICAgICAgaWYgbGVuKHNlbCkgPj0gMSBhbmQgbWluKHNlbCkgPiAwOgorICAgICAgICAgICAgICAgIG5ld3NlbGVjdGlvbiA9IFttaW4oc2VsKSAtIDFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld3NlbGVjdGlvbiA9IFswXQorICAgICAgICBlbGlmIGNoYXIgPT0gV2tleXMuZG93bmFycm93a2V5OgorICAgICAgICAgICAgaWYgbGVuKHNlbCkgPj0gMSBhbmQgbWF4KHNlbCkgPCAobGVuKHNlbGYuaXRlbXMpIC0gMSk6CisgICAgICAgICAgICAgICAgbmV3c2VsZWN0aW9uID0gW21heChzZWwpICsgMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3c2VsZWN0aW9uID0gW2xlbihzZWxmLml0ZW1zKSAtIDFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RpZmllcnMgPSAwCisgICAgICAgICAgICBpZiAoc2VsZi5sYXN0dGltZSArIHNlbGYudGltZWxpbWl0KSA8IEV2dC5UaWNrQ291bnQoKToKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3R0eXBpbmcgPSAiIgorICAgICAgICAgICAgaWYgc2VsZi50eXBpbmdjYXNlc2VuczoKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3R0eXBpbmcgPSBzZWxmLmxhc3R0eXBpbmcgKyBjaGFyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubGFzdHR5cGluZyA9IHNlbGYubGFzdHR5cGluZyArIHN0cmluZy5sb3dlcihjaGFyKQorICAgICAgICAgICAgc2VsZi5sYXN0dGltZSA9IEV2dC5UaWNrQ291bnQoKQorICAgICAgICAgICAgaSA9IHNlbGYuZmluZG1hdGNoKHNlbGYubGFzdHR5cGluZykKKyAgICAgICAgICAgIG5ld3NlbGVjdGlvbiA9IFtpXQorICAgICAgICBpZiBtb2RpZmllcnMgJiBFdmVudHMuc2hpZnRLZXkgYW5kIG5vdCBzZWxmLl9saXN0LnNlbEZsYWdzICYgTGlzdHMubE9ubHlPbmU6CisgICAgICAgICAgICBuZXdzZWxlY3Rpb24gPSBuZXdzZWxlY3Rpb24gKyBzZWwKKyAgICAgICAgc2VsZi5zZXRzZWxlY3Rpb24obmV3c2VsZWN0aW9uKQorICAgICAgICBzZWxmLl9saXN0LkxBdXRvU2Nyb2xsKCkKKyAgICAgICAgc2VsZi5jbGljaygoLTEsIC0xKSwgMCkKKworICAgIGRlZiBmaW5kbWF0Y2goc2VsZiwgdGFnKToKKyAgICAgICAgbG93ZXIgPSBzdHJpbmcubG93ZXIKKyAgICAgICAgaXRlbXMgPSBzZWxmLml0ZW1zCisgICAgICAgIHR5cGluZ2Nhc2VzZW5zID0gc2VsZi50eXBpbmdjYXNlc2VucworICAgICAgICB0YWdsZW4gPSBsZW4odGFnKQorICAgICAgICBtYXRjaCA9ICdcMzc3JyAqIDEwMAorICAgICAgICBtYXRjaF9pID0gLTEKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGl0ZW1zKSk6CisgICAgICAgICAgICBpdGVtID0gc3RyKGl0ZW1zW2ldKQorICAgICAgICAgICAgaWYgbm90IHR5cGluZ2Nhc2VzZW5zOgorICAgICAgICAgICAgICAgIGl0ZW0gPSBsb3dlcihpdGVtKQorICAgICAgICAgICAgaWYgdGFnIDw9IGl0ZW0gPCBtYXRjaDoKKyAgICAgICAgICAgICAgICBtYXRjaCA9IGl0ZW0KKyAgICAgICAgICAgICAgICBtYXRjaF9pID0gaQorICAgICAgICBpZiBtYXRjaF9pID49IDA6CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hfaQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGxlbihpdGVtcykgLSAxCisKKyAgICBkZWYgZG9tZW51X2NvcHkoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWwgPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIHNlbGl0ZW1zID0gW10KKyAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgc2VsaXRlbXMuYXBwZW5kKHN0cihzZWxmLml0ZW1zW2ldKSkKKyAgICAgICAgdGV4dCA9IHN0cmluZy5qb2luKHNlbGl0ZW1zLCAnXHInKQorICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ1B1dFNjcmFwJyk6CisgICAgICAgICAgICAgICAgU2NyYXAuWmVyb1NjcmFwKCkKKyAgICAgICAgICAgICAgICBTY3JhcC5QdXRTY3JhcCgnVEVYVCcsIHRleHQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKKyAgICAgICAgICAgICAgICBzYyA9IFNjcmFwLkdldEN1cnJlbnRTY3JhcCgpCisgICAgICAgICAgICAgICAgc2MuUHV0U2NyYXBGbGF2b3IoJ1RFWFQnLCAwLCB0ZXh0KQorCisgICAgZGVmIGNhbl9jb3B5KHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmdldHNlbGVjdGlvbigpKSA8PiAwCisKKyAgICBkZWYgZG9tZW51X3NlbGVjdGFsbChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuc2VsZWN0YWxsKCkKKworICAgIGRlZiBjYW5fc2VsZWN0YWxsKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9saXN0LnNlbEZsYWdzICYgTGlzdHMubE9ubHlPbmUKKworICAgIGRlZiBzZWxlY3RhbGwoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9saXN0LnNlbEZsYWdzICYgTGlzdHMubE9ubHlPbmU6CisgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihyYW5nZShsZW4oc2VsZi5pdGVtcykpKQorICAgICAgICAgICAgc2VsZi5fbGlzdC5MQXV0b1Njcm9sbCgpCisgICAgICAgICAgICBzZWxmLmNsaWNrKCgtMSwgLTEpLCAwKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgIl9zZWwiKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fc2VsCisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBwb2ludCA9ICgwLDApCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBvaywgcG9pbnQgPSBzZWxmLl9saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCisgICAgICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChwb2ludFsxXSkKKyAgICAgICAgICAgIHBvaW50ID0gcG9pbnRbMF0sIHBvaW50WzFdKzEKKyAgICAgICAgcmV0dXJuIGl0ZW1zCisKKyAgICBkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIHNlbGVjdGlvbik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9wYXJlbnQgb3Igbm90IHNlbGYuX2xpc3Q6CisgICAgICAgICAgICBzZWxmLl9zZWwgPSBzZWxlY3Rpb24KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXRfc2VsID0gc2VsZi5fbGlzdC5MU2V0U2VsZWN0CisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLml0ZW1zKSk6CisgICAgICAgICAgICBpZiBpIGluIHNlbGVjdGlvbjoKKyAgICAgICAgICAgICAgICBzZXRfc2VsKDEsICgwLCBpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2V0X3NlbCgwLCAoMCwgaSkpCisgICAgICAgIHNlbGYuX2xpc3QuTEF1dG9TY3JvbGwoKQorCisgICAgZGVmIGdldHNlbGVjdGVkb2JqZWN0cyhzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICBvYmplY3RzID0gW10KKyAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgb2JqZWN0cy5hcHBlbmQoc2VsZi5pdGVtc1tpXSkKKyAgICAgICAgcmV0dXJuIG9iamVjdHMKKworICAgIGRlZiBzZXRzZWxlY3RlZG9iamVjdHMoc2VsZiwgb2JqZWN0cyk6CisgICAgICAgIHNlbCA9IFtdCisgICAgICAgIGZvciBvIGluIG9iamVjdHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsLmFwcGVuZChzZWxmLml0ZW1zLmluZGV4KG8pKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5zZXRzZWxlY3Rpb24oc2VsKQorCisgICAgZGVmIGdldHRvcGNlbGwoc2VsZik6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgdCA9IHQgKyAxCisgICAgICAgIGNsLCBjdCwgY3IsIGNiID0gc2VsZi5fbGlzdC5MUmVjdCgoMCwgMCkpCisgICAgICAgIGNlbGxoZWlnaHQgPSBjYiAtIGN0CisgICAgICAgIHJldHVybiAodCAtIGN0KSAvIGNlbGxoZWlnaHQKKworICAgIGRlZiBzZXR0b3BjZWxsKHNlbGYsIHRvcGNlbGwpOgorICAgICAgICB0b3AgPSBzZWxmLmdldHRvcGNlbGwoKQorICAgICAgICBkaWZmID0gdG9wY2VsbCAtIHRvcAorICAgICAgICBzZWxmLl9saXN0LkxTY3JvbGwoMCwgZGlmZikKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgaWYgbm90IHZpc1JnbjoKKyAgICAgICAgICAgICAgICB2aXNSZ24gPSBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KKyAgICAgICAgICAgIHNlbGYuX2xpc3QuTFVwZGF0ZSh2aXNSZ24pCisgICAgICAgICAgICBzdGF0ZSA9IFtrVGhlbWVTdGF0ZUFjdGl2ZSwga1RoZW1lU3RhdGVJbmFjdGl2ZV1bbm90IHNlbGYuX2FjdGl2YXRlZF0KKyAgICAgICAgICAgIEFwcC5EcmF3VGhlbWVMaXN0Qm94RnJhbWUoUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSksIHN0YXRlKQorICAgICAgICAgICAgaWYgc2VsZi5fc2VsZWN0ZWQgYW5kIHNlbGYuX2FjdGl2YXRlZDoKKyAgICAgICAgICAgICAgICBzZWxmLmRyYXdzZWxmcmFtZSgxKQorCisgICAgZGVmIHNlbGVjdChzZWxmLCBvbm9mZiwgaXNjbGljayA9IDApOgorICAgICAgICBpZiBXYmFzZS5TZWxlY3RhYmxlV2lkZ2V0LnNlbGVjdChzZWxmLCBvbm9mZik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgc2VsZi5kcmF3c2VsZnJhbWUob25vZmYpCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBzZWxmLl9hY3RpdmF0ZWQgPSBvbm9mZgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgc2VsZi5fbGlzdC5MQWN0aXZhdGUob25vZmYpCisgICAgICAgICAgICAjc3RhdGUgPSBba1RoZW1lU3RhdGVBY3RpdmUsIGtUaGVtZVN0YXRlSW5hY3RpdmVdW25vdCBvbm9mZl0KKyAgICAgICAgICAgICNBcHAuRHJhd1RoZW1lTGlzdEJveEZyYW1lKFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpLCBzdGF0ZSkKKyAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdGVkOgorICAgICAgICAgICAgICAgIHNlbGYuZHJhd3NlbGZyYW1lKG9ub2ZmKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMKKworICAgIGRlZiBpdGVtcmVwcihzZWxmLCBpdGVtKToKKyAgICAgICAgcmV0dXJuIHN0cihpdGVtKVs6MjU1XQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXNbaW5kZXhdCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaW5kZXgsIGl0ZW0pOgorICAgICAgICBpZiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX2xpc3Q6CisgICAgICAgICAgICBzZWxmLl9saXN0LkxTZXRDZWxsKHNlbGYuaXRlbXJlcHIoaXRlbSksICgwLCBpbmRleCkpCisgICAgICAgIHNlbGYuaXRlbXNbaW5kZXhdID0gaXRlbQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9saXN0OgorICAgICAgICAgICAgc2VsZi5fbGlzdC5MRGVsUm93KDEsIGluZGV4KQorICAgICAgICBkZWwgc2VsZi5pdGVtc1tpbmRleF0KKworICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgYSwgYik6CisgICAgICAgIHJldHVybiBzZWxmLml0ZW1zW2E6Yl0KKworICAgIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgYSwgYik6CisgICAgICAgIGlmIGItYToKKyAgICAgICAgICAgIGlmIHNlbGYuX3BhcmVudCBhbmQgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLl9saXN0LkxEZWxSb3coYi1hLCBhKQorICAgICAgICAgICAgZGVsIHNlbGYuaXRlbXNbYTpiXQorCisgICAgZGVmIF9fc2V0c2xpY2VfXyhzZWxmLCBhLCBiLCBpdGVtcyk6CisgICAgICAgIGlmIHNlbGYuX3BhcmVudCBhbmQgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgIGwgPSBsZW4oaXRlbXMpCisgICAgICAgICAgICB0aGVfbGlzdCA9IHNlbGYuX2xpc3QKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKKyAgICAgICAgICAgIGlmIGItYToKKyAgICAgICAgICAgICAgICBpZiBiID4gbGVuKHNlbGYuaXRlbXMpOgorICAgICAgICAgICAgICAgICMgZml4IGZvciBuZXcgMS41ICJmZWF0dXJlIiB3aGVyZSBiIGlzIHN5cy5tYXhpbnQgaW5zdGVhZCBvZiBsZW4oc2VsZikuLi4KKyAgICAgICAgICAgICAgICAjIExEZWxSb3cgZG9lc24ndCBsaWtlIG1heGludC4KKyAgICAgICAgICAgICAgICAgICAgYiA9IGxlbihzZWxmLml0ZW1zKQorICAgICAgICAgICAgICAgIHRoZV9saXN0LkxEZWxSb3coYi1hLCBhKQorICAgICAgICAgICAgdGhlX2xpc3QuTEFkZFJvdyhsLCBhKQorICAgICAgICAgICAgc2VsZl9pdGVtcmVwciA9IHNlbGYuaXRlbXJlcHIKKyAgICAgICAgICAgIHNldF9jZWxsID0gdGhlX2xpc3QuTFNldENlbGwKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgorICAgICAgICAgICAgICAgIHNldF9jZWxsKHNlbGZfaXRlbXJlcHIoaXRlbXNbaV0pLCAoMCwgaSArIGEpKQorICAgICAgICAgICAgc2VsZi5pdGVtc1thOmJdID0gaXRlbXMKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaXRlbXNbYTpiXSA9IGl0ZW1zCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKQorCisgICAgZGVmIGFwcGVuZChzZWxmLCBpdGVtKToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9saXN0OgorICAgICAgICAgICAgaW5kZXggPSBsZW4oc2VsZi5pdGVtcykKKyAgICAgICAgICAgIHNlbGYuX2xpc3QuTEFkZFJvdygxLCBpbmRleCkKKyAgICAgICAgICAgIHNlbGYuX2xpc3QuTFNldENlbGwoc2VsZi5pdGVtcmVwcihpdGVtKSwgKDAsIGluZGV4KSkKKyAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSkKKworICAgIGRlZiByZW1vdmUoc2VsZiwgaXRlbSk6CisgICAgICAgIGluZGV4ID0gc2VsZi5pdGVtcy5pbmRleChpdGVtKQorICAgICAgICBzZWxmLl9fZGVsaXRlbV9fKGluZGV4KQorCisgICAgZGVmIGluZGV4KHNlbGYsIGl0ZW0pOgorICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5pbmRleChpdGVtKQorCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgaXRlbSk6CisgICAgICAgIGlmIGluZGV4IDwgMDoKKyAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICBpZiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX2xpc3Q6CisgICAgICAgICAgICBzZWxmLl9saXN0LkxBZGRSb3coMSwgaW5kZXgpCisgICAgICAgICAgICBzZWxmLl9saXN0LkxTZXRDZWxsKHNlbGYuaXRlbXJlcHIoaXRlbSksICgwLCBpbmRleCkpCisgICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KGluZGV4LCBpdGVtKQorCisgICAgZGVmIHNldGRyYXdpbmdtb2RlKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBzZWxmLmRyYXdpbmdtb2RlID0gc2VsZi5kcmF3aW5nbW9kZSAtIDEKKyAgICAgICAgICAgIGlmIHNlbGYuZHJhd2luZ21vZGUgPT0gMCBhbmQgc2VsZi5fbGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLl9saXN0LkxTZXREcmF3aW5nTW9kZSgxKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICAgICAgICAgIGJvdW5kcyA9IGwsIHQsIHIsIGIgPSBRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICBjbCwgY3QsIGNyLCBjYiA9IHNlbGYuX2xpc3QuTFJlY3QoKDAsIGxlbihzZWxmLml0ZW1zKS0xKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgY2IgPCBiOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFFkLkVyYXNlUmVjdCgobCwgY2IsIGNyLCBiKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGlzdC5MVXBkYXRlKHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5WYWxpZFdpbmRvd1JlY3QoYm91bmRzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5kcmF3aW5nbW9kZSA9PSAwIGFuZCBzZWxmLl9saXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX2xpc3QuTFNldERyYXdpbmdNb2RlKDApCisgICAgICAgICAgICBzZWxmLmRyYXdpbmdtb2RlID0gc2VsZi5kcmF3aW5nbW9kZSArIDEKIAogCiBjbGFzcyBDdXN0b21MaXN0KExpc3QpOgotCQotCSIiIkJhc2UgY2xhc3MgZm9yIHdyaXRpbmcgY3VzdG9tIGxpc3QgZGVmaW5pdGlvbnMuIiIiCi0JCi0JX2NlbGxIZWlnaHQgPSAwCi0JCi0JZGVmIGNyZWF0ZWxpc3Qoc2VsZik6Ci0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQlzZWxmLlNldFBvcnQoKQotCQlyZWN0ID0gc2VsZi5fYm91bmRzCi0JCXJlY3QgPSByZWN0WzBdKzEsIHJlY3RbMV0rMSwgcmVjdFsyXS0xNiwgcmVjdFszXS0xCi0JCXNlbGYuX3ZpZXdib3VuZHMgPSByZWN0Ci0JCXNlbGYuX2xpc3QgPSBDcmVhdGVDdXN0b21MaXN0KAotCQkJCXJlY3QsCi0JCQkJKDAsIDAsIDEsIDApLAotCQkJCSgwLCBzZWxmLl9jZWxsSGVpZ2h0KSwKLQkJCQkoa0xpc3REZWZVc2VyUHJvY1R5cGUsIHNlbGYubGlzdERlZmluaXRpb25GdW5jKSwKLQkJCQlzZWxmLl9wYXJlbnR3aW5kb3cud2lkLAotCQkJCTAsIDEsIDAsIDEpCi0JCWlmIHNlbGYuZHJhd2luZ21vZGU6Ci0JCQlzZWxmLl9saXN0LkxTZXREcmF3aW5nTW9kZSgwKQotCQlzZWxmLl9saXN0LnNlbEZsYWdzID0gc2VsZi5fZmxhZ3MKLQkJc2VsZi5zZXRpdGVtcyhzZWxmLml0ZW1zKQotCQlpZiBoYXNhdHRyKHNlbGYsICJfc2VsIik6Ci0JCQlzZWxmLnNldHNlbGVjdGlvbihzZWxmLl9zZWwpCi0JCQlkZWwgc2VsZi5fc2VsCi0JCi0JZGVmIGxpc3REZWZpbml0aW9uRnVuYyhzZWxmLCBtZXNzYWdlLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCi0JCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKLQkJIiIiVGhlIExERUYgbWVzc2FnZSBkaXNwYXRjaGVyIHJvdXRpbmUsIG5vIG5lZWQgdG8gb3ZlcnJpZGUuIiIiCi0JCWlmIG1lc3NhZ2UgPT0gbEluaXRNc2c6Ci0JCQlzZWxmLmxpc3REZWZJbml0KHRoZUxpc3QpCi0JCWVsaWYgbWVzc2FnZSA9PSBsRHJhd01zZzoKLQkJCXNlbGYubGlzdERlZkRyYXcoc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLAotCQkJCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KQotCQllbGlmIG1lc3NhZ2UgPT0gbEhpbGl0ZU1zZzoKLQkJCXNlbGYubGlzdERlZkhpZ2hsaWdodChzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCi0JCQkJCWRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpCi0JCWVsaWYgbWVzc2FnZSA9PSBsQ2xvc2VNc2c6Ci0JCQlzZWxmLmxpc3REZWZDbG9zZSh0aGVMaXN0KQotCQotCWRlZiBsaXN0RGVmSW5pdChzZWxmLCB0aGVMaXN0KToKLQkJcGFzcwotCWRlZiBsaXN0RGVmQ2xvc2Uoc2VsZiwgdGhlTGlzdCk6Ci0JCXBhc3MKLQlkZWYgbGlzdERlZkRyYXcoc2VsZiwgc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLCAKLQkJCWRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpOgotCQlwYXNzCi0JZGVmIGxpc3REZWZIaWdobGlnaHQoc2VsZiwgc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLCAKLQkJCWRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpOgotCQlwYXNzCisKKyAgICAiIiJCYXNlIGNsYXNzIGZvciB3cml0aW5nIGN1c3RvbSBsaXN0IGRlZmluaXRpb25zLiIiIgorCisgICAgX2NlbGxIZWlnaHQgPSAwCisKKyAgICBkZWYgY3JlYXRlbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHJlY3QgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgcmVjdCA9IHJlY3RbMF0rMSwgcmVjdFsxXSsxLCByZWN0WzJdLTE2LCByZWN0WzNdLTEKKyAgICAgICAgc2VsZi5fdmlld2JvdW5kcyA9IHJlY3QKKyAgICAgICAgc2VsZi5fbGlzdCA9IENyZWF0ZUN1c3RvbUxpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgKDAsIDAsIDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgKDAsIHNlbGYuX2NlbGxIZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGtMaXN0RGVmVXNlclByb2NUeXBlLCBzZWxmLmxpc3REZWZpbml0aW9uRnVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMCwgMSkKKyAgICAgICAgaWYgc2VsZi5kcmF3aW5nbW9kZToKKyAgICAgICAgICAgIHNlbGYuX2xpc3QuTFNldERyYXdpbmdNb2RlKDApCisgICAgICAgIHNlbGYuX2xpc3Quc2VsRmxhZ3MgPSBzZWxmLl9mbGFncworICAgICAgICBzZWxmLnNldGl0ZW1zKHNlbGYuaXRlbXMpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgIl9zZWwiKToKKyAgICAgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uKHNlbGYuX3NlbCkKKyAgICAgICAgICAgIGRlbCBzZWxmLl9zZWwKKworICAgIGRlZiBsaXN0RGVmaW5pdGlvbkZ1bmMoc2VsZiwgbWVzc2FnZSwgc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKKyAgICAgICAgIiIiVGhlIExERUYgbWVzc2FnZSBkaXNwYXRjaGVyIHJvdXRpbmUsIG5vIG5lZWQgdG8gb3ZlcnJpZGUuIiIiCisgICAgICAgIGlmIG1lc3NhZ2UgPT0gbEluaXRNc2c6CisgICAgICAgICAgICBzZWxmLmxpc3REZWZJbml0KHRoZUxpc3QpCisgICAgICAgIGVsaWYgbWVzc2FnZSA9PSBsRHJhd01zZzoKKyAgICAgICAgICAgIHNlbGYubGlzdERlZkRyYXcoc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpCisgICAgICAgIGVsaWYgbWVzc2FnZSA9PSBsSGlsaXRlTXNnOgorICAgICAgICAgICAgc2VsZi5saXN0RGVmSGlnaGxpZ2h0KHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KQorICAgICAgICBlbGlmIG1lc3NhZ2UgPT0gbENsb3NlTXNnOgorICAgICAgICAgICAgc2VsZi5saXN0RGVmQ2xvc2UodGhlTGlzdCkKKworICAgIGRlZiBsaXN0RGVmSW5pdChzZWxmLCB0aGVMaXN0KToKKyAgICAgICAgcGFzcworICAgIGRlZiBsaXN0RGVmQ2xvc2Uoc2VsZiwgdGhlTGlzdCk6CisgICAgICAgIHBhc3MKKyAgICBkZWYgbGlzdERlZkRyYXcoc2VsZiwgc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKKyAgICAgICAgcGFzcworICAgIGRlZiBsaXN0RGVmSGlnaGxpZ2h0KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6CisgICAgICAgIHBhc3MKIAogCiBjbGFzcyBUd29MaW5lTGlzdChDdXN0b21MaXN0KToKLQkKLQlfY2VsbEhlaWdodCA9IDI4Ci0JCi0JZGVmIGxpc3REZWZEcmF3KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKLQkJCWRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpOgotCQlzYXZlZFBvcnQgPSBRZC5HZXRQb3J0KCkKLQkJUWQuU2V0UG9ydCh0aGVMaXN0LkdldExpc3RQb3J0KCkpCi0JCXNhdmVkQ2xpcCA9IFFkLk5ld1JnbigpCi0JCVFkLkdldENsaXAoc2F2ZWRDbGlwKQotCQlRZC5DbGlwUmVjdChjZWxsUmVjdCkKLQkJc2F2ZWRQZW5TdGF0ZSA9IFFkLkdldFBlblN0YXRlKCkKLQkJUWQuUGVuTm9ybWFsKCkKLQkJUWQuRXJhc2VSZWN0KGNlbGxSZWN0KQotCQkKLQkJI2RyYXcgdGhlIGNlbGwgaWYgaXQgY29udGFpbnMgZGF0YQotCQlhc2NlbnQsIGRlc2NlbnQsIGxlYWRpbmcsIHNpemUsIGhtID0gRm0uRm9udE1ldHJpY3MoKQotCQlsaW5lZmVlZCA9IGFzY2VudCArIGRlc2NlbnQgKyBsZWFkaW5nCi0JCQotCQlpZiBkYXRhTGVuOgotCQkJbGVmdCwgdG9wLCByaWdodCwgYm90dG9tID0gY2VsbFJlY3QKLQkJCWRhdGEgPSB0aGVMaXN0LkxHZXRDZWxsKGRhdGFMZW4sIHRoZUNlbGwpCi0JCQlsaW5lcyA9IGRhdGEuc3BsaXQoIlxyIikKLQkJCWxpbmUxID0gbGluZXNbMF0KLQkJCWlmIGxlbihsaW5lcykgPiAxOgotCQkJCWxpbmUyID0gbGluZXNbMV0KLQkJCWVsc2U6Ci0JCQkJbGluZTIgPSAiIgotCQkJUWQuTW92ZVRvKGludChsZWZ0ICsgNCksIGludCh0b3AgKyBhc2NlbnQpKQotCQkJUWQuRHJhd1RleHQobGluZTEsIDAsIGxlbihsaW5lMSkpCi0JCQlpZiBsaW5lMjoKLQkJCQlRZC5Nb3ZlVG8oaW50KGxlZnQgKyA0KSwgaW50KHRvcCArIGFzY2VudCArIGxpbmVmZWVkKSkKLQkJCQlRZC5EcmF3VGV4dChsaW5lMiwgMCwgbGVuKGxpbmUyKSkKLQkJCVFkLlBlblBhdCgiXHgxMVx4MTFceDExXHgxMVx4MTFceDExXHgxMVx4MTEiKQotCQkJYm90dG9tID0gdG9wICsgdGhlTGlzdC5jZWxsU2l6ZVsxXQotCQkJUWQuTW92ZVRvKGxlZnQsIGJvdHRvbSAtIDEpCi0JCQlRZC5MaW5lVG8ocmlnaHQsIGJvdHRvbSAtIDEpCi0JCWlmIHNlbGVjdGVkOgotCQkJc2VsZi5saXN0RGVmSGlnaGxpZ2h0KHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKLQkJCQkJZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCkKLQkJI3Jlc3RvcmUgZ3JhcGhpY3MgZW52aXJvbm1lbnQKLQkJUWQuU2V0UG9ydChzYXZlZFBvcnQpCi0JCVFkLlNldENsaXAoc2F2ZWRDbGlwKQotCQlRZC5EaXNwb3NlUmduKHNhdmVkQ2xpcCkKLQkJUWQuU2V0UGVuU3RhdGUoc2F2ZWRQZW5TdGF0ZSkKLQkKLQlkZWYgbGlzdERlZkhpZ2hsaWdodChzZWxmLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCi0JCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKLQkJc2F2ZWRQb3J0ID0gUWQuR2V0UG9ydCgpCi0JCVFkLlNldFBvcnQodGhlTGlzdC5HZXRMaXN0UG9ydCgpKQotCQlzYXZlZENsaXAgPSBRZC5OZXdSZ24oKQotCQlRZC5HZXRDbGlwKHNhdmVkQ2xpcCkKLQkJUWQuQ2xpcFJlY3QoY2VsbFJlY3QpCi0JCXNhdmVkUGVuU3RhdGUgPSBRZC5HZXRQZW5TdGF0ZSgpCi0JCVFkLlBlbk5vcm1hbCgpCi0JCVFkLlBlbk1vZGUoaGlsaXRldHJhbnNmZXJtb2RlKQotCQlRZC5QYWludFJlY3QoY2VsbFJlY3QpCi0JCQotCQkjcmVzdG9yZSBncmFwaGljcyBlbnZpcm9ubWVudAotCQlRZC5TZXRQb3J0KHNhdmVkUG9ydCkKLQkJUWQuU2V0Q2xpcChzYXZlZENsaXApCi0JCVFkLkRpc3Bvc2VSZ24oc2F2ZWRDbGlwKQotCQlRZC5TZXRQZW5TdGF0ZShzYXZlZFBlblN0YXRlKQotCQorCisgICAgX2NlbGxIZWlnaHQgPSAyOAorCisgICAgZGVmIGxpc3REZWZEcmF3KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6CisgICAgICAgIHNhdmVkUG9ydCA9IFFkLkdldFBvcnQoKQorICAgICAgICBRZC5TZXRQb3J0KHRoZUxpc3QuR2V0TGlzdFBvcnQoKSkKKyAgICAgICAgc2F2ZWRDbGlwID0gUWQuTmV3UmduKCkKKyAgICAgICAgUWQuR2V0Q2xpcChzYXZlZENsaXApCisgICAgICAgIFFkLkNsaXBSZWN0KGNlbGxSZWN0KQorICAgICAgICBzYXZlZFBlblN0YXRlID0gUWQuR2V0UGVuU3RhdGUoKQorICAgICAgICBRZC5QZW5Ob3JtYWwoKQorICAgICAgICBRZC5FcmFzZVJlY3QoY2VsbFJlY3QpCisKKyAgICAgICAgI2RyYXcgdGhlIGNlbGwgaWYgaXQgY29udGFpbnMgZGF0YQorICAgICAgICBhc2NlbnQsIGRlc2NlbnQsIGxlYWRpbmcsIHNpemUsIGhtID0gRm0uRm9udE1ldHJpY3MoKQorICAgICAgICBsaW5lZmVlZCA9IGFzY2VudCArIGRlc2NlbnQgKyBsZWFkaW5nCisKKyAgICAgICAgaWYgZGF0YUxlbjoKKyAgICAgICAgICAgIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSA9IGNlbGxSZWN0CisgICAgICAgICAgICBkYXRhID0gdGhlTGlzdC5MR2V0Q2VsbChkYXRhTGVuLCB0aGVDZWxsKQorICAgICAgICAgICAgbGluZXMgPSBkYXRhLnNwbGl0KCJcciIpCisgICAgICAgICAgICBsaW5lMSA9IGxpbmVzWzBdCisgICAgICAgICAgICBpZiBsZW4obGluZXMpID4gMToKKyAgICAgICAgICAgICAgICBsaW5lMiA9IGxpbmVzWzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmUyID0gIiIKKyAgICAgICAgICAgIFFkLk1vdmVUbyhpbnQobGVmdCArIDQpLCBpbnQodG9wICsgYXNjZW50KSkKKyAgICAgICAgICAgIFFkLkRyYXdUZXh0KGxpbmUxLCAwLCBsZW4obGluZTEpKQorICAgICAgICAgICAgaWYgbGluZTI6CisgICAgICAgICAgICAgICAgUWQuTW92ZVRvKGludChsZWZ0ICsgNCksIGludCh0b3AgKyBhc2NlbnQgKyBsaW5lZmVlZCkpCisgICAgICAgICAgICAgICAgUWQuRHJhd1RleHQobGluZTIsIDAsIGxlbihsaW5lMikpCisgICAgICAgICAgICBRZC5QZW5QYXQoIlx4MTFceDExXHgxMVx4MTFceDExXHgxMVx4MTFceDExIikKKyAgICAgICAgICAgIGJvdHRvbSA9IHRvcCArIHRoZUxpc3QuY2VsbFNpemVbMV0KKyAgICAgICAgICAgIFFkLk1vdmVUbyhsZWZ0LCBib3R0b20gLSAxKQorICAgICAgICAgICAgUWQuTGluZVRvKHJpZ2h0LCBib3R0b20gLSAxKQorICAgICAgICBpZiBzZWxlY3RlZDoKKyAgICAgICAgICAgIHNlbGYubGlzdERlZkhpZ2hsaWdodChzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCkKKyAgICAgICAgI3Jlc3RvcmUgZ3JhcGhpY3MgZW52aXJvbm1lbnQKKyAgICAgICAgUWQuU2V0UG9ydChzYXZlZFBvcnQpCisgICAgICAgIFFkLlNldENsaXAoc2F2ZWRDbGlwKQorICAgICAgICBRZC5EaXNwb3NlUmduKHNhdmVkQ2xpcCkKKyAgICAgICAgUWQuU2V0UGVuU3RhdGUoc2F2ZWRQZW5TdGF0ZSkKKworICAgIGRlZiBsaXN0RGVmSGlnaGxpZ2h0KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6CisgICAgICAgIHNhdmVkUG9ydCA9IFFkLkdldFBvcnQoKQorICAgICAgICBRZC5TZXRQb3J0KHRoZUxpc3QuR2V0TGlzdFBvcnQoKSkKKyAgICAgICAgc2F2ZWRDbGlwID0gUWQuTmV3UmduKCkKKyAgICAgICAgUWQuR2V0Q2xpcChzYXZlZENsaXApCisgICAgICAgIFFkLkNsaXBSZWN0KGNlbGxSZWN0KQorICAgICAgICBzYXZlZFBlblN0YXRlID0gUWQuR2V0UGVuU3RhdGUoKQorICAgICAgICBRZC5QZW5Ob3JtYWwoKQorICAgICAgICBRZC5QZW5Nb2RlKGhpbGl0ZXRyYW5zZmVybW9kZSkKKyAgICAgICAgUWQuUGFpbnRSZWN0KGNlbGxSZWN0KQorCisgICAgICAgICNyZXN0b3JlIGdyYXBoaWNzIGVudmlyb25tZW50CisgICAgICAgIFFkLlNldFBvcnQoc2F2ZWRQb3J0KQorICAgICAgICBRZC5TZXRDbGlwKHNhdmVkQ2xpcCkKKyAgICAgICAgUWQuRGlzcG9zZVJnbihzYXZlZENsaXApCisgICAgICAgIFFkLlNldFBlblN0YXRlKHNhdmVkUGVuU3RhdGUpCisKIAogY2xhc3MgUmVzdWx0c1dpbmRvdzoKLQkKLQkiIiJTaW1wbGUgcmVzdWx0cyB3aW5kb3cuIFRoZSB1c2VyIGNhbm5vdCBtYWtlIHRoaXMgd2luZG93IGdvIGF3YXkgY29tcGxldGVseToKLQljbG9zaW5nIGl0IHdpbGwganVzdCBoaWRlIGl0LiBJdCB3aWxsIHJlbWFpbiBpbiB0aGUgd2luZG93cyBsaXN0LiBUaGUgb3duZXIgb2YgdGhpcyB3aW5kb3cKLQlzaG91bGQgY2FsbCB0aGUgZG9uZSgpIG1ldGhvZCB0byBpbmRpY2F0ZSBpdCdzIGRvbmUgd2l0aCBpdC4KLQkiIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZT1Ob25lLCB0aXRsZT0iUmVzdWx0cyIsIGNhbGxiYWNrPU5vbmUpOgotCQlpbXBvcnQgVwotCQlpZiBwb3NzaXplIGlzIE5vbmU6Ci0JCQlwb3NzaXplID0gKDUwMCwgMjAwKQotCQlzZWxmLncgPSBXLldpbmRvdyhwb3NzaXplLCB0aXRsZSwgbWluc2l6ZT0oMjAwLCAxMDApKQotCQlzZWxmLncucmVzdWx0cyA9IFcuVHdvTGluZUxpc3QoKC0xLCAtMSwgMSwgLTE0KSwgY2FsbGJhY2s9Tm9uZSkKLQkJc2VsZi53LmJpbmQoIjxjbG9zZT4iLCBzZWxmLmhpZGUpCi0JCXNlbGYudy5vcGVuKCkKLQkJc2VsZi5fZG9uZSA9IDAKLQkKLQlkZWYgZG9uZShzZWxmKToKLQkJc2VsZi5fZG9uZSA9IDEKLQkJaWYgbm90IHNlbGYudy5pc3Zpc2libGUoKToKLQkJCXNlbGYudy5jbG9zZSgpCi0JCi0JZGVmIGhpZGUoc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9kb25lOgotCQkJc2VsZi53LnNob3coMCkKLQkJCXJldHVybiAtMQotCQotCWRlZiBhcHBlbmQoc2VsZiwgbXNnKToKLQkJaWYgbm90IHNlbGYudy5pc3Zpc2libGUoKToKLQkJCXNlbGYudy5zaG93KDEpCi0JCQlzZWxmLncuc2VsZWN0KCkKLQkJbXNnID0gc3RyaW5nLnJlcGxhY2UobXNnLCAnXG4nLCAnXHInKQotCQlzZWxmLncucmVzdWx0cy5hcHBlbmQobXNnKQotCQlzZWxmLncucmVzdWx0cy5zZXRzZWxlY3Rpb24oW2xlbihzZWxmLncucmVzdWx0cyktMV0pCi0JCi0JZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgotCQlyZXR1cm4gZ2V0YXR0cihzZWxmLncucmVzdWx0cywgYXR0cikKKworICAgICIiIlNpbXBsZSByZXN1bHRzIHdpbmRvdy4gVGhlIHVzZXIgY2Fubm90IG1ha2UgdGhpcyB3aW5kb3cgZ28gYXdheSBjb21wbGV0ZWx5OgorICAgIGNsb3NpbmcgaXQgd2lsbCBqdXN0IGhpZGUgaXQuIEl0IHdpbGwgcmVtYWluIGluIHRoZSB3aW5kb3dzIGxpc3QuIFRoZSBvd25lciBvZiB0aGlzIHdpbmRvdworICAgIHNob3VsZCBjYWxsIHRoZSBkb25lKCkgbWV0aG9kIHRvIGluZGljYXRlIGl0J3MgZG9uZSB3aXRoIGl0LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemU9Tm9uZSwgdGl0bGU9IlJlc3VsdHMiLCBjYWxsYmFjaz1Ob25lKToKKyAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgaWYgcG9zc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgcG9zc2l6ZSA9ICg1MDAsIDIwMCkKKyAgICAgICAgc2VsZi53ID0gVy5XaW5kb3cocG9zc2l6ZSwgdGl0bGUsIG1pbnNpemU9KDIwMCwgMTAwKSkKKyAgICAgICAgc2VsZi53LnJlc3VsdHMgPSBXLlR3b0xpbmVMaXN0KCgtMSwgLTEsIDEsIC0xNCksIGNhbGxiYWNrPU5vbmUpCisgICAgICAgIHNlbGYudy5iaW5kKCI8Y2xvc2U+Iiwgc2VsZi5oaWRlKQorICAgICAgICBzZWxmLncub3BlbigpCisgICAgICAgIHNlbGYuX2RvbmUgPSAwCisKKyAgICBkZWYgZG9uZShzZWxmKToKKyAgICAgICAgc2VsZi5fZG9uZSA9IDEKKyAgICAgICAgaWYgbm90IHNlbGYudy5pc3Zpc2libGUoKToKKyAgICAgICAgICAgIHNlbGYudy5jbG9zZSgpCisKKyAgICBkZWYgaGlkZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2RvbmU6CisgICAgICAgICAgICBzZWxmLncuc2hvdygwKQorICAgICAgICAgICAgcmV0dXJuIC0xCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIG1zZyk6CisgICAgICAgIGlmIG5vdCBzZWxmLncuaXN2aXNpYmxlKCk6CisgICAgICAgICAgICBzZWxmLncuc2hvdygxKQorICAgICAgICAgICAgc2VsZi53LnNlbGVjdCgpCisgICAgICAgIG1zZyA9IHN0cmluZy5yZXBsYWNlKG1zZywgJ1xuJywgJ1xyJykKKyAgICAgICAgc2VsZi53LnJlc3VsdHMuYXBwZW5kKG1zZykKKyAgICAgICAgc2VsZi53LnJlc3VsdHMuc2V0c2VsZWN0aW9uKFtsZW4oc2VsZi53LnJlc3VsdHMpLTFdKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLncucmVzdWx0cywgYXR0cikKIAogCiBjbGFzcyBNdWx0aUxpc3QoTGlzdCk6Ci0JCi0JIiIiWFhYIEV4cGVyaW1hbnRhbCEhISIiIgotCQotCWRlZiBzZXRpdGVtcyhzZWxmLCBpdGVtcyk6Ci0JCXNlbGYuaXRlbXMgPSBpdGVtcwotCQlpZiBub3Qgc2VsZi5fcGFyZW50IG9yIG5vdCBzZWxmLl9saXN0OgotCQkJcmV0dXJuCi0JCXNlbGYuX2xpc3QuTERlbFJvdygwLCAxKQotCQlzZWxmLnNldGRyYXdpbmdtb2RlKDApCi0JCXNlbGYuX2xpc3QuTEFkZFJvdyhsZW4oc2VsZi5pdGVtcyksIDApCi0JCXNlbGZfaXRlbXJlcHIgPSBzZWxmLml0ZW1yZXByCi0JCXNldF9jZWxsID0gc2VsZi5fbGlzdC5MU2V0Q2VsbAotCQlmb3IgaSBpbiByYW5nZShsZW4oaXRlbXMpKToKLQkJCXJvdyA9IGl0ZW1zW2ldCi0JCQlmb3IgaiBpbiByYW5nZShsZW4ocm93KSk6Ci0JCQkJaXRlbSA9IHJvd1tqXQotCQkJCXNldF9jZWxsKHNlbGZfaXRlbXJlcHIoaXRlbSksIChqLCBpKSkKLQkJc2VsZi5zZXRkcmF3aW5nbW9kZSgxKQotCQotCWRlZiBnZXRzZWxlY3Rpb24oc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9wYXJlbnQgb3Igbm90IHNlbGYuX2xpc3Q6Ci0JCQlpZiBoYXNhdHRyKHNlbGYsICJfc2VsIik6Ci0JCQkJcmV0dXJuIHNlbGYuX3NlbAotCQkJcmV0dXJuIFtdCi0JCWl0ZW1zID0gW10KLQkJcG9pbnQgPSAoMCwwKQotCQl3aGlsZSAxOgotCQkJb2ssIHBvaW50ID0gc2VsZi5fbGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQotCQkJaWYgbm90IG9rOgotCQkJCWJyZWFrCi0JCQlpdGVtcy5hcHBlbmQocG9pbnRbMV0pCi0JCQlwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCi0JCXJldHVybiBpdGVtcwotCQotCWRlZiBzZXRzZWxlY3Rpb24oc2VsZiwgc2VsZWN0aW9uKToKLQkJaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKLQkJCXNlbGYuX3NlbCA9IHNlbGVjdGlvbgotCQkJcmV0dXJuCi0JCXNldF9zZWwgPSBzZWxmLl9saXN0LkxTZXRTZWxlY3QKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuaXRlbXMpKToKLQkJCWZvciBqIGluIHJhbmdlKGxlbihzZWxmLml0ZW1zW2ldKSk6Ci0JCQkJaWYgaSBpbiBzZWxlY3Rpb246Ci0JCQkJCXNldF9zZWwoMSwgKGosIGkpKQotCQkJCWVsc2U6Ci0JCQkJCXNldF9zZWwoMCwgKGosIGkpKQotCQkjc2VsZi5fbGlzdC5MQXV0b1Njcm9sbCgpCiAKKyAgICAiIiJYWFggRXhwZXJpbWFudGFsISEhIiIiCisKKyAgICBkZWYgc2V0aXRlbXMoc2VsZiwgaXRlbXMpOgorICAgICAgICBzZWxmLml0ZW1zID0gaXRlbXMKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9saXN0LkxEZWxSb3coMCwgMSkKKyAgICAgICAgc2VsZi5zZXRkcmF3aW5nbW9kZSgwKQorICAgICAgICBzZWxmLl9saXN0LkxBZGRSb3cobGVuKHNlbGYuaXRlbXMpLCAwKQorICAgICAgICBzZWxmX2l0ZW1yZXByID0gc2VsZi5pdGVtcmVwcgorICAgICAgICBzZXRfY2VsbCA9IHNlbGYuX2xpc3QuTFNldENlbGwKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGl0ZW1zKSk6CisgICAgICAgICAgICByb3cgPSBpdGVtc1tpXQorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKHJvdykpOgorICAgICAgICAgICAgICAgIGl0ZW0gPSByb3dbal0KKyAgICAgICAgICAgICAgICBzZXRfY2VsbChzZWxmX2l0ZW1yZXByKGl0ZW0pLCAoaiwgaSkpCisgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKKworICAgIGRlZiBnZXRzZWxlY3Rpb24oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9wYXJlbnQgb3Igbm90IHNlbGYuX2xpc3Q6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJfc2VsIik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NlbAorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgcG9pbnQgPSAoMCwwKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgb2ssIHBvaW50ID0gc2VsZi5fbGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQorICAgICAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpdGVtcy5hcHBlbmQocG9pbnRbMV0pCisgICAgICAgICAgICBwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCisgICAgICAgIHJldHVybiBpdGVtcworCisgICAgZGVmIHNldHNlbGVjdGlvbihzZWxmLCBzZWxlY3Rpb24pOgorICAgICAgICBpZiBub3Qgc2VsZi5fcGFyZW50IG9yIG5vdCBzZWxmLl9saXN0OgorICAgICAgICAgICAgc2VsZi5fc2VsID0gc2VsZWN0aW9uCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2V0X3NlbCA9IHNlbGYuX2xpc3QuTFNldFNlbGVjdAorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5pdGVtcykpOgorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKHNlbGYuaXRlbXNbaV0pKToKKyAgICAgICAgICAgICAgICBpZiBpIGluIHNlbGVjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgc2V0X3NlbCgxLCAoaiwgaSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2V0X3NlbCgwLCAoaiwgaSkpCisgICAgICAgICNzZWxmLl9saXN0LkxBdXRvU2Nyb2xsKCkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvV21lbnVzLnB5IGIvTWFjL1Rvb2xzL0lERS9XbWVudXMucHkKaW5kZXggYmQxMTlhNS4uMDFhOGUxYyAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9XbWVudXMucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9XbWVudXMucHkKQEAgLTgsMjUyICs4LDI1MiBAQAogI19hcnJvd2Rvd24gPSBRZC5HZXRQaWN0dXJlKDQ3MykKIAogX2Fycm93cmlnaHQgPSBSZXMuUmVzb3VyY2UoCi0JJ1x4MDBJXHgwMFx4MDBceDAwXHgwMFx4MDBcblx4MDBcblx4MTFceDAxXHgwMVx4MDBcblx4MDBceDAwXHgwMCcKLQknXHgwMFx4MDBcblx4MDBcblx4OTBceDAwXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXG5ceDAwXG5ceDAwXHgwMCcKLQknXHgwMFx4MDBceDAwXG5ceDAwXG5ceDAwXHgwMFx4MDBceDAwXHgwMFxuXHgwMFxuXHgwMFx4MDBceDEwXHgwMCcKLQknXHgxOFx4MDBceDFjXHgwMFx4MWVceDAwXHgxZlx4MDBceDFmXHgwMFx4MWVceDAwXHgxY1x4MDBceDE4XHgwMCcKLQknXHgxMFx4MDBceGZmJykKKyAgICAgICAgJ1x4MDBJXHgwMFx4MDBceDAwXHgwMFx4MDBcblx4MDBcblx4MTFceDAxXHgwMVx4MDBcblx4MDBceDAwXHgwMCcKKyAgICAgICAgJ1x4MDBceDAwXG5ceDAwXG5ceDkwXHgwMFx4MDJceDAwXHgwMFx4MDBceDAwXHgwMFxuXHgwMFxuXHgwMFx4MDAnCisgICAgICAgICdceDAwXHgwMFx4MDBcblx4MDBcblx4MDBceDAwXHgwMFx4MDBceDAwXG5ceDAwXG5ceDAwXHgwMFx4MTBceDAwJworICAgICAgICAnXHgxOFx4MDBceDFjXHgwMFx4MWVceDAwXHgxZlx4MDBceDFmXHgwMFx4MWVceDAwXHgxY1x4MDBceDE4XHgwMCcKKyAgICAgICAgJ1x4MTBceDAwXHhmZicpCiAKIAogY2xhc3MgUG9wdXBDb250cm9sKFdjb250cm9scy5Db250cm9sV2lkZ2V0KToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgaXRlbXM9Tm9uZSwgY2FsbGJhY2s9Tm9uZSk6Ci0JCWlmIGl0ZW1zIGlzIE5vbmU6Ci0JCQlpdGVtcyA9IFtdCi0JCXByb2NJRCA9IENvbnRyb2xzLnBvcHVwTWVudVByb2N8Q29udHJvbHMucG9wdXBGaXhlZFdpZHRofENvbnRyb2xzLnVzZVdGb250Ci0JCVdjb250cm9scy5Db250cm9sV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUsICIiLCBwcm9jSUQsIGNhbGxiYWNrLCAwLCAwLCAwKQotCQlzZWxmLl9pdGVtcyA9IGl0ZW1zWzpdCi0JCi0JZGVmIHNldChzZWxmLCB2YWx1ZSk6Ci0JCXNlbGYuX2NvbnRyb2wuU2V0Q29udHJvbFZhbHVlKHZhbHVlKzEpCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYuX2NvbnRyb2wuR2V0Q29udHJvbFZhbHVlKCkgLSAxCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYubWVudSA9IG1lbnUgPSBGcmFtZVdvcmsuTWVudShzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50Lm1lbnViYXIsICdGb28nLCAtMSkKLQkJCi0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLl9pdGVtcykpOgotCQkJaXRlbSA9IHNlbGYuX2l0ZW1zW2ldCi0JCQlpZiB0eXBlKGl0ZW0pID09IFN0cmluZ1R5cGU6Ci0JCQkJbWVudWl0ZW10ZXh0ID0gb2JqZWN0ID0gaXRlbQotCQkJZWxpZiB0eXBlKGl0ZW0pID09IFR1cGxlVHlwZSBhbmQgbGVuKGl0ZW0pID09IDI6Ci0JCQkJbWVudWl0ZW10ZXh0LCBvYmplY3QgPSBpdGVtCi0JCQkJc2VsZi5faXRlbXNbaV0gPSBvYmplY3QKLQkJCWVsc2U6Ci0JCQkJcmFpc2UgV2Jhc2UuV2lkZ2V0c0Vycm9yLCAiaWxsZWdhbCBpdGVtbGlzdCBmb3IgcG9wdXAgbWVudSIKLQkJCW1lbnVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG1lbnUsIG1lbnVpdGVtdGV4dCwgTm9uZSwgTm9uZSkKLQkJCi0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQlzZWxmLl9jb250cm9sID0gQ3RsLk5ld0NvbnRyb2woc2VsZi5fcGFyZW50d2luZG93LndpZCwgCi0JCQkJCQlzZWxmLl9ib3VuZHMsIAotCQkJCQkJc2VsZi5fdGl0bGUsIAotCQkJCQkJMSwgCi0JCQkJCQlzZWxmLl92YWx1ZSwgCi0JCQkJCQlzZWxmLm1lbnUuaWQsIAotCQkJCQkJc2VsZi5fbWF4LCAKLQkJCQkJCXNlbGYuX3Byb2NJRCwgCi0JCQkJCQkwKQotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLmVuYWJsZShzZWxmLl9lbmFibGVkKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5tZW51LmRlbGV0ZSgpCi0JCXJldHVybiBXY29udHJvbHMuQ29udHJvbFdpZGdldC5jbG9zZShzZWxmKQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJcGFydCA9IHNlbGYuX2NvbnRyb2wuVHJhY2tDb250cm9sKHBvaW50LCAtMSkKLQkJaWYgcGFydDoKLQkJCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgc2VsZi5faXRlbXNbc2VsZi5nZXQoKV0pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgaXRlbXM9Tm9uZSwgY2FsbGJhY2s9Tm9uZSk6CisgICAgICAgIGlmIGl0ZW1zIGlzIE5vbmU6CisgICAgICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgIHByb2NJRCA9IENvbnRyb2xzLnBvcHVwTWVudVByb2N8Q29udHJvbHMucG9wdXBGaXhlZFdpZHRofENvbnRyb2xzLnVzZVdGb250CisgICAgICAgIFdjb250cm9scy5Db250cm9sV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUsICIiLCBwcm9jSUQsIGNhbGxiYWNrLCAwLCAwLCAwKQorICAgICAgICBzZWxmLl9pdGVtcyA9IGl0ZW1zWzpdCisKKyAgICBkZWYgc2V0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sVmFsdWUodmFsdWUrMSkKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250cm9sLkdldENvbnRyb2xWYWx1ZSgpIC0gMQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYubWVudSA9IG1lbnUgPSBGcmFtZVdvcmsuTWVudShzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50Lm1lbnViYXIsICdGb28nLCAtMSkKKworICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5faXRlbXMpKToKKyAgICAgICAgICAgIGl0ZW0gPSBzZWxmLl9pdGVtc1tpXQorICAgICAgICAgICAgaWYgdHlwZShpdGVtKSA9PSBTdHJpbmdUeXBlOgorICAgICAgICAgICAgICAgIG1lbnVpdGVtdGV4dCA9IG9iamVjdCA9IGl0ZW0KKyAgICAgICAgICAgIGVsaWYgdHlwZShpdGVtKSA9PSBUdXBsZVR5cGUgYW5kIGxlbihpdGVtKSA9PSAyOgorICAgICAgICAgICAgICAgIG1lbnVpdGVtdGV4dCwgb2JqZWN0ID0gaXRlbQorICAgICAgICAgICAgICAgIHNlbGYuX2l0ZW1zW2ldID0gb2JqZWN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFdiYXNlLldpZGdldHNFcnJvciwgImlsbGVnYWwgaXRlbWxpc3QgZm9yIHBvcHVwIG1lbnUiCisgICAgICAgICAgICBtZW51aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtZW51LCBtZW51aXRlbXRleHQsIE5vbmUsIE5vbmUpCisKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisgICAgICAgIHNlbGYuX2NvbnRyb2wgPSBDdGwuTmV3Q29udHJvbChzZWxmLl9wYXJlbnR3aW5kb3cud2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVudS5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuZW5hYmxlKHNlbGYuX2VuYWJsZWQpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYubWVudS5kZWxldGUoKQorICAgICAgICByZXR1cm4gV2NvbnRyb2xzLkNvbnRyb2xXaWRnZXQuY2xvc2Uoc2VsZikKKworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2VuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcGFydCA9IHNlbGYuX2NvbnRyb2wuVHJhY2tDb250cm9sKHBvaW50LCAtMSkKKyAgICAgICAgaWYgcGFydDoKKyAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgc2VsZi5faXRlbXNbc2VsZi5nZXQoKV0pCiAKIAogY2xhc3MgUG9wdXBXaWRnZXQoV2Jhc2UuQ2xpY2thYmxlV2lkZ2V0KToKLQkKLQkiIiJTaW1wbGUgdGl0bGUtbGVzcyBwb3B1cCB3aWRnZXQuIFNob3VsZCBiZSAxNngxNiBwaXhlbHMuIAotCUJ1aWxkcyB0aGUgbWVudSBpdGVtcyBvbiB0aGUgZmx5LCBnb29kIGZvciBkeW5hbWljIHBvcHVwIG1lbnVzLiIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCBpdGVtcz1Ob25lLCBjYWxsYmFjaz1Ob25lKToKLQkJV2Jhc2UuQ2xpY2thYmxlV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCi0JCWlmIGl0ZW1zIGlzIE5vbmU6Ci0JCQlpdGVtcyA9IFtdCi0JCXNlbGYuX2l0ZW1zID0gaXRlbXMKLQkJc2VsZi5faXRlbXNkaWN0ID0ge30KLQkJc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjawotCQlzZWxmLl9lbmFibGVkID0gMQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJV2Jhc2UuQ2xpY2thYmxlV2lkZ2V0LmNsb3NlKHNlbGYpCi0JCXNlbGYuX2l0ZW1zID0gTm9uZQotCQlzZWxmLl9pdGVtc2RpY3QgPSB7fQotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJUWQuRnJhbWVSZWN0KHNlbGYuX2JvdW5kcykKLQkJCVFkLkVyYXNlUmVjdChRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCAxLCAxKSkKLQkJCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJCWwgPSBsICsgMgotCQkJdCA9IHQgKyAzCi0JCQlwaWN0ZnJhbWUgPSAobCwgdCwgbCArIDEwLCB0ICsgMTApCi0JCQlRZC5EcmF3UGljdHVyZShfYXJyb3dyaWdodCwgcGljdGZyYW1lKQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJc2VsZi5tZW51ID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5fcGFyZW50d2luZG93LnBhcmVudC5tZW51YmFyLCAnRm9vJywgLTEpCi0JCXNlbGYuX2FkZGl0ZW1zKHNlbGYuX2l0ZW1zLCBzZWxmLm1lbnUpCi0JCXNlbGYuU2V0UG9ydCgpCi0JCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJbCwgdCA9IFFkLkxvY2FsVG9HbG9iYWwoKGwrMSwgdCsxKSkKLQkJV2Jhc2UuU2V0Q3Vyc29yKCJhcnJvdyIpCi0JCXNlbGYubWVudS5tZW51LkVuYWJsZU1lbnVJdGVtKDApCi0JCXJlcGx5ID0gc2VsZi5tZW51Lm1lbnUuUG9wVXBNZW51U2VsZWN0KHQsIGwsIDEpCi0JCWlmIHJlcGx5OgotCQkJaWQgPSByZXBseSA+PiAxNgotCQkJaXRlbSA9IHJlcGx5ICYgMHhmZmZmCi0JCQlzZWxmLl9tZW51X2NhbGxiYWNrKGlkLCBpdGVtKQotCQlzZWxmLl9lbXB0eW1lbnUoKQotCQotCWRlZiBzZXQoc2VsZiwgaXRlbXMpOgotCQlzZWxmLl9pdGVtcyA9IGl0ZW1zCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYuX2l0ZW1zCi0JCi0JZGVmIF9hZGRpdGVtcyhzZWxmLCBpdGVtcywgbWVudSk6Ci0JCWZyb20gRnJhbWVXb3JrIGltcG9ydCBTdWJNZW51LCBNZW51SXRlbQotCQltZW51X2lkID0gbWVudS5pZAotCQlmb3IgaXRlbSBpbiBpdGVtczoKLQkJCWlmIGl0ZW0gPT0gIi0iOgotCQkJCW1lbnUuYWRkc2VwYXJhdG9yKCkKLQkJCQljb250aW51ZQotCQkJZWxpZiB0eXBlKGl0ZW0pID09IExpc3RUeXBlOgotCQkJCXN1Ym1lbnUgPSBTdWJNZW51KG1lbnUsIGl0ZW1bMF0pCi0JCQkJc2VsZi5fYWRkaXRlbXMoaXRlbVsxOl0sIHN1Ym1lbnUpCi0JCQkJY29udGludWUKLQkJCWVsaWYgdHlwZShpdGVtKSA9PSBTdHJpbmdUeXBlOgotCQkJCW1lbnVpdGVtdGV4dCA9IG9iamVjdCA9IGl0ZW0KLQkJCWVsaWYgdHlwZShpdGVtKSA9PSBUdXBsZVR5cGUgYW5kIGxlbihpdGVtKSA9PSAyOgotCQkJCW1lbnVpdGVtdGV4dCwgb2JqZWN0ID0gaXRlbQotCQkJZWxzZToKLQkJCQlyYWlzZSBXYmFzZS5XaWRnZXRzRXJyb3IsICJpbGxlZ2FsIGl0ZW1saXN0IGZvciBwb3B1cCBtZW51IgotCQkJCi0JCQlpZiBtZW51aXRlbXRleHRbOjFdID09ICdcMCc6Ci0JCQkJY2hlY2sgPSBvcmQobWVudWl0ZW10ZXh0WzFdKQotCQkJCW1lbnVpdGVtdGV4dCA9IG1lbnVpdGVtdGV4dFsyOl0KLQkJCWVsc2U6Ci0JCQkJY2hlY2sgPSAwCi0JCQltZW51aXRlbSA9IE1lbnVJdGVtKG1lbnUsIG1lbnVpdGVtdGV4dCwgTm9uZSwgTm9uZSkKLQkJCWlmIGNoZWNrOgotCQkJCW1lbnVpdGVtLmNoZWNrKDEpCi0JCQlzZWxmLl9pdGVtc2RpY3RbKG1lbnVfaWQsIG1lbnVpdGVtLml0ZW0pXSA9IG9iamVjdAotCQotCWRlZiBfZW1wdHltZW51KHNlbGYpOgotCQltZW51cyA9IHNlbGYuX3BhcmVudHdpbmRvdy5wYXJlbnQubWVudWJhci5tZW51cwotCQlmb3IgaWQsIGl0ZW0gaW4gc2VsZi5faXRlbXNkaWN0LmtleXMoKToKLQkJCWlmIG1lbnVzLmhhc19rZXkoaWQpOgotCQkJCXNlbGYubWVudSA9IG1lbnVzW2lkXQotCQkJCXNlbGYubWVudS5kZWxldGUoKQotCQlzZWxmLl9pdGVtc2RpY3QgPSB7fQotCQotCWRlZiBfbWVudV9jYWxsYmFjayhzZWxmLCBpZCwgaXRlbSk6Ci0JCXRoaW5nID0gc2VsZi5faXRlbXNkaWN0WyhpZCwgaXRlbSldCi0JCWlmIGNhbGxhYmxlKHRoaW5nKToKLQkJCXRoaW5nKCkKLQkJZWxpZiBzZWxmLl9jYWxsYmFjazoKLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgdGhpbmcpCisKKyAgICAiIiJTaW1wbGUgdGl0bGUtbGVzcyBwb3B1cCB3aWRnZXQuIFNob3VsZCBiZSAxNngxNiBwaXhlbHMuCisgICAgQnVpbGRzIHRoZSBtZW51IGl0ZW1zIG9uIHRoZSBmbHksIGdvb2QgZm9yIGR5bmFtaWMgcG9wdXAgbWVudXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgaXRlbXM9Tm9uZSwgY2FsbGJhY2s9Tm9uZSk6CisgICAgICAgIFdiYXNlLkNsaWNrYWJsZVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQorICAgICAgICBpZiBpdGVtcyBpcyBOb25lOgorICAgICAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBzZWxmLl9pdGVtcyA9IGl0ZW1zCisgICAgICAgIHNlbGYuX2l0ZW1zZGljdCA9IHt9CisgICAgICAgIHNlbGYuX2NhbGxiYWNrID0gY2FsbGJhY2sKKyAgICAgICAgc2VsZi5fZW5hYmxlZCA9IDEKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgV2Jhc2UuQ2xpY2thYmxlV2lkZ2V0LmNsb3NlKHNlbGYpCisgICAgICAgIHNlbGYuX2l0ZW1zID0gTm9uZQorICAgICAgICBzZWxmLl9pdGVtc2RpY3QgPSB7fQorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBRZC5GcmFtZVJlY3Qoc2VsZi5fYm91bmRzKQorICAgICAgICAgICAgUWQuRXJhc2VSZWN0KFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpKQorICAgICAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcworICAgICAgICAgICAgbCA9IGwgKyAyCisgICAgICAgICAgICB0ID0gdCArIDMKKyAgICAgICAgICAgIHBpY3RmcmFtZSA9IChsLCB0LCBsICsgMTAsIHQgKyAxMCkKKyAgICAgICAgICAgIFFkLkRyYXdQaWN0dXJlKF9hcnJvd3JpZ2h0LCBwaWN0ZnJhbWUpCisKKyAgICBkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYubWVudSA9IEZyYW1lV29yay5NZW51KHNlbGYuX3BhcmVudHdpbmRvdy5wYXJlbnQubWVudWJhciwgJ0ZvbycsIC0xKQorICAgICAgICBzZWxmLl9hZGRpdGVtcyhzZWxmLl9pdGVtcywgc2VsZi5tZW51KQorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIGwsIHQgPSBRZC5Mb2NhbFRvR2xvYmFsKChsKzEsIHQrMSkpCisgICAgICAgIFdiYXNlLlNldEN1cnNvcigiYXJyb3ciKQorICAgICAgICBzZWxmLm1lbnUubWVudS5FbmFibGVNZW51SXRlbSgwKQorICAgICAgICByZXBseSA9IHNlbGYubWVudS5tZW51LlBvcFVwTWVudVNlbGVjdCh0LCBsLCAxKQorICAgICAgICBpZiByZXBseToKKyAgICAgICAgICAgIGlkID0gcmVwbHkgPj4gMTYKKyAgICAgICAgICAgIGl0ZW0gPSByZXBseSAmIDB4ZmZmZgorICAgICAgICAgICAgc2VsZi5fbWVudV9jYWxsYmFjayhpZCwgaXRlbSkKKyAgICAgICAgc2VsZi5fZW1wdHltZW51KCkKKworICAgIGRlZiBzZXQoc2VsZiwgaXRlbXMpOgorICAgICAgICBzZWxmLl9pdGVtcyA9IGl0ZW1zCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faXRlbXMKKworICAgIGRlZiBfYWRkaXRlbXMoc2VsZiwgaXRlbXMsIG1lbnUpOgorICAgICAgICBmcm9tIEZyYW1lV29yayBpbXBvcnQgU3ViTWVudSwgTWVudUl0ZW0KKyAgICAgICAgbWVudV9pZCA9IG1lbnUuaWQKKyAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgICAgICBpZiBpdGVtID09ICItIjoKKyAgICAgICAgICAgICAgICBtZW51LmFkZHNlcGFyYXRvcigpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgdHlwZShpdGVtKSA9PSBMaXN0VHlwZToKKyAgICAgICAgICAgICAgICBzdWJtZW51ID0gU3ViTWVudShtZW51LCBpdGVtWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuX2FkZGl0ZW1zKGl0ZW1bMTpdLCBzdWJtZW51KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHR5cGUoaXRlbSkgPT0gU3RyaW5nVHlwZToKKyAgICAgICAgICAgICAgICBtZW51aXRlbXRleHQgPSBvYmplY3QgPSBpdGVtCisgICAgICAgICAgICBlbGlmIHR5cGUoaXRlbSkgPT0gVHVwbGVUeXBlIGFuZCBsZW4oaXRlbSkgPT0gMjoKKyAgICAgICAgICAgICAgICBtZW51aXRlbXRleHQsIG9iamVjdCA9IGl0ZW0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgV2Jhc2UuV2lkZ2V0c0Vycm9yLCAiaWxsZWdhbCBpdGVtbGlzdCBmb3IgcG9wdXAgbWVudSIKKworICAgICAgICAgICAgaWYgbWVudWl0ZW10ZXh0WzoxXSA9PSAnXDAnOgorICAgICAgICAgICAgICAgIGNoZWNrID0gb3JkKG1lbnVpdGVtdGV4dFsxXSkKKyAgICAgICAgICAgICAgICBtZW51aXRlbXRleHQgPSBtZW51aXRlbXRleHRbMjpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNoZWNrID0gMAorICAgICAgICAgICAgbWVudWl0ZW0gPSBNZW51SXRlbShtZW51LCBtZW51aXRlbXRleHQsIE5vbmUsIE5vbmUpCisgICAgICAgICAgICBpZiBjaGVjazoKKyAgICAgICAgICAgICAgICBtZW51aXRlbS5jaGVjaygxKQorICAgICAgICAgICAgc2VsZi5faXRlbXNkaWN0WyhtZW51X2lkLCBtZW51aXRlbS5pdGVtKV0gPSBvYmplY3QKKworICAgIGRlZiBfZW1wdHltZW51KHNlbGYpOgorICAgICAgICBtZW51cyA9IHNlbGYuX3BhcmVudHdpbmRvdy5wYXJlbnQubWVudWJhci5tZW51cworICAgICAgICBmb3IgaWQsIGl0ZW0gaW4gc2VsZi5faXRlbXNkaWN0LmtleXMoKToKKyAgICAgICAgICAgIGlmIG1lbnVzLmhhc19rZXkoaWQpOgorICAgICAgICAgICAgICAgIHNlbGYubWVudSA9IG1lbnVzW2lkXQorICAgICAgICAgICAgICAgIHNlbGYubWVudS5kZWxldGUoKQorICAgICAgICBzZWxmLl9pdGVtc2RpY3QgPSB7fQorCisgICAgZGVmIF9tZW51X2NhbGxiYWNrKHNlbGYsIGlkLCBpdGVtKToKKyAgICAgICAgdGhpbmcgPSBzZWxmLl9pdGVtc2RpY3RbKGlkLCBpdGVtKV0KKyAgICAgICAgaWYgY2FsbGFibGUodGhpbmcpOgorICAgICAgICAgICAgdGhpbmcoKQorICAgICAgICBlbGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCB0aGluZykKIAogCiBjbGFzcyBQb3B1cE1lbnUoUG9wdXBXaWRnZXQpOgotCQotCSIiIlNpbXBsZSB0aXRsZS1sZXNzIHBvcHVwIHdpZGdldC4gU2hvdWxkIGJlIDE2eDE2IHBpeGVscy4gCi0JUHJlYnVpbGRzIHRoZSBtZW51IGl0ZW1zLCBnb29kIGZvciBzdGF0aWMgKG5vbiBjaGFuZ2luZykgcG9wdXAgbWVudXMuIiIiCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQlzZWxmLm1lbnUgPSBXYXBwbGljYXRpb24uTWVudShzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50Lm1lbnViYXIsICdGb28nLCAtMSkKLQkJc2VsZi5fYWRkaXRlbXMoc2VsZi5faXRlbXMsIHNlbGYubWVudSkKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYuX2VtcHR5bWVudSgpCi0JCVdiYXNlLldpZGdldC5jbG9zZShzZWxmKQotCQlzZWxmLl9pdGVtcyA9IE5vbmUKLQkJc2VsZi5faXRlbXNkaWN0ID0ge30KLQkJc2VsZi5tZW51ID0gTm9uZQotCQotCWRlZiBzZXQoc2VsZiwgaXRlbXMpOgotCQlpZiBzZWxmLl9pdGVtc2RpY3Q6Ci0JCQlzZWxmLl9lbXB0eW1lbnUoKQotCQlzZWxmLm1lbnUgPSBXYXBwbGljYXRpb24uTWVudShzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50Lm1lbnViYXIsICdGb28nLCAtMSkKLQkJc2VsZi5faXRlbXMgPSBpdGVtcwotCQlzZWxmLl9hZGRpdGVtcyhzZWxmLl9pdGVtcywgc2VsZi5tZW51KQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJc2VsZi5TZXRQb3J0KCkKLQkJbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcwotCQlsLCB0ID0gUWQuTG9jYWxUb0dsb2JhbCgobCsxLCB0KzEpKQotCQlXYmFzZS5TZXRDdXJzb3IoImFycm93IikKLQkJc2VsZi5tZW51Lm1lbnUuRW5hYmxlTWVudUl0ZW0oMCkKLQkJcmVwbHkgPSBzZWxmLm1lbnUubWVudS5Qb3BVcE1lbnVTZWxlY3QodCwgbCwgMSkKLQkJaWYgcmVwbHk6Ci0JCQlpZCA9IHJlcGx5ID4+IDE2Ci0JCQlpdGVtID0gcmVwbHkgJiAweGZmZmYKLQkJCXNlbGYuX21lbnVfY2FsbGJhY2soaWQsIGl0ZW0pCisKKyAgICAiIiJTaW1wbGUgdGl0bGUtbGVzcyBwb3B1cCB3aWRnZXQuIFNob3VsZCBiZSAxNngxNiBwaXhlbHMuCisgICAgUHJlYnVpbGRzIHRoZSBtZW51IGl0ZW1zLCBnb29kIGZvciBzdGF0aWMgKG5vbiBjaGFuZ2luZykgcG9wdXAgbWVudXMuIiIiCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisgICAgICAgIHNlbGYubWVudSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYuX3BhcmVudHdpbmRvdy5wYXJlbnQubWVudWJhciwgJ0ZvbycsIC0xKQorICAgICAgICBzZWxmLl9hZGRpdGVtcyhzZWxmLl9pdGVtcywgc2VsZi5tZW51KQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9lbXB0eW1lbnUoKQorICAgICAgICBXYmFzZS5XaWRnZXQuY2xvc2Uoc2VsZikKKyAgICAgICAgc2VsZi5faXRlbXMgPSBOb25lCisgICAgICAgIHNlbGYuX2l0ZW1zZGljdCA9IHt9CisgICAgICAgIHNlbGYubWVudSA9IE5vbmUKKworICAgIGRlZiBzZXQoc2VsZiwgaXRlbXMpOgorICAgICAgICBpZiBzZWxmLl9pdGVtc2RpY3Q6CisgICAgICAgICAgICBzZWxmLl9lbXB0eW1lbnUoKQorICAgICAgICBzZWxmLm1lbnUgPSBXYXBwbGljYXRpb24uTWVudShzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50Lm1lbnViYXIsICdGb28nLCAtMSkKKyAgICAgICAgc2VsZi5faXRlbXMgPSBpdGVtcworICAgICAgICBzZWxmLl9hZGRpdGVtcyhzZWxmLl9pdGVtcywgc2VsZi5tZW51KQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIGwsIHQgPSBRZC5Mb2NhbFRvR2xvYmFsKChsKzEsIHQrMSkpCisgICAgICAgIFdiYXNlLlNldEN1cnNvcigiYXJyb3ciKQorICAgICAgICBzZWxmLm1lbnUubWVudS5FbmFibGVNZW51SXRlbSgwKQorICAgICAgICByZXBseSA9IHNlbGYubWVudS5tZW51LlBvcFVwTWVudVNlbGVjdCh0LCBsLCAxKQorICAgICAgICBpZiByZXBseToKKyAgICAgICAgICAgIGlkID0gcmVwbHkgPj4gMTYKKyAgICAgICAgICAgIGl0ZW0gPSByZXBseSAmIDB4ZmZmZgorICAgICAgICAgICAgc2VsZi5fbWVudV9jYWxsYmFjayhpZCwgaXRlbSkKIAogCiBjbGFzcyBGb250TWVudShQb3B1cE1lbnUpOgotCQotCSIiIkEgZm9udCBwb3B1cCBtZW51LiIiIgotCQotCW1lbnUgPSBOb25lCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIGNhbGxiYWNrKToKLQkJUG9wdXBNZW51Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCi0JCV9tYWtlZm9udG1lbnUoKQotCQlzZWxmLl9jYWxsYmFjayA9IGNhbGxiYWNrCi0JCXNlbGYuX2VuYWJsZWQgPSAxCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJZGVsIHNlbGYuX2NhbGxiYWNrCi0JCi0JZGVmIHNldChzZWxmKToKLQkJcmFpc2UgV2Jhc2UuV2lkZ2V0c0Vycm9yLCAiY2FuJ3QgY2hhbmdlIGZvbnQgbWVudSB3aWRnZXQiCi0JCi0JZGVmIF9tZW51X2NhbGxiYWNrKHNlbGYsIGlkLCBpdGVtKToKLQkJZm9udG5hbWUgPSBzZWxmLm1lbnUubWVudS5HZXRNZW51SXRlbVRleHQoaXRlbSkKLQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQlXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsIGZvbnRuYW1lKQogCi0JZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlpZiBub3Qgc2VsZi5fZW5hYmxlZDoKLQkJCXJldHVybgotCQlfbWFrZWZvbnRtZW51KCkKLQkJcmV0dXJuIFBvcHVwTWVudS5jbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKQotCQorICAgICIiIkEgZm9udCBwb3B1cCBtZW51LiIiIgorCisgICAgbWVudSA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCBjYWxsYmFjayk6CisgICAgICAgIFBvcHVwTWVudS5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQorICAgICAgICBfbWFrZWZvbnRtZW51KCkKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjaworICAgICAgICBzZWxmLl9lbmFibGVkID0gMQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX2NhbGNib3VuZHMoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBkZWwgc2VsZi5fY2FsbGJhY2sKKworICAgIGRlZiBzZXQoc2VsZik6CisgICAgICAgIHJhaXNlIFdiYXNlLldpZGdldHNFcnJvciwgImNhbid0IGNoYW5nZSBmb250IG1lbnUgd2lkZ2V0IgorCisgICAgZGVmIF9tZW51X2NhbGxiYWNrKHNlbGYsIGlkLCBpdGVtKToKKyAgICAgICAgZm9udG5hbWUgPSBzZWxmLm1lbnUubWVudS5HZXRNZW51SXRlbVRleHQoaXRlbSkKKyAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICBXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsIGZvbnRuYW1lKQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBfbWFrZWZvbnRtZW51KCkKKyAgICAgICAgcmV0dXJuIFBvcHVwTWVudS5jbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKQorCiAKIGRlZiBfbWFrZWZvbnRtZW51KCk6Ci0JIiIiaGVscGVyIGZvciBmb250IG1lbnUiIiIKLQlpZiBGb250TWVudS5tZW51IGlzIG5vdCBOb25lOgotCQlyZXR1cm4KLQlpbXBvcnQgVwotCUZvbnRNZW51Lm1lbnUgPSBXYXBwbGljYXRpb24uTWVudShXLmdldGFwcGxpY2F0aW9uKCkubWVudWJhciwgJ0ZvbycsIC0xKQotCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JZm9yIGkgaW4gcmFuZ2UoRm9udE1lbnUubWVudS5tZW51LkNvdW50TWVudUl0ZW1zKCksIDAsIC0xKToKLQkJRm9udE1lbnUubWVudS5tZW51LkRlbGV0ZU1lbnVJdGVtKGkpCi0JRm9udE1lbnUubWVudS5tZW51LkFwcGVuZFJlc01lbnUoJ0ZPTkQnKQorICAgICIiImhlbHBlciBmb3IgZm9udCBtZW51IiIiCisgICAgaWYgRm9udE1lbnUubWVudSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuCisgICAgaW1wb3J0IFcKKyAgICBGb250TWVudS5tZW51ID0gV2FwcGxpY2F0aW9uLk1lbnUoVy5nZXRhcHBsaWNhdGlvbigpLm1lbnViYXIsICdGb28nLCAtMSkKKyAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgIGZvciBpIGluIHJhbmdlKEZvbnRNZW51Lm1lbnUubWVudS5Db3VudE1lbnVJdGVtcygpLCAwLCAtMSk6CisgICAgICAgIEZvbnRNZW51Lm1lbnUubWVudS5EZWxldGVNZW51SXRlbShpKQorICAgIEZvbnRNZW51Lm1lbnUubWVudS5BcHBlbmRSZXNNZW51KCdGT05EJykKIAogCiBkZWYgX2dldGZvbnRsaXN0KCk6Ci0JZnJvbSBDYXJib24gaW1wb3J0IFJlcwotCWZvbnRuYW1lcyA9IFtdCi0JZm9yIGkgaW4gcmFuZ2UoMSwgUmVzLkNvdW50UmVzb3VyY2VzKCdGT05EJykgKyAxKToKLQkJciA9IFJlcy5HZXRJbmRSZXNvdXJjZSgnRk9ORCcsIGkpCi0JCWZvbnRuYW1lcy5hcHBlbmQoci5HZXRSZXNJbmZvKClbMl0pCi0JcmV0dXJuIGZvbnRuYW1lcworICAgIGZyb20gQ2FyYm9uIGltcG9ydCBSZXMKKyAgICBmb250bmFtZXMgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKDEsIFJlcy5Db3VudFJlc291cmNlcygnRk9ORCcpICsgMSk6CisgICAgICAgIHIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ0ZPTkQnLCBpKQorICAgICAgICBmb250bmFtZXMuYXBwZW5kKHIuR2V0UmVzSW5mbygpWzJdKQorICAgIHJldHVybiBmb250bmFtZXMKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvV21pbmlhcHAucHkgYi9NYWMvVG9vbHMvSURFL1dtaW5pYXBwLnB5CmluZGV4IGUwOWUzMzQuLjBjNTE1ODMgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvV21pbmlhcHAucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9XbWluaWFwcC5weQpAQCAtNSwxOCArNSwxOCBAQAogaW1wb3J0IG9zCiAKIGNsYXNzIFRlc3RBcHAoV2FwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKToKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCWZyb20gQ2FyYm9uIGltcG9ydCBSZXMKLSMJCW1hY3Jlc291cmNlLm9wZW5fcGF0aG5hbWUoIldpZGdldHMucnNyYyIpCi0JCXNlbGYuX21lbnVzdG9jaGVjayA9IFtdCi0JCXNlbGYucHJlZmZpbGVwYXRoID0gb3MucGF0aC5qb2luKCJQeXRob24iLCAiUHl0aG9uSURFIHByZWZlcmVuY2VzIikKLQkJV2FwcGxpY2F0aW9uLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYsICdQeXRoJykKLQkJIyBvcGVuIGEgbmV3IHRleHQgZWRpdG9yCi0JCWltcG9ydCBQeUVkaXQKLQkJUHlFZGl0LkVkaXRvcigpCi0JCSMgc3RhcnQgdGhlIG1haW5sb29wCi0JCXNlbGYubWFpbmxvb3AoKQotCQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgUmVzCisjICAgICAgICAgICAgICAgbWFjcmVzb3VyY2Uub3Blbl9wYXRobmFtZSgiV2lkZ2V0cy5yc3JjIikKKyAgICAgICAgc2VsZi5fbWVudXN0b2NoZWNrID0gW10KKyAgICAgICAgc2VsZi5wcmVmZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oIlB5dGhvbiIsICJQeXRob25JREUgcHJlZmVyZW5jZXMiKQorICAgICAgICBXYXBwbGljYXRpb24uQXBwbGljYXRpb24uX19pbml0X18oc2VsZiwgJ1B5dGgnKQorICAgICAgICAjIG9wZW4gYSBuZXcgdGV4dCBlZGl0b3IKKyAgICAgICAgaW1wb3J0IFB5RWRpdAorICAgICAgICBQeUVkaXQuRWRpdG9yKCkKKyAgICAgICAgIyBzdGFydCB0aGUgbWFpbmxvb3AKKyAgICAgICAgc2VsZi5tYWlubG9vcCgpCisKIAogVGVzdEFwcCgpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1dxdWlja3RpbWUucHkgYi9NYWMvVG9vbHMvSURFL1dxdWlja3RpbWUucHkKaW5kZXggNDIxZDU1OC4uNjcxYWEwOSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9XcXVpY2t0aW1lLnB5CisrKyBiL01hYy9Ub29scy9JREUvV3F1aWNrdGltZS5weQpAQCAtOSwxMDYgKzksMTA1IEBACiBfbW92aWVzaW5pdGlhbGl6ZWQgPSAwCiAKIGRlZiBFbnRlck1vdmllcygpOgotCWdsb2JhbCBfbW92aWVzaW5pdGlhbGl6ZWQKLQlpZiBub3QgX21vdmllc2luaXRpYWxpemVkOgotCQlRdC5FbnRlck1vdmllcygpCi0JCV9tb3ZpZXNpbml0aWFsaXplZCA9IDEKKyAgICBnbG9iYWwgX21vdmllc2luaXRpYWxpemVkCisgICAgaWYgbm90IF9tb3ZpZXNpbml0aWFsaXplZDoKKyAgICAgICAgUXQuRW50ZXJNb3ZpZXMoKQorICAgICAgICBfbW92aWVzaW5pdGlhbGl6ZWQgPSAxCiAKIGNsYXNzIE1vdmllKFcuV2lkZ2V0KToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSk6Ci0JCUVudGVyTW92aWVzKCkKLQkJc2VsZi5tb3ZpZSA9IE5vbmUKLQkJc2VsZi5ydW5uaW5nID0gMAotCQlXLldpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQotCQotCWRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qob2xkYm91bmRzKQotCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCi0JCXNlbGYuY2FsY21vdmllYm94KCkKLQkKLQlkZWYgc2V0KHNlbGYsIHBhdGhfb3JfZnNzLCBzdGFydCA9IDApOgotCQlzZWxmLlNldFBvcnQoKQotCQlpZiBzZWxmLm1vdmllOgotCQkJI3NlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYubW92aWUuR2V0TW92aWVCb3goKSkKLQkJCVFkLlBhaW50UmVjdChzZWxmLm1vdmllLkdldE1vdmllQm94KCkpCi0JCXBhdGggPSBGaWxlLnBhdGhuYW1lKHBhdGgpCi0JCXNlbGYubW92aWV0aXRsZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKLQkJbW92aWVSZXNSZWYgPSBRdC5PcGVuTW92aWVGaWxlKHBhdGhfb3JfZnNzLCAxKQotCQlzZWxmLm1vdmllLCBkdW1teSwgZHVtbXkgPSBRdC5OZXdNb3ZpZUZyb21GaWxlKG1vdmllUmVzUmVmLCAwLCBRdWlja1RpbWUubmV3TW92aWVBY3RpdmUpCi0JCXNlbGYubW92aWVib3ggPSBzZWxmLm1vdmllLkdldE1vdmllQm94KCkKLQkJc2VsZi5jYWxjbW92aWVib3goKQotCQlRZC5PYnNjdXJlQ3Vyc29yKCkJIyBYWFggZG9lcyB0aGlzIHdvcmsgYXQgYWxsPwotCQlzZWxmLm1vdmllLkdvVG9CZWdpbm5pbmdPZk1vdmllKCkKLQkJaWYgc3RhcnQ6Ci0JCQlzZWxmLm1vdmllLlN0YXJ0TW92aWUoKQotCQkJc2VsZi5ydW5uaW5nID0gMQotCQllbHNlOgotCQkJc2VsZi5ydW5uaW5nID0gMAotCQkJc2VsZi5tb3ZpZS5Nb3ZpZXNUYXNrKDApCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYubW92aWUKLQkKLQlkZWYgZ2V0bW92aWV0aXRsZShzZWxmKToKLQkJcmV0dXJuIHNlbGYubW92aWV0aXRsZQotCQotCWRlZiBzdGFydChzZWxmKToKLQkJaWYgc2VsZi5tb3ZpZToKLQkJCVFkLk9ic2N1cmVDdXJzb3IoKQotCQkJc2VsZi5tb3ZpZS5TdGFydE1vdmllKCkKLQkJCXNlbGYucnVubmluZyA9IDEKLQkKLQlkZWYgc3RvcChzZWxmKToKLQkJaWYgc2VsZi5tb3ZpZToKLQkJCXNlbGYubW92aWUuU3RvcE1vdmllKCkKLQkJCXNlbGYucnVubmluZyA9IDAKLQkKLQlkZWYgcmV3aW5kKHNlbGYpOgotCQlpZiBzZWxmLm1vdmllOgotCQkJc2VsZi5tb3ZpZS5Hb1RvQmVnaW5uaW5nT2ZNb3ZpZSgpCi0JCi0JZGVmIGNhbGNtb3ZpZWJveChzZWxmKToKLQkJaWYgbm90IHNlbGYubW92aWU6Ci0JCQlyZXR1cm4KLQkJbWwsIG10LCBtciwgbWIgPSBzZWxmLm1vdmllYm94Ci0JCXdsLCB3dCwgd3IsIHdiID0gd2lkZ2V0Ym94ID0gc2VsZi5fYm91bmRzCi0JCW1oZWlnaHQgPSBtYiAtIG10Ci0JCW13aWR0aCA9IG1yIC0gbWwKLQkJd2hlaWdodCA9IHdiIC0gd3QKLQkJd3dpZHRoID0gd3IgLSB3bAotCQlpZiAobWhlaWdodCAqIDIgPCB3aGVpZ2h0KSBhbmQgKG13aWR0aCAqIDIgPCB3d2lkdGgpOgotCQkJc2NhbGUgPSAyCi0JCWVsaWYgbWhlaWdodCA+IHdoZWlnaHQgb3IgbXdpZHRoID4gd3dpZHRoOgotCQkJc2NhbGUgPSBtaW4oZmxvYXQod2hlaWdodCkgLyBtaGVpZ2h0LCBmbG9hdCh3d2lkdGgpIC8gbXdpZHRoKQotCQllbHNlOgotCQkJc2NhbGUgPSAxCi0JCW13aWR0aCwgbWhlaWdodCA9IG13aWR0aCAqIHNjYWxlLCBtaGVpZ2h0ICogc2NhbGUKLQkJbWwsIG10ID0gd2wgKyAod3dpZHRoIC0gbXdpZHRoKSAvIDIsIHd0ICsgKHdoZWlnaHQgLSBtaGVpZ2h0KSAvIDIKLQkJbXIsIG1iID0gbWwgKyBtd2lkdGgsIG10ICsgbWhlaWdodAotCQlzZWxmLm1vdmllLlNldE1vdmllQm94KChtbCwgbXQsIG1yLCBtYikpCi0JCi0JZGVmIGlkbGUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLm1vdmllOgotCQkJaWYgbm90IHNlbGYubW92aWUuSXNNb3ZpZURvbmUoKSBhbmQgc2VsZi5ydW5uaW5nOgotCQkJCVFkLk9ic2N1cmVDdXJzb3IoKQotCQkJCXdoaWxlIDE6Ci0JCQkJCXNlbGYubW92aWUuTW92aWVzVGFzaygwKQotCQkJCQlnb3RvbmUsIGV2ZW50ID0gRXZ0LkV2ZW50QXZhaWwoRXZlbnRzLmV2ZXJ5RXZlbnQpCi0JCQkJCWlmIGdvdG9uZSBvciBzZWxmLm1vdmllLklzTW92aWVEb25lKCk6Ci0JCQkJCQlicmVhawotCQkJZWxpZiBzZWxmLnJ1bm5pbmc6Ci0JCQkJYm94ID0gc2VsZi5tb3ZpZS5HZXRNb3ZpZUJveCgpCi0JCQkJc2VsZi5TZXRQb3J0KCkKLQkJCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChib3gpCi0JCQkJc2VsZi5tb3ZpZSA9IE5vbmUKLQkJCQlzZWxmLnJ1bm5pbmcgPSAwCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQlRZC5QYWludFJlY3Qoc2VsZi5fYm91bmRzKQotCQkJaWYgc2VsZi5tb3ZpZToKLQkJCQlzZWxmLm1vdmllLlVwZGF0ZU1vdmllKCkKLQkJCQlzZWxmLm1vdmllLk1vdmllc1Rhc2soMCkKIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplKToKKyAgICAgICAgRW50ZXJNb3ZpZXMoKQorICAgICAgICBzZWxmLm1vdmllID0gTm9uZQorICAgICAgICBzZWxmLnJ1bm5pbmcgPSAwCisgICAgICAgIFcuV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCisKKyAgICBkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG9sZGJvdW5kcykKKyAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qoc2VsZi5fYm91bmRzKQorICAgICAgICBzZWxmLmNhbGNtb3ZpZWJveCgpCisKKyAgICBkZWYgc2V0KHNlbGYsIHBhdGhfb3JfZnNzLCBzdGFydCA9IDApOgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBpZiBzZWxmLm1vdmllOgorICAgICAgICAgICAgI3NlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYubW92aWUuR2V0TW92aWVCb3goKSkKKyAgICAgICAgICAgIFFkLlBhaW50UmVjdChzZWxmLm1vdmllLkdldE1vdmllQm94KCkpCisgICAgICAgIHBhdGggPSBGaWxlLnBhdGhuYW1lKHBhdGgpCisgICAgICAgIHNlbGYubW92aWV0aXRsZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKKyAgICAgICAgbW92aWVSZXNSZWYgPSBRdC5PcGVuTW92aWVGaWxlKHBhdGhfb3JfZnNzLCAxKQorICAgICAgICBzZWxmLm1vdmllLCBkdW1teSwgZHVtbXkgPSBRdC5OZXdNb3ZpZUZyb21GaWxlKG1vdmllUmVzUmVmLCAwLCBRdWlja1RpbWUubmV3TW92aWVBY3RpdmUpCisgICAgICAgIHNlbGYubW92aWVib3ggPSBzZWxmLm1vdmllLkdldE1vdmllQm94KCkKKyAgICAgICAgc2VsZi5jYWxjbW92aWVib3goKQorICAgICAgICBRZC5PYnNjdXJlQ3Vyc29yKCkgICAgICAjIFhYWCBkb2VzIHRoaXMgd29yayBhdCBhbGw/CisgICAgICAgIHNlbGYubW92aWUuR29Ub0JlZ2lubmluZ09mTW92aWUoKQorICAgICAgICBpZiBzdGFydDoKKyAgICAgICAgICAgIHNlbGYubW92aWUuU3RhcnRNb3ZpZSgpCisgICAgICAgICAgICBzZWxmLnJ1bm5pbmcgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJ1bm5pbmcgPSAwCisgICAgICAgICAgICBzZWxmLm1vdmllLk1vdmllc1Rhc2soMCkKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1vdmllCisKKyAgICBkZWYgZ2V0bW92aWV0aXRsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubW92aWV0aXRsZQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1vdmllOgorICAgICAgICAgICAgUWQuT2JzY3VyZUN1cnNvcigpCisgICAgICAgICAgICBzZWxmLm1vdmllLlN0YXJ0TW92aWUoKQorICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gMQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIGlmIHNlbGYubW92aWU6CisgICAgICAgICAgICBzZWxmLm1vdmllLlN0b3BNb3ZpZSgpCisgICAgICAgICAgICBzZWxmLnJ1bm5pbmcgPSAwCisKKyAgICBkZWYgcmV3aW5kKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1vdmllOgorICAgICAgICAgICAgc2VsZi5tb3ZpZS5Hb1RvQmVnaW5uaW5nT2ZNb3ZpZSgpCisKKyAgICBkZWYgY2FsY21vdmllYm94KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5tb3ZpZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtbCwgbXQsIG1yLCBtYiA9IHNlbGYubW92aWVib3gKKyAgICAgICAgd2wsIHd0LCB3ciwgd2IgPSB3aWRnZXRib3ggPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgbWhlaWdodCA9IG1iIC0gbXQKKyAgICAgICAgbXdpZHRoID0gbXIgLSBtbAorICAgICAgICB3aGVpZ2h0ID0gd2IgLSB3dAorICAgICAgICB3d2lkdGggPSB3ciAtIHdsCisgICAgICAgIGlmIChtaGVpZ2h0ICogMiA8IHdoZWlnaHQpIGFuZCAobXdpZHRoICogMiA8IHd3aWR0aCk6CisgICAgICAgICAgICBzY2FsZSA9IDIKKyAgICAgICAgZWxpZiBtaGVpZ2h0ID4gd2hlaWdodCBvciBtd2lkdGggPiB3d2lkdGg6CisgICAgICAgICAgICBzY2FsZSA9IG1pbihmbG9hdCh3aGVpZ2h0KSAvIG1oZWlnaHQsIGZsb2F0KHd3aWR0aCkgLyBtd2lkdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzY2FsZSA9IDEKKyAgICAgICAgbXdpZHRoLCBtaGVpZ2h0ID0gbXdpZHRoICogc2NhbGUsIG1oZWlnaHQgKiBzY2FsZQorICAgICAgICBtbCwgbXQgPSB3bCArICh3d2lkdGggLSBtd2lkdGgpIC8gMiwgd3QgKyAod2hlaWdodCAtIG1oZWlnaHQpIC8gMgorICAgICAgICBtciwgbWIgPSBtbCArIG13aWR0aCwgbXQgKyBtaGVpZ2h0CisgICAgICAgIHNlbGYubW92aWUuU2V0TW92aWVCb3goKG1sLCBtdCwgbXIsIG1iKSkKKworICAgIGRlZiBpZGxlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5tb3ZpZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLm1vdmllLklzTW92aWVEb25lKCkgYW5kIHNlbGYucnVubmluZzoKKyAgICAgICAgICAgICAgICBRZC5PYnNjdXJlQ3Vyc29yKCkKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1vdmllLk1vdmllc1Rhc2soMCkKKyAgICAgICAgICAgICAgICAgICAgZ290b25lLCBldmVudCA9IEV2dC5FdmVudEF2YWlsKEV2ZW50cy5ldmVyeUV2ZW50KQorICAgICAgICAgICAgICAgICAgICBpZiBnb3RvbmUgb3Igc2VsZi5tb3ZpZS5Jc01vdmllRG9uZSgpOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgc2VsZi5ydW5uaW5nOgorICAgICAgICAgICAgICAgIGJveCA9IHNlbGYubW92aWUuR2V0TW92aWVCb3goKQorICAgICAgICAgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3QoYm94KQorICAgICAgICAgICAgICAgIHNlbGYubW92aWUgPSBOb25lCisgICAgICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gMAorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBRZC5QYWludFJlY3Qoc2VsZi5fYm91bmRzKQorICAgICAgICAgICAgaWYgc2VsZi5tb3ZpZToKKyAgICAgICAgICAgICAgICBzZWxmLm1vdmllLlVwZGF0ZU1vdmllKCkKKyAgICAgICAgICAgICAgICBzZWxmLm1vdmllLk1vdmllc1Rhc2soMCkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvV3NvY2tldC5weSBiL01hYy9Ub29scy9JREUvV3NvY2tldC5weQppbmRleCA5MTM3OTdjLi5lYjU5MzZkIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1dzb2NrZXQucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9Xc29ja2V0LnB5CkBAIC0xNywzNzUgKzE3LDM3NSBAQAogVkVSQk9TRSA9IDEKIAogY2xhc3MgU2VydmVyKGFzeW5jb3JlLmRpc3BhdGNoZXIpOgotCQotCSIiIkdlbmVyaWMgYXN5bmNocm9ub3VzIHNlcnZlciBjbGFzcyIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3J0LCBoYW5kbGVyX2NsYXNzLCBiYWNrbG9nPTEsIGhvc3Q9IiIpOgotCQkiIiJhcmd1bWVudHM6Ci0JCS0gcG9ydDogdGhlIHBvcnQgdG8gbGlzdGVuIHRvCi0JCS0gaGFuZGxlcl9jbGFzczogY2xhc3MgdG8gaGFuZGxlIHJlcXVlc3RzCi0JCS0gYmFja2xvZzogYmFja2xvZyBxdWV1ZSBzaXplIChvcHRpb25hbCkgKGRvbid0IGZ1bGx5IHVuZGVyc3RhbmQsIHNlZSBzb2NrZXQgZG9jcykKLQkJLSBob3N0OiBob3N0IG5hbWUgKG9wdGlvbmFsOiBjYW4gYmUgZW1wdHkgdG8gdXNlIGRlZmF1bHQgaG9zdCBuYW1lKQotCQkiIiIKLQkJaWYgVkVSQk9TRToKLQkJCXByaW50ICJTdGFydGluZyIsIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCi0JCXNlbGYuaGFuZGxlcl9jbGFzcyA9IGhhbmRsZXJfY2xhc3MKLQkJYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmKQotCQlzZWxmLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLQkJc2VsZi5iaW5kKChob3N0LCBwb3J0KSkKLQkJc2VsZi5saXN0ZW4oYmFja2xvZykKLQkKLQlkZWYgaGFuZGxlX2FjY2VwdChzZWxmKToKLQkJY29ubiwgYWRkciA9IHNlbGYuYWNjZXB0KCkKLQkJaWYgVkVSQk9TRToKLQkJCXByaW50ICdJbmNvbWluZyBDb25uZWN0aW9uIGZyb20gJXM6JWQnICUgYWRkcgotCQlzZWxmLmhhbmRsZXJfY2xhc3MoY29ubikKKworICAgICIiIkdlbmVyaWMgYXN5bmNocm9ub3VzIHNlcnZlciBjbGFzcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQsIGhhbmRsZXJfY2xhc3MsIGJhY2tsb2c9MSwgaG9zdD0iIik6CisgICAgICAgICIiImFyZ3VtZW50czoKKyAgICAgICAgLSBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gdG8KKyAgICAgICAgLSBoYW5kbGVyX2NsYXNzOiBjbGFzcyB0byBoYW5kbGUgcmVxdWVzdHMKKyAgICAgICAgLSBiYWNrbG9nOiBiYWNrbG9nIHF1ZXVlIHNpemUgKG9wdGlvbmFsKSAoZG9uJ3QgZnVsbHkgdW5kZXJzdGFuZCwgc2VlIHNvY2tldCBkb2NzKQorICAgICAgICAtIGhvc3Q6IGhvc3QgbmFtZSAob3B0aW9uYWw6IGNhbiBiZSBlbXB0eSB0byB1c2UgZGVmYXVsdCBob3N0IG5hbWUpCisgICAgICAgICIiIgorICAgICAgICBpZiBWRVJCT1NFOgorICAgICAgICAgICAgcHJpbnQgIlN0YXJ0aW5nIiwgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgc2VsZi5oYW5kbGVyX2NsYXNzID0gaGFuZGxlcl9jbGFzcworICAgICAgICBhc3luY29yZS5kaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY3JlYXRlX3NvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmJpbmQoKGhvc3QsIHBvcnQpKQorICAgICAgICBzZWxmLmxpc3RlbihiYWNrbG9nKQorCisgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLmFjY2VwdCgpCisgICAgICAgIGlmIFZFUkJPU0U6CisgICAgICAgICAgICBwcmludCAnSW5jb21pbmcgQ29ubmVjdGlvbiBmcm9tICVzOiVkJyAlIGFkZHIKKyAgICAgICAgc2VsZi5oYW5kbGVyX2NsYXNzKGNvbm4pCiAKIAogY2xhc3MgUHJveHlTZXJ2ZXIoU2VydmVyKToKLQkKLQkiIiJHZW5lcmljIHByb3h5IHNlcnZlciBjbGFzcyIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3J0LCBoYW5kbGVyX2NsYXNzLCBwcm94eWFkZHI9Tm9uZSwgY2xvc2VwYXJ0bmVycz0wKToKLQkJIiIiYXJndW1lbnRzOgotCQktIHBvcnQ6IHRoZSBwb3J0IHRvIGxpc3RlbiB0bwotCQktIGhhbmRsZXJfY2xhc3M6IHByb3h5IGNsYXNzIHRvIGhhbmRsZSByZXF1ZXN0cwotCQktIHByb3h5YWRkcjogYSB0dXBsZSBjb250YWluaW5nIHRoZSBhZGRyZXNzIGFuZCAKLQkJICBwb3J0IG9mIGEgcmVtb3RlIGhvc3QgdG8gY29ubmVjdCB0byAob3B0aW9uYWwpCi0JCS0gY2xvc2VwYXJ0bmVyczogYm9vbGVhbiwgc3BlY2lmaWVzIHdoZXRoZXIgd2Ugc2hvdWxkIGNsb3NlCi0JCSAgYWxsIHByb3h5IGNvbm5lY3Rpb25zIG9yIG5vdCAob3B0aW9uYWwpLiBodHRwIHNlZW1zIHRvICpub3QqCi0JCSAgd2FudCB0aGlzLCBidXQgdGVsbmV0IGRvZXMuLi4KLQkJIiIiCi0JCVNlcnZlci5fX2luaXRfXyhzZWxmLCBwb3J0LCBoYW5kbGVyX2NsYXNzLCAxLCAiIikKLQkJc2VsZi5wcm94eWFkZHIgPSBwcm94eWFkZHIKLQkJc2VsZi5jbG9zZXBhcnRuZXJzID0gY2xvc2VwYXJ0bmVycwotCQotCWRlZiBoYW5kbGVfYWNjZXB0KHNlbGYpOgotCQljb25uLCBhZGRyID0gc2VsZi5hY2NlcHQoKQotCQlpZiBWRVJCT1NFOgotCQkJcHJpbnQgJ0luY29taW5nIENvbm5lY3Rpb24gZnJvbSAlczolZCcgJSBhZGRyCi0JCXNlbGYuaGFuZGxlcl9jbGFzcyhjb25uLCBzZWxmLnByb3h5YWRkciwgY2xvc2VwYXJ0bmVyPXNlbGYuY2xvc2VwYXJ0bmVycykKKworICAgICIiIkdlbmVyaWMgcHJveHkgc2VydmVyIGNsYXNzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydCwgaGFuZGxlcl9jbGFzcywgcHJveHlhZGRyPU5vbmUsIGNsb3NlcGFydG5lcnM9MCk6CisgICAgICAgICIiImFyZ3VtZW50czoKKyAgICAgICAgLSBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gdG8KKyAgICAgICAgLSBoYW5kbGVyX2NsYXNzOiBwcm94eSBjbGFzcyB0byBoYW5kbGUgcmVxdWVzdHMKKyAgICAgICAgLSBwcm94eWFkZHI6IGEgdHVwbGUgY29udGFpbmluZyB0aGUgYWRkcmVzcyBhbmQKKyAgICAgICAgICBwb3J0IG9mIGEgcmVtb3RlIGhvc3QgdG8gY29ubmVjdCB0byAob3B0aW9uYWwpCisgICAgICAgIC0gY2xvc2VwYXJ0bmVyczogYm9vbGVhbiwgc3BlY2lmaWVzIHdoZXRoZXIgd2Ugc2hvdWxkIGNsb3NlCisgICAgICAgICAgYWxsIHByb3h5IGNvbm5lY3Rpb25zIG9yIG5vdCAob3B0aW9uYWwpLiBodHRwIHNlZW1zIHRvICpub3QqCisgICAgICAgICAgd2FudCB0aGlzLCBidXQgdGVsbmV0IGRvZXMuLi4KKyAgICAgICAgIiIiCisgICAgICAgIFNlcnZlci5fX2luaXRfXyhzZWxmLCBwb3J0LCBoYW5kbGVyX2NsYXNzLCAxLCAiIikKKyAgICAgICAgc2VsZi5wcm94eWFkZHIgPSBwcm94eWFkZHIKKyAgICAgICAgc2VsZi5jbG9zZXBhcnRuZXJzID0gY2xvc2VwYXJ0bmVycworCisgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLmFjY2VwdCgpCisgICAgICAgIGlmIFZFUkJPU0U6CisgICAgICAgICAgICBwcmludCAnSW5jb21pbmcgQ29ubmVjdGlvbiBmcm9tICVzOiVkJyAlIGFkZHIKKyAgICAgICAgc2VsZi5oYW5kbGVyX2NsYXNzKGNvbm4sIHNlbGYucHJveHlhZGRyLCBjbG9zZXBhcnRuZXI9c2VsZi5jbG9zZXBhcnRuZXJzKQogCiAKIGNsYXNzIENvbm5lY3Rpb24oYXN5bmNvcmUuZGlzcGF0Y2hlcik6Ci0JCi0JIiIiR2VuZXJpYyBjb25uZWN0aW9uIGNsYXNzIiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcz1Ob25lLCByZWFkZnVuYz1Ob25lLCB0ZXJtaW5hdG9yPU5vbmUpOgotCQkiIiJhcmd1bWVudHM6IAotCQktIHNvY2tfb3JfYWRkcmVzczogZWl0aGVyIGEgc29ja2V0LCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWUgCi0JCWFuZCBwb3J0IG51bWJlciBvZiBhIHJlbW90ZSBob3N0Ci0JCS0gcmVhZGZ1bmM6IGNhbGxiYWNrIGZ1bmN0aW9uIChvcHRpb25hbCkuIFdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyCi0JCSAgdGhlcmUgaXMgc29tZSBkYXRhIGF2YWlsYWJsZSwgb3Igd2hlbiBhbiBhcHByb3ByYWl0ZSB0ZXJtaW5hdG9yCi0JCSAgaXMgZm91bmQuCi0JCS0gdGVybWluYXRvcjogc3RyaW5nIHdoaWNoIHNwZWNpZmllcyB3aGVuIGEgcmVhZCBpcyBjb21wbGV0ZSAob3B0aW9uYWwpIiIiCi0JCXNlbGYuX291dF9idWZmZXIgPSAiIgotCQlzZWxmLl9pbl9idWZmZXIgPSAiIgotCQlzZWxmLnJlYWRmdW5jID0gcmVhZGZ1bmMKLQkJc2VsZi50ZXJtaW5hdG9yID0gdGVybWluYXRvcgotCQlhc3luY29yZS5kaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYpCi0JCWlmIGhhc2F0dHIoc29ja19vcl9hZGRyZXNzLCAiZmlsZW5vIik6Ci0JCQlzZWxmLnNldF9zb2NrZXQoc29ja19vcl9hZGRyZXNzKQotCQllbHNlOgotCQkJc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLQkJCXNvY2suc2V0YmxvY2tpbmcoMCkKLQkJCXNlbGYuc2V0X3NvY2tldChzb2NrKQotCQkJaWYgc29ja19vcl9hZGRyZXNzOgotCQkJCXNlbGYuY29ubmVjdChzb2NrX29yX2FkZHJlc3MpCi0JCi0JIyBwdWJsaWMgbWV0aG9kcwotCWRlZiBzZW5kKHNlbGYsIGRhdGEpOgotCQlzZWxmLl9vdXRfYnVmZmVyID0gc2VsZi5fb3V0X2J1ZmZlciArIGRhdGEKLQkKLQlkZWYgcmVjdihzZWxmLCBieXRlcz0tMSk6Ci0JCWlmIGJ5dGVzID09IC0xOgotCQkJYnl0ZXMgPSBsZW4oc2VsZi5faW5fYnVmZmVyKQotCQlkYXRhID0gc2VsZi5faW5fYnVmZmVyWzpieXRlc10KLQkJc2VsZi5faW5fYnVmZmVyID0gc2VsZi5faW5fYnVmZmVyW2J5dGVzOl0KLQkJcmV0dXJuIGRhdGEKLQkKLQlkZWYgc2V0X3Rlcm1pbmF0b3Ioc2VsZiwgdGVybWluYXRvcik6Ci0JCXNlbGYudGVybWluYXRvciA9IHRlcm1pbmF0b3IKLQkKLQkjIG92ZXJyaWRlIHRoaXMgaWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgaW5jb21pbmcgZGF0YSBzdHJlYW0gCi0JZGVmIGhhbmRsZV9pbmNvbWluZ19kYXRhKHNlbGYsIGRhdGEpOgotCQlpZiBzZWxmLnJlYWRmdW5jOgotCQkJaWYgc2VsZi50ZXJtaW5hdG9yOgotCQkJCXNlbGYuX2luX2J1ZmZlciA9IHNlbGYuX2luX2J1ZmZlciArIGRhdGEKLQkJCQlwb3MgPSBzdHJpbmcuZmluZChzZWxmLl9pbl9idWZmZXIsIHNlbGYudGVybWluYXRvcikKLQkJCQlpZiBwb3MgPCAwOgotCQkJCQlyZXR1cm4KLQkJCQlkYXRhID0gc2VsZi5faW5fYnVmZmVyWzpwb3NdCi0JCQkJc2VsZi5faW5fYnVmZmVyID0gc2VsZi5faW5fYnVmZmVyW3BvcyArIGxlbihzZWxmLnRlcm1pbmF0b3IpOl0KLQkJCQlzZWxmLnJlYWRmdW5jKGRhdGEpCi0JCQllbHNlOgotCQkJCXNlbGYucmVhZGZ1bmMoc2VsZi5faW5fYnVmZmVyICsgZGF0YSkKLQkJCQlzZWxmLl9pbl9idWZmZXIgPSAiIgotCQllbHNlOgotCQkJc2VsZi5faW5fYnVmZmVyID0gc2VsZi5faW5fYnVmZmVyICsgZGF0YQotCQotCSMgaW50ZXJuYWwgbXVjawotCWRlZiBoYW5kbGVfcmVhZChzZWxmKToKLQkJZGF0YSA9IGFzeW5jb3JlLmRpc3BhdGNoZXIucmVjdihzZWxmLCBCVUZTSVpFKQotCQlpZiBkYXRhOgotCQkJaWYgVkVSQk9TRSA+IDI6Ci0JCQkJcHJpbnQgImluY29taW5nIC0+ICV4ICVyIiAlIChpZChzZWxmKSwgZGF0YSkKLQkJCXNlbGYuaGFuZGxlX2luY29taW5nX2RhdGEoZGF0YSkKLQkKLQlkZWYgaGFuZGxlX3dyaXRlKHNlbGYpOgotCQlpZiBzZWxmLl9vdXRfYnVmZmVyOgotCQkJc2VudCA9IHNlbGYuc29ja2V0LnNlbmQoc2VsZi5fb3V0X2J1ZmZlcls6QlVGU0laRV0pCi0JCQlpZiBWRVJCT1NFID4gMjoKLQkJCQlwcmludCAib3V0Z29pbmcgLT4gJXggJXIiICUgKGlkKHNlbGYpLCBzZWxmLl9vdXRfYnVmZmVyWzpzZW50XSkKLQkJCXNlbGYuX291dF9idWZmZXIgPSBzZWxmLl9vdXRfYnVmZmVyW3NlbnQ6XQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgc2VsZi5yZWFkZnVuYyBhbmQgc2VsZi5faW5fYnVmZmVyOgotCQkJc2VsZi5yZWFkZnVuYyhzZWxmLl9pbl9idWZmZXIpCi0JCQlzZWxmLl9pbl9idWZmZXIgPSAiIgotCQkjZWxpZiBWRVJCT1NFID4gMSBhbmQgc2VsZi5faW5fYnVmZmVyOgotCQkjCXByaW50ICItLS0gdGhlcmUgaXMgdW5yZWFkIGRhdGE6ICVyIiwgKHNlbGYuX2luX2J1ZmZlciwpCi0JCWFzeW5jb3JlLmRpc3BhdGNoZXIuY2xvc2Uoc2VsZikKLQkKLQlkZWYgaGFuZGxlX2Nsb3NlKHNlbGYpOgotCQlzZWxmLmNsb3NlKCkKLQkKLQlkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZik6Ci0JCXBhc3MKKworICAgICIiIkdlbmVyaWMgY29ubmVjdGlvbiBjbGFzcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcz1Ob25lLCByZWFkZnVuYz1Ob25lLCB0ZXJtaW5hdG9yPU5vbmUpOgorICAgICAgICAiIiJhcmd1bWVudHM6CisgICAgICAgIC0gc29ja19vcl9hZGRyZXNzOiBlaXRoZXIgYSBzb2NrZXQsIG9yIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZQorICAgICAgICBhbmQgcG9ydCBudW1iZXIgb2YgYSByZW1vdGUgaG9zdAorICAgICAgICAtIHJlYWRmdW5jOiBjYWxsYmFjayBmdW5jdGlvbiAob3B0aW9uYWwpLiBXaWxsIGJlIGNhbGxlZCB3aGVuZXZlcgorICAgICAgICAgIHRoZXJlIGlzIHNvbWUgZGF0YSBhdmFpbGFibGUsIG9yIHdoZW4gYW4gYXBwcm9wcmFpdGUgdGVybWluYXRvcgorICAgICAgICAgIGlzIGZvdW5kLgorICAgICAgICAtIHRlcm1pbmF0b3I6IHN0cmluZyB3aGljaCBzcGVjaWZpZXMgd2hlbiBhIHJlYWQgaXMgY29tcGxldGUgKG9wdGlvbmFsKSIiIgorICAgICAgICBzZWxmLl9vdXRfYnVmZmVyID0gIiIKKyAgICAgICAgc2VsZi5faW5fYnVmZmVyID0gIiIKKyAgICAgICAgc2VsZi5yZWFkZnVuYyA9IHJlYWRmdW5jCisgICAgICAgIHNlbGYudGVybWluYXRvciA9IHRlcm1pbmF0b3IKKyAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBpZiBoYXNhdHRyKHNvY2tfb3JfYWRkcmVzcywgImZpbGVubyIpOgorICAgICAgICAgICAgc2VsZi5zZXRfc29ja2V0KHNvY2tfb3JfYWRkcmVzcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICBzb2NrLnNldGJsb2NraW5nKDApCisgICAgICAgICAgICBzZWxmLnNldF9zb2NrZXQoc29jaykKKyAgICAgICAgICAgIGlmIHNvY2tfb3JfYWRkcmVzczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbm5lY3Qoc29ja19vcl9hZGRyZXNzKQorCisgICAgIyBwdWJsaWMgbWV0aG9kcworICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9vdXRfYnVmZmVyID0gc2VsZi5fb3V0X2J1ZmZlciArIGRhdGEKKworICAgIGRlZiByZWN2KHNlbGYsIGJ5dGVzPS0xKToKKyAgICAgICAgaWYgYnl0ZXMgPT0gLTE6CisgICAgICAgICAgICBieXRlcyA9IGxlbihzZWxmLl9pbl9idWZmZXIpCisgICAgICAgIGRhdGEgPSBzZWxmLl9pbl9idWZmZXJbOmJ5dGVzXQorICAgICAgICBzZWxmLl9pbl9idWZmZXIgPSBzZWxmLl9pbl9idWZmZXJbYnl0ZXM6XQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIHNldF90ZXJtaW5hdG9yKHNlbGYsIHRlcm1pbmF0b3IpOgorICAgICAgICBzZWxmLnRlcm1pbmF0b3IgPSB0ZXJtaW5hdG9yCisKKyAgICAjIG92ZXJyaWRlIHRoaXMgaWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgaW5jb21pbmcgZGF0YSBzdHJlYW0KKyAgICBkZWYgaGFuZGxlX2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIHNlbGYucmVhZGZ1bmM6CisgICAgICAgICAgICBpZiBzZWxmLnRlcm1pbmF0b3I6CisgICAgICAgICAgICAgICAgc2VsZi5faW5fYnVmZmVyID0gc2VsZi5faW5fYnVmZmVyICsgZGF0YQorICAgICAgICAgICAgICAgIHBvcyA9IHN0cmluZy5maW5kKHNlbGYuX2luX2J1ZmZlciwgc2VsZi50ZXJtaW5hdG9yKQorICAgICAgICAgICAgICAgIGlmIHBvcyA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9pbl9idWZmZXJbOnBvc10KKyAgICAgICAgICAgICAgICBzZWxmLl9pbl9idWZmZXIgPSBzZWxmLl9pbl9idWZmZXJbcG9zICsgbGVuKHNlbGYudGVybWluYXRvcik6XQorICAgICAgICAgICAgICAgIHNlbGYucmVhZGZ1bmMoZGF0YSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkZnVuYyhzZWxmLl9pbl9idWZmZXIgKyBkYXRhKQorICAgICAgICAgICAgICAgIHNlbGYuX2luX2J1ZmZlciA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9pbl9idWZmZXIgPSBzZWxmLl9pbl9idWZmZXIgKyBkYXRhCisKKyAgICAjIGludGVybmFsIG11Y2sKKyAgICBkZWYgaGFuZGxlX3JlYWQoc2VsZik6CisgICAgICAgIGRhdGEgPSBhc3luY29yZS5kaXNwYXRjaGVyLnJlY3Yoc2VsZiwgQlVGU0laRSkKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIGlmIFZFUkJPU0UgPiAyOgorICAgICAgICAgICAgICAgIHByaW50ICJpbmNvbWluZyAtPiAleCAlciIgJSAoaWQoc2VsZiksIGRhdGEpCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9pbmNvbWluZ19kYXRhKGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX3dyaXRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9vdXRfYnVmZmVyOgorICAgICAgICAgICAgc2VudCA9IHNlbGYuc29ja2V0LnNlbmQoc2VsZi5fb3V0X2J1ZmZlcls6QlVGU0laRV0pCisgICAgICAgICAgICBpZiBWRVJCT1NFID4gMjoKKyAgICAgICAgICAgICAgICBwcmludCAib3V0Z29pbmcgLT4gJXggJXIiICUgKGlkKHNlbGYpLCBzZWxmLl9vdXRfYnVmZmVyWzpzZW50XSkKKyAgICAgICAgICAgIHNlbGYuX291dF9idWZmZXIgPSBzZWxmLl9vdXRfYnVmZmVyW3NlbnQ6XQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJlYWRmdW5jIGFuZCBzZWxmLl9pbl9idWZmZXI6CisgICAgICAgICAgICBzZWxmLnJlYWRmdW5jKHNlbGYuX2luX2J1ZmZlcikKKyAgICAgICAgICAgIHNlbGYuX2luX2J1ZmZlciA9ICIiCisgICAgICAgICNlbGlmIFZFUkJPU0UgPiAxIGFuZCBzZWxmLl9pbl9idWZmZXI6CisgICAgICAgICMgICAgICAgcHJpbnQgIi0tLSB0aGVyZSBpcyB1bnJlYWQgZGF0YTogJXIiLCAoc2VsZi5faW5fYnVmZmVyLCkKKyAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5jbG9zZShzZWxmKQorCisgICAgZGVmIGhhbmRsZV9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZik6CisgICAgICAgIHBhc3MKIAogCiBjbGFzcyBDb25uZWN0aW9uVUk6Ci0JCi0JIiIiR2x1ZSB0byBsZXQgYSBjb25uZWN0aW9uIHRlbGwgdGhpbmdzIHRvIHRoZSBVSSBpbiBhIHN0YW5kYXJkaXplZCB3YXkuCi0JCi0JVGhlIHByb3RvY29sbCBkZWZpbmVzIGZvdXIgZnVuY3Rpb25zLCB3aGljaCB0aGUgY29ubmVjdGlvbiB3aWxsIGNhbGw6Ci0JCi0JCWRlZiBzZXR0b3RhbChpbnQgdG90YWwpOiBnZXRzIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGtub3dzIHRoZSBkYXRhIHNpemUKLQkJZGVmIHNldGN1cnJlbnQoaW50IGN1cnJlbnQpOiBnZXRzIGNhbGxlZCB3aGVuIHNvbWUgbmV3IGRhdGEgaGFzIGFycml2ZWQKLQkJZGVmIGRvbmUoKTogZ2V0cyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUKLQkJZGVmIGVycm9yKHR5cGUsIHZhbHVlLCB0Yik6IGdldHMgY2FsbGVkIHdoZW5ldmVuIGFuIGVycm9yIG9jY3VyZWQKLQkiIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgc2V0dG90YWxfZnVuYywgc2V0Y3VycmVudF9mdW5jLCBkb25lX2Z1bmMsIGVycm9yX2Z1bmMpOgotCQlzZWxmLnNldHRvdGFsID0gc2V0dG90YWxfZnVuYwotCQlzZWxmLnNldGN1cnJlbnQgPSBzZXRjdXJyZW50X2Z1bmMKLQkJc2VsZi5kb25lID0gZG9uZV9mdW5jCi0JCXNlbGYuZXJyb3IgPSBlcnJvcl9mdW5jCisKKyAgICAiIiJHbHVlIHRvIGxldCBhIGNvbm5lY3Rpb24gdGVsbCB0aGluZ3MgdG8gdGhlIFVJIGluIGEgc3RhbmRhcmRpemVkIHdheS4KKworICAgIFRoZSBwcm90b2NvbGwgZGVmaW5lcyBmb3VyIGZ1bmN0aW9ucywgd2hpY2ggdGhlIGNvbm5lY3Rpb24gd2lsbCBjYWxsOgorCisgICAgICAgICAgICBkZWYgc2V0dG90YWwoaW50IHRvdGFsKTogZ2V0cyBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBrbm93cyB0aGUgZGF0YSBzaXplCisgICAgICAgICAgICBkZWYgc2V0Y3VycmVudChpbnQgY3VycmVudCk6IGdldHMgY2FsbGVkIHdoZW4gc29tZSBuZXcgZGF0YSBoYXMgYXJyaXZlZAorICAgICAgICAgICAgZGVmIGRvbmUoKTogZ2V0cyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUKKyAgICAgICAgICAgIGRlZiBlcnJvcih0eXBlLCB2YWx1ZSwgdGIpOiBnZXRzIGNhbGxlZCB3aGVuZXZlbiBhbiBlcnJvciBvY2N1cmVkCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2V0dG90YWxfZnVuYywgc2V0Y3VycmVudF9mdW5jLCBkb25lX2Z1bmMsIGVycm9yX2Z1bmMpOgorICAgICAgICBzZWxmLnNldHRvdGFsID0gc2V0dG90YWxfZnVuYworICAgICAgICBzZWxmLnNldGN1cnJlbnQgPSBzZXRjdXJyZW50X2Z1bmMKKyAgICAgICAgc2VsZi5kb25lID0gZG9uZV9mdW5jCisgICAgICAgIHNlbGYuZXJyb3IgPSBlcnJvcl9mdW5jCiAKIAogY2xhc3MgSFRUUEVycm9yKHNvY2tldC5lcnJvcik6IHBhc3MKIAogCiBjbGFzcyBIVFRQQ2xpZW50KENvbm5lY3Rpb24sIGh0dHBsaWIuSFRUUCk6Ci0JCi0JIiIiQXN5bmNocm9ub3VzIEhUVFAgY29ubmVjdGlvbiIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCAoaG9zdCwgcG9ydCksIGRhdGFoYW5kbGVyLCB1aT1Ob25lKToKLQkJQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCAoaG9zdCwgcG9ydCkpCi0JCXNlbGYuZGF0YWhhbmRsZXIgPSBkYXRhaGFuZGxlcgotCQlzZWxmLnVpID0gdWkKLQkJc2VsZi5idWYgPSAiIgotCQlzZWxmLmRvbmVoZWFkZXJzID0gMAotCQlzZWxmLmRvbmUgPSAwCi0JCXNlbGYuaGVhZGVycyA9IE5vbmUKLQkJc2VsZi5sZW5ndGggPSBOb25lCi0JCXNlbGYucG9zID0gMAotCQotCWRlZiBnZXRyZXBseShzZWxmKToKLQkJcmFpc2UgVHlwZUVycm9yLCAiZ2V0cmVwbHkoKSBpcyBub3Qgc3VwcG9ydGVkIGluIGFzeW5jIEhUVFAgY29ubmVjdGlvbiIKLQkKLQlkZWYgaGFuZGxlX2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6Ci0JCWFzc2VydCBub3Qgc2VsZi5kb25lCi0JCWlmIG5vdCBzZWxmLmRvbmVoZWFkZXJzOgotCQkJc2VsZi5idWYgPSBzZWxmLmJ1ZiArIGRhdGEKLQkJCXBvcyA9IHN0cmluZy5maW5kKHNlbGYuYnVmLCAiXHJcblxyXG4iKQotCQkJaWYgcG9zID49IDA6Ci0JCQkJc2VsZi5oYW5kbGVfcmVwbHkoc2VsZi5idWZbOnBvcys0XSkKLQkJCQlsZW5ndGggPSBzZWxmLmhlYWRlcnMuZ2V0aGVhZGVyKCJDb250ZW50LUxlbmd0aCIpCi0JCQkJaWYgbGVuZ3RoIGlzIG5vdCBOb25lOgotCQkJCQlzZWxmLmxlbmd0aCA9IGludChsZW5ndGgpCi0JCQkJCWlmIHNlbGYudWkgaXMgbm90IE5vbmU6Ci0JCQkJCQlzZWxmLnVpLnNldHRvdGFsKHNlbGYubGVuZ3RoKQotCQkJCWVsc2U6Ci0JCQkJCXNlbGYubGVuZ3RoID0gLTEKLQkJCQlzZWxmLmRvbmVoZWFkZXJzID0gMQotCQkJCXNlbGYuaGFuZGxlX2RhdGEoc2VsZi5idWZbcG9zKzQ6XSkKLQkJCQlzZWxmLmJ1ZiA9ICIiCi0JCWVsc2U6Ci0JCQlzZWxmLmhhbmRsZV9kYXRhKGRhdGEpCi0JCi0JZGVmIGhhbmRsZV9yZXBseShzZWxmLCBkYXRhKToKLQkJZiA9IGNTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQotCQl2ZXIsIGNvZGUsIG1zZyA9IHN0cmluZy5zcGxpdChmLnJlYWRsaW5lKCksIE5vbmUsIDIpCi0JCWNvZGUgPSBpbnQoY29kZSkKLQkJbXNnID0gc3RyaW5nLnN0cmlwKG1zZykKLQkJaWYgY29kZSA8PiAyMDA6Ci0JCQkjIEhtLCB0aGlzIGlzIHdoYXQgKkkqIG5lZWQsIGJ1dCBwcm9iYWJseSBub3QgY29ycmVjdC4uLgotCQkJcmFpc2UgSFRUUEVycm9yLCAoY29kZSwgbXNnKQotCQlzZWxmLmhlYWRlcnMgPSBtaW1ldG9vbHMuTWVzc2FnZShmKQotCQotCWRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKLQkJc2VsZi5wb3MgPSBzZWxmLnBvcyArIGxlbihkYXRhKQotCQlpZiBzZWxmLnVpIGlzIG5vdCBOb25lOgotCQkJc2VsZi51aS5zZXRjdXJyZW50KHNlbGYucG9zKQotCQlzZWxmLmRhdGFoYW5kbGVyKGRhdGEpCi0JCWlmIHNlbGYucG9zID49IHNlbGYubGVuZ3RoOgotCQkJc2VsZi5kYXRhaGFuZGxlcigiIikKLQkJCXNlbGYuZG9uZSA9IDEKLQkJCWlmIHNlbGYudWkgaXMgbm90IE5vbmU6Ci0JCQkJc2VsZi51aS5kb25lKCkKLQkKLQlkZWYgaGFuZGxlX2Vycm9yKHNlbGYsIHR5cGUsIHZhbHVlLCB0Yik6Ci0JCWlmIHNlbGYudWkgaXMgbm90IE5vbmU6Ci0JCQlzZWxmLnVpLmVycm9yKHR5cGUsIHZhbHVlLCB0YikKLQkJZWxzZToKLQkJCUNvbm5lY3Rpb24uaGFuZGxlX2Vycm9yKHNlbGYsIHR5cGUsIHZhbHVlLCB0YikKLQkKLQlkZWYgbG9nKHNlbGYsIG1lc3NhZ2UpOgotCQlpZiBWRVJCT1NFOgotCQkJcHJpbnQgJ0xPRzonLCBtZXNzYWdlCisKKyAgICAiIiJBc3luY2hyb25vdXMgSFRUUCBjb25uZWN0aW9uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKGhvc3QsIHBvcnQpLCBkYXRhaGFuZGxlciwgdWk9Tm9uZSk6CisgICAgICAgIENvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgKGhvc3QsIHBvcnQpKQorICAgICAgICBzZWxmLmRhdGFoYW5kbGVyID0gZGF0YWhhbmRsZXIKKyAgICAgICAgc2VsZi51aSA9IHVpCisgICAgICAgIHNlbGYuYnVmID0gIiIKKyAgICAgICAgc2VsZi5kb25laGVhZGVycyA9IDAKKyAgICAgICAgc2VsZi5kb25lID0gMAorICAgICAgICBzZWxmLmhlYWRlcnMgPSBOb25lCisgICAgICAgIHNlbGYubGVuZ3RoID0gTm9uZQorICAgICAgICBzZWxmLnBvcyA9IDAKKworICAgIGRlZiBnZXRyZXBseShzZWxmKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiZ2V0cmVwbHkoKSBpcyBub3Qgc3VwcG9ydGVkIGluIGFzeW5jIEhUVFAgY29ubmVjdGlvbiIKKworICAgIGRlZiBoYW5kbGVfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLmRvbmUKKyAgICAgICAgaWYgbm90IHNlbGYuZG9uZWhlYWRlcnM6CisgICAgICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmICsgZGF0YQorICAgICAgICAgICAgcG9zID0gc3RyaW5nLmZpbmQoc2VsZi5idWYsICJcclxuXHJcbiIpCisgICAgICAgICAgICBpZiBwb3MgPj0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZXBseShzZWxmLmJ1Zls6cG9zKzRdKQorICAgICAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYuaGVhZGVycy5nZXRoZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikKKyAgICAgICAgICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gaW50KGxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi51aSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudWkuc2V0dG90YWwoc2VsZi5sZW5ndGgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sZW5ndGggPSAtMQorICAgICAgICAgICAgICAgIHNlbGYuZG9uZWhlYWRlcnMgPSAxCisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShzZWxmLmJ1Zltwb3MrNDpdKQorICAgICAgICAgICAgICAgIHNlbGYuYnVmID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoZGF0YSkKKworICAgIGRlZiBoYW5kbGVfcmVwbHkoc2VsZiwgZGF0YSk6CisgICAgICAgIGYgPSBjU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKKyAgICAgICAgdmVyLCBjb2RlLCBtc2cgPSBzdHJpbmcuc3BsaXQoZi5yZWFkbGluZSgpLCBOb25lLCAyKQorICAgICAgICBjb2RlID0gaW50KGNvZGUpCisgICAgICAgIG1zZyA9IHN0cmluZy5zdHJpcChtc2cpCisgICAgICAgIGlmIGNvZGUgPD4gMjAwOgorICAgICAgICAgICAgIyBIbSwgdGhpcyBpcyB3aGF0ICpJKiBuZWVkLCBidXQgcHJvYmFibHkgbm90IGNvcnJlY3QuLi4KKyAgICAgICAgICAgIHJhaXNlIEhUVFBFcnJvciwgKGNvZGUsIG1zZykKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gbWltZXRvb2xzLk1lc3NhZ2UoZikKKworICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5wb3MgPSBzZWxmLnBvcyArIGxlbihkYXRhKQorICAgICAgICBpZiBzZWxmLnVpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi51aS5zZXRjdXJyZW50KHNlbGYucG9zKQorICAgICAgICBzZWxmLmRhdGFoYW5kbGVyKGRhdGEpCisgICAgICAgIGlmIHNlbGYucG9zID49IHNlbGYubGVuZ3RoOgorICAgICAgICAgICAgc2VsZi5kYXRhaGFuZGxlcigiIikKKyAgICAgICAgICAgIHNlbGYuZG9uZSA9IDEKKyAgICAgICAgICAgIGlmIHNlbGYudWkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi51aS5kb25lKCkKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKKyAgICAgICAgaWYgc2VsZi51aSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudWkuZXJyb3IodHlwZSwgdmFsdWUsIHRiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgQ29ubmVjdGlvbi5oYW5kbGVfZXJyb3Ioc2VsZiwgdHlwZSwgdmFsdWUsIHRiKQorCisgICAgZGVmIGxvZyhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgaWYgVkVSQk9TRToKKyAgICAgICAgICAgIHByaW50ICdMT0c6JywgbWVzc2FnZQogCiAKIGNsYXNzIFB5TWVzc2FnZToKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCXNlbGYuX2J1ZiA9ICIiCi0JCXNlbGYuX2xlbiA9IE5vbmUKLQkJc2VsZi5fY2hlY2tzdW0gPSBOb25lCi0JCi0JZGVmIGZlZWQoc2VsZiwgZGF0YSk6Ci0JCXNlbGYuX2J1ZiA9IHNlbGYuX2J1ZiArIGRhdGEKLQkJaWYgc2VsZi5fbGVuIGlzIE5vbmU6Ci0JCQlpZiBsZW4oc2VsZi5fYnVmKSA+PSA4OgotCQkJCWltcG9ydCBzdHJ1Y3QKLQkJCQlzZWxmLl9sZW4sIHNlbGYuX2NoZWNrc3VtID0gc3RydWN0LnVucGFjaygibGwiLCBzZWxmLl9idWZbOjhdKQotCQkJCXNlbGYuX2J1ZiA9IHNlbGYuX2J1Zls4Ol0KLQkJaWYgc2VsZi5fbGVuIGlzIG5vdCBOb25lOgotCQkJaWYgbGVuKHNlbGYuX2J1ZikgPj0gc2VsZi5fbGVuOgotCQkJCWltcG9ydCB6bGliCi0JCQkJZGF0YSA9IHNlbGYuX2J1Zls6c2VsZi5fbGVuXQotCQkJCWxlZnRvdmVyID0gc2VsZi5fYnVmW3NlbGYuX2xlbjpdCi0JCQkJc2VsZi5fYnVmID0gTm9uZQotCQkJCWFzc2VydCBzZWxmLl9jaGVja3N1bSA9PSB6bGliLmFkbGVyMzIoZGF0YSksICJjb3JydXB0IGRhdGEiCi0JCQkJc2VsZi5kYXRhID0gZGF0YQotCQkJCXJldHVybiAxLCBsZWZ0b3ZlcgotCQkJZWxzZToKLQkJCQlyZXR1cm4gMCwgTm9uZQotCQllbHNlOgotCQkJcmV0dXJuIDAsIE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fYnVmID0gIiIKKyAgICAgICAgc2VsZi5fbGVuID0gTm9uZQorICAgICAgICBzZWxmLl9jaGVja3N1bSA9IE5vbmUKKworICAgIGRlZiBmZWVkKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9idWYgPSBzZWxmLl9idWYgKyBkYXRhCisgICAgICAgIGlmIHNlbGYuX2xlbiBpcyBOb25lOgorICAgICAgICAgICAgaWYgbGVuKHNlbGYuX2J1ZikgPj0gODoKKyAgICAgICAgICAgICAgICBpbXBvcnQgc3RydWN0CisgICAgICAgICAgICAgICAgc2VsZi5fbGVuLCBzZWxmLl9jaGVja3N1bSA9IHN0cnVjdC51bnBhY2soImxsIiwgc2VsZi5fYnVmWzo4XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9idWYgPSBzZWxmLl9idWZbODpdCisgICAgICAgIGlmIHNlbGYuX2xlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLl9idWYpID49IHNlbGYuX2xlbjoKKyAgICAgICAgICAgICAgICBpbXBvcnQgemxpYgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9idWZbOnNlbGYuX2xlbl0KKyAgICAgICAgICAgICAgICBsZWZ0b3ZlciA9IHNlbGYuX2J1ZltzZWxmLl9sZW46XQorICAgICAgICAgICAgICAgIHNlbGYuX2J1ZiA9IE5vbmUKKyAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5fY2hlY2tzdW0gPT0gemxpYi5hZGxlcjMyKGRhdGEpLCAiY29ycnVwdCBkYXRhIgorICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAgICAgICAgICAgICByZXR1cm4gMSwgbGVmdG92ZXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAsIE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAwLCBOb25lCiAKIAogY2xhc3MgUHlDb25uZWN0aW9uKENvbm5lY3Rpb24pOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBzb2NrX29yX2FkZHJlc3MpOgotCQlDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcykKLQkJc2VsZi5jdXJyZW50bWVzc2FnZSA9IFB5TWVzc2FnZSgpCi0JCi0JZGVmIGhhbmRsZV9pbmNvbWluZ19kYXRhKHNlbGYsIGRhdGEpOgotCQl3aGlsZSBkYXRhOgotCQkJZG9uZSwgZGF0YSA9IHNlbGYuY3VycmVudG1lc3NhZ2UuZmVlZChkYXRhKQotCQkJaWYgZG9uZToKLQkJCQlpbXBvcnQgY1BpY2tsZQotCQkJCXNlbGYuaGFuZGxlX29iamVjdChjUGlja2xlLmxvYWRzKHNlbGYuY3VycmVudG1lc3NhZ2UuZGF0YSkpCi0JCQkJc2VsZi5jdXJyZW50bWVzc2FnZSA9IFB5TWVzc2FnZSgpCi0JCi0JZGVmIGhhbmRsZV9vYmplY3Qoc2VsZiwgb2JqZWN0KToKLQkJcHJpbnQgJ3VuaGFuZGxlZCBvYmplY3Q6JywgcmVwcihvYmplY3QpCi0JCi0JZGVmIHNlbmQoc2VsZiwgb2JqZWN0KToKLQkJaW1wb3J0IGNQaWNrbGUsIHpsaWIsIHN0cnVjdAotCQlkYXRhID0gY1BpY2tsZS5kdW1wcyhvYmplY3QsIDEpCi0JCWxlbmd0aCA9IGxlbihkYXRhKQotCQljaGVja3N1bSA9IHpsaWIuYWRsZXIzMihkYXRhKQotCQlkYXRhID0gc3RydWN0LnBhY2soImxsIiwgbGVuZ3RoLCBjaGVja3N1bSkgKyBkYXRhCi0JCUNvbm5lY3Rpb24uc2VuZChzZWxmLCBkYXRhKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcyk6CisgICAgICAgIENvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgc29ja19vcl9hZGRyZXNzKQorICAgICAgICBzZWxmLmN1cnJlbnRtZXNzYWdlID0gUHlNZXNzYWdlKCkKKworICAgIGRlZiBoYW5kbGVfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgd2hpbGUgZGF0YToKKyAgICAgICAgICAgIGRvbmUsIGRhdGEgPSBzZWxmLmN1cnJlbnRtZXNzYWdlLmZlZWQoZGF0YSkKKyAgICAgICAgICAgIGlmIGRvbmU6CisgICAgICAgICAgICAgICAgaW1wb3J0IGNQaWNrbGUKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9vYmplY3QoY1BpY2tsZS5sb2FkcyhzZWxmLmN1cnJlbnRtZXNzYWdlLmRhdGEpKQorICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudG1lc3NhZ2UgPSBQeU1lc3NhZ2UoKQorCisgICAgZGVmIGhhbmRsZV9vYmplY3Qoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgcHJpbnQgJ3VuaGFuZGxlZCBvYmplY3Q6JywgcmVwcihvYmplY3QpCisKKyAgICBkZWYgc2VuZChzZWxmLCBvYmplY3QpOgorICAgICAgICBpbXBvcnQgY1BpY2tsZSwgemxpYiwgc3RydWN0CisgICAgICAgIGRhdGEgPSBjUGlja2xlLmR1bXBzKG9iamVjdCwgMSkKKyAgICAgICAgbGVuZ3RoID0gbGVuKGRhdGEpCisgICAgICAgIGNoZWNrc3VtID0gemxpYi5hZGxlcjMyKGRhdGEpCisgICAgICAgIGRhdGEgPSBzdHJ1Y3QucGFjaygibGwiLCBsZW5ndGgsIGNoZWNrc3VtKSArIGRhdGEKKyAgICAgICAgQ29ubmVjdGlvbi5zZW5kKHNlbGYsIGRhdGEpCiAKIAogY2xhc3MgRWNobyhDb25uZWN0aW9uKToKLQkKLQkiIiJTaW1wbGUgZWNob2luZyBjb25uZWN0aW9uOiBpdCBzZW5kcyBldmVyeXRoaW5nIGJhY2sgaXQgcmVjZWl2ZXMuIiIiIAotCQotCWRlZiBoYW5kbGVfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKLQkJc2VsZi5zZW5kKGRhdGEpCisKKyAgICAiIiJTaW1wbGUgZWNob2luZyBjb25uZWN0aW9uOiBpdCBzZW5kcyBldmVyeXRoaW5nIGJhY2sgaXQgcmVjZWl2ZXMuIiIiCisKKyAgICBkZWYgaGFuZGxlX2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuc2VuZChkYXRhKQogCiAKIGNsYXNzIFByb3h5KENvbm5lY3Rpb24pOgotCQotCSIiIkdlbmVyaWMgcHJveHkgY29ubmVjdGlvbiIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBzb2NrX29yX2FkZHJlc3M9Tm9uZSwgcHJveHlhZGRyPU5vbmUsIGNsb3NlcGFydG5lcj0wKToKLQkJIiIiYXJndW1lbnRzOgotCQktIHNvY2tfb3JfYWRkcmVzcyBpcyBlaXRoZXIgYSBzb2NrZXQgb3IgYSB0dXBsZSBjb250YWluaW5nIHRoZSAKLQkJbmFtZSBhbmQgcG9ydCBudW1iZXIgb2YgYSByZW1vdGUgaG9zdAotCQktIHByb3h5YWRkcjogYSB0dXBsZSBjb250YWluaW5nIGEgbmFtZSBhbmQgYSBwb3J0IG51bWJlciBvZiBhIAotCQkgIHJlbW90ZSBob3N0IChvcHRpb25hbCkuCi0JCS0gY2xvc2VwYXJ0bmVyOiBib29sZWFuLCBzcGVjaWZpZXMgd2hldGhlciB3ZSBzaG91bGQgY2xvc2UKLQkJICB0aGUgcHJveHkgY29ubmVjdGlvbiAob3B0aW9uYWwpIiIiCi0JCQotCQlDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcykKLQkJc2VsZi5vdGhlciA9IE5vbmUKLQkJc2VsZi5wcm94eWFkZHIgPSBwcm94eWFkZHIKLQkJc2VsZi5jbG9zZXBhcnRuZXIgPSBjbG9zZXBhcnRuZXIKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCWlmIHNlbGYub3RoZXI6Ci0JCQlvdGhlciA9IHNlbGYub3RoZXIKLQkJCXNlbGYub3RoZXIgPSBOb25lCi0JCQlvdGhlci5vdGhlciA9IE5vbmUKLQkJCWlmIHNlbGYuY2xvc2VwYXJ0bmVyOgotCQkJCW90aGVyLmNsb3NlKCkKLQkJQ29ubmVjdGlvbi5jbG9zZShzZWxmKQotCQotCWRlZiBoYW5kbGVfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKLQkJaWYgbm90IHNlbGYub3RoZXI6Ci0JCQkjIHBhc3MgZGF0YSBmb3IgcG9zc2libGUgYXV0b21hdGljIHJlbW90ZSBob3N0IGRldGVjdGlvbgotCQkJIyAoc2VlIEhUVFBQcm94eSkKLQkJCWRhdGEgPSBzZWxmLmNvbm5lY3Rwcm94eShkYXRhKQotCQlzZWxmLm90aGVyLnNlbmQoZGF0YSkKLQkKLQlkZWYgY29ubmVjdHByb3h5KHNlbGYsIGRhdGEpOgotCQlvdGhlciA9IHNlbGYuX19jbGFzc19fKHNlbGYucHJveHlhZGRyLCBjbG9zZXBhcnRuZXI9c2VsZi5jbG9zZXBhcnRuZXIpCi0JCXNlbGYub3RoZXIgPSBvdGhlcgotCQlvdGhlci5vdGhlciA9IHNlbGYKLQkJcmV0dXJuIGRhdGEKKworICAgICIiIkdlbmVyaWMgcHJveHkgY29ubmVjdGlvbiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcz1Ob25lLCBwcm94eWFkZHI9Tm9uZSwgY2xvc2VwYXJ0bmVyPTApOgorICAgICAgICAiIiJhcmd1bWVudHM6CisgICAgICAgIC0gc29ja19vcl9hZGRyZXNzIGlzIGVpdGhlciBhIHNvY2tldCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlCisgICAgICAgIG5hbWUgYW5kIHBvcnQgbnVtYmVyIG9mIGEgcmVtb3RlIGhvc3QKKyAgICAgICAgLSBwcm94eWFkZHI6IGEgdHVwbGUgY29udGFpbmluZyBhIG5hbWUgYW5kIGEgcG9ydCBudW1iZXIgb2YgYQorICAgICAgICAgIHJlbW90ZSBob3N0IChvcHRpb25hbCkuCisgICAgICAgIC0gY2xvc2VwYXJ0bmVyOiBib29sZWFuLCBzcGVjaWZpZXMgd2hldGhlciB3ZSBzaG91bGQgY2xvc2UKKyAgICAgICAgICB0aGUgcHJveHkgY29ubmVjdGlvbiAob3B0aW9uYWwpIiIiCisKKyAgICAgICAgQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCBzb2NrX29yX2FkZHJlc3MpCisgICAgICAgIHNlbGYub3RoZXIgPSBOb25lCisgICAgICAgIHNlbGYucHJveHlhZGRyID0gcHJveHlhZGRyCisgICAgICAgIHNlbGYuY2xvc2VwYXJ0bmVyID0gY2xvc2VwYXJ0bmVyCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3RoZXI6CisgICAgICAgICAgICBvdGhlciA9IHNlbGYub3RoZXIKKyAgICAgICAgICAgIHNlbGYub3RoZXIgPSBOb25lCisgICAgICAgICAgICBvdGhlci5vdGhlciA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYuY2xvc2VwYXJ0bmVyOgorICAgICAgICAgICAgICAgIG90aGVyLmNsb3NlKCkKKyAgICAgICAgQ29ubmVjdGlvbi5jbG9zZShzZWxmKQorCisgICAgZGVmIGhhbmRsZV9pbmNvbWluZ19kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBub3Qgc2VsZi5vdGhlcjoKKyAgICAgICAgICAgICMgcGFzcyBkYXRhIGZvciBwb3NzaWJsZSBhdXRvbWF0aWMgcmVtb3RlIGhvc3QgZGV0ZWN0aW9uCisgICAgICAgICAgICAjIChzZWUgSFRUUFByb3h5KQorICAgICAgICAgICAgZGF0YSA9IHNlbGYuY29ubmVjdHByb3h5KGRhdGEpCisgICAgICAgIHNlbGYub3RoZXIuc2VuZChkYXRhKQorCisgICAgZGVmIGNvbm5lY3Rwcm94eShzZWxmLCBkYXRhKToKKyAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhzZWxmLnByb3h5YWRkciwgY2xvc2VwYXJ0bmVyPXNlbGYuY2xvc2VwYXJ0bmVyKQorICAgICAgICBzZWxmLm90aGVyID0gb3RoZXIKKyAgICAgICAgb3RoZXIub3RoZXIgPSBzZWxmCisgICAgICAgIHJldHVybiBkYXRhCiAKIAogY2xhc3MgSFRUUFByb3h5KFByb3h5KToKLQkKLQkiIiJTaW1wbGUsIHVzZWxlc3MsIGh0dHAgcHJveHkuIEl0IGZpZ3VyZXMgb3V0IGl0c2VsZiB3aGVyZSB0byBjb25uZWN0IHRvLiIiIgotCQotCWRlZiBjb25uZWN0cHJveHkoc2VsZiwgZGF0YSk6Ci0JCWlmIFZFUkJPU0U6Ci0JCQlwcmludCAiLS0tIHByb3h5IHJlcXVlc3QiLCByZXByKGRhdGEpCi0JCWFkZHIsIGRhdGEgPSBkZV9wcm94aWZ5KGRhdGEpCi0JCW90aGVyID0gUHJveHkoYWRkcikKLQkJc2VsZi5vdGhlciA9IG90aGVyCi0JCW90aGVyLm90aGVyID0gc2VsZgotCQlyZXR1cm4gZGF0YQorCisgICAgIiIiU2ltcGxlLCB1c2VsZXNzLCBodHRwIHByb3h5LiBJdCBmaWd1cmVzIG91dCBpdHNlbGYgd2hlcmUgdG8gY29ubmVjdCB0by4iIiIKKworICAgIGRlZiBjb25uZWN0cHJveHkoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIFZFUkJPU0U6CisgICAgICAgICAgICBwcmludCAiLS0tIHByb3h5IHJlcXVlc3QiLCByZXByKGRhdGEpCisgICAgICAgIGFkZHIsIGRhdGEgPSBkZV9wcm94aWZ5KGRhdGEpCisgICAgICAgIG90aGVyID0gUHJveHkoYWRkcikKKyAgICAgICAgc2VsZi5vdGhlciA9IG90aGVyCisgICAgICAgIG90aGVyLm90aGVyID0gc2VsZgorICAgICAgICByZXR1cm4gZGF0YQogCiAKICMgaGVscGVyIGZvciBIVFRQUHJveHkKIGRlZiBkZV9wcm94aWZ5KGRhdGEpOgotCWltcG9ydCByZQotCXJlcV9wYXR0ZXJuID0gIkdFVCBodHRwOi8vKFthLXpBLVowLTktXy5dKykoOihbMC05XSspKT8iCi0JbSA9IHJlLm1hdGNoKHJlcV9wYXR0ZXJuLCBkYXRhKQotCWhvc3QsIGR1bW15LCBwb3J0ID0gbS5ncm91cHMoKQotCWlmIG5vdCBwb3J0OgotCQlwb3J0ID0gODAKLQllbHNlOgotCQlwb3J0ID0gaW50KHBvcnQpCi0JIyBjaGFuZ2UgIkdFVCBodHRwOi8veHgueHgueHgveXkiIGludG8gIkdFVCAveXkiCi0JZGF0YSA9IHJlLnN1YihyZXFfcGF0dGVybiwgIkdFVCAiLCBkYXRhKQotCXJldHVybiAoaG9zdCwgcG9ydCksIGRhdGEKKyAgICBpbXBvcnQgcmUKKyAgICByZXFfcGF0dGVybiA9ICJHRVQgaHR0cDovLyhbYS16QS1aMC05LV8uXSspKDooWzAtOV0rKSk/IgorICAgIG0gPSByZS5tYXRjaChyZXFfcGF0dGVybiwgZGF0YSkKKyAgICBob3N0LCBkdW1teSwgcG9ydCA9IG0uZ3JvdXBzKCkKKyAgICBpZiBub3QgcG9ydDoKKyAgICAgICAgcG9ydCA9IDgwCisgICAgZWxzZToKKyAgICAgICAgcG9ydCA9IGludChwb3J0KQorICAgICMgY2hhbmdlICJHRVQgaHR0cDovL3h4Lnh4Lnh4L3l5IiBpbnRvICJHRVQgL3l5IgorICAgIGRhdGEgPSByZS5zdWIocmVxX3BhdHRlcm4sICJHRVQgIiwgZGF0YSkKKyAgICByZXR1cm4gKGhvc3QsIHBvcnQpLCBkYXRhCiAKIAogIyBpZiB3ZSdyZSBydW5uaW5nICJ1bmRlciBXIiwgbGV0J3MgcmVnaXN0ZXIgdGhlIHNvY2tldCBwb2xsZXIgdG8gdGhlIGV2ZW50IGxvb3AKIHRyeToKLQlpbXBvcnQgVworICAgIGltcG9ydCBXCiBleGNlcHQ6Ci0JcGFzcworICAgIHBhc3MKIGVsc2U6Ci0JVy5nZXRhcHBsaWNhdGlvbigpLmFkZGlkbGVmdW5jKGFzeW5jb3JlLnBvbGwpCisgICAgVy5nZXRhcHBsaWNhdGlvbigpLmFkZGlkbGVmdW5jKGFzeW5jb3JlLnBvbGwpCiAKIAogIyMgdGVzdGluZyBtdWNrCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1d0ZXh0LnB5IGIvTWFjL1Rvb2xzL0lERS9XdGV4dC5weQppbmRleCAzODk0ZTE2Li5iM2QyZjhlIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1d0ZXh0LnB5CisrKyBiL01hYy9Ub29scy9JREUvV3RleHQucHkKQEAgLTE0LDY0MCArMTQsNjQwIEBACiAKIAogY2xhc3MgVGV4dEJveChXYmFzZS5XaWRnZXQpOgotCQotCSIiIkEgc3RhdGljIHRleHQgd2lkZ2V0IiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRleHQ9IiIsIGFsaWduPVRleHRFZGl0LnRlSnVzdExlZnQsIAotCQkJCWZvbnRzZXR0aW5ncz1Ob25lLAotCQkJCWJhY2tncm91bmRjb2xvcj0oMHhmZmZmLCAweGZmZmYsIDB4ZmZmZikKLQkJCQkpOgotCQlpZiBmb250c2V0dGluZ3MgaXMgTm9uZToKLQkJCWltcG9ydCBXCi0JCQlmb250c2V0dGluZ3MgPSBXLmdldGRlZmF1bHRmb250KCkKLQkJV2Jhc2UuV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCi0JCXNlbGYuZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCi0JCXNlbGYudGV4dCA9IHRleHQKLQkJc2VsZi5hbGlnbiA9IGFsaWduCi0JCXNlbGYuX2JhY2tncm91bmRjb2xvciA9IGJhY2tncm91bmRjb2xvcgotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikgPSBzZWxmLmZvbnRzZXR0aW5ncwotCQkJZm9udGlkID0gR2V0Rk51bShmb250KQotCQkJc2F2ZXN0YXRlID0gUWQuR2V0UGVuU3RhdGUoKQotCQkJUWQuVGV4dEZvbnQoZm9udGlkKQotCQkJUWQuVGV4dEZhY2Uoc3R5bGUpCi0JCQlRZC5UZXh0U2l6ZShzaXplKQotCQkJUWQuUkdCRm9yZUNvbG9yKGNvbG9yKQotCQkJUWQuUkdCQmFja0NvbG9yKHNlbGYuX2JhY2tncm91bmRjb2xvcikKLQkJCVRFLlRFVGV4dEJveChzZWxmLnRleHQsIHNlbGYuX2JvdW5kcywgc2VsZi5hbGlnbikKLQkJCVFkLlJHQkJhY2tDb2xvcigoMHhmZmZmLCAweGZmZmYsIDB4ZmZmZikpCi0JCQlRZC5TZXRQZW5TdGF0ZShzYXZlc3RhdGUpCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYudGV4dAotCQotCWRlZiBzZXQoc2VsZiwgdGV4dCk6Ci0JCXNlbGYudGV4dCA9IHRleHQKLQkJaWYgc2VsZi5fcGFyZW50d2luZG93IGFuZCBzZWxmLl9wYXJlbnR3aW5kb3cud2lkOgotCQkJc2VsZi5TZXRQb3J0KCkKLQkJCXNlbGYuZHJhdygpCisKKyAgICAiIiJBIHN0YXRpYyB0ZXh0IHdpZGdldCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRleHQ9IiIsIGFsaWduPVRleHRFZGl0LnRlSnVzdExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHNldHRpbmdzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZGNvbG9yPSgweGZmZmYsIDB4ZmZmZiwgMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgIGlmIGZvbnRzZXR0aW5ncyBpcyBOb25lOgorICAgICAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgICAgIGZvbnRzZXR0aW5ncyA9IFcuZ2V0ZGVmYXVsdGZvbnQoKQorICAgICAgICBXYmFzZS5XaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKKyAgICAgICAgc2VsZi5mb250c2V0dGluZ3MgPSBmb250c2V0dGluZ3MKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgICAgICBzZWxmLmFsaWduID0gYWxpZ24KKyAgICAgICAgc2VsZi5fYmFja2dyb3VuZGNvbG9yID0gYmFja2dyb3VuZGNvbG9yCisKKyAgICBkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKKyAgICAgICAgaWYgc2VsZi5fdmlzaWJsZToKKyAgICAgICAgICAgIChmb250LCBzdHlsZSwgc2l6ZSwgY29sb3IpID0gc2VsZi5mb250c2V0dGluZ3MKKyAgICAgICAgICAgIGZvbnRpZCA9IEdldEZOdW0oZm9udCkKKyAgICAgICAgICAgIHNhdmVzdGF0ZSA9IFFkLkdldFBlblN0YXRlKCkKKyAgICAgICAgICAgIFFkLlRleHRGb250KGZvbnRpZCkKKyAgICAgICAgICAgIFFkLlRleHRGYWNlKHN0eWxlKQorICAgICAgICAgICAgUWQuVGV4dFNpemUoc2l6ZSkKKyAgICAgICAgICAgIFFkLlJHQkZvcmVDb2xvcihjb2xvcikKKyAgICAgICAgICAgIFFkLlJHQkJhY2tDb2xvcihzZWxmLl9iYWNrZ3JvdW5kY29sb3IpCisgICAgICAgICAgICBURS5URVRleHRCb3goc2VsZi50ZXh0LCBzZWxmLl9ib3VuZHMsIHNlbGYuYWxpZ24pCisgICAgICAgICAgICBRZC5SR0JCYWNrQ29sb3IoKDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYpKQorICAgICAgICAgICAgUWQuU2V0UGVuU3RhdGUoc2F2ZXN0YXRlKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGV4dAorCisgICAgZGVmIHNldChzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgICAgICBpZiBzZWxmLl9wYXJlbnR3aW5kb3cgYW5kIHNlbGYuX3BhcmVudHdpbmRvdy53aWQ6CisgICAgICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICAgICAgc2VsZi5kcmF3KCkKIAogCiBjbGFzcyBfU2Nyb2xsV2lkZ2V0OgotCQotCSMgdG8gYmUgb3ZlcnJpZGRlbgotCWRlZiBnZXRzY3JvbGxyZWN0cyhzZWxmKToKLQkJIiIiUmV0dXJuIChkZXN0cmVjdCwgdmlld3JlY3QpLiIiIgotCQlyZXR1cm4gTm9uZSwgTm9uZQotCQotCSMgaW50ZXJuYWwgbWV0aG9kCi0JCi0JZGVmIHVwZGF0ZXNjcm9sbGJhcnMoc2VsZik6Ci0JCShkbCwgZHQsIGRyLCBkYiksICh2bCwgdnQsIHZyLCB2YikgPSBzZWxmLmdldHNjcm9sbHJlY3RzKCkKLQkJaWYgc2VsZi5fcGFyZW50Ll9iYXJ4OgotCQkJdmlld3dpZHRoID0gdnIgLSB2bAotCQkJZGVzdHdpZHRoID0gZHIgLSBkbAotCQkJYmFyID0gc2VsZi5fcGFyZW50Ll9iYXJ4Ci0JCQliYXIuc2V0bWF4KGRlc3R3aWR0aCAtIHZpZXd3aWR0aCkKLQkJCQotCQkJIyBNYWNPUyA4LjEgZG9lc24ndCBhdXRvbWF0aWNhbGx5IGRpc2FibGUKLQkJCSMgc2Nyb2xsYmFycyB3aG9zZSBtYXggPD0gbWluCi0JCQliYXIuZW5hYmxlKGRlc3R3aWR0aCA+IHZpZXd3aWR0aCkKLQkJCQotCQkJYmFyLnNldHZpZXdzaXplKHZpZXd3aWR0aCkKLQkJCWJhci5zZXQodmwgLSBkbCkKLQkJaWYgc2VsZi5fcGFyZW50Ll9iYXJ5OgotCQkJdmlld2hlaWdodCA9IHZiIC0gdnQKLQkJCWRlc3RoZWlnaHQgPSBkYiAtIGR0Ci0JCQliYXIgPSBzZWxmLl9wYXJlbnQuX2JhcnkKLQkJCWJhci5zZXRtYXgoZGVzdGhlaWdodCAtIHZpZXdoZWlnaHQpCi0JCQkKLQkJCSMgTWFjT1MgOC4xIGRvZXNuJ3QgYXV0b21hdGljYWxseSBkaXNhYmxlCi0JCQkjIHNjcm9sbGJhcnMgd2hvc2UgbWF4IDw9IG1pbgotCQkJYmFyLmVuYWJsZShkZXN0aGVpZ2h0ID4gdmlld2hlaWdodCkKLQkJCQotCQkJYmFyLnNldHZpZXdzaXplKHZpZXdoZWlnaHQpCi0JCQliYXIuc2V0KHZ0IC0gZHQpCisKKyAgICAjIHRvIGJlIG92ZXJyaWRkZW4KKyAgICBkZWYgZ2V0c2Nyb2xscmVjdHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiAoZGVzdHJlY3QsIHZpZXdyZWN0KS4iIiIKKyAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKworICAgICMgaW50ZXJuYWwgbWV0aG9kCisKKyAgICBkZWYgdXBkYXRlc2Nyb2xsYmFycyhzZWxmKToKKyAgICAgICAgKGRsLCBkdCwgZHIsIGRiKSwgKHZsLCB2dCwgdnIsIHZiKSA9IHNlbGYuZ2V0c2Nyb2xscmVjdHMoKQorICAgICAgICBpZiBzZWxmLl9wYXJlbnQuX2Jhcng6CisgICAgICAgICAgICB2aWV3d2lkdGggPSB2ciAtIHZsCisgICAgICAgICAgICBkZXN0d2lkdGggPSBkciAtIGRsCisgICAgICAgICAgICBiYXIgPSBzZWxmLl9wYXJlbnQuX2JhcngKKyAgICAgICAgICAgIGJhci5zZXRtYXgoZGVzdHdpZHRoIC0gdmlld3dpZHRoKQorCisgICAgICAgICAgICAjIE1hY09TIDguMSBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgZGlzYWJsZQorICAgICAgICAgICAgIyBzY3JvbGxiYXJzIHdob3NlIG1heCA8PSBtaW4KKyAgICAgICAgICAgIGJhci5lbmFibGUoZGVzdHdpZHRoID4gdmlld3dpZHRoKQorCisgICAgICAgICAgICBiYXIuc2V0dmlld3NpemUodmlld3dpZHRoKQorICAgICAgICAgICAgYmFyLnNldCh2bCAtIGRsKQorICAgICAgICBpZiBzZWxmLl9wYXJlbnQuX2Jhcnk6CisgICAgICAgICAgICB2aWV3aGVpZ2h0ID0gdmIgLSB2dAorICAgICAgICAgICAgZGVzdGhlaWdodCA9IGRiIC0gZHQKKyAgICAgICAgICAgIGJhciA9IHNlbGYuX3BhcmVudC5fYmFyeQorICAgICAgICAgICAgYmFyLnNldG1heChkZXN0aGVpZ2h0IC0gdmlld2hlaWdodCkKKworICAgICAgICAgICAgIyBNYWNPUyA4LjEgZG9lc24ndCBhdXRvbWF0aWNhbGx5IGRpc2FibGUKKyAgICAgICAgICAgICMgc2Nyb2xsYmFycyB3aG9zZSBtYXggPD0gbWluCisgICAgICAgICAgICBiYXIuZW5hYmxlKGRlc3RoZWlnaHQgPiB2aWV3aGVpZ2h0KQorCisgICAgICAgICAgICBiYXIuc2V0dmlld3NpemUodmlld2hlaWdodCkKKyAgICAgICAgICAgIGJhci5zZXQodnQgLSBkdCkKIAogCi1VTkRPTEFCRUxTID0gWwkjIEluZGV4ZWQgYnkgV0VHZXRVbmRvSW5mbygpIHZhbHVlCi0JTm9uZSwgIiIsICJ0eXBpbmciLCAiQ3V0IiwgIlBhc3RlIiwgIkNsZWFyIiwgIkRyYWciLCAiU3R5bGUiLAotCSJSdWxlciIsICJiYWNrc3BhY2UiLCAiZGVsZXRlIiwgInRyYW5zZm9ybSIsICJyZXNpemUiXQorVU5ET0xBQkVMUyA9IFsgICMgSW5kZXhlZCBieSBXRUdldFVuZG9JbmZvKCkgdmFsdWUKKyAgICAgICAgTm9uZSwgIiIsICJ0eXBpbmciLCAiQ3V0IiwgIlBhc3RlIiwgIkNsZWFyIiwgIkRyYWciLCAiU3R5bGUiLAorICAgICAgICAiUnVsZXIiLCAiYmFja3NwYWNlIiwgImRlbGV0ZSIsICJ0cmFuc2Zvcm0iLCAicmVzaXplIl0KIAogCiBjbGFzcyBFZGl0VGV4dChXYmFzZS5TZWxlY3RhYmxlV2lkZ2V0LCBfU2Nyb2xsV2lkZ2V0KToKLQkKLQkiIiJBIHRleHQgZWRpdCB3aWRnZXQsIG1haW5seSBmb3Igc2ltcGxlIGVudHJ5IGZpZWxkcy4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGV4dD0iIiwgCi0JCQkJY2FsbGJhY2s9Tm9uZSwgaW5zZXQ9KDMsIDMpLCAKLQkJCQlmb250c2V0dGluZ3M9Tm9uZSwKLQkJCQl0YWJzZXR0aW5ncyA9ICgzMiwgMCksCi0JCQkJcmVhZG9ubHkgPSAwKToKLQkJaWYgZm9udHNldHRpbmdzIGlzIE5vbmU6Ci0JCQlpbXBvcnQgVwotCQkJZm9udHNldHRpbmdzID0gVy5nZXRkZWZhdWx0Zm9udCgpCi0JCVdiYXNlLlNlbGVjdGFibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKLQkJc2VsZi50ZW1wdGV4dCA9IHRleHQKLQkJc2VsZi50ZWQgPSBOb25lCi0JCXNlbGYuc2VsZWN0aW9uID0gTm9uZQotCQlzZWxmLm9sZHNlbGVjdGlvbiA9IE5vbmUKLQkJc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjawotCQlzZWxmLmNoYW5nZWQgPSAwCi0JCXNlbGYuc2VsY2hhbmdlZCA9IDAKLQkJc2VsZi5fc2VsZWN0ZWQgPSAwCi0JCXNlbGYuX2VuYWJsZWQgPSAxCi0JCXNlbGYud3JhcCA9IDEKLQkJc2VsZi5yZWFkb25seSA9IHJlYWRvbmx5Ci0JCXNlbGYuZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCi0JCXNlbGYudGFic2V0dGluZ3MgPSB0YWJzZXR0aW5ncwotCQlpZiB0eXBlKGluc2V0KSA8PiBUdXBsZVR5cGU6Ci0JCQlzZWxmLmluc2V0ID0gKGluc2V0LCBpbnNldCkKLQkJZWxzZToKLQkJCXNlbGYuaW5zZXQgPSBpbnNldAotCQotCWRlZiBvcGVuKHNlbGYpOgotCQlpZiBub3QgaGFzYXR0cihzZWxmLl9wYXJlbnQsICJfYmFyeCIpOgotCQkJc2VsZi5fcGFyZW50Ll9iYXJ4ID0gTm9uZQotCQlpZiBub3QgaGFzYXR0cihzZWxmLl9wYXJlbnQsICJfYmFyeSIpOgotCQkJc2VsZi5fcGFyZW50Ll9iYXJ5ID0gTm9uZQotCQlzZWxmLl9jYWxjYm91bmRzKCkKLQkJc2VsZi5TZXRQb3J0KCkKLQkJdmlld3JlY3QsIGRlc3RyZWN0ID0gc2VsZi5fY2FsY3RleHRib3VuZHMoKQotCQlmbGFncyA9IHNlbGYuX2dldGZsYWdzKCkKLQkJc2VsZi50ZWQgPSB3YXN0ZS5XRU5ldyhkZXN0cmVjdCwgdmlld3JlY3QsIGZsYWdzKQotCQlzZWxmLnRlZC5XRUluc3RhbGxUYWJIb29rcygpCi0JCXNlbGYudGVkLldFU2V0QWxpZ25tZW50KFdBU1RFY29uc3Qud2VGbHVzaExlZnQpCi0JCXNlbGYuc2V0Zm9udHNldHRpbmdzKHNlbGYuZm9udHNldHRpbmdzKQotCQlzZWxmLnNldHRhYnNldHRpbmdzKHNlbGYudGFic2V0dGluZ3MpCi0JCXNlbGYudGVkLldFVXNlVGV4dChSZXMuUmVzb3VyY2Uoc2VsZi50ZW1wdGV4dCkpCi0JCXNlbGYudGVkLldFQ2FsVGV4dCgpCi0JCWlmIHNlbGYuc2VsZWN0aW9uOgotCQkJc2VsZi5zZXRzZWxlY3Rpb24oc2VsZi5zZWxlY3Rpb25bMF0sIHNlbGYuc2VsZWN0aW9uWzFdKQotCQkJc2VsZi5zZWxlY3Rpb24gPSBOb25lCi0JCWVsc2U6Ci0JCQlzZWxmLnNlbHZpZXcoKQotCQlzZWxmLnRlbXB0ZXh0ID0gTm9uZQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLmJpbmQoInBhZ2V1cCIsIHNlbGYuc2Nyb2xscGFnZXVwKQotCQlzZWxmLmJpbmQoInBhZ2Vkb3duIiwgc2VsZi5zY3JvbGxwYWdlZG93bikKLQkJc2VsZi5iaW5kKCJ0b3AiLCBzZWxmLnNjcm9sbHRvcCkKLQkJc2VsZi5iaW5kKCJib3R0b20iLCBzZWxmLnNjcm9sbGJvdHRvbSkKLQkJc2VsZi5zZWxjaGFuZ2VkID0gMAotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5fcGFyZW50Ll9iYXJ4ID0gTm9uZQotCQlzZWxmLl9wYXJlbnQuX2JhcnkgPSBOb25lCi0JCXNlbGYudGVkID0gTm9uZQotCQlzZWxmLnRlbXB0ZXh0ID0gTm9uZQotCQlXYmFzZS5TZWxlY3RhYmxlV2lkZ2V0LmNsb3NlKHNlbGYpCi0JCi0JZGVmIHRleHRjaGFuZ2VkKHNlbGYsIGFsbD0wKToKLQkJc2VsZi5jaGFuZ2VkID0gMQotCQotCWRlZiBzZWxlY3Rpb25jaGFuZ2VkKHNlbGYpOgotCQlzZWxmLnNlbGNoYW5nZWQgPSAxCi0JCXNlbGYub2xkc2VsZWN0aW9uID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQotCWRlZiBnZXR0YWJzZXR0aW5ncyhzZWxmKToKLQkJcmV0dXJuIHNlbGYudGFic2V0dGluZ3MKLQkKLQlkZWYgc2V0dGFic2V0dGluZ3Moc2VsZiwgKHRhYnNpemUsIHRhYm1vZGUpKToKLQkJc2VsZi50YWJzZXR0aW5ncyA9ICh0YWJzaXplLCB0YWJtb2RlKQotCQlpZiBoYXNhdHRyKHNlbGYudGVkLCAiV0VTZXRUYWJTaXplIik6Ci0JCQlwb3J0ID0gc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkKLQkJCWlmIHRhYm1vZGU6Ci0JCQkJKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikgPSBzZWxmLmdldGZvbnRzZXR0aW5ncygpCi0JCQkJc2F2ZXNldHRpbmdzID0gR2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0KQotCQkJCVNldFBvcnRGb250U2V0dGluZ3MocG9ydCwgKGZvbnQsIHN0eWxlLCBzaXplKSkKLQkJCQl0YWJzaXplID0gUWQuU3RyaW5nV2lkdGgoJyAnICogdGFic2l6ZSkKLQkJCQlTZXRQb3J0Rm9udFNldHRpbmdzKHBvcnQsIHNhdmVzZXR0aW5ncykKLQkJCXRhYnNpemUgPSBtYXgodGFic2l6ZSwgMSkKLQkJCXNlbGYudGVkLldFU2V0VGFiU2l6ZSh0YWJzaXplKQotCQkJc2VsZi5TZXRQb3J0KCkKLQkJCVFkLkVyYXNlUmVjdChzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkpCi0JCQlzZWxmLnRlZC5XRVVwZGF0ZShwb3J0LnZpc1JnbikKLQkKLQlkZWYgZ2V0Zm9udHNldHRpbmdzKHNlbGYpOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgUmVzCi0JCShmb250LCBzdHlsZSwgc2l6ZSwgY29sb3IpID0gc2VsZi50ZWQuV0VHZXRSdW5JbmZvKDApWzRdCi0JCWZvbnQgPSBGbS5HZXRGb250TmFtZShmb250KQotCQlyZXR1cm4gKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikKLQkKLQlkZWYgc2V0Zm9udHNldHRpbmdzKHNlbGYsIChmb250LCBzdHlsZSwgc2l6ZSwgY29sb3IpKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJaWYgdHlwZShmb250KSA8PiBTdHJpbmdUeXBlOgotCQkJZm9udCA9IEZtLkdldEZvbnROYW1lKGZvbnQpCi0JCXNlbGYuZm9udHNldHRpbmdzID0gKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikKLQkJZm9udGlkID0gR2V0Rk51bShmb250KQotCQlyZWFkb25seSA9IHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgLTEpCi0JCWlmIHJlYWRvbmx5OgotCQkJc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRlJlYWRPbmx5LCAwKQotCQl0cnk6Ci0JCQlzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGSW5oaWJpdFJlY2FsLCAxKQotCQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKDAsIHNlbGYudGVkLldFR2V0VGV4dExlbmd0aCgpKQotCQkJc2VsZi50ZWQuV0VTZXRTdHlsZShXQVNURWNvbnN0LndlRG9GYWNlLCAoMCwgMCwgMCwgKDAsIDAsIDApKSkKLQkJCXNlbGYudGVkLldFU2V0U3R5bGUoV0FTVEVjb25zdC53ZURvRmFjZSB8IAotCQkJCQkJV0FTVEVjb25zdC53ZURvQ29sb3IgfCAKLQkJCQkJCVdBU1RFY29uc3Qud2VEb0ZvbnQgfCAKLQkJCQkJCVdBU1RFY29uc3Qud2VEb1NpemUsIAotCQkJCQkJKGZvbnRpZCwgc3R5bGUsIHNpemUsIGNvbG9yKSkKLQkJCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZJbmhpYml0UmVjYWwsIDApCi0JCQlzZWxmLnRlZC5XRUNhbFRleHQoKQotCQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbGVuZCkKLQkJZmluYWxseToKLQkJCWlmIHJlYWRvbmx5OgotCQkJCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMSkKLQkJdmlld3JlY3QgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJUWQuRXJhc2VSZWN0KHZpZXdyZWN0KQotCQlzZWxmLnRlZC5XRVVwZGF0ZShzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCi0JZGVmIGFkanVzdChzZWxmLCBvbGRib3VuZHMpOgotCQlzZWxmLlNldFBvcnQoKQotCQkjIE5vdGU6IGlmIEFwcC5EcmF3VGhlbWVFZGl0VGV4dEZyYW1lIGlzIGV2ZXIgdXNlZCwgaXQgd2lsbCBiZSBuZWNlc3NhcnkKLQkJIyB0byB1bmNvbmRpdGlvbmFsbHkgb3V0c2V0IHRoZSBpbnZhbGlkYXRlZCByZWN0YW5nbGVzLCBzaW5jZSBBcHBlYXJhbmNlCi0JCSMgZnJhbWVzIGFyZSBkcmF3biBvdXRzaWRlIHRoZSBib3VuZHMuCi0JCWlmIHNlbGYuX3NlbGVjdGVkIGFuZCBzZWxmLl9wYXJlbnR3aW5kb3cuX2hhc3NlbGZyYW1lczoKLQkJCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChvbGRib3VuZHMsIC0zLCAtMykpCi0JCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCAtMywgLTMpKQotCQllbHNlOgotCQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qob2xkYm91bmRzKQotCQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qoc2VsZi5fYm91bmRzKQotCQl2aWV3cmVjdCwgZGVzdHJlY3QgPSBzZWxmLl9jYWxjdGV4dGJvdW5kcygpCi0JCXNlbGYudGVkLldFU2V0Vmlld1JlY3Qodmlld3JlY3QpCi0JCXNlbGYudGVkLldFU2V0RGVzdFJlY3QoZGVzdHJlY3QpCi0JCWlmIHNlbGYud3JhcDoKLQkJCXNlbGYudGVkLldFQ2FsVGV4dCgpCi0JCWlmIHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKVszXSA8IHZpZXdyZWN0WzFdOgotCQkJc2VsZi5zZWx2aWV3KCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkKLQkjIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSMgc2VsZWN0aW9uIHN0dWZmCi0JZGVmIHNlbHZpZXcoc2VsZik6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCi0JZGVmIHNlbGVjdGFsbChzZWxmKToKLQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oMCwgc2VsZi50ZWQuV0VHZXRUZXh0TGVuZ3RoKCkpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCi0JZGVmIHNlbGVjdGxpbmUoc2VsZiwgbGluZW5vLCBjaGFyb2Zmc2V0ID0gMCk6Ci0JCW5ld3NlbHN0YXJ0LCBuZXdzZWxlbmQgPSBzZWxmLnRlZC5XRUdldExpbmVSYW5nZShsaW5lbm8pCi0JCSMgQXV0b3Njcm9sbCBtYWtlcyB0aGUgKmVuZCogb2YgdGhlIHNlbGVjdGlvbiB2aXNpYmxlLCB3aGljaCwgCi0JCSMgaW4gdGhlIGNhc2Ugb2YgYSB3aG9sZSBsaW5lLCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSAqbmV4dCogbGluZS4gCi0JCSMgU28gc29tZXRpbWVzIGl0IGxlYXZlcyBvdXIgbGluZSBqdXN0IGFib3ZlIHRoZSB2aWV3IHJlY3QuIAotCQkjIExldCdzIGZvb2wgV2FzdGUgYnkgaW5pdGlhbGx5IHNlbGVjdGluZyBvbmUgY2hhciBsZXNzOgotCQlzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihuZXdzZWxzdGFydCArIGNoYXJvZmZzZXQsIG5ld3NlbGVuZC0xKQotCQlzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihuZXdzZWxzdGFydCArIGNoYXJvZmZzZXQsIG5ld3NlbGVuZCkKLQkJc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkKLQlkZWYgZ2V0c2VsZWN0aW9uKHNlbGYpOgotCQlpZiBzZWxmLnRlZDoKLQkJCXJldHVybiBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCWVsc2U6Ci0JCQlyZXR1cm4gc2VsZi5zZWxlY3Rpb24KLQkKLQlkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIHNlbHN0YXJ0LCBzZWxlbmQpOgotCQlzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQotCQlpZiBzZWxmLnRlZDoKLQkJCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCi0JCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJZWxzZToKLQkJCXNlbGYuc2VsZWN0aW9uID0gc2Vsc3RhcnQsIHNlbGVuZAotCQotCWRlZiBvZmZzZXR0b2xpbmUoc2VsZiwgb2Zmc2V0KToKLQkJcmV0dXJuIHNlbGYudGVkLldFT2Zmc2V0VG9MaW5lKG9mZnNldCkKLQkKLQlkZWYgY291bnRsaW5lcyhzZWxmKToKLQkJcmV0dXJuIHNlbGYudGVkLldFQ291bnRMaW5lcygpCi0JCi0JZGVmIGdldHNlbGVjdGVkdGV4dChzZWxmKToKLQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJcmV0dXJuIHNlbGYudGVkLldFR2V0VGV4dCgpLmRhdGFbc2Vsc3RhcnQ6c2VsZW5kXQotCQotCWRlZiBleHBhbmRzZWxlY3Rpb24oc2VsZik6Ci0JCW9sZHNlbHN0YXJ0LCBvbGRzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4ob2xkc2Vsc3RhcnQsIG9sZHNlbGVuZCksIG1heChvbGRzZWxzdGFydCwgb2xkc2VsZW5kKQotCQlpZiBzZWxzdGFydCA8PiBzZWxlbmQgYW5kIGNocihzZWxmLnRlZC5XRUdldENoYXIoc2VsZW5kLTEpKSA9PSAnXHInOgotCQkJc2VsZW5kID0gc2VsZW5kIC0gMQotCQluZXdzZWxzdGFydCwgZHVtbXkgPSBzZWxmLnRlZC5XRUZpbmRMaW5lKHNlbHN0YXJ0LCAxKQotCQlkdW1teSwgbmV3c2VsZW5kID0gc2VsZi50ZWQuV0VGaW5kTGluZShzZWxlbmQsIDEpCi0JCWlmIG9sZHNlbHN0YXJ0IDw+IG5ld3NlbHN0YXJ0IG9yICBvbGRzZWxlbmQgPD4gbmV3c2VsZW5kOgotCQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24obmV3c2Vsc3RhcnQsIG5ld3NlbGVuZCkKLQkJCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCi0JZGVmIGluc2VydChzZWxmLCB0ZXh0KToKLQkJc2VsZi50ZWQuV0VJbnNlcnQodGV4dCwgTm9uZSwgTm9uZSkKLQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCi0JIyB0ZXh0Ci0JZGVmIHNldChzZWxmLCB0ZXh0KToKLQkJaWYgbm90IHNlbGYudGVkOgotCQkJc2VsZi50ZW1wdGV4dCA9IHRleHQKLQkJZWxzZToKLQkJCXNlbGYudGVkLldFVXNlVGV4dChSZXMuUmVzb3VyY2UodGV4dCkpCi0JCQlzZWxmLnRlZC5XRUNhbFRleHQoKQotCQkJc2VsZi5TZXRQb3J0KCkKLQkJCXZpZXdyZWN0LCBkZXN0cmVjdCA9IHNlbGYuX2NhbGN0ZXh0Ym91bmRzKCkKLQkJCXNlbGYudGVkLldFU2V0Vmlld1JlY3Qodmlld3JlY3QpCi0JCQlzZWxmLnRlZC5XRVNldERlc3RSZWN0KGRlc3RyZWN0KQotCQkJcmduID0gUWQuTmV3UmduKCkKLQkJCVFkLlJlY3RSZ24ocmduLCB2aWV3cmVjdCkKLQkJCVFkLkVyYXNlUmVjdCh2aWV3cmVjdCkKLQkJCXNlbGYuZHJhdyhyZ24pCi0JCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQkJc2VsZi50ZXh0Y2hhbmdlZCgxKQotCQotCWRlZiBnZXQoc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9wYXJlbnQ6Ci0JCQlyZXR1cm4gc2VsZi50ZW1wdGV4dAotCQllbHNlOgotCQkJcmV0dXJuIHNlbGYudGVkLldFR2V0VGV4dCgpLmRhdGEKLQkKLQkjIGV2ZW50cwotCWRlZiBrZXkoc2VsZiwgY2hhciwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlpZiBzZWxmLl9lbmFibGVkIGFuZCBub3QgbW9kaWZpZXJzICYgRXZlbnRzLmNtZEtleSBvciBjaGFyIGluIFdrZXlzLmFycm93a2V5czoKLQkJCXNlbGYudGVkLldFS2V5KG9yZChjaGFyKSwgbW9kaWZpZXJzKQotCQkJaWYgY2hhciBub3QgaW4gV2tleXMubmF2aWdhdGlvbmtleXM6Ci0JCQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCQlpZiBjaGFyIG5vdCBpbiBXa2V5cy5zY3JvbGxrZXlzOgotCQkJCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCBjaGFyLCBtb2RpZmllcnMpCi0JCi0JZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlpZiBub3Qgc2VsZi5fZW5hYmxlZDoKLQkJCXJldHVybgotCQlzZWxmLnRlZC5XRUNsaWNrKHBvaW50LCBtb2RpZmllcnMsIEV2dC5UaWNrQ291bnQoKSkKLQkJc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJcmV0dXJuIDEKLQkKLQlkZWYgaWRsZShzZWxmKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi50ZWQuV0VJZGxlKCkKLQkKLQlkZWYgcm9sbG92ZXIoc2VsZiwgcG9pbnQsIG9ub2ZmKToKLQkJaWYgb25vZmY6Ci0JCQlXYmFzZS5TZXRDdXJzb3IoImlCZWFtIikKLQkKLQlkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgotCQlzZWxmLl9hY3RpdmF0ZWQgPSBvbm9mZgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJc2VsZi5TZXRQb3J0KCkKLQkJCQotCQkJIyBESVNBQkxFRCEgIFRoZXJlIGFyZSB0b28gbWFueSBwbGFjZXMgd2hlcmUgaXQgaXMgYXNzdW1lZCB0aGF0Ci0JCQkjIHRoZSBmcmFtZSBvZiBhbiBFZGl0VGV4dCBpdGVtIGlzIDEgcGl4ZWwsIGluc2lkZSB0aGUgYm91bmRzLgotCQkJI3N0YXRlID0gW2tUaGVtZVN0YXRlQWN0aXZlLCBrVGhlbWVTdGF0ZUluYWN0aXZlXVtub3Qgb25vZmZdCi0JCQkjQXBwLkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUoUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSksIHN0YXRlKQotCQkJCi0JCQlpZiBzZWxmLl9zZWxlY3RlZDoKLQkJCQlpZiBvbm9mZjoKLQkJCQkJc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCi0JCQkJZWxzZToKLQkJCQkJc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKLQkJCQlzZWxmLmRyYXdzZWxmcmFtZShvbm9mZikKLQkKLQlkZWYgc2VsZWN0KHNlbGYsIG9ub2ZmLCBpc2NsaWNrID0gMCk6Ci0JCWlmIFdiYXNlLlNlbGVjdGFibGVXaWRnZXQuc2VsZWN0KHNlbGYsIG9ub2ZmKToKLQkJCXJldHVybgotCQlzZWxmLlNldFBvcnQoKQotCQlpZiBvbm9mZjoKLQkJCXNlbGYudGVkLldFQWN0aXZhdGUoKQotCQkJaWYgc2VsZi5fcGFyZW50d2luZG93Ll90YWJiYWJsZSBhbmQgbm90IGlzY2xpY2s6Ci0JCQkJc2VsZi5zZWxlY3RhbGwoKQotCQllbHNlOgotCQkJc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKLQkJc2VsZi5kcmF3c2VsZnJhbWUob25vZmYpCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQlpZiBub3QgdmlzUmduOgotCQkJCXZpc1JnbiA9IHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbgotCQkJc2VsZi50ZWQuV0VVcGRhdGUodmlzUmduKQogCi0JCQkjIERJU0FCTEVEISAgVGhlcmUgYXJlIHRvbyBtYW55IHBsYWNlcyB3aGVyZSBpdCBpcyBhc3N1bWVkIHRoYXQKLQkJCSMgdGhlIGZyYW1lIG9mIGFuIEVkaXRUZXh0IGl0ZW0gaXMgMSBwaXhlbCwgaW5zaWRlIHRoZSBib3VuZHMuCi0JCQkjc3RhdGUgPSBba1RoZW1lU3RhdGVBY3RpdmUsIGtUaGVtZVN0YXRlSW5hY3RpdmVdW25vdCBzZWxmLl9hY3RpdmF0ZWRdCi0JCQkjQXBwLkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUoUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSksIHN0YXRlKQotCQkJUWQuRnJhbWVSZWN0KHNlbGYuX2JvdW5kcykKKyAgICAiIiJBIHRleHQgZWRpdCB3aWRnZXQsIG1haW5seSBmb3Igc2ltcGxlIGVudHJ5IGZpZWxkcy4iIiIKIAotCQkJaWYgc2VsZi5fc2VsZWN0ZWQgYW5kIHNlbGYuX2FjdGl2YXRlZDoKLQkJCQlzZWxmLmRyYXdzZWxmcmFtZSgxKQotCQotCSMgc2Nyb2xsaW5nCi0JZGVmIHNjcm9sbHBhZ2V1cChzZWxmKToKLQkJaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6Ci0JCQlzZWxmLnZzY3JvbGwoIisrIikKLQkKLQlkZWYgc2Nyb2xscGFnZWRvd24oc2VsZik6Ci0JCWlmIHNlbGYuX3BhcmVudC5fYmFyeSBhbmQgc2VsZi5fcGFyZW50Ll9iYXJ5Ll9lbmFibGVkOgotCQkJc2VsZi52c2Nyb2xsKCItLSIpCi0JCi0JZGVmIHNjcm9sbHRvcChzZWxmKToKLQkJaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6Ci0JCQlzZWxmLnZzY3JvbGwoc2VsZi5fcGFyZW50Ll9iYXJ5LmdldG1pbigpKQotCQlpZiBzZWxmLl9wYXJlbnQuX2JhcnggYW5kIHNlbGYuX3BhcmVudC5fYmFyeC5fZW5hYmxlZDoKLQkJCXNlbGYuaHNjcm9sbChzZWxmLl9wYXJlbnQuX2JhcnguZ2V0bWluKCkpCi0JCi0JZGVmIHNjcm9sbGJvdHRvbShzZWxmKToKLQkJaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6Ci0JCQlzZWxmLnZzY3JvbGwoc2VsZi5fcGFyZW50Ll9iYXJ5LmdldG1heCgpKQotCQotCSMgbWVudSBoYW5kbGVycwotCWRlZiBkb21lbnVfY29weShzZWxmLCAqYXJncyk6Ci0JCXNlbGJlZ2luLCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCWlmIHNlbGJlZ2luID09IHNlbGVuZDoKLQkJCXJldHVybgotCQlpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6Ci0JCQlTY3JhcC5aZXJvU2NyYXAoKQotCQllbHNlOgotCQkJU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQotCQlzZWxmLnRlZC5XRUNvcHkoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQotCWRlZiBkb21lbnVfY3V0KHNlbGYsICphcmdzKToKLQkJc2VsYmVnaW4sIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJaWYgc2VsYmVnaW4gPT0gc2VsZW5kOgotCQkJcmV0dXJuCi0JCWlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKLQkJCVNjcmFwLlplcm9TY3JhcCgpCi0JCWVsc2U6Ci0JCQlTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCi0JCXNlbGYudGVkLldFQ3V0KCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5zZWx2aWV3KCkKLQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAiIiwgTm9uZSkKLQkKLQlkZWYgZG9tZW51X3Bhc3RlKHNlbGYsICphcmdzKToKLQkJaWYgbm90IHNlbGYudGVkLldFQ2FuUGFzdGUoKToKLQkJCXJldHVybgotCQlzZWxmLnNlbHZpZXcoKQotCQlzZWxmLnRlZC5XRVBhc3RlKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAiIiwgTm9uZSkKLQkKLQlkZWYgZG9tZW51X2NsZWFyKHNlbGYsICphcmdzKToKLQkJc2VsZi50ZWQuV0VEZWxldGUoKQotCQlzZWxmLnNlbHZpZXcoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnRleHRjaGFuZ2VkKCkKLQkJc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKLQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQlXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsICIiLCBOb25lKQotCQotCWRlZiBkb21lbnVfdW5kbyhzZWxmLCAqYXJncyk6Ci0JCXdoaWNoLCByZWRvID0gc2VsZi50ZWQuV0VHZXRVbmRvSW5mbygpCi0JCWlmIG5vdCB3aGljaDogCi0JCQlyZXR1cm4KLQkJc2VsZi50ZWQuV0VVbmRvKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAiIiwgTm9uZSkKLQkKLQlkZWYgY2FuX3VuZG8oc2VsZiwgbWVudWl0ZW0pOgotCQkjZG91bmRvID0gc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRlVuZG8sIC0xKQotCQkjcHJpbnQgZG91bmRvCi0JCSNpZiBub3QgZG91bmRvOgotCQkjCXJldHVybiAwCi0JCXdoaWNoLCByZWRvID0gc2VsZi50ZWQuV0VHZXRVbmRvSW5mbygpCi0JCWlmIHdoaWNoIDwgbGVuKFVORE9MQUJFTFMpOgotCQkJd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQotCQllbHNlOgotCQkJd2hpY2ggPSAiIgotCQlpZiB3aGljaCA9PSBOb25lOiAKLQkJCXJldHVybiBOb25lCi0JCWlmIHJlZG86Ci0JCQl3aGljaCA9ICJSZWRvICIrd2hpY2gKLQkJZWxzZToKLQkJCXdoaWNoID0gIlVuZG8gIit3aGljaAotCQltZW51aXRlbS5zZXR0ZXh0KHdoaWNoKQotCQlyZXR1cm4gMQotCQotCWRlZiBkb21lbnVfc2VsZWN0YWxsKHNlbGYsICphcmdzKToKLQkJc2VsZi5zZWxlY3RhbGwoKQotCQotCSMgcHJpdmF0ZQotCWRlZiBnZXRzY3JvbGxyZWN0cyhzZWxmKToKLQkJcmV0dXJuIHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKSwgc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCi0JZGVmIHZzY3JvbGwoc2VsZiwgdmFsdWUpOgotCQlsaW5laGVpZ2h0ID0gc2VsZi50ZWQuV0VHZXRIZWlnaHQoMCwgMSkKLQkJZHIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKLQkJdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJdmlld2hlaWdodCA9IHZyWzNdIC0gdnJbMV0KLQkJbWF4ZGVsdGEgPSB2clsxXSAtIGRyWzFdCi0JCW1pbmRlbHRhID0gdnJbM10gLSBkclszXQotCQlpZiB2YWx1ZSA9PSAiKyI6Ci0JCQlkZWx0YSA9IGxpbmVoZWlnaHQKLQkJZWxpZiB2YWx1ZSA9PSAiLSI6Ci0JCQlkZWx0YSA9IC0gbGluZWhlaWdodAotCQllbGlmIHZhbHVlID09ICIrKyI6Ci0JCQlkZWx0YSA9IHZpZXdoZWlnaHQgLSBsaW5laGVpZ2h0Ci0JCWVsaWYgdmFsdWUgPT0gIi0tIjoKLQkJCWRlbHRhID0gbGluZWhlaWdodCAtIHZpZXdoZWlnaHQKLQkJZWxzZToJIyBpbiB0aHVtYgotCQkJZGVsdGEgPSB2clsxXSAtIGRyWzFdIC0gdmFsdWUKLQkJZGVsdGEgPSBtaW4obWF4ZGVsdGEsIGRlbHRhKQotCQlkZWx0YSA9IG1heChtaW5kZWx0YSwgZGVsdGEpCi0JCWRlbHRhID0gaW50KGRlbHRhKQotCQlzZWxmLnRlZC5XRVNjcm9sbCgwLCBkZWx0YSkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkKLQlkZWYgaHNjcm9sbChzZWxmLCB2YWx1ZSk6Ci0JCWRyID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCi0JCXZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCWRlc3R3aWR0aCA9IGRyWzJdIC0gZHJbMF0KLQkJdmlld3dpZHRoID0gdnJbMl0gLSB2clswXQotCQl2aWV3b2Zmc2V0ID0gbWF4ZGVsdGEgPSB2clswXSAtIGRyWzBdCi0JCW1pbmRlbHRhID0gdnJbMl0gLSBkclsyXQotCQlpZiB2YWx1ZSA9PSAiKyI6Ci0JCQlkZWx0YSA9IDMyCi0JCWVsaWYgdmFsdWUgPT0gIi0iOgotCQkJZGVsdGEgPSAtIDMyCi0JCWVsaWYgdmFsdWUgPT0gIisrIjoKLQkJCWRlbHRhID0gMC41ICogKHZyWzJdIC0gdnJbMF0pCi0JCWVsaWYgdmFsdWUgPT0gIi0tIjoKLQkJCWRlbHRhID0gMC41ICogKHZyWzBdIC0gdnJbMl0pCi0JCWVsc2U6CSMgaW4gdGh1bWIKLQkJCWRlbHRhID0gdnJbMF0gLSBkclswXSAtIHZhbHVlCi0JCQkjY3VyID0gKDMyNzY3ICogdmlld29mZnNldCkgLyAoZGVzdHdpZHRoIC0gdmlld3dpZHRoKQotCQkJI2RlbHRhID0gKGN1ci12YWx1ZSkqKGRlc3R3aWR0aCAtIHZpZXd3aWR0aCkvMzI3NjcKLQkJCSNpZiBhYnMoZGVsdGEgLSB2aWV3b2Zmc2V0KSA8PTI6Ci0JCQkjCSMgY29tcGVuc2F0ZSBmb3IgaXJyaXRhdGluZyByb3VuZGluZyBlcnJvcgotCQkJIwlkZWx0YSA9IHZpZXdvZmZzZXQKLQkJZGVsdGEgPSBtaW4obWF4ZGVsdGEsIGRlbHRhKQotCQlkZWx0YSA9IG1heChtaW5kZWx0YSwgZGVsdGEpCi0JCWRlbHRhID0gaW50KGRlbHRhKQotCQlzZWxmLnRlZC5XRVNjcm9sbChkZWx0YSwgMCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkKLQkjIHNvbWUgaW50ZXJuYWxzCi0JZGVmIF9nZXRmbGFncyhzZWxmKToKLQkJZmxhZ3MgPSBXQVNURWNvbnN0LndlRG9BdXRvU2Nyb2xsIHwgV0FTVEVjb25zdC53ZURvTW9ub1N0eWxlZAotCQlpZiBzZWxmLnJlYWRvbmx5OgotCQkJZmxhZ3MgPSBmbGFncyB8IFdBU1RFY29uc3Qud2VEb1JlYWRPbmx5Ci0JCWVsc2U6Ci0JCQlmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvVW5kbwotCQlyZXR1cm4gZmxhZ3MKLQkKLQlkZWYgX2dldHZpZXdyZWN0KHNlbGYpOgotCQlyZXR1cm4gUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgc2VsZi5pbnNldFswXSwgc2VsZi5pbnNldFsxXSkKLQkKLQlkZWYgX2NhbGN0ZXh0Ym91bmRzKHNlbGYpOgotCQl2aWV3cmVjdCA9IGwsIHQsIHIsIGIgPSBzZWxmLl9nZXR2aWV3cmVjdCgpCi0JCWlmIHNlbGYudGVkOgotCQkJZGwsIGR0LCBkciwgZGIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKLQkJCXZsLCB2dCwgdnIsIHZiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCQl5c2hpZnQgPSB0IC0gdnQKLQkJCWlmIChkYiAtIGR0KSA8IChiIC0gdCk6Ci0JCQkJZGVzdHJlY3QgPSB2aWV3cmVjdAotCQkJZWxzZToKLQkJCQlkZXN0cmVjdCA9IGwsIGR0ICsgeXNoaWZ0LCByLCBkYiArIHlzaGlmdAotCQllbHNlOgotCQkJZGVzdHJlY3QgPSB2aWV3cmVjdAotCQlyZXR1cm4gdmlld3JlY3QsIGRlc3RyZWN0Ci0JCQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0ZXh0PSIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPU5vbmUsIGluc2V0PSgzLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250c2V0dGluZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJzZXR0aW5ncyA9ICgzMiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgPSAwKToKKyAgICAgICAgaWYgZm9udHNldHRpbmdzIGlzIE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgVworICAgICAgICAgICAgZm9udHNldHRpbmdzID0gVy5nZXRkZWZhdWx0Zm9udCgpCisgICAgICAgIFdiYXNlLlNlbGVjdGFibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKKyAgICAgICAgc2VsZi50ZW1wdGV4dCA9IHRleHQKKyAgICAgICAgc2VsZi50ZWQgPSBOb25lCisgICAgICAgIHNlbGYuc2VsZWN0aW9uID0gTm9uZQorICAgICAgICBzZWxmLm9sZHNlbGVjdGlvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjaworICAgICAgICBzZWxmLmNoYW5nZWQgPSAwCisgICAgICAgIHNlbGYuc2VsY2hhbmdlZCA9IDAKKyAgICAgICAgc2VsZi5fc2VsZWN0ZWQgPSAwCisgICAgICAgIHNlbGYuX2VuYWJsZWQgPSAxCisgICAgICAgIHNlbGYud3JhcCA9IDEKKyAgICAgICAgc2VsZi5yZWFkb25seSA9IHJlYWRvbmx5CisgICAgICAgIHNlbGYuZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCisgICAgICAgIHNlbGYudGFic2V0dGluZ3MgPSB0YWJzZXR0aW5ncworICAgICAgICBpZiB0eXBlKGluc2V0KSA8PiBUdXBsZVR5cGU6CisgICAgICAgICAgICBzZWxmLmluc2V0ID0gKGluc2V0LCBpbnNldCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaW5zZXQgPSBpbnNldAorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYuX3BhcmVudCwgIl9iYXJ4Iik6CisgICAgICAgICAgICBzZWxmLl9wYXJlbnQuX2JhcnggPSBOb25lCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYuX3BhcmVudCwgIl9iYXJ5Iik6CisgICAgICAgICAgICBzZWxmLl9wYXJlbnQuX2JhcnkgPSBOb25lCisgICAgICAgIHNlbGYuX2NhbGNib3VuZHMoKQorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICB2aWV3cmVjdCwgZGVzdHJlY3QgPSBzZWxmLl9jYWxjdGV4dGJvdW5kcygpCisgICAgICAgIGZsYWdzID0gc2VsZi5fZ2V0ZmxhZ3MoKQorICAgICAgICBzZWxmLnRlZCA9IHdhc3RlLldFTmV3KGRlc3RyZWN0LCB2aWV3cmVjdCwgZmxhZ3MpCisgICAgICAgIHNlbGYudGVkLldFSW5zdGFsbFRhYkhvb2tzKCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRBbGlnbm1lbnQoV0FTVEVjb25zdC53ZUZsdXNoTGVmdCkKKyAgICAgICAgc2VsZi5zZXRmb250c2V0dGluZ3Moc2VsZi5mb250c2V0dGluZ3MpCisgICAgICAgIHNlbGYuc2V0dGFic2V0dGluZ3Moc2VsZi50YWJzZXR0aW5ncykKKyAgICAgICAgc2VsZi50ZWQuV0VVc2VUZXh0KFJlcy5SZXNvdXJjZShzZWxmLnRlbXB0ZXh0KSkKKyAgICAgICAgc2VsZi50ZWQuV0VDYWxUZXh0KCkKKyAgICAgICAgaWYgc2VsZi5zZWxlY3Rpb246CisgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihzZWxmLnNlbGVjdGlvblswXSwgc2VsZi5zZWxlY3Rpb25bMV0pCisgICAgICAgICAgICBzZWxmLnNlbGVjdGlvbiA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VsdmlldygpCisgICAgICAgIHNlbGYudGVtcHRleHQgPSBOb25lCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYuYmluZCgicGFnZXVwIiwgc2VsZi5zY3JvbGxwYWdldXApCisgICAgICAgIHNlbGYuYmluZCgicGFnZWRvd24iLCBzZWxmLnNjcm9sbHBhZ2Vkb3duKQorICAgICAgICBzZWxmLmJpbmQoInRvcCIsIHNlbGYuc2Nyb2xsdG9wKQorICAgICAgICBzZWxmLmJpbmQoImJvdHRvbSIsIHNlbGYuc2Nyb2xsYm90dG9tKQorICAgICAgICBzZWxmLnNlbGNoYW5nZWQgPSAwCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX3BhcmVudC5fYmFyeCA9IE5vbmUKKyAgICAgICAgc2VsZi5fcGFyZW50Ll9iYXJ5ID0gTm9uZQorICAgICAgICBzZWxmLnRlZCA9IE5vbmUKKyAgICAgICAgc2VsZi50ZW1wdGV4dCA9IE5vbmUKKyAgICAgICAgV2Jhc2UuU2VsZWN0YWJsZVdpZGdldC5jbG9zZShzZWxmKQorCisgICAgZGVmIHRleHRjaGFuZ2VkKHNlbGYsIGFsbD0wKToKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMQorCisgICAgZGVmIHNlbGVjdGlvbmNoYW5nZWQoc2VsZik6CisgICAgICAgIHNlbGYuc2VsY2hhbmdlZCA9IDEKKyAgICAgICAgc2VsZi5vbGRzZWxlY3Rpb24gPSBzZWxmLmdldHNlbGVjdGlvbigpCisKKyAgICBkZWYgZ2V0dGFic2V0dGluZ3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRhYnNldHRpbmdzCisKKyAgICBkZWYgc2V0dGFic2V0dGluZ3Moc2VsZiwgKHRhYnNpemUsIHRhYm1vZGUpKToKKyAgICAgICAgc2VsZi50YWJzZXR0aW5ncyA9ICh0YWJzaXplLCB0YWJtb2RlKQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYudGVkLCAiV0VTZXRUYWJTaXplIik6CisgICAgICAgICAgICBwb3J0ID0gc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkKKyAgICAgICAgICAgIGlmIHRhYm1vZGU6CisgICAgICAgICAgICAgICAgKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikgPSBzZWxmLmdldGZvbnRzZXR0aW5ncygpCisgICAgICAgICAgICAgICAgc2F2ZXNldHRpbmdzID0gR2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0KQorICAgICAgICAgICAgICAgIFNldFBvcnRGb250U2V0dGluZ3MocG9ydCwgKGZvbnQsIHN0eWxlLCBzaXplKSkKKyAgICAgICAgICAgICAgICB0YWJzaXplID0gUWQuU3RyaW5nV2lkdGgoJyAnICogdGFic2l6ZSkKKyAgICAgICAgICAgICAgICBTZXRQb3J0Rm9udFNldHRpbmdzKHBvcnQsIHNhdmVzZXR0aW5ncykKKyAgICAgICAgICAgIHRhYnNpemUgPSBtYXgodGFic2l6ZSwgMSkKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2V0VGFiU2l6ZSh0YWJzaXplKQorICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgICAgIFFkLkVyYXNlUmVjdChzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkpCisgICAgICAgICAgICBzZWxmLnRlZC5XRVVwZGF0ZShwb3J0LnZpc1JnbikKKworICAgIGRlZiBnZXRmb250c2V0dGluZ3Moc2VsZik6CisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBSZXMKKyAgICAgICAgKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikgPSBzZWxmLnRlZC5XRUdldFJ1bkluZm8oMClbNF0KKyAgICAgICAgZm9udCA9IEZtLkdldEZvbnROYW1lKGZvbnQpCisgICAgICAgIHJldHVybiAoZm9udCwgc3R5bGUsIHNpemUsIGNvbG9yKQorCisgICAgZGVmIHNldGZvbnRzZXR0aW5ncyhzZWxmLCAoZm9udCwgc3R5bGUsIHNpemUsIGNvbG9yKSk6CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIGlmIHR5cGUoZm9udCkgPD4gU3RyaW5nVHlwZToKKyAgICAgICAgICAgIGZvbnQgPSBGbS5HZXRGb250TmFtZShmb250KQorICAgICAgICBzZWxmLmZvbnRzZXR0aW5ncyA9IChmb250LCBzdHlsZSwgc2l6ZSwgY29sb3IpCisgICAgICAgIGZvbnRpZCA9IEdldEZOdW0oZm9udCkKKyAgICAgICAgcmVhZG9ubHkgPSBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGUmVhZE9ubHksIC0xKQorICAgICAgICBpZiByZWFkb25seToKKyAgICAgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkluaGliaXRSZWNhbCwgMSkKKyAgICAgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbigwLCBzZWxmLnRlZC5XRUdldFRleHRMZW5ndGgoKSkKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2V0U3R5bGUoV0FTVEVjb25zdC53ZURvRmFjZSwgKDAsIDAsIDAsICgwLCAwLCAwKSkpCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNldFN0eWxlKFdBU1RFY29uc3Qud2VEb0ZhY2UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvQ29sb3IgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvRm9udCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVNURWNvbnN0LndlRG9TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvbnRpZCwgc3R5bGUsIHNpemUsIGNvbG9yKSkKKyAgICAgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZJbmhpYml0UmVjYWwsIDApCisgICAgICAgICAgICBzZWxmLnRlZC5XRUNhbFRleHQoKQorICAgICAgICAgICAgc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbGVuZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHJlYWRvbmx5OgorICAgICAgICAgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMSkKKyAgICAgICAgdmlld3JlY3QgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgUWQuRXJhc2VSZWN0KHZpZXdyZWN0KQorICAgICAgICBzZWxmLnRlZC5XRVVwZGF0ZShzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCisgICAgICAgIHNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgICMgTm90ZTogaWYgQXBwLkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUgaXMgZXZlciB1c2VkLCBpdCB3aWxsIGJlIG5lY2Vzc2FyeQorICAgICAgICAjIHRvIHVuY29uZGl0aW9uYWxseSBvdXRzZXQgdGhlIGludmFsaWRhdGVkIHJlY3RhbmdsZXMsIHNpbmNlIEFwcGVhcmFuY2UKKyAgICAgICAgIyBmcmFtZXMgYXJlIGRyYXduIG91dHNpZGUgdGhlIGJvdW5kcy4KKyAgICAgICAgaWYgc2VsZi5fc2VsZWN0ZWQgYW5kIHNlbGYuX3BhcmVudHdpbmRvdy5faGFzc2VsZnJhbWVzOgorICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3QoUWQuSW5zZXRSZWN0KG9sZGJvdW5kcywgLTMsIC0zKSkKKyAgICAgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIC0zLCAtMykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChvbGRib3VuZHMpCisgICAgICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCisgICAgICAgIHZpZXdyZWN0LCBkZXN0cmVjdCA9IHNlbGYuX2NhbGN0ZXh0Ym91bmRzKCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRWaWV3UmVjdCh2aWV3cmVjdCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXREZXN0UmVjdChkZXN0cmVjdCkKKyAgICAgICAgaWYgc2VsZi53cmFwOgorICAgICAgICAgICAgc2VsZi50ZWQuV0VDYWxUZXh0KCkKKyAgICAgICAgaWYgc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpWzNdIDwgdmlld3JlY3RbMV06CisgICAgICAgICAgICBzZWxmLnNlbHZpZXcoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorCisgICAgIyBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHNlbGVjdGlvbiBzdHVmZgorICAgIGRlZiBzZWx2aWV3KHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorCisgICAgZGVmIHNlbGVjdGFsbChzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oMCwgc2VsZi50ZWQuV0VHZXRUZXh0TGVuZ3RoKCkpCisgICAgICAgIHNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgc2VsZWN0bGluZShzZWxmLCBsaW5lbm8sIGNoYXJvZmZzZXQgPSAwKToKKyAgICAgICAgbmV3c2Vsc3RhcnQsIG5ld3NlbGVuZCA9IHNlbGYudGVkLldFR2V0TGluZVJhbmdlKGxpbmVubykKKyAgICAgICAgIyBBdXRvc2Nyb2xsIG1ha2VzIHRoZSAqZW5kKiBvZiB0aGUgc2VsZWN0aW9uIHZpc2libGUsIHdoaWNoLAorICAgICAgICAjIGluIHRoZSBjYXNlIG9mIGEgd2hvbGUgbGluZSwgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgKm5leHQqIGxpbmUuCisgICAgICAgICMgU28gc29tZXRpbWVzIGl0IGxlYXZlcyBvdXIgbGluZSBqdXN0IGFib3ZlIHRoZSB2aWV3IHJlY3QuCisgICAgICAgICMgTGV0J3MgZm9vbCBXYXN0ZSBieSBpbml0aWFsbHkgc2VsZWN0aW5nIG9uZSBjaGFyIGxlc3M6CisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKG5ld3NlbHN0YXJ0ICsgY2hhcm9mZnNldCwgbmV3c2VsZW5kLTEpCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKG5ld3NlbHN0YXJ0ICsgY2hhcm9mZnNldCwgbmV3c2VsZW5kKQorICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi50ZWQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2VsZWN0aW9uCisKKyAgICBkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIHNlbHN0YXJ0LCBzZWxlbmQpOgorICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICBpZiBzZWxmLnRlZDoKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0aW9uID0gc2Vsc3RhcnQsIHNlbGVuZAorCisgICAgZGVmIG9mZnNldHRvbGluZShzZWxmLCBvZmZzZXQpOgorICAgICAgICByZXR1cm4gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUob2Zmc2V0KQorCisgICAgZGVmIGNvdW50bGluZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRlZC5XRUNvdW50TGluZXMoKQorCisgICAgZGVmIGdldHNlbGVjdGVkdGV4dChzZWxmKToKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudGVkLldFR2V0VGV4dCgpLmRhdGFbc2Vsc3RhcnQ6c2VsZW5kXQorCisgICAgZGVmIGV4cGFuZHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgb2xkc2Vsc3RhcnQsIG9sZHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihvbGRzZWxzdGFydCwgb2xkc2VsZW5kKSwgbWF4KG9sZHNlbHN0YXJ0LCBvbGRzZWxlbmQpCisgICAgICAgIGlmIHNlbHN0YXJ0IDw+IHNlbGVuZCBhbmQgY2hyKHNlbGYudGVkLldFR2V0Q2hhcihzZWxlbmQtMSkpID09ICdccic6CisgICAgICAgICAgICBzZWxlbmQgPSBzZWxlbmQgLSAxCisgICAgICAgIG5ld3NlbHN0YXJ0LCBkdW1teSA9IHNlbGYudGVkLldFRmluZExpbmUoc2Vsc3RhcnQsIDEpCisgICAgICAgIGR1bW15LCBuZXdzZWxlbmQgPSBzZWxmLnRlZC5XRUZpbmRMaW5lKHNlbGVuZCwgMSkKKyAgICAgICAgaWYgb2xkc2Vsc3RhcnQgPD4gbmV3c2Vsc3RhcnQgb3IgIG9sZHNlbGVuZCA8PiBuZXdzZWxlbmQ6CisgICAgICAgICAgICBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihuZXdzZWxzdGFydCwgbmV3c2VsZW5kKQorICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgdGV4dCk6CisgICAgICAgIHNlbGYudGVkLldFSW5zZXJ0KHRleHQsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYudGV4dGNoYW5nZWQoKQorICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorCisgICAgIyB0ZXh0CisgICAgZGVmIHNldChzZWxmLCB0ZXh0KToKKyAgICAgICAgaWYgbm90IHNlbGYudGVkOgorICAgICAgICAgICAgc2VsZi50ZW1wdGV4dCA9IHRleHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGVkLldFVXNlVGV4dChSZXMuUmVzb3VyY2UodGV4dCkpCisgICAgICAgICAgICBzZWxmLnRlZC5XRUNhbFRleHQoKQorICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgICAgIHZpZXdyZWN0LCBkZXN0cmVjdCA9IHNlbGYuX2NhbGN0ZXh0Ym91bmRzKCkKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2V0Vmlld1JlY3Qodmlld3JlY3QpCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNldERlc3RSZWN0KGRlc3RyZWN0KQorICAgICAgICAgICAgcmduID0gUWQuTmV3UmduKCkKKyAgICAgICAgICAgIFFkLlJlY3RSZ24ocmduLCB2aWV3cmVjdCkKKyAgICAgICAgICAgIFFkLkVyYXNlUmVjdCh2aWV3cmVjdCkKKyAgICAgICAgICAgIHNlbGYuZHJhdyhyZ24pCisgICAgICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICAgICAgc2VsZi50ZXh0Y2hhbmdlZCgxKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhcmVudDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRlbXB0ZXh0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ZWQuV0VHZXRUZXh0KCkuZGF0YQorCisgICAgIyBldmVudHMKKyAgICBkZWYga2V5KHNlbGYsIGNoYXIsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgaWYgc2VsZi5fZW5hYmxlZCBhbmQgbm90IG1vZGlmaWVycyAmIEV2ZW50cy5jbWRLZXkgb3IgY2hhciBpbiBXa2V5cy5hcnJvd2tleXM6CisgICAgICAgICAgICBzZWxmLnRlZC5XRUtleShvcmQoY2hhciksIG1vZGlmaWVycykKKyAgICAgICAgICAgIGlmIGNoYXIgbm90IGluIFdrZXlzLm5hdmlnYXRpb25rZXlzOgorICAgICAgICAgICAgICAgIHNlbGYudGV4dGNoYW5nZWQoKQorICAgICAgICAgICAgaWYgY2hhciBub3QgaW4gV2tleXMuc2Nyb2xsa2V5czoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgY2hhciwgbW9kaWZpZXJzKQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnRlZC5XRUNsaWNrKHBvaW50LCBtb2RpZmllcnMsIEV2dC5UaWNrQ291bnQoKSkKKyAgICAgICAgc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBpZGxlKHNlbGYpOgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLnRlZC5XRUlkbGUoKQorCisgICAgZGVmIHJvbGxvdmVyKHNlbGYsIHBvaW50LCBvbm9mZik6CisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgV2Jhc2UuU2V0Q3Vyc29yKCJpQmVhbSIpCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBzZWxmLl9hY3RpdmF0ZWQgPSBvbm9mZgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKworICAgICAgICAgICAgIyBESVNBQkxFRCEgIFRoZXJlIGFyZSB0b28gbWFueSBwbGFjZXMgd2hlcmUgaXQgaXMgYXNzdW1lZCB0aGF0CisgICAgICAgICAgICAjIHRoZSBmcmFtZSBvZiBhbiBFZGl0VGV4dCBpdGVtIGlzIDEgcGl4ZWwsIGluc2lkZSB0aGUgYm91bmRzLgorICAgICAgICAgICAgI3N0YXRlID0gW2tUaGVtZVN0YXRlQWN0aXZlLCBrVGhlbWVTdGF0ZUluYWN0aXZlXVtub3Qgb25vZmZdCisgICAgICAgICAgICAjQXBwLkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUoUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSksIHN0YXRlKQorCisgICAgICAgICAgICBpZiBzZWxmLl9zZWxlY3RlZDoKKyAgICAgICAgICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmRyYXdzZWxmcmFtZShvbm9mZikKKworICAgIGRlZiBzZWxlY3Qoc2VsZiwgb25vZmYsIGlzY2xpY2sgPSAwKToKKyAgICAgICAgaWYgV2Jhc2UuU2VsZWN0YWJsZVdpZGdldC5zZWxlY3Qoc2VsZiwgb25vZmYpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCisgICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnR3aW5kb3cuX3RhYmJhYmxlIGFuZCBub3QgaXNjbGljazoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGFsbCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQorICAgICAgICBzZWxmLmRyYXdzZWxmcmFtZShvbm9mZikKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgaWYgbm90IHZpc1JnbjoKKyAgICAgICAgICAgICAgICB2aXNSZ24gPSBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KKyAgICAgICAgICAgIHNlbGYudGVkLldFVXBkYXRlKHZpc1JnbikKKworICAgICAgICAgICAgIyBESVNBQkxFRCEgIFRoZXJlIGFyZSB0b28gbWFueSBwbGFjZXMgd2hlcmUgaXQgaXMgYXNzdW1lZCB0aGF0CisgICAgICAgICAgICAjIHRoZSBmcmFtZSBvZiBhbiBFZGl0VGV4dCBpdGVtIGlzIDEgcGl4ZWwsIGluc2lkZSB0aGUgYm91bmRzLgorICAgICAgICAgICAgI3N0YXRlID0gW2tUaGVtZVN0YXRlQWN0aXZlLCBrVGhlbWVTdGF0ZUluYWN0aXZlXVtub3Qgc2VsZi5fYWN0aXZhdGVkXQorICAgICAgICAgICAgI0FwcC5EcmF3VGhlbWVFZGl0VGV4dEZyYW1lKFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpLCBzdGF0ZSkKKyAgICAgICAgICAgIFFkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCisKKyAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdGVkIGFuZCBzZWxmLl9hY3RpdmF0ZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5kcmF3c2VsZnJhbWUoMSkKKworICAgICMgc2Nyb2xsaW5nCisgICAgZGVmIHNjcm9sbHBhZ2V1cChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6CisgICAgICAgICAgICBzZWxmLnZzY3JvbGwoIisrIikKKworICAgIGRlZiBzY3JvbGxwYWdlZG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6CisgICAgICAgICAgICBzZWxmLnZzY3JvbGwoIi0tIikKKworICAgIGRlZiBzY3JvbGx0b3Aoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3BhcmVudC5fYmFyeSBhbmQgc2VsZi5fcGFyZW50Ll9iYXJ5Ll9lbmFibGVkOgorICAgICAgICAgICAgc2VsZi52c2Nyb2xsKHNlbGYuX3BhcmVudC5fYmFyeS5nZXRtaW4oKSkKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50Ll9iYXJ4IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnguX2VuYWJsZWQ6CisgICAgICAgICAgICBzZWxmLmhzY3JvbGwoc2VsZi5fcGFyZW50Ll9iYXJ4LmdldG1pbigpKQorCisgICAgZGVmIHNjcm9sbGJvdHRvbShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6CisgICAgICAgICAgICBzZWxmLnZzY3JvbGwoc2VsZi5fcGFyZW50Ll9iYXJ5LmdldG1heCgpKQorCisgICAgIyBtZW51IGhhbmRsZXJzCisgICAgZGVmIGRvbWVudV9jb3B5KHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsYmVnaW4sIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgaWYgc2VsYmVnaW4gPT0gc2VsZW5kOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKKyAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCisgICAgICAgIHNlbGYudGVkLldFQ29weSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgZG9tZW51X2N1dChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGJlZ2luLCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIGlmIHNlbGJlZ2luID09IHNlbGVuZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6CisgICAgICAgICAgICBTY3JhcC5aZXJvU2NyYXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQorICAgICAgICBzZWxmLnRlZC5XRUN1dCgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYuc2VsdmlldygpCisgICAgICAgIHNlbGYudGV4dGNoYW5nZWQoKQorICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKKyAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgIiIsIE5vbmUpCisKKyAgICBkZWYgZG9tZW51X3Bhc3RlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgbm90IHNlbGYudGVkLldFQ2FuUGFzdGUoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnNlbHZpZXcoKQorICAgICAgICBzZWxmLnRlZC5XRVBhc3RlKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi50ZXh0Y2hhbmdlZCgpCisgICAgICAgIHNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAiIiwgTm9uZSkKKworICAgIGRlZiBkb21lbnVfY2xlYXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLnRlZC5XRURlbGV0ZSgpCisgICAgICAgIHNlbGYuc2VsdmlldygpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYudGV4dGNoYW5nZWQoKQorICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKKyAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgIiIsIE5vbmUpCisKKyAgICBkZWYgZG9tZW51X3VuZG8oc2VsZiwgKmFyZ3MpOgorICAgICAgICB3aGljaCwgcmVkbyA9IHNlbGYudGVkLldFR2V0VW5kb0luZm8oKQorICAgICAgICBpZiBub3Qgd2hpY2g6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi50ZWQuV0VVbmRvKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi50ZXh0Y2hhbmdlZCgpCisgICAgICAgIHNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAiIiwgTm9uZSkKKworICAgIGRlZiBjYW5fdW5kbyhzZWxmLCBtZW51aXRlbSk6CisgICAgICAgICNkb3VuZG8gPSBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGVW5kbywgLTEpCisgICAgICAgICNwcmludCBkb3VuZG8KKyAgICAgICAgI2lmIG5vdCBkb3VuZG86CisgICAgICAgICMgICAgICAgcmV0dXJuIDAKKyAgICAgICAgd2hpY2gsIHJlZG8gPSBzZWxmLnRlZC5XRUdldFVuZG9JbmZvKCkKKyAgICAgICAgaWYgd2hpY2ggPCBsZW4oVU5ET0xBQkVMUyk6CisgICAgICAgICAgICB3aGljaCA9IFVORE9MQUJFTFNbd2hpY2hdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aGljaCA9ICIiCisgICAgICAgIGlmIHdoaWNoID09IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiByZWRvOgorICAgICAgICAgICAgd2hpY2ggPSAiUmVkbyAiK3doaWNoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aGljaCA9ICJVbmRvICIrd2hpY2gKKyAgICAgICAgbWVudWl0ZW0uc2V0dGV4dCh3aGljaCkKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBkb21lbnVfc2VsZWN0YWxsKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5zZWxlY3RhbGwoKQorCisgICAgIyBwcml2YXRlCisgICAgZGVmIGdldHNjcm9sbHJlY3RzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpLCBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKworICAgIGRlZiB2c2Nyb2xsKHNlbGYsIHZhbHVlKToKKyAgICAgICAgbGluZWhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KDAsIDEpCisgICAgICAgIGRyID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCisgICAgICAgIHZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgIHZpZXdoZWlnaHQgPSB2clszXSAtIHZyWzFdCisgICAgICAgIG1heGRlbHRhID0gdnJbMV0gLSBkclsxXQorICAgICAgICBtaW5kZWx0YSA9IHZyWzNdIC0gZHJbM10KKyAgICAgICAgaWYgdmFsdWUgPT0gIisiOgorICAgICAgICAgICAgZGVsdGEgPSBsaW5laGVpZ2h0CisgICAgICAgIGVsaWYgdmFsdWUgPT0gIi0iOgorICAgICAgICAgICAgZGVsdGEgPSAtIGxpbmVoZWlnaHQKKyAgICAgICAgZWxpZiB2YWx1ZSA9PSAiKysiOgorICAgICAgICAgICAgZGVsdGEgPSB2aWV3aGVpZ2h0IC0gbGluZWhlaWdodAorICAgICAgICBlbGlmIHZhbHVlID09ICItLSI6CisgICAgICAgICAgICBkZWx0YSA9IGxpbmVoZWlnaHQgLSB2aWV3aGVpZ2h0CisgICAgICAgIGVsc2U6ICAgIyBpbiB0aHVtYgorICAgICAgICAgICAgZGVsdGEgPSB2clsxXSAtIGRyWzFdIC0gdmFsdWUKKyAgICAgICAgZGVsdGEgPSBtaW4obWF4ZGVsdGEsIGRlbHRhKQorICAgICAgICBkZWx0YSA9IG1heChtaW5kZWx0YSwgZGVsdGEpCisgICAgICAgIGRlbHRhID0gaW50KGRlbHRhKQorICAgICAgICBzZWxmLnRlZC5XRVNjcm9sbCgwLCBkZWx0YSkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKworICAgIGRlZiBoc2Nyb2xsKHNlbGYsIHZhbHVlKToKKyAgICAgICAgZHIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKKyAgICAgICAgdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgZGVzdHdpZHRoID0gZHJbMl0gLSBkclswXQorICAgICAgICB2aWV3d2lkdGggPSB2clsyXSAtIHZyWzBdCisgICAgICAgIHZpZXdvZmZzZXQgPSBtYXhkZWx0YSA9IHZyWzBdIC0gZHJbMF0KKyAgICAgICAgbWluZGVsdGEgPSB2clsyXSAtIGRyWzJdCisgICAgICAgIGlmIHZhbHVlID09ICIrIjoKKyAgICAgICAgICAgIGRlbHRhID0gMzIKKyAgICAgICAgZWxpZiB2YWx1ZSA9PSAiLSI6CisgICAgICAgICAgICBkZWx0YSA9IC0gMzIKKyAgICAgICAgZWxpZiB2YWx1ZSA9PSAiKysiOgorICAgICAgICAgICAgZGVsdGEgPSAwLjUgKiAodnJbMl0gLSB2clswXSkKKyAgICAgICAgZWxpZiB2YWx1ZSA9PSAiLS0iOgorICAgICAgICAgICAgZGVsdGEgPSAwLjUgKiAodnJbMF0gLSB2clsyXSkKKyAgICAgICAgZWxzZTogICAjIGluIHRodW1iCisgICAgICAgICAgICBkZWx0YSA9IHZyWzBdIC0gZHJbMF0gLSB2YWx1ZQorICAgICAgICAgICAgI2N1ciA9ICgzMjc2NyAqIHZpZXdvZmZzZXQpIC8gKGRlc3R3aWR0aCAtIHZpZXd3aWR0aCkKKyAgICAgICAgICAgICNkZWx0YSA9IChjdXItdmFsdWUpKihkZXN0d2lkdGggLSB2aWV3d2lkdGgpLzMyNzY3CisgICAgICAgICAgICAjaWYgYWJzKGRlbHRhIC0gdmlld29mZnNldCkgPD0yOgorICAgICAgICAgICAgIyAgICAgICAjIGNvbXBlbnNhdGUgZm9yIGlycml0YXRpbmcgcm91bmRpbmcgZXJyb3IKKyAgICAgICAgICAgICMgICAgICAgZGVsdGEgPSB2aWV3b2Zmc2V0CisgICAgICAgIGRlbHRhID0gbWluKG1heGRlbHRhLCBkZWx0YSkKKyAgICAgICAgZGVsdGEgPSBtYXgobWluZGVsdGEsIGRlbHRhKQorICAgICAgICBkZWx0YSA9IGludChkZWx0YSkKKyAgICAgICAgc2VsZi50ZWQuV0VTY3JvbGwoZGVsdGEsIDApCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICAjIHNvbWUgaW50ZXJuYWxzCisgICAgZGVmIF9nZXRmbGFncyhzZWxmKToKKyAgICAgICAgZmxhZ3MgPSBXQVNURWNvbnN0LndlRG9BdXRvU2Nyb2xsIHwgV0FTVEVjb25zdC53ZURvTW9ub1N0eWxlZAorICAgICAgICBpZiBzZWxmLnJlYWRvbmx5OgorICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyB8IFdBU1RFY29uc3Qud2VEb1JlYWRPbmx5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvVW5kbworICAgICAgICByZXR1cm4gZmxhZ3MKKworICAgIGRlZiBfZ2V0dmlld3JlY3Qoc2VsZik6CisgICAgICAgIHJldHVybiBRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCBzZWxmLmluc2V0WzBdLCBzZWxmLmluc2V0WzFdKQorCisgICAgZGVmIF9jYWxjdGV4dGJvdW5kcyhzZWxmKToKKyAgICAgICAgdmlld3JlY3QgPSBsLCB0LCByLCBiID0gc2VsZi5fZ2V0dmlld3JlY3QoKQorICAgICAgICBpZiBzZWxmLnRlZDoKKyAgICAgICAgICAgIGRsLCBkdCwgZHIsIGRiID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCisgICAgICAgICAgICB2bCwgdnQsIHZyLCB2YiA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQorICAgICAgICAgICAgeXNoaWZ0ID0gdCAtIHZ0CisgICAgICAgICAgICBpZiAoZGIgLSBkdCkgPCAoYiAtIHQpOgorICAgICAgICAgICAgICAgIGRlc3RyZWN0ID0gdmlld3JlY3QKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVzdHJlY3QgPSBsLCBkdCArIHlzaGlmdCwgciwgZGIgKyB5c2hpZnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlc3RyZWN0ID0gdmlld3JlY3QKKyAgICAgICAgcmV0dXJuIHZpZXdyZWN0LCBkZXN0cmVjdAorCiAKIGNsYXNzIFRleHRFZGl0b3IoRWRpdFRleHQpOgotCQotCSIiIkEgdGV4dCBlZGl0IHdpZGdldC4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGV4dD0iIiwgY2FsbGJhY2s9Tm9uZSwgd3JhcD0xLCBpbnNldD0oNCwgNCksCi0JCQkJZm9udHNldHRpbmdzPU5vbmUsCi0JCQkJdGFic2V0dGluZ3M9KDMyLCAwKSwKLQkJCQlyZWFkb25seT0wKToKLQkJRWRpdFRleHQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGV4dCwgY2FsbGJhY2ssIGluc2V0LCBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzLCByZWFkb25seSkKLQkJc2VsZi53cmFwID0gd3JhcAotCQotCWRlZiBfZ2V0ZmxhZ3Moc2VsZik6Ci0JCWZsYWdzID0gV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb01vbm9TdHlsZWQgfCBcCi0JCQkJV0FTVEVjb25zdC53ZURvT3V0bGluZUhpbGl0ZQotCQlpZiBzZWxmLnJlYWRvbmx5OgotCQkJZmxhZ3MgPSBmbGFncyB8IFdBU1RFY29uc3Qud2VEb1JlYWRPbmx5Ci0JCWVsc2U6Ci0JCQlmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvVW5kbwotCQlyZXR1cm4gZmxhZ3MKLQkKLQlkZWYgX2dldHZpZXdyZWN0KHNlbGYpOgotCQlsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCi0JCXJldHVybiAobCArIDUsIHQgKyAyLCByLCBiIC0gMikKLQkKLQlkZWYgX2NhbGN0ZXh0Ym91bmRzKHNlbGYpOgotCQlpZiBzZWxmLndyYXA6Ci0JCQlyZXR1cm4gRWRpdFRleHQuX2NhbGN0ZXh0Ym91bmRzKHNlbGYpCi0JCWVsc2U6Ci0JCQl2aWV3cmVjdCA9IGwsIHQsIHIsIGIgPSBzZWxmLl9nZXR2aWV3cmVjdCgpCi0JCQlpZiBzZWxmLnRlZDoKLQkJCQlkbCwgZHQsIGRyLCBkYiA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQotCQkJCXZsLCB2dCwgdnIsIHZiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCQkJeHNoaWZ0ID0gbCAtIHZsCi0JCQkJeXNoaWZ0ID0gdCAtIHZ0Ci0JCQkJaWYgKGRiIC0gZHQpIDwgKGIgLSB0KToKLQkJCQkJeXNoaWZ0ID0gdCAtIGR0Ci0JCQkJZGVzdHJlY3QgPSAoZGwgKyB4c2hpZnQsIGR0ICsgeXNoaWZ0LCBkciArIHhzaGlmdCwgZGIgKyB5c2hpZnQpCi0JCQllbHNlOgotCQkJCWRlc3RyZWN0ID0gKGwsIHQsIHIgKyA1MDAwLCBiKQotCQkJcmV0dXJuIHZpZXdyZWN0LCBkZXN0cmVjdAotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJaWYgbm90IHZpc1JnbjoKLQkJCQl2aXNSZ24gPSBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KLQkJCXNlbGYudGVkLldFVXBkYXRlKHZpc1JnbikKLQkJCWlmIHNlbGYuX3NlbGVjdGVkIGFuZCBzZWxmLl9hY3RpdmF0ZWQ6Ci0JCQkJc2VsZi5kcmF3c2VsZnJhbWUoMSkKIAotCWRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6Ci0JCXNlbGYuX2FjdGl2YXRlZCA9IG9ub2ZmCi0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQlzZWxmLlNldFBvcnQoKQotCQkJIyBkb2Vzbid0IGRyYXcgZnJhbWUsIGFzIEVkaXRUZXh0LmFjdGl2YXRlIGRvZXMKLQkJCWlmIHNlbGYuX3NlbGVjdGVkOgotCQkJCWlmIG9ub2ZmOgotCQkJCQlzZWxmLnRlZC5XRUFjdGl2YXRlKCkKLQkJCQllbHNlOgotCQkJCQlzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQotCQkJCXNlbGYuZHJhd3NlbGZyYW1lKG9ub2ZmKQorICAgICIiIkEgdGV4dCBlZGl0IHdpZGdldC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0ZXh0PSIiLCBjYWxsYmFjaz1Ob25lLCB3cmFwPTEsIGluc2V0PSg0LCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250c2V0dGluZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJzZXR0aW5ncz0oMzIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5PTApOgorICAgICAgICBFZGl0VGV4dC5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0ZXh0LCBjYWxsYmFjaywgaW5zZXQsIGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MsIHJlYWRvbmx5KQorICAgICAgICBzZWxmLndyYXAgPSB3cmFwCisKKyAgICBkZWYgX2dldGZsYWdzKHNlbGYpOgorICAgICAgICBmbGFncyA9IFdBU1RFY29uc3Qud2VEb0F1dG9TY3JvbGwgfCBXQVNURWNvbnN0LndlRG9Nb25vU3R5bGVkIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvT3V0bGluZUhpbGl0ZQorICAgICAgICBpZiBzZWxmLnJlYWRvbmx5OgorICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyB8IFdBU1RFY29uc3Qud2VEb1JlYWRPbmx5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvVW5kbworICAgICAgICByZXR1cm4gZmxhZ3MKKworICAgIGRlZiBfZ2V0dmlld3JlY3Qoc2VsZik6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgcmV0dXJuIChsICsgNSwgdCArIDIsIHIsIGIgLSAyKQorCisgICAgZGVmIF9jYWxjdGV4dGJvdW5kcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi53cmFwOgorICAgICAgICAgICAgcmV0dXJuIEVkaXRUZXh0Ll9jYWxjdGV4dGJvdW5kcyhzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmlld3JlY3QgPSBsLCB0LCByLCBiID0gc2VsZi5fZ2V0dmlld3JlY3QoKQorICAgICAgICAgICAgaWYgc2VsZi50ZWQ6CisgICAgICAgICAgICAgICAgZGwsIGR0LCBkciwgZGIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKKyAgICAgICAgICAgICAgICB2bCwgdnQsIHZyLCB2YiA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQorICAgICAgICAgICAgICAgIHhzaGlmdCA9IGwgLSB2bAorICAgICAgICAgICAgICAgIHlzaGlmdCA9IHQgLSB2dAorICAgICAgICAgICAgICAgIGlmIChkYiAtIGR0KSA8IChiIC0gdCk6CisgICAgICAgICAgICAgICAgICAgIHlzaGlmdCA9IHQgLSBkdAorICAgICAgICAgICAgICAgIGRlc3RyZWN0ID0gKGRsICsgeHNoaWZ0LCBkdCArIHlzaGlmdCwgZHIgKyB4c2hpZnQsIGRiICsgeXNoaWZ0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZXN0cmVjdCA9IChsLCB0LCByICsgNTAwMCwgYikKKyAgICAgICAgICAgIHJldHVybiB2aWV3cmVjdCwgZGVzdHJlY3QKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgaWYgbm90IHZpc1JnbjoKKyAgICAgICAgICAgICAgICB2aXNSZ24gPSBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KKyAgICAgICAgICAgIHNlbGYudGVkLldFVXBkYXRlKHZpc1JnbikKKyAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdGVkIGFuZCBzZWxmLl9hY3RpdmF0ZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5kcmF3c2VsZnJhbWUoMSkKKworICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6CisgICAgICAgIHNlbGYuX2FjdGl2YXRlZCA9IG9ub2ZmCisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICAgICAgIyBkb2Vzbid0IGRyYXcgZnJhbWUsIGFzIEVkaXRUZXh0LmFjdGl2YXRlIGRvZXMKKyAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdGVkOgorICAgICAgICAgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRlZC5XRUFjdGl2YXRlKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQorICAgICAgICAgICAgICAgIHNlbGYuZHJhd3NlbGZyYW1lKG9ub2ZmKQogCiAKIGltcG9ydCByZQpAQCAtNjU4LDQ3OSArNjU4LDQ3OSBAQAogCiAKIGNsYXNzIFB5RWRpdG9yKFRleHRFZGl0b3IpOgotCQotCSIiIkEgc3BlY2lhbGl6ZWQgUHl0aG9uIHNvdXJjZSBlZGl0IHdpZGdldCIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0ZXh0PSIiLCBjYWxsYmFjaz1Ob25lLCBpbnNldD0oNCwgNCksCi0JCQkJZm9udHNldHRpbmdzPU5vbmUsCi0JCQkJdGFic2V0dGluZ3M9KDMyLCAwKSwKLQkJCQlyZWFkb25seT0wLAotCQkJCWRlYnVnZ2VyPU5vbmUsCi0JCQkJZmlsZT0nJyk6Ci0JCVRleHRFZGl0b3IuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGV4dCwgY2FsbGJhY2ssIDAsIGluc2V0LCBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzLCByZWFkb25seSkKLQkJc2VsZi5iaW5kKCJjbWRbIiwgc2VsZi5kb21lbnVfc2hpZnRsZWZ0KQotCQlzZWxmLmJpbmQoImNtZF0iLCBzZWxmLmRvbWVudV9zaGlmdHJpZ2h0KQotCQlzZWxmLmJpbmQoImNtZHNoaWZ0WyIsIHNlbGYuZG9tZW51X3VuY29tbWVudCkKLQkJc2VsZi5iaW5kKCJjbWRzaGlmdF0iLCBzZWxmLmRvbWVudV9jb21tZW50KQotCQlzZWxmLmJpbmQoImNtZHNoaWZ0ZCIsIHNlbGYuYWxsZGlydHkpCi0JCXNlbGYuZmlsZSA9IGZpbGUJIyBvbmx5IGZvciBkZWJ1Z2dlciByZWZlcmVuY2UKLQkJc2VsZi5fZGVidWdnZXIgPSBkZWJ1Z2dlcgotCQlpZiBkZWJ1Z2dlcjoKLQkJCWRlYnVnZ2VyLnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBzZWxmLmZpbGUpCi0JCXNlbGYuX2RpcnR5ID0gKDAsIE5vbmUpCi0JCXNlbGYuZG9fZm9udGlmeSA9IDAKLQkKLQkjZGVmIG9wZW4oc2VsZik6Ci0JIwlUZXh0RWRpdG9yLm9wZW4oc2VsZikKLQkjCWlmIHNlbGYuZG9fZm9udGlmeToKLQkjCQlzZWxmLmZvbnRpZnkoKQotCSMJc2VsZi5fZGlydHkgPSAoTm9uZSwgTm9uZSkKLQkKLQlkZWYgX2dldGZsYWdzKHNlbGYpOgotCQlmbGFncyA9IChXQVNURWNvbnN0LndlRG9EcmF3T2Zmc2NyZWVuIHwgV0FTVEVjb25zdC53ZURvVXNlVGVtcE1lbSB8Ci0JCQkJV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb091dGxpbmVIaWxpdGUpCi0JCWlmIHNlbGYucmVhZG9ubHk6Ci0JCQlmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvUmVhZE9ubHkKLQkJZWxzZToKLQkJCWZsYWdzID0gZmxhZ3MgfCBXQVNURWNvbnN0LndlRG9VbmRvCi0JCXJldHVybiBmbGFncwotCQotCWRlZiB0ZXh0Y2hhbmdlZChzZWxmLCBhbGw9MCk6Ci0JCXNlbGYuY2hhbmdlZCA9IDEKLQkJaWYgYWxsOgotCQkJc2VsZi5fZGlydHkgPSAoMCwgTm9uZSkKLQkJCXJldHVybgotCQlvbGRzZWwgPSBzZWxmLm9sZHNlbGVjdGlvbgotCQlzZWwgPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCWlmIG5vdCBzZWw6Ci0JCQkjIFhYWCB3aGF0IHRvIGRvPwotCQkJcmV0dXJuCi0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBzZWwKLQkJc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgc2VsZW5kKSwgbWF4KHNlbHN0YXJ0LCBzZWxlbmQpCi0JCWlmIG9sZHNlbDoKLQkJCW9sZHNlbHN0YXJ0LCBvbGRzZWxlbmQgPSBtaW4ob2xkc2VsKSwgbWF4KG9sZHNlbCkKLQkJCXNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIG9sZHNlbHN0YXJ0KSwgbWF4KHNlbGVuZCwgb2xkc2VsZW5kKQotCQlzdGFydGxpbmUgPSBzZWxmLm9mZnNldHRvbGluZShzZWxzdGFydCkKLQkJZW5kbGluZSA9IHNlbGYub2Zmc2V0dG9saW5lKHNlbGVuZCkKLQkJc2Vsc3RhcnQsIF8gPSBzZWxmLnRlZC5XRUdldExpbmVSYW5nZShzdGFydGxpbmUpCi0JCV8sIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0TGluZVJhbmdlKGVuZGxpbmUpCi0JCWlmIHNlbHN0YXJ0ID4gMDoKLQkJCXNlbHN0YXJ0ID0gc2Vsc3RhcnQgLSAxCi0JCXNlbGYuX2RpcnR5ID0gKHNlbHN0YXJ0LCBzZWxlbmQpCi0JCi0JZGVmIGlkbGUoc2VsZik6Ci0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYudGVkLldFSWRsZSgpCi0JCWlmIG5vdCBzZWxmLmRvX2ZvbnRpZnk6Ci0JCQlyZXR1cm4KLQkJc3RhcnQsIGVuZCA9IHNlbGYuX2RpcnR5Ci0JCWlmIHN0YXJ0IGlzIE5vbmU6Ci0JCQlyZXR1cm4KLQkJdGV4dExlbmd0aCA9IHNlbGYudGVkLldFR2V0VGV4dExlbmd0aCgpCi0JCWlmIGVuZCBpcyBOb25lOgotCQkJZW5kID0gdGV4dExlbmd0aAotCQlpZiBzdGFydCA+PSBlbmQ6Ci0JCQlzZWxmLl9kaXJ0eSA9IChOb25lLCBOb25lKQotCQllbHNlOgotCQkJc2VsZi5mb250aWZ5KHN0YXJ0LCBlbmQpCi0JCQlzZWxmLl9kaXJ0eSA9IChOb25lLCBOb25lKQotCQotCWRlZiBhbGxkaXJ0eShzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX2RpcnR5ID0gKDAsIE5vbmUpCi0JCi0JZGVmIGZvbnRpZnkoc2VsZiwgc3RhcnQ9MCwgZW5kPU5vbmUpOgotCQkjVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJaWYgc2VsZi5yZWFkb25seToKLQkJCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMCkKLQkJc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRk91dGxpbmVIaWxpdGUsIDApCi0JCXNlbGYudGVkLldFRGVhY3RpdmF0ZSgpCi0JCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZBdXRvU2Nyb2xsLCAwKQotCQlzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGVW5kbywgMCkKLQkJcHl0ZXh0ID0gc2VsZi5nZXQoKS5yZXBsYWNlKCJcciIsICJcbiIpCi0JCWlmIGVuZCBpcyBOb25lOgotCQkJZW5kID0gbGVuKHB5dGV4dCkKLQkJZWxzZToKLQkJCWVuZCA9IG1pbihlbmQsIGxlbihweXRleHQpKQotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQlzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihzdGFydCwgZW5kKQotCQlzZWxmLnRlZC5XRVNldFN0eWxlKFdBU1RFY29uc3Qud2VEb0ZhY2UgfCBXQVNURWNvbnN0LndlRG9Db2xvciwgCi0JCQkJKDAsIDAsIDEyLCAoMCwgMCwgMCkpKQotCQkKLQkJdGFncyA9IFB5Rm9udGlmeS5mb250aWZ5KHB5dGV4dCwgc3RhcnQsIGVuZCkKLQkJc3R5bGVzID0gewotCQkJJ3N0cmluZyc6IChXQVNURWNvbnN0LndlRG9Db2xvciwgKDAsIDAsIDAsIGtTdHJpbmdDb2xvcikpLAotCQkJJ2tleXdvcmQnOiAoV0FTVEVjb25zdC53ZURvRmFjZSwgKDAsIDEsIDAsICgwLCAwLCAwKSkpLAotCQkJJ2NvbW1lbnQnOiAoV0FTVEVjb25zdC53ZURvRmFjZSB8IFdBU1RFY29uc3Qud2VEb0NvbG9yLCAoMCwgMCwgMCwga0NvbW1lbnRDb2xvcikpLAotCQkJJ2lkZW50aWZpZXInOiAoV0FTVEVjb25zdC53ZURvQ29sb3IsICgwLCAwLCAwLCAoMHhiZmZmLCAwLCAwKSkpCi0JCX0KLQkJc2V0c2VsZWN0aW9uID0gc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24KLQkJc2V0c3R5bGUgPSBzZWxmLnRlZC5XRVNldFN0eWxlCi0JCWZvciB0YWcsIHN0YXJ0LCBlbmQsIHN1Ymxpc3QgaW4gdGFnczoKLQkJCXNldHNlbGVjdGlvbihzdGFydCwgZW5kKQotCQkJbW9kZSwgc3R5bGUgPSBzdHlsZXNbdGFnXQotCQkJc2V0c3R5bGUobW9kZSwgc3R5bGUpCi0JCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCi0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZBdXRvU2Nyb2xsLCAxKQotCQlzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGVW5kbywgMSkKLQkJc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCi0JCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZPdXRsaW5lSGlsaXRlLCAxKQotCQlpZiBzZWxmLnJlYWRvbmx5OgotCQkJc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRlJlYWRPbmx5LCAxKQotCQotCWRlZiBkb21lbnVfc2hpZnRsZWZ0KHNlbGYpOgotCQlzZWxmLmV4cGFuZHNlbGVjdGlvbigpCi0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCksIG1heChzZWxzdGFydCwgc2VsZW5kKQotCQlzbmlwcGV0ID0gc2VsZi5nZXRzZWxlY3RlZHRleHQoKQotCQlsaW5lcyA9IHN0cmluZy5zcGxpdChzbmlwcGV0LCAnXHInKQotCQlmb3IgaSBpbiByYW5nZShsZW4obGluZXMpKToKLQkJCWlmIGxpbmVzW2ldWzoxXSA9PSAnXHQnOgotCQkJCWxpbmVzW2ldID0gbGluZXNbaV1bMTpdCi0JCXNuaXBwZXQgPSBzdHJpbmcuam9pbihsaW5lcywgJ1xyJykKLQkJc2VsZi5pbnNlcnQoc25pcHBldCkKLQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbHN0YXJ0ICsgbGVuKHNuaXBwZXQpKQotCQotCWRlZiBkb21lbnVfc2hpZnRyaWdodChzZWxmKToKLQkJc2VsZi5leHBhbmRzZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKLQkJc25pcHBldCA9IHNlbGYuZ2V0c2VsZWN0ZWR0ZXh0KCkKLQkJbGluZXMgPSBzdHJpbmcuc3BsaXQoc25pcHBldCwgJ1xyJykKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSAtIChub3QgbGluZXNbLTFdKSk6Ci0JCQlsaW5lc1tpXSA9ICdcdCcgKyBsaW5lc1tpXQotCQlzbmlwcGV0ID0gc3RyaW5nLmpvaW4obGluZXMsICdccicpCi0JCXNlbGYuaW5zZXJ0KHNuaXBwZXQpCi0JCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxzdGFydCArIGxlbihzbmlwcGV0KSkKLQkKLQlkZWYgZG9tZW51X3VuY29tbWVudChzZWxmKToKLQkJc2VsZi5leHBhbmRzZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKLQkJc25pcHBldCA9IHNlbGYuZ2V0c2VsZWN0ZWR0ZXh0KCkKLQkJbGluZXMgPSBzdHJpbmcuc3BsaXQoc25pcHBldCwgJ1xyJykKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSk6Ci0JCQltID0gY29tbWVudFBhdC5tYXRjaChsaW5lc1tpXSkKLQkJCWlmIG06Ci0JCQkJcG9zID0gbS5zdGFydCgxKQotCQkJCWxpbmVzW2ldID0gbGluZXNbaV1bOnBvc10gKyBsaW5lc1tpXVtwb3MrMTpdCi0JCXNuaXBwZXQgPSBzdHJpbmcuam9pbihsaW5lcywgJ1xyJykKLQkJc2VsZi5pbnNlcnQoc25pcHBldCkKLQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbHN0YXJ0ICsgbGVuKHNuaXBwZXQpKQotCQotCWRlZiBkb21lbnVfY29tbWVudChzZWxmKToKLQkJc2VsZi5leHBhbmRzZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKLQkJc25pcHBldCA9IHNlbGYuZ2V0c2VsZWN0ZWR0ZXh0KCkKLQkJbGluZXMgPSBzdHJpbmcuc3BsaXQoc25pcHBldCwgJ1xyJykKLQkJaW5kZW50ID0gMzAwMCAjIGFyYml0cmFyeSBsYXJnZSBudW1iZXIuLi4KLQkJZm9yIGxpbmUgaW4gbGluZXM6Ci0JCQlpZiBzdHJpbmcuc3RyaXAobGluZSk6Ci0JCQkJbSA9IGluZGVudFBhdC5tYXRjaChsaW5lKQotCQkJCWlmIG06Ci0JCQkJCWluZGVudCA9IG1pbihpbmRlbnQsIG0ucmVnc1swXVsxXSkKLQkJCQllbHNlOgotCQkJCQlpbmRlbnQgPSAwCi0JCQkJCWJyZWFrCi0JCWZvciBpIGluIHJhbmdlKGxlbihsaW5lcykgLSAobm90IGxpbmVzWy0xXSkpOgotCQkJbGluZXNbaV0gPSBsaW5lc1tpXVs6aW5kZW50XSArICIjIiArIGxpbmVzW2ldW2luZGVudDpdCi0JCXNuaXBwZXQgPSBzdHJpbmcuam9pbihsaW5lcywgJ1xyJykKLQkJc2VsZi5pbnNlcnQoc25pcHBldCkKLQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbHN0YXJ0ICsgbGVuKHNuaXBwZXQpKQotCQotCWRlZiBzZXRmaWxlKHNlbGYsIGZpbGUpOgotCQlzZWxmLmZpbGUgPSBmaWxlCi0JCi0JZGVmIHNldChzZWxmLCB0ZXh0LCBmaWxlID0gJycpOgotCQlvbGRmaWxlID0gc2VsZi5maWxlCi0JCXNlbGYuZmlsZSA9IGZpbGUKLQkJaWYgc2VsZi5fZGVidWdnZXI6Ci0JCQlzZWxmLl9kZWJ1Z2dlci51bnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBvbGRmaWxlKQotCQkJc2VsZi5fZGVidWdnZXIucmVnaXN0ZXJfZWRpdG9yKHNlbGYsIGZpbGUpCi0JCVRleHRFZGl0b3Iuc2V0KHNlbGYsIHRleHQpCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCXNlbGYuX2RlYnVnZ2VyLnVucmVnaXN0ZXJfZWRpdG9yKHNlbGYsIHNlbGYuZmlsZSkKLQkJCXNlbGYuX2RlYnVnZ2VyID0gTm9uZQotCQlUZXh0RWRpdG9yLmNsb3NlKHNlbGYpCQkKLQkKLQlkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCWlmIG5vdCBzZWxmLl9lbmFibGVkOgotCQkJcmV0dXJuCi0JCWlmIHNlbGYuX2RlYnVnZ2VyIGFuZCBzZWxmLnB0X2luX2JyZWFrcyhwb2ludCk6Ci0JCQlzZWxmLmJyZWFraGl0KHBvaW50LCBtb2RpZmllcnMpCi0JCWVsaWYgc2VsZi5fZGVidWdnZXI6Ci0JCQlibCwgYnQsIGJyLCBiYiA9IHNlbGYuX2dldGJyZWFrcmVjdCgpCi0JCQlRZC5FcmFzZVJlY3QoKGJsLCBidCwgYnItMSwgYmIpKQotCQkJVGV4dEVkaXRvci5jbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKQotCQkJc2VsZi5kcmF3YnJlYWtwb2ludHMoKQotCQllbHNlOgotCQkJVGV4dEVkaXRvci5jbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKQotCQkJaWYgc2VsZi50ZWQuV0VHZXRDbGlja0NvdW50KCkgPj0gMzoKLQkJCQkjIHNlbGVjdCBibG9jayB3aXRoIG91ciBpbmRlbnQKLQkJCQlsaW5lcyA9IHN0cmluZy5zcGxpdChzZWxmLmdldCgpLCAnXHInKQotCQkJCXNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCQkJbGluZW5vID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUoc2Vsc3RhcnQpCi0JCQkJdGFicyA9IDAKLQkJCQlsaW5lID0gbGluZXNbbGluZW5vXQotCQkJCXdoaWxlIGxpbmVbdGFiczpdIGFuZCBsaW5lW3RhYnNdID09ICdcdCc6Ci0JCQkJCXRhYnMgPSB0YWJzICsgMQotCQkJCXRhYnN0YWcgPSAnXHQnICogdGFicwotCQkJCWZyb21saW5lID0gMAotCQkJCXRvbGluZSA9IGxlbihsaW5lcykKLQkJCQlpZiB0YWJzOgotCQkJCQlmb3IgaSBpbiByYW5nZShsaW5lbm8gLSAxLCAtMSwgLTEpOgotCQkJCQkJbGluZSA9IGxpbmVzW2ldCi0JCQkJCQlpZiBsaW5lWzp0YWJzXSA8PiB0YWJzdGFnOgotCQkJCQkJCWZyb21saW5lID0gaSArIDEKLQkJCQkJCQlicmVhawotCQkJCQlmb3IgaSBpbiByYW5nZShsaW5lbm8gKyAxLCB0b2xpbmUpOgotCQkJCQkJbGluZSA9IGxpbmVzW2ldCi0JCQkJCQlpZiBsaW5lWzp0YWJzXSA8PiB0YWJzdGFnOgotCQkJCQkJCXRvbGluZSA9IGkgLSAxCi0JCQkJCQkJYnJlYWsKLQkJCQlzZWxzdGFydCwgZHVtbXkgPSBzZWxmLnRlZC5XRUdldExpbmVSYW5nZShmcm9tbGluZSkKLQkJCQlkdW1teSwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRMaW5lUmFuZ2UodG9saW5lKQotCQkJCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCi0JCi0JZGVmIGJyZWFraGl0KHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlpZiBub3Qgc2VsZi5maWxlOgotCQkJcmV0dXJuCi0JCWRlc3RyZWN0ID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCi0JCW9mZnNldCwgZWRnZSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KHBvaW50KQotCQlsaW5lbm8gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZShvZmZzZXQpICsgMQotCQlpZiBwb2ludFsxXSA8PSBkZXN0cmVjdFszXToKLQkJCXNlbGYuX2RlYnVnZ2VyLmNsZWFyX2JyZWFrc19hYm92ZShzZWxmLmZpbGUsIHNlbGYuY291bnRsaW5lcygpKQotCQkJc2VsZi5fZGVidWdnZXIudG9nZ2xlX2JyZWFrKHNlbGYuZmlsZSwgbGluZW5vKQotCQllbHNlOgotCQkJc2VsZi5fZGVidWdnZXIuY2xlYXJfYnJlYWtzX2Fib3ZlKHNlbGYuZmlsZSwgbGluZW5vKQotCQotCWRlZiBrZXkoc2VsZiwgY2hhciwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlpZiBtb2RpZmllcnMgJiBFdmVudHMuY21kS2V5IGFuZCBub3QgY2hhciBpbiBXa2V5cy5hcnJvd2tleXM6Ci0JCQlyZXR1cm4KLQkJaWYgY2hhciA9PSAnXHInOgotCQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJCXNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCksIG1heChzZWxzdGFydCwgc2VsZW5kKQotCQkJbGFzdGNoYXIgPSBjaHIoc2VsZi50ZWQuV0VHZXRDaGFyKHNlbHN0YXJ0LTEpKQotCQkJaWYgbGFzdGNoYXIgPD4gJ1xyJyBhbmQgc2Vsc3RhcnQ6Ci0JCQkJcG9zLCBkdW1teSA9IHNlbGYudGVkLldFRmluZExpbmUoc2Vsc3RhcnQsIDApCi0JCQkJbGluZXJlcyA9IFJlcy5SZXNvdXJjZSgnJykKLQkJCQlzZWxmLnRlZC5XRUNvcHlSYW5nZShwb3MsIHNlbHN0YXJ0LCBsaW5lcmVzLCBOb25lLCBOb25lKQotCQkJCWxpbmUgPSBsaW5lcmVzLmRhdGEgKyAnXG4nCi0JCQkJdGFiY291bnQgPSBzZWxmLmV4dHJhdGFicyhsaW5lKQotCQkJCXNlbGYudGVkLldFS2V5KG9yZCgnXHInKSwgMCkKLQkJCQlmb3IgaSBpbiByYW5nZSh0YWJjb3VudCk6Ci0JCQkJCXNlbGYudGVkLldFS2V5KG9yZCgnXHQnKSwgMCkKLQkJCWVsc2U6Ci0JCQkJc2VsZi50ZWQuV0VLZXkob3JkKCdccicpLCAwKQotCQllbGlmIGNoYXIgaW4gJyldfSc6Ci0JCQlzZWxmLnRlZC5XRUtleShvcmQoY2hhciksIG1vZGlmaWVycykKLQkJCXNlbGYuYmFsYW5jZXBhcmVucyhjaGFyKQotCQllbHNlOgotCQkJc2VsZi50ZWQuV0VLZXkob3JkKGNoYXIpLCBtb2RpZmllcnMpCi0JCWlmIGNoYXIgbm90IGluIFdrZXlzLm5hdmlnYXRpb25rZXlzOgotCQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCi0JZGVmIGJhbGFuY2VwYXJlbnMoc2VsZiwgY2hhcik6Ci0JCWlmIGNoYXIgPT0gJyknOgotCQkJdGFyZ2V0ID0gJygnCi0JCWVsaWYgY2hhciA9PSAnXSc6Ci0JCQl0YXJnZXQgPSAnWycKLQkJZWxpZiBjaGFyID09ICd9JzoKLQkJCXRhcmdldCA9ICd7JwotCQlyZWN1cnNpb25sZXZlbCA9IDEKLQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJY291bnQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCkgLSAyCi0JCW1pbmNvdW50ID0gbWF4KDAsIGNvdW50IC0gMjA0OCkKLQkJbGFzdHF1b3RlID0gTm9uZQotCQl3aGlsZSBjb3VudCA+IG1pbmNvdW50OgotCQkJdGVzdGNoYXIgPSBjaHIoc2VsZi50ZWQuV0VHZXRDaGFyKGNvdW50KSkKLQkJCWlmIHRlc3RjaGFyIGluICJcIiciIGFuZCBjaHIoc2VsZi50ZWQuV0VHZXRDaGFyKGNvdW50IC0gMSkpIDw+ICdcXCc6Ci0JCQkJaWYgbGFzdHF1b3RlID09IHRlc3RjaGFyOgotCQkJCQlyZWN1cnNpb25sZXZlbCA9IHJlY3Vyc2lvbmxldmVsIC0gMQotCQkJCQlsYXN0cXVvdGUgPSBOb25lCi0JCQkJZWxpZiBub3QgbGFzdHF1b3RlOgotCQkJCQlyZWN1cnNpb25sZXZlbCA9IHJlY3Vyc2lvbmxldmVsICsgMQotCQkJCQlsYXN0cXVvdGUgPSB0ZXN0Y2hhcgotCQkJZWxpZiBub3QgbGFzdHF1b3RlIGFuZCB0ZXN0Y2hhciA9PSBjaGFyOgotCQkJCXJlY3Vyc2lvbmxldmVsID0gcmVjdXJzaW9ubGV2ZWwgKyAxCi0JCQllbGlmIG5vdCBsYXN0cXVvdGUgYW5kIHRlc3RjaGFyID09IHRhcmdldDoKLQkJCQlyZWN1cnNpb25sZXZlbCA9IHJlY3Vyc2lvbmxldmVsIC0gMQotCQkJCWlmIHJlY3Vyc2lvbmxldmVsID09IDA6Ci0JCQkJCWltcG9ydCB0aW1lCi0JCQkJCWF1dG9zY3JvbGwgPSBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGQXV0b1Njcm9sbCwgLTEpCi0JCQkJCWlmIGF1dG9zY3JvbGw6Ci0JCQkJCQlzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGQXV0b1Njcm9sbCwgMCkKLQkJCQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oY291bnQsIGNvdW50ICsgMSkKLQkJCQkJc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkuUURGbHVzaFBvcnRCdWZmZXIoTm9uZSkgICMgbmVlZGVkIHVuZGVyIE9TWAotCQkJCQl0aW1lLnNsZWVwKDAuMikKLQkJCQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbGVuZCkKLQkJCQkJaWYgYXV0b3Njcm9sbDoKLQkJCQkJCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZBdXRvU2Nyb2xsLCAxKQotCQkJCQlicmVhawotCQkJY291bnQgPSBjb3VudCAtIDEKLQkKLQlkZWYgZXh0cmF0YWJzKHNlbGYsIGxpbmUpOgotCQl0YWJjb3VudCA9IDAKLQkJZm9yIGMgaW4gbGluZToKLQkJCWlmIGMgPD4gJ1x0JzoKLQkJCQlicmVhawotCQkJdGFiY291bnQgPSB0YWJjb3VudCArIDEKLQkJbGFzdCA9IDAKLQkJY2xlYW5saW5lID0gJycKLQkJdGFncyA9IFB5Rm9udGlmeS5mb250aWZ5KGxpbmUpCi0JCSMgc3RyaXAgY29tbWVudHMgYW5kIHN0cmluZ3MKLQkJZm9yIHRhZywgc3RhcnQsIGVuZCwgc3VibGlzdCBpbiB0YWdzOgotCQkJaWYgdGFnIGluICgnc3RyaW5nJywgJ2NvbW1lbnQnKToKLQkJCQljbGVhbmxpbmUgPSBjbGVhbmxpbmUgKyBsaW5lW2xhc3Q6c3RhcnRdCi0JCQkJbGFzdCA9IGVuZAotCQljbGVhbmxpbmUgPSBjbGVhbmxpbmUgKyBsaW5lW2xhc3Q6XQotCQljbGVhbmxpbmUgPSBzdHJpbmcuc3RyaXAoY2xlYW5saW5lKQotCQlpZiBjbGVhbmxpbmUgYW5kIGNsZWFubGluZVstMV0gPT0gJzonOgotCQkJdGFiY291bnQgPSB0YWJjb3VudCArIDEKLQkJZWxzZToKLQkJCSMgZXh0cmEgaW5kZW50IGFmdGVyIHVuYmFsYW5jZWQgKCwgWyBvciB7Ci0JCQlmb3Igb3BlbiwgY2xvc2UgaW4gKCgnKCcsICcpJyksICgnWycsICddJyksICgneycsICd9JykpOgotCQkJCWNvdW50ID0gc3RyaW5nLmNvdW50KGNsZWFubGluZSwgb3BlbikKLQkJCQlpZiBjb3VudCBhbmQgY291bnQgPiBzdHJpbmcuY291bnQoY2xlYW5saW5lLCBjbG9zZSk6Ci0JCQkJCXRhYmNvdW50ID0gdGFiY291bnQgKyAyCi0JCQkJCWJyZWFrCi0JCXJldHVybiB0YWJjb3VudAotCQotCWRlZiByb2xsb3ZlcihzZWxmLCBwb2ludCwgb25vZmYpOgotCQlpZiBvbm9mZjoKLQkJCWlmIHNlbGYuX2RlYnVnZ2VyIGFuZCBzZWxmLnB0X2luX2JyZWFrcyhwb2ludCk6Ci0JCQkJV2Jhc2UuU2V0Q3Vyc29yKCJhcnJvdyIpCi0JCQllbHNlOgotCQkJCVdiYXNlLlNldEN1cnNvcigiaUJlYW0iKQotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlUZXh0RWRpdG9yLmRyYXcoc2VsZiwgdmlzUmduKQotCQlpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCXNlbGYuZHJhd2JyZWFrcG9pbnRzKCkKLQkKLQlkZWYgc2hvd2JyZWFrcG9pbnRzKHNlbGYsIG9ub2ZmKToKLQkJaWYgKG5vdCBub3Qgc2VsZi5fZGVidWdnZXIpIDw+IG9ub2ZmOgotCQkJaWYgb25vZmY6Ci0JCQkJaWYgbm90IF9fZGVidWdfXzoKLQkJCQkJaW1wb3J0IFcKLQkJCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZGVidWcgaW4gXCJPcHRpbWl6ZSBieXRlY29kZVwiIG1vZGUuXHIoc2VlIFwiRGVmYXVsdCBzdGFydHVwIG9wdGlvbnNcIiBpbiBFZGl0UHl0aG9uUHJlZmVyZW5jZXMpIgotCQkJCWltcG9ydCBQeURlYnVnZ2VyCi0JCQkJc2VsZi5fZGVidWdnZXIgPSBQeURlYnVnZ2VyLmdldGRlYnVnZ2VyKCkKLQkJCQlzZWxmLl9kZWJ1Z2dlci5yZWdpc3Rlcl9lZGl0b3Ioc2VsZiwgc2VsZi5maWxlKQotCQkJZWxpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCQlzZWxmLl9kZWJ1Z2dlci51bnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBzZWxmLmZpbGUpCi0JCQkJc2VsZi5fZGVidWdnZXIgPSBOb25lCi0JCQlzZWxmLmFkanVzdChzZWxmLl9ib3VuZHMpCi0JCi0JZGVmIHRvZ2dsZWJyZWFrcG9pbnRzKHNlbGYpOgotCQlzZWxmLnNob3dicmVha3BvaW50cyhub3Qgc2VsZi5fZGVidWdnZXIpCi0JCi0JZGVmIGNsZWFyYnJlYWtwb2ludHMoc2VsZik6Ci0JCWlmIHNlbGYuZmlsZToKLQkJCXNlbGYuX2RlYnVnZ2VyLmNsZWFyX2FsbF9maWxlX2JyZWFrcyhzZWxmLmZpbGUpCi0JCi0JZGVmIGVkaXRicmVha3BvaW50cyhzZWxmKToKLQkJaWYgc2VsZi5fZGVidWdnZXI6Ci0JCQlzZWxmLl9kZWJ1Z2dlci5lZGl0X2JyZWFrcygpCi0JCQlzZWxmLl9kZWJ1Z2dlci5icmVha3N2aWV3ZXIuc2VsZWN0ZmlsZShzZWxmLmZpbGUpCi0JCi0JZGVmIGRyYXdicmVha3BvaW50cyhzZWxmLCBlcmFzZWFsbCA9IDApOgotCQlicmVha3JlY3QgPSBibCwgYnQsIGJyLCBiYiA9IHNlbGYuX2dldGJyZWFrcmVjdCgpCi0JCWJyID0gYnIgLSAxCi0JCXNlbGYuU2V0UG9ydCgpCi0JCVFkLlBlblBhdChRZC5HZXRRREdsb2JhbHNHcmF5KCkpCi0JCVFkLlBhaW50UmVjdCgoYnIsIGJ0LCBiciArIDEsIGJiKSkKLQkJUWQuUGVuTm9ybWFsKCkKLQkJc2VsZi5fcGFyZW50d2luZG93LnRlbXBjbGlwcmVjdChicmVha3JlY3QpCi0JCVFkLlJHQkZvcmVDb2xvcigoMHhmZmZmLCAwLCAwKSkKLQkJdHJ5OgotCQkJbGFzdHRvcCA9IGJ0Ci0JCQlzZWxmX3RlZCA9IHNlbGYudGVkCi0JCQlRZF9QYWludE92YWwgPSBRZC5QYWludE92YWwKLQkJCVFkX0VyYXNlUmVjdCA9IFFkLkVyYXNlUmVjdAotCQkJZm9yIGxpbmVubyBpbiBzZWxmLl9kZWJ1Z2dlci5nZXRfZmlsZV9icmVha3Moc2VsZi5maWxlKToKLQkJCQlzdGFydCwgZW5kID0gc2VsZl90ZWQuV0VHZXRMaW5lUmFuZ2UobGluZW5vIC0gMSkKLQkJCQlpZiBsaW5lbm8gPD4gc2VsZl90ZWQuV0VPZmZzZXRUb0xpbmUoc3RhcnQpICsgMToKLQkJCQkJIyBicmVha3BvaW50cyBiZXlvbmQgb3VyIHRleHQ6IGVyYXNlIHJlc3QsIGFuZCBiYWNrIG91dAotCQkJCQlRZF9FcmFzZVJlY3QoKGJsLCBsYXN0dG9wLCBiciwgYmIpKQotCQkJCQlicmVhawotCQkJCSh4LCB5KSwgaCA9IHNlbGZfdGVkLldFR2V0UG9pbnQoc3RhcnQsIDApCi0JCQkJYm90dG9tID0geSArIGgKLQkJCQkjcHJpbnQgeSwgKGxhc3R0b3AsIGJvdHRvbSkKLQkJCQlpZiBib3R0b20gPiBsYXN0dG9wOgotCQkJCQlRZF9FcmFzZVJlY3QoKGJsLCBsYXN0dG9wLCBiciwgeSArIGggKiBlcmFzZWFsbCkpCi0JCQkJCWxhc3R0b3AgPSBib3R0b20KLQkJCQlyZWRidWxsZXQgPSBibCArIDIsIHkgKyAzLCBibCArIDgsIHkgKyA5Ci0JCQkJUWRfUGFpbnRPdmFsKHJlZGJ1bGxldCkKLQkJCWVsc2U6Ci0JCQkJUWRfRXJhc2VSZWN0KChibCwgbGFzdHRvcCwgYnIsIGJiKSkKLQkJCVFkLlJHQkZvcmVDb2xvcigoMCwgMCwgMCkpCi0JCWZpbmFsbHk6Ci0JCQlzZWxmLl9wYXJlbnR3aW5kb3cucmVzdG9yZWNsaXAoKQotCQotCWRlZiB1cGRhdGVzY3JvbGxiYXJzKHNlbGYpOgotCQlpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCXNlbGYuZHJhd2JyZWFrcG9pbnRzKDEpCi0JCVRleHRFZGl0b3IudXBkYXRlc2Nyb2xsYmFycyhzZWxmKQotCQotCWRlZiBwdF9pbl9icmVha3Moc2VsZiwgcG9pbnQpOgotCQlyZXR1cm4gUWQuUHRJblJlY3QocG9pbnQsIHNlbGYuX2dldGJyZWFrcmVjdCgpKQotCQotCWRlZiBfZ2V0YnJlYWtyZWN0KHNlbGYpOgotCQlpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJCXJldHVybiAobCsxLCB0KzEsIGwgKyAxMiwgYi0xKQotCQllbHNlOgotCQkJcmV0dXJuICgwLCAwLCAwLCAwKQotCQotCWRlZiBfZ2V0dmlld3JlY3Qoc2VsZik6Ci0JCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJaWYgc2VsZi5fZGVidWdnZXI6Ci0JCQlyZXR1cm4gKGwgKyAxNywgdCArIDIsIHIsIGIgLSAyKQotCQllbHNlOgotCQkJcmV0dXJuIChsICsgNSwgdCArIDIsIHIsIGIgLSAyKQotCQotCWRlZiBfY2FsY3RleHRib3VuZHMoc2VsZik6Ci0JCXZpZXdyZWN0ID0gbCwgdCwgciwgYiA9IHNlbGYuX2dldHZpZXdyZWN0KCkKLQkJaWYgc2VsZi50ZWQ6Ci0JCQlkbCwgZHQsIGRyLCBkYiA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQotCQkJdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJCXhzaGlmdCA9IGwgLSB2bAotCQkJeXNoaWZ0ID0gdCAtIHZ0Ci0JCQlpZiAoZGIgLSBkdCkgPCAoYiAtIHQpOgotCQkJCXlzaGlmdCA9IHQgLSBkdAotCQkJZGVzdHJlY3QgPSAoZGwgKyB4c2hpZnQsIGR0ICsgeXNoaWZ0LCBkciArIHhzaGlmdCwgZGIgKyB5c2hpZnQpCi0JCWVsc2U6Ci0JCQlkZXN0cmVjdCA9IChsLCB0LCByICsgNTAwMCwgYikKLQkJcmV0dXJuIHZpZXdyZWN0LCBkZXN0cmVjdAorCisgICAgIiIiQSBzcGVjaWFsaXplZCBQeXRob24gc291cmNlIGVkaXQgd2lkZ2V0IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGV4dD0iIiwgY2FsbGJhY2s9Tm9uZSwgaW5zZXQ9KDQsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzZXR0aW5ncz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYnNldHRpbmdzPSgzMiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9JycpOgorICAgICAgICBUZXh0RWRpdG9yLl9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRleHQsIGNhbGxiYWNrLCAwLCBpbnNldCwgZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncywgcmVhZG9ubHkpCisgICAgICAgIHNlbGYuYmluZCgiY21kWyIsIHNlbGYuZG9tZW51X3NoaWZ0bGVmdCkKKyAgICAgICAgc2VsZi5iaW5kKCJjbWRdIiwgc2VsZi5kb21lbnVfc2hpZnRyaWdodCkKKyAgICAgICAgc2VsZi5iaW5kKCJjbWRzaGlmdFsiLCBzZWxmLmRvbWVudV91bmNvbW1lbnQpCisgICAgICAgIHNlbGYuYmluZCgiY21kc2hpZnRdIiwgc2VsZi5kb21lbnVfY29tbWVudCkKKyAgICAgICAgc2VsZi5iaW5kKCJjbWRzaGlmdGQiLCBzZWxmLmFsbGRpcnR5KQorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlICAgICAgICAjIG9ubHkgZm9yIGRlYnVnZ2VyIHJlZmVyZW5jZQorICAgICAgICBzZWxmLl9kZWJ1Z2dlciA9IGRlYnVnZ2VyCisgICAgICAgIGlmIGRlYnVnZ2VyOgorICAgICAgICAgICAgZGVidWdnZXIucmVnaXN0ZXJfZWRpdG9yKHNlbGYsIHNlbGYuZmlsZSkKKyAgICAgICAgc2VsZi5fZGlydHkgPSAoMCwgTm9uZSkKKyAgICAgICAgc2VsZi5kb19mb250aWZ5ID0gMAorCisgICAgI2RlZiBvcGVuKHNlbGYpOgorICAgICMgICAgICAgVGV4dEVkaXRvci5vcGVuKHNlbGYpCisgICAgIyAgICAgICBpZiBzZWxmLmRvX2ZvbnRpZnk6CisgICAgIyAgICAgICAgICAgICAgIHNlbGYuZm9udGlmeSgpCisgICAgIyAgICAgICBzZWxmLl9kaXJ0eSA9IChOb25lLCBOb25lKQorCisgICAgZGVmIF9nZXRmbGFncyhzZWxmKToKKyAgICAgICAgZmxhZ3MgPSAoV0FTVEVjb25zdC53ZURvRHJhd09mZnNjcmVlbiB8IFdBU1RFY29uc3Qud2VEb1VzZVRlbXBNZW0gfAorICAgICAgICAgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb091dGxpbmVIaWxpdGUpCisgICAgICAgIGlmIHNlbGYucmVhZG9ubHk6CisgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvUmVhZE9ubHkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZsYWdzID0gZmxhZ3MgfCBXQVNURWNvbnN0LndlRG9VbmRvCisgICAgICAgIHJldHVybiBmbGFncworCisgICAgZGVmIHRleHRjaGFuZ2VkKHNlbGYsIGFsbD0wKToKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMQorICAgICAgICBpZiBhbGw6CisgICAgICAgICAgICBzZWxmLl9kaXJ0eSA9ICgwLCBOb25lKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG9sZHNlbCA9IHNlbGYub2xkc2VsZWN0aW9uCisgICAgICAgIHNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgaWYgbm90IHNlbDoKKyAgICAgICAgICAgICMgWFhYIHdoYXQgdG8gZG8/CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbAorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKKyAgICAgICAgaWYgb2xkc2VsOgorICAgICAgICAgICAgb2xkc2Vsc3RhcnQsIG9sZHNlbGVuZCA9IG1pbihvbGRzZWwpLCBtYXgob2xkc2VsKQorICAgICAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgb2xkc2Vsc3RhcnQpLCBtYXgoc2VsZW5kLCBvbGRzZWxlbmQpCisgICAgICAgIHN0YXJ0bGluZSA9IHNlbGYub2Zmc2V0dG9saW5lKHNlbHN0YXJ0KQorICAgICAgICBlbmRsaW5lID0gc2VsZi5vZmZzZXR0b2xpbmUoc2VsZW5kKQorICAgICAgICBzZWxzdGFydCwgXyA9IHNlbGYudGVkLldFR2V0TGluZVJhbmdlKHN0YXJ0bGluZSkKKyAgICAgICAgXywgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRMaW5lUmFuZ2UoZW5kbGluZSkKKyAgICAgICAgaWYgc2Vsc3RhcnQgPiAwOgorICAgICAgICAgICAgc2Vsc3RhcnQgPSBzZWxzdGFydCAtIDEKKyAgICAgICAgc2VsZi5fZGlydHkgPSAoc2Vsc3RhcnQsIHNlbGVuZCkKKworICAgIGRlZiBpZGxlKHNlbGYpOgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLnRlZC5XRUlkbGUoKQorICAgICAgICBpZiBub3Qgc2VsZi5kb19mb250aWZ5OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHN0YXJ0LCBlbmQgPSBzZWxmLl9kaXJ0eQorICAgICAgICBpZiBzdGFydCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRleHRMZW5ndGggPSBzZWxmLnRlZC5XRUdldFRleHRMZW5ndGgoKQorICAgICAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgICAgIGVuZCA9IHRleHRMZW5ndGgKKyAgICAgICAgaWYgc3RhcnQgPj0gZW5kOgorICAgICAgICAgICAgc2VsZi5fZGlydHkgPSAoTm9uZSwgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZm9udGlmeShzdGFydCwgZW5kKQorICAgICAgICAgICAgc2VsZi5fZGlydHkgPSAoTm9uZSwgTm9uZSkKKworICAgIGRlZiBhbGxkaXJ0eShzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX2RpcnR5ID0gKDAsIE5vbmUpCisKKyAgICBkZWYgZm9udGlmeShzZWxmLCBzdGFydD0wLCBlbmQ9Tm9uZSk6CisgICAgICAgICNXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBpZiBzZWxmLnJlYWRvbmx5OgorICAgICAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRlJlYWRPbmx5LCAwKQorICAgICAgICBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGT3V0bGluZUhpbGl0ZSwgMCkKKyAgICAgICAgc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKKyAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkF1dG9TY3JvbGwsIDApCisgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZVbmRvLCAwKQorICAgICAgICBweXRleHQgPSBzZWxmLmdldCgpLnJlcGxhY2UoIlxyIiwgIlxuIikKKyAgICAgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICAgICAgICBlbmQgPSBsZW4ocHl0ZXh0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW5kID0gbWluKGVuZCwgbGVuKHB5dGV4dCkpCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHN0YXJ0LCBlbmQpCisgICAgICAgIHNlbGYudGVkLldFU2V0U3R5bGUoV0FTVEVjb25zdC53ZURvRmFjZSB8IFdBU1RFY29uc3Qud2VEb0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgKDAsIDAsIDEyLCAoMCwgMCwgMCkpKQorCisgICAgICAgIHRhZ3MgPSBQeUZvbnRpZnkuZm9udGlmeShweXRleHQsIHN0YXJ0LCBlbmQpCisgICAgICAgIHN0eWxlcyA9IHsKKyAgICAgICAgICAgICAgICAnc3RyaW5nJzogKFdBU1RFY29uc3Qud2VEb0NvbG9yLCAoMCwgMCwgMCwga1N0cmluZ0NvbG9yKSksCisgICAgICAgICAgICAgICAgJ2tleXdvcmQnOiAoV0FTVEVjb25zdC53ZURvRmFjZSwgKDAsIDEsIDAsICgwLCAwLCAwKSkpLAorICAgICAgICAgICAgICAgICdjb21tZW50JzogKFdBU1RFY29uc3Qud2VEb0ZhY2UgfCBXQVNURWNvbnN0LndlRG9Db2xvciwgKDAsIDAsIDAsIGtDb21tZW50Q29sb3IpKSwKKyAgICAgICAgICAgICAgICAnaWRlbnRpZmllcic6IChXQVNURWNvbnN0LndlRG9Db2xvciwgKDAsIDAsIDAsICgweGJmZmYsIDAsIDApKSkKKyAgICAgICAgfQorICAgICAgICBzZXRzZWxlY3Rpb24gPSBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbgorICAgICAgICBzZXRzdHlsZSA9IHNlbGYudGVkLldFU2V0U3R5bGUKKyAgICAgICAgZm9yIHRhZywgc3RhcnQsIGVuZCwgc3VibGlzdCBpbiB0YWdzOgorICAgICAgICAgICAgc2V0c2VsZWN0aW9uKHN0YXJ0LCBlbmQpCisgICAgICAgICAgICBtb2RlLCBzdHlsZSA9IHN0eWxlc1t0YWddCisgICAgICAgICAgICBzZXRzdHlsZShtb2RlLCBzdHlsZSkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbGVuZCkKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkF1dG9TY3JvbGwsIDEpCisgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZVbmRvLCAxKQorICAgICAgICBzZWxmLnRlZC5XRUFjdGl2YXRlKCkKKyAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRk91dGxpbmVIaWxpdGUsIDEpCisgICAgICAgIGlmIHNlbGYucmVhZG9ubHk6CisgICAgICAgICAgICBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGUmVhZE9ubHksIDEpCisKKyAgICBkZWYgZG9tZW51X3NoaWZ0bGVmdChzZWxmKToKKyAgICAgICAgc2VsZi5leHBhbmRzZWxlY3Rpb24oKQorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKKyAgICAgICAgc25pcHBldCA9IHNlbGYuZ2V0c2VsZWN0ZWR0ZXh0KCkKKyAgICAgICAgbGluZXMgPSBzdHJpbmcuc3BsaXQoc25pcHBldCwgJ1xyJykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSk6CisgICAgICAgICAgICBpZiBsaW5lc1tpXVs6MV0gPT0gJ1x0JzoKKyAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmVzW2ldWzE6XQorICAgICAgICBzbmlwcGV0ID0gc3RyaW5nLmpvaW4obGluZXMsICdccicpCisgICAgICAgIHNlbGYuaW5zZXJ0KHNuaXBwZXQpCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxzdGFydCArIGxlbihzbmlwcGV0KSkKKworICAgIGRlZiBkb21lbnVfc2hpZnRyaWdodChzZWxmKToKKyAgICAgICAgc2VsZi5leHBhbmRzZWxlY3Rpb24oKQorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKKyAgICAgICAgc25pcHBldCA9IHNlbGYuZ2V0c2VsZWN0ZWR0ZXh0KCkKKyAgICAgICAgbGluZXMgPSBzdHJpbmcuc3BsaXQoc25pcHBldCwgJ1xyJykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSAtIChub3QgbGluZXNbLTFdKSk6CisgICAgICAgICAgICBsaW5lc1tpXSA9ICdcdCcgKyBsaW5lc1tpXQorICAgICAgICBzbmlwcGV0ID0gc3RyaW5nLmpvaW4obGluZXMsICdccicpCisgICAgICAgIHNlbGYuaW5zZXJ0KHNuaXBwZXQpCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxzdGFydCArIGxlbihzbmlwcGV0KSkKKworICAgIGRlZiBkb21lbnVfdW5jb21tZW50KHNlbGYpOgorICAgICAgICBzZWxmLmV4cGFuZHNlbGVjdGlvbigpCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCksIG1heChzZWxzdGFydCwgc2VsZW5kKQorICAgICAgICBzbmlwcGV0ID0gc2VsZi5nZXRzZWxlY3RlZHRleHQoKQorICAgICAgICBsaW5lcyA9IHN0cmluZy5zcGxpdChzbmlwcGV0LCAnXHInKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obGluZXMpKToKKyAgICAgICAgICAgIG0gPSBjb21tZW50UGF0Lm1hdGNoKGxpbmVzW2ldKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBwb3MgPSBtLnN0YXJ0KDEpCisgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXVs6cG9zXSArIGxpbmVzW2ldW3BvcysxOl0KKyAgICAgICAgc25pcHBldCA9IHN0cmluZy5qb2luKGxpbmVzLCAnXHInKQorICAgICAgICBzZWxmLmluc2VydChzbmlwcGV0KQorICAgICAgICBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihzZWxzdGFydCwgc2Vsc3RhcnQgKyBsZW4oc25pcHBldCkpCisKKyAgICBkZWYgZG9tZW51X2NvbW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuZXhwYW5kc2VsZWN0aW9uKCkKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgc2VsZW5kKSwgbWF4KHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgIHNuaXBwZXQgPSBzZWxmLmdldHNlbGVjdGVkdGV4dCgpCisgICAgICAgIGxpbmVzID0gc3RyaW5nLnNwbGl0KHNuaXBwZXQsICdccicpCisgICAgICAgIGluZGVudCA9IDMwMDAgIyBhcmJpdHJhcnkgbGFyZ2UgbnVtYmVyLi4uCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgaWYgc3RyaW5nLnN0cmlwKGxpbmUpOgorICAgICAgICAgICAgICAgIG0gPSBpbmRlbnRQYXQubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBtaW4oaW5kZW50LCBtLnJlZ3NbMF1bMV0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gMAorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obGluZXMpIC0gKG5vdCBsaW5lc1stMV0pKToKKyAgICAgICAgICAgIGxpbmVzW2ldID0gbGluZXNbaV1bOmluZGVudF0gKyAiIyIgKyBsaW5lc1tpXVtpbmRlbnQ6XQorICAgICAgICBzbmlwcGV0ID0gc3RyaW5nLmpvaW4obGluZXMsICdccicpCisgICAgICAgIHNlbGYuaW5zZXJ0KHNuaXBwZXQpCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxzdGFydCArIGxlbihzbmlwcGV0KSkKKworICAgIGRlZiBzZXRmaWxlKHNlbGYsIGZpbGUpOgorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisKKyAgICBkZWYgc2V0KHNlbGYsIHRleHQsIGZpbGUgPSAnJyk6CisgICAgICAgIG9sZGZpbGUgPSBzZWxmLmZpbGUKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICBpZiBzZWxmLl9kZWJ1Z2dlcjoKKyAgICAgICAgICAgIHNlbGYuX2RlYnVnZ2VyLnVucmVnaXN0ZXJfZWRpdG9yKHNlbGYsIG9sZGZpbGUpCisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci5yZWdpc3Rlcl9lZGl0b3Ioc2VsZiwgZmlsZSkKKyAgICAgICAgVGV4dEVkaXRvci5zZXQoc2VsZiwgdGV4dCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnZXI6CisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci51bnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBzZWxmLmZpbGUpCisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlciA9IE5vbmUKKyAgICAgICAgVGV4dEVkaXRvci5jbG9zZShzZWxmKQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9kZWJ1Z2dlciBhbmQgc2VsZi5wdF9pbl9icmVha3MocG9pbnQpOgorICAgICAgICAgICAgc2VsZi5icmVha2hpdChwb2ludCwgbW9kaWZpZXJzKQorICAgICAgICBlbGlmIHNlbGYuX2RlYnVnZ2VyOgorICAgICAgICAgICAgYmwsIGJ0LCBiciwgYmIgPSBzZWxmLl9nZXRicmVha3JlY3QoKQorICAgICAgICAgICAgUWQuRXJhc2VSZWN0KChibCwgYnQsIGJyLTEsIGJiKSkKKyAgICAgICAgICAgIFRleHRFZGl0b3IuY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycykKKyAgICAgICAgICAgIHNlbGYuZHJhd2JyZWFrcG9pbnRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFRleHRFZGl0b3IuY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycykKKyAgICAgICAgICAgIGlmIHNlbGYudGVkLldFR2V0Q2xpY2tDb3VudCgpID49IDM6CisgICAgICAgICAgICAgICAgIyBzZWxlY3QgYmxvY2sgd2l0aCBvdXIgaW5kZW50CisgICAgICAgICAgICAgICAgbGluZXMgPSBzdHJpbmcuc3BsaXQoc2VsZi5nZXQoKSwgJ1xyJykKKyAgICAgICAgICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICAgICAgICAgIGxpbmVubyA9IHNlbGYudGVkLldFT2Zmc2V0VG9MaW5lKHNlbHN0YXJ0KQorICAgICAgICAgICAgICAgIHRhYnMgPSAwCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVzW2xpbmVub10KKyAgICAgICAgICAgICAgICB3aGlsZSBsaW5lW3RhYnM6XSBhbmQgbGluZVt0YWJzXSA9PSAnXHQnOgorICAgICAgICAgICAgICAgICAgICB0YWJzID0gdGFicyArIDEKKyAgICAgICAgICAgICAgICB0YWJzdGFnID0gJ1x0JyAqIHRhYnMKKyAgICAgICAgICAgICAgICBmcm9tbGluZSA9IDAKKyAgICAgICAgICAgICAgICB0b2xpbmUgPSBsZW4obGluZXMpCisgICAgICAgICAgICAgICAgaWYgdGFiczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGluZW5vIC0gMSwgLTEsIC0xKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lc1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZVs6dGFic10gPD4gdGFic3RhZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGluZSA9IGkgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGluZW5vICsgMSwgdG9saW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lc1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZVs6dGFic10gPD4gdGFic3RhZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2xpbmUgPSBpIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc2Vsc3RhcnQsIGR1bW15ID0gc2VsZi50ZWQuV0VHZXRMaW5lUmFuZ2UoZnJvbWxpbmUpCisgICAgICAgICAgICAgICAgZHVtbXksIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0TGluZVJhbmdlKHRvbGluZSkKKyAgICAgICAgICAgICAgICBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihzZWxzdGFydCwgc2VsZW5kKQorCisgICAgZGVmIGJyZWFraGl0KHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5maWxlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGRlc3RyZWN0ID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCisgICAgICAgIG9mZnNldCwgZWRnZSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KHBvaW50KQorICAgICAgICBsaW5lbm8gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZShvZmZzZXQpICsgMQorICAgICAgICBpZiBwb2ludFsxXSA8PSBkZXN0cmVjdFszXToKKyAgICAgICAgICAgIHNlbGYuX2RlYnVnZ2VyLmNsZWFyX2JyZWFrc19hYm92ZShzZWxmLmZpbGUsIHNlbGYuY291bnRsaW5lcygpKQorICAgICAgICAgICAgc2VsZi5fZGVidWdnZXIudG9nZ2xlX2JyZWFrKHNlbGYuZmlsZSwgbGluZW5vKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZGVidWdnZXIuY2xlYXJfYnJlYWtzX2Fib3ZlKHNlbGYuZmlsZSwgbGluZW5vKQorCisgICAgZGVmIGtleShzZWxmLCBjaGFyLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIGlmIG1vZGlmaWVycyAmIEV2ZW50cy5jbWRLZXkgYW5kIG5vdCBjaGFyIGluIFdrZXlzLmFycm93a2V5czoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBjaGFyID09ICdccic6CisgICAgICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgc2VsZW5kKSwgbWF4KHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgICAgICBsYXN0Y2hhciA9IGNocihzZWxmLnRlZC5XRUdldENoYXIoc2Vsc3RhcnQtMSkpCisgICAgICAgICAgICBpZiBsYXN0Y2hhciA8PiAnXHInIGFuZCBzZWxzdGFydDoKKyAgICAgICAgICAgICAgICBwb3MsIGR1bW15ID0gc2VsZi50ZWQuV0VGaW5kTGluZShzZWxzdGFydCwgMCkKKyAgICAgICAgICAgICAgICBsaW5lcmVzID0gUmVzLlJlc291cmNlKCcnKQorICAgICAgICAgICAgICAgIHNlbGYudGVkLldFQ29weVJhbmdlKHBvcywgc2Vsc3RhcnQsIGxpbmVyZXMsIE5vbmUsIE5vbmUpCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVyZXMuZGF0YSArICdcbicKKyAgICAgICAgICAgICAgICB0YWJjb3VudCA9IHNlbGYuZXh0cmF0YWJzKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi50ZWQuV0VLZXkob3JkKCdccicpLCAwKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHRhYmNvdW50KToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZWQuV0VLZXkob3JkKCdcdCcpLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRlZC5XRUtleShvcmQoJ1xyJyksIDApCisgICAgICAgIGVsaWYgY2hhciBpbiAnKV19JzoKKyAgICAgICAgICAgIHNlbGYudGVkLldFS2V5KG9yZChjaGFyKSwgbW9kaWZpZXJzKQorICAgICAgICAgICAgc2VsZi5iYWxhbmNlcGFyZW5zKGNoYXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRlZC5XRUtleShvcmQoY2hhciksIG1vZGlmaWVycykKKyAgICAgICAgaWYgY2hhciBub3QgaW4gV2tleXMubmF2aWdhdGlvbmtleXM6CisgICAgICAgICAgICBzZWxmLnRleHRjaGFuZ2VkKCkKKyAgICAgICAgc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKworICAgIGRlZiBiYWxhbmNlcGFyZW5zKHNlbGYsIGNoYXIpOgorICAgICAgICBpZiBjaGFyID09ICcpJzoKKyAgICAgICAgICAgIHRhcmdldCA9ICcoJworICAgICAgICBlbGlmIGNoYXIgPT0gJ10nOgorICAgICAgICAgICAgdGFyZ2V0ID0gJ1snCisgICAgICAgIGVsaWYgY2hhciA9PSAnfSc6CisgICAgICAgICAgICB0YXJnZXQgPSAneycKKyAgICAgICAgcmVjdXJzaW9ubGV2ZWwgPSAxCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIGNvdW50ID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpIC0gMgorICAgICAgICBtaW5jb3VudCA9IG1heCgwLCBjb3VudCAtIDIwNDgpCisgICAgICAgIGxhc3RxdW90ZSA9IE5vbmUKKyAgICAgICAgd2hpbGUgY291bnQgPiBtaW5jb3VudDoKKyAgICAgICAgICAgIHRlc3RjaGFyID0gY2hyKHNlbGYudGVkLldFR2V0Q2hhcihjb3VudCkpCisgICAgICAgICAgICBpZiB0ZXN0Y2hhciBpbiAiXCInIiBhbmQgY2hyKHNlbGYudGVkLldFR2V0Q2hhcihjb3VudCAtIDEpKSA8PiAnXFwnOgorICAgICAgICAgICAgICAgIGlmIGxhc3RxdW90ZSA9PSB0ZXN0Y2hhcjoKKyAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9ubGV2ZWwgPSByZWN1cnNpb25sZXZlbCAtIDEKKyAgICAgICAgICAgICAgICAgICAgbGFzdHF1b3RlID0gTm9uZQorICAgICAgICAgICAgICAgIGVsaWYgbm90IGxhc3RxdW90ZToKKyAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9ubGV2ZWwgPSByZWN1cnNpb25sZXZlbCArIDEKKyAgICAgICAgICAgICAgICAgICAgbGFzdHF1b3RlID0gdGVzdGNoYXIKKyAgICAgICAgICAgIGVsaWYgbm90IGxhc3RxdW90ZSBhbmQgdGVzdGNoYXIgPT0gY2hhcjoKKyAgICAgICAgICAgICAgICByZWN1cnNpb25sZXZlbCA9IHJlY3Vyc2lvbmxldmVsICsgMQorICAgICAgICAgICAgZWxpZiBub3QgbGFzdHF1b3RlIGFuZCB0ZXN0Y2hhciA9PSB0YXJnZXQ6CisgICAgICAgICAgICAgICAgcmVjdXJzaW9ubGV2ZWwgPSByZWN1cnNpb25sZXZlbCAtIDEKKyAgICAgICAgICAgICAgICBpZiByZWN1cnNpb25sZXZlbCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICAgICAgICAgICAgICBhdXRvc2Nyb2xsID0gc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkF1dG9TY3JvbGwsIC0xKQorICAgICAgICAgICAgICAgICAgICBpZiBhdXRvc2Nyb2xsOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkF1dG9TY3JvbGwsIDApCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKGNvdW50LCBjb3VudCArIDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLlFERmx1c2hQb3J0QnVmZmVyKE5vbmUpICAjIG5lZWRlZCB1bmRlciBPU1gKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgICAgICAgICAgICAgIGlmIGF1dG9zY3JvbGw6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGQXV0b1Njcm9sbCwgMSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgLSAxCisKKyAgICBkZWYgZXh0cmF0YWJzKHNlbGYsIGxpbmUpOgorICAgICAgICB0YWJjb3VudCA9IDAKKyAgICAgICAgZm9yIGMgaW4gbGluZToKKyAgICAgICAgICAgIGlmIGMgPD4gJ1x0JzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGFiY291bnQgPSB0YWJjb3VudCArIDEKKyAgICAgICAgbGFzdCA9IDAKKyAgICAgICAgY2xlYW5saW5lID0gJycKKyAgICAgICAgdGFncyA9IFB5Rm9udGlmeS5mb250aWZ5KGxpbmUpCisgICAgICAgICMgc3RyaXAgY29tbWVudHMgYW5kIHN0cmluZ3MKKyAgICAgICAgZm9yIHRhZywgc3RhcnQsIGVuZCwgc3VibGlzdCBpbiB0YWdzOgorICAgICAgICAgICAgaWYgdGFnIGluICgnc3RyaW5nJywgJ2NvbW1lbnQnKToKKyAgICAgICAgICAgICAgICBjbGVhbmxpbmUgPSBjbGVhbmxpbmUgKyBsaW5lW2xhc3Q6c3RhcnRdCisgICAgICAgICAgICAgICAgbGFzdCA9IGVuZAorICAgICAgICBjbGVhbmxpbmUgPSBjbGVhbmxpbmUgKyBsaW5lW2xhc3Q6XQorICAgICAgICBjbGVhbmxpbmUgPSBzdHJpbmcuc3RyaXAoY2xlYW5saW5lKQorICAgICAgICBpZiBjbGVhbmxpbmUgYW5kIGNsZWFubGluZVstMV0gPT0gJzonOgorICAgICAgICAgICAgdGFiY291bnQgPSB0YWJjb3VudCArIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZXh0cmEgaW5kZW50IGFmdGVyIHVuYmFsYW5jZWQgKCwgWyBvciB7CisgICAgICAgICAgICBmb3Igb3BlbiwgY2xvc2UgaW4gKCgnKCcsICcpJyksICgnWycsICddJyksICgneycsICd9JykpOgorICAgICAgICAgICAgICAgIGNvdW50ID0gc3RyaW5nLmNvdW50KGNsZWFubGluZSwgb3BlbikKKyAgICAgICAgICAgICAgICBpZiBjb3VudCBhbmQgY291bnQgPiBzdHJpbmcuY291bnQoY2xlYW5saW5lLCBjbG9zZSk6CisgICAgICAgICAgICAgICAgICAgIHRhYmNvdW50ID0gdGFiY291bnQgKyAyCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiB0YWJjb3VudAorCisgICAgZGVmIHJvbGxvdmVyKHNlbGYsIHBvaW50LCBvbm9mZik6CisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgaWYgc2VsZi5fZGVidWdnZXIgYW5kIHNlbGYucHRfaW5fYnJlYWtzKHBvaW50KToKKyAgICAgICAgICAgICAgICBXYmFzZS5TZXRDdXJzb3IoImFycm93IikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgV2Jhc2UuU2V0Q3Vyc29yKCJpQmVhbSIpCisKKyAgICBkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKKyAgICAgICAgVGV4dEVkaXRvci5kcmF3KHNlbGYsIHZpc1JnbikKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnZXI6CisgICAgICAgICAgICBzZWxmLmRyYXdicmVha3BvaW50cygpCisKKyAgICBkZWYgc2hvd2JyZWFrcG9pbnRzKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgKG5vdCBub3Qgc2VsZi5fZGVidWdnZXIpIDw+IG9ub2ZmOgorICAgICAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICAgICAgaWYgbm90IF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZGVidWcgaW4gXCJPcHRpbWl6ZSBieXRlY29kZVwiIG1vZGUuXHIoc2VlIFwiRGVmYXVsdCBzdGFydHVwIG9wdGlvbnNcIiBpbiBFZGl0UHl0aG9uUHJlZmVyZW5jZXMpIgorICAgICAgICAgICAgICAgIGltcG9ydCBQeURlYnVnZ2VyCisgICAgICAgICAgICAgICAgc2VsZi5fZGVidWdnZXIgPSBQeURlYnVnZ2VyLmdldGRlYnVnZ2VyKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci5yZWdpc3Rlcl9lZGl0b3Ioc2VsZiwgc2VsZi5maWxlKQorICAgICAgICAgICAgZWxpZiBzZWxmLl9kZWJ1Z2dlcjoKKyAgICAgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci51bnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBzZWxmLmZpbGUpCisgICAgICAgICAgICAgICAgc2VsZi5fZGVidWdnZXIgPSBOb25lCisgICAgICAgICAgICBzZWxmLmFkanVzdChzZWxmLl9ib3VuZHMpCisKKyAgICBkZWYgdG9nZ2xlYnJlYWtwb2ludHMoc2VsZik6CisgICAgICAgIHNlbGYuc2hvd2JyZWFrcG9pbnRzKG5vdCBzZWxmLl9kZWJ1Z2dlcikKKworICAgIGRlZiBjbGVhcmJyZWFrcG9pbnRzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZpbGU6CisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci5jbGVhcl9hbGxfZmlsZV9icmVha3Moc2VsZi5maWxlKQorCisgICAgZGVmIGVkaXRicmVha3BvaW50cyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnZXI6CisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci5lZGl0X2JyZWFrcygpCisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci5icmVha3N2aWV3ZXIuc2VsZWN0ZmlsZShzZWxmLmZpbGUpCisKKyAgICBkZWYgZHJhd2JyZWFrcG9pbnRzKHNlbGYsIGVyYXNlYWxsID0gMCk6CisgICAgICAgIGJyZWFrcmVjdCA9IGJsLCBidCwgYnIsIGJiID0gc2VsZi5fZ2V0YnJlYWtyZWN0KCkKKyAgICAgICAgYnIgPSBiciAtIDEKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgUWQuUGVuUGF0KFFkLkdldFFER2xvYmFsc0dyYXkoKSkKKyAgICAgICAgUWQuUGFpbnRSZWN0KChiciwgYnQsIGJyICsgMSwgYmIpKQorICAgICAgICBRZC5QZW5Ob3JtYWwoKQorICAgICAgICBzZWxmLl9wYXJlbnR3aW5kb3cudGVtcGNsaXByZWN0KGJyZWFrcmVjdCkKKyAgICAgICAgUWQuUkdCRm9yZUNvbG9yKCgweGZmZmYsIDAsIDApKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsYXN0dG9wID0gYnQKKyAgICAgICAgICAgIHNlbGZfdGVkID0gc2VsZi50ZWQKKyAgICAgICAgICAgIFFkX1BhaW50T3ZhbCA9IFFkLlBhaW50T3ZhbAorICAgICAgICAgICAgUWRfRXJhc2VSZWN0ID0gUWQuRXJhc2VSZWN0CisgICAgICAgICAgICBmb3IgbGluZW5vIGluIHNlbGYuX2RlYnVnZ2VyLmdldF9maWxlX2JyZWFrcyhzZWxmLmZpbGUpOgorICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBzZWxmX3RlZC5XRUdldExpbmVSYW5nZShsaW5lbm8gLSAxKQorICAgICAgICAgICAgICAgIGlmIGxpbmVubyA8PiBzZWxmX3RlZC5XRU9mZnNldFRvTGluZShzdGFydCkgKyAxOgorICAgICAgICAgICAgICAgICAgICAjIGJyZWFrcG9pbnRzIGJleW9uZCBvdXIgdGV4dDogZXJhc2UgcmVzdCwgYW5kIGJhY2sgb3V0CisgICAgICAgICAgICAgICAgICAgIFFkX0VyYXNlUmVjdCgoYmwsIGxhc3R0b3AsIGJyLCBiYikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgKHgsIHkpLCBoID0gc2VsZl90ZWQuV0VHZXRQb2ludChzdGFydCwgMCkKKyAgICAgICAgICAgICAgICBib3R0b20gPSB5ICsgaAorICAgICAgICAgICAgICAgICNwcmludCB5LCAobGFzdHRvcCwgYm90dG9tKQorICAgICAgICAgICAgICAgIGlmIGJvdHRvbSA+IGxhc3R0b3A6CisgICAgICAgICAgICAgICAgICAgIFFkX0VyYXNlUmVjdCgoYmwsIGxhc3R0b3AsIGJyLCB5ICsgaCAqIGVyYXNlYWxsKSkKKyAgICAgICAgICAgICAgICAgICAgbGFzdHRvcCA9IGJvdHRvbQorICAgICAgICAgICAgICAgIHJlZGJ1bGxldCA9IGJsICsgMiwgeSArIDMsIGJsICsgOCwgeSArIDkKKyAgICAgICAgICAgICAgICBRZF9QYWludE92YWwocmVkYnVsbGV0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBRZF9FcmFzZVJlY3QoKGJsLCBsYXN0dG9wLCBiciwgYmIpKQorICAgICAgICAgICAgUWQuUkdCRm9yZUNvbG9yKCgwLCAwLCAwKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy5yZXN0b3JlY2xpcCgpCisKKyAgICBkZWYgdXBkYXRlc2Nyb2xsYmFycyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnZXI6CisgICAgICAgICAgICBzZWxmLmRyYXdicmVha3BvaW50cygxKQorICAgICAgICBUZXh0RWRpdG9yLnVwZGF0ZXNjcm9sbGJhcnMoc2VsZikKKworICAgIGRlZiBwdF9pbl9icmVha3Moc2VsZiwgcG9pbnQpOgorICAgICAgICByZXR1cm4gUWQuUHRJblJlY3QocG9pbnQsIHNlbGYuX2dldGJyZWFrcmVjdCgpKQorCisgICAgZGVmIF9nZXRicmVha3JlY3Qoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2RlYnVnZ2VyOgorICAgICAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcworICAgICAgICAgICAgcmV0dXJuIChsKzEsIHQrMSwgbCArIDEyLCBiLTEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKDAsIDAsIDAsIDApCisKKyAgICBkZWYgX2dldHZpZXdyZWN0KHNlbGYpOgorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIGlmIHNlbGYuX2RlYnVnZ2VyOgorICAgICAgICAgICAgcmV0dXJuIChsICsgMTcsIHQgKyAyLCByLCBiIC0gMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAobCArIDUsIHQgKyAyLCByLCBiIC0gMikKKworICAgIGRlZiBfY2FsY3RleHRib3VuZHMoc2VsZik6CisgICAgICAgIHZpZXdyZWN0ID0gbCwgdCwgciwgYiA9IHNlbGYuX2dldHZpZXdyZWN0KCkKKyAgICAgICAgaWYgc2VsZi50ZWQ6CisgICAgICAgICAgICBkbCwgZHQsIGRyLCBkYiA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQorICAgICAgICAgICAgdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgICAgIHhzaGlmdCA9IGwgLSB2bAorICAgICAgICAgICAgeXNoaWZ0ID0gdCAtIHZ0CisgICAgICAgICAgICBpZiAoZGIgLSBkdCkgPCAoYiAtIHQpOgorICAgICAgICAgICAgICAgIHlzaGlmdCA9IHQgLSBkdAorICAgICAgICAgICAgZGVzdHJlY3QgPSAoZGwgKyB4c2hpZnQsIGR0ICsgeXNoaWZ0LCBkciArIHhzaGlmdCwgZGIgKyB5c2hpZnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZXN0cmVjdCA9IChsLCB0LCByICsgNTAwMCwgYikKKyAgICAgICAgcmV0dXJuIHZpZXdyZWN0LCBkZXN0cmVjdAogCiAKIGRlZiBHZXRGTnVtKGZvbnRuYW1lKToKLQkiIiJTYW1lIGFzIEZtLkdldEZOdW0oKSwgYnV0IG1hcHMgYSBtaXNzaW5nIGZvbnQgdG8gTW9uYWNvIGluc3RlYWQgb2YgdGhlIHN5c3RlbSBmb250LiIiIgotCWlmIGZvbnRuYW1lIDw+IEZtLkdldEZvbnROYW1lKDApOgotCQlmb250aWQgPSBGbS5HZXRGTnVtKGZvbnRuYW1lKQotCQlpZiBmb250aWQgPT0gMDoKLQkJCWZvbnRpZCA9IEZvbnRzLm1vbmFjbwotCWVsc2U6Ci0JCWZvbnRpZCA9IDAKLQlyZXR1cm4gZm9udGlkCisgICAgIiIiU2FtZSBhcyBGbS5HZXRGTnVtKCksIGJ1dCBtYXBzIGEgbWlzc2luZyBmb250IHRvIE1vbmFjbyBpbnN0ZWFkIG9mIHRoZSBzeXN0ZW0gZm9udC4iIiIKKyAgICBpZiBmb250bmFtZSA8PiBGbS5HZXRGb250TmFtZSgwKToKKyAgICAgICAgZm9udGlkID0gRm0uR2V0Rk51bShmb250bmFtZSkKKyAgICAgICAgaWYgZm9udGlkID09IDA6CisgICAgICAgICAgICBmb250aWQgPSBGb250cy5tb25hY28KKyAgICBlbHNlOgorICAgICAgICBmb250aWQgPSAwCisgICAgcmV0dXJuIGZvbnRpZAogCiAjIGIvdyBjb21wYXQuIEFueW9uZSB1c2luZyB0aGlzPwogR2V0Rk5hbWUgPSBGbS5HZXRGb250TmFtZQogCiBkZWYgR2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0KToKLQlyZXR1cm4gRm0uR2V0Rm9udE5hbWUocG9ydC5HZXRQb3J0VGV4dEZvbnQoKSksIHBvcnQuR2V0UG9ydFRleHRGYWNlKCksIHBvcnQuR2V0UG9ydFRleHRTaXplKCkKKyAgICByZXR1cm4gRm0uR2V0Rm9udE5hbWUocG9ydC5HZXRQb3J0VGV4dEZvbnQoKSksIHBvcnQuR2V0UG9ydFRleHRGYWNlKCksIHBvcnQuR2V0UG9ydFRleHRTaXplKCkKIAogZGVmIFNldFBvcnRGb250U2V0dGluZ3MocG9ydCwgKGZvbnQsIGZhY2UsIHNpemUpKToKLQlzYXZlcG9ydCA9IFFkLkdldFBvcnQoKQotCVFkLlNldFBvcnQocG9ydCkKLQlRZC5UZXh0Rm9udChHZXRGTnVtKGZvbnQpKQotCVFkLlRleHRGYWNlKGZhY2UpCi0JUWQuVGV4dFNpemUoc2l6ZSkKLQlRZC5TZXRQb3J0KHNhdmVwb3J0KQorICAgIHNhdmVwb3J0ID0gUWQuR2V0UG9ydCgpCisgICAgUWQuU2V0UG9ydChwb3J0KQorICAgIFFkLlRleHRGb250KEdldEZOdW0oZm9udCkpCisgICAgUWQuVGV4dEZhY2UoZmFjZSkKKyAgICBRZC5UZXh0U2l6ZShzaXplKQorICAgIFFkLlNldFBvcnQoc2F2ZXBvcnQpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1d0cmFjZWJhY2sucHkgYi9NYWMvVG9vbHMvSURFL1d0cmFjZWJhY2sucHkKaW5kZXggOTBhMjVmZS4uZTg0MzQ5ZCAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9XdHJhY2ViYWNrLnB5CisrKyBiL01hYy9Ub29scy9JREUvV3RyYWNlYmFjay5weQpAQCAtNywxODIgKzcsMTgxIEBACiAKIAogY2xhc3MgVHJhY2VCYWNrOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSA9ICJUcmFjZWJhY2siKToKLQkJYXBwID0gVy5nZXRhcHBsaWNhdGlvbigpICAjIGNoZWNrcyBpZiBXIGlzIHByb3Blcmx5IGluaXRpYWxpemVkCi0JCXNlbGYudGl0bGUgPSB0aXRsZQotCQlzZWxmLncgPSBOb25lCi0JCXNlbGYuY2xvc2VkID0gMQotCQlzZWxmLnN0YXJ0ID0gMAotCQlzZWxmLmxhc3R3aW5kb3d0aXRsZSA9ICIiCi0JCXNlbGYuYm91bmRzID0gKDM2MCwgMjk4KQotCQotCWRlZiB0cmFjZWJhY2soc2VsZiwgc3RhcnQgPSAwLCBsYXN0d2luZG93dGl0bGUgPSAiIik6Ci0JCXRyeToKLQkJCXNlbGYubGFzdHdpbmRvd3RpdGxlID0gbGFzdHdpbmRvd3RpdGxlCi0JCQlzZWxmLnN0YXJ0ID0gc3RhcnQKLQkJCXNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YiA9IHN5cy5leGNfaW5mbygpCi0JCQlpZiBzZWxmLnR5cGUgaXMgbm90IFN5bnRheEVycm9yOgotCQkJCXNlbGYuc2hvdygpCi0JCQkJaWYgdHlwZShzZWxmLnR5cGUpID09IHR5cGVzLkNsYXNzVHlwZToKLQkJCQkJZXJyb3J0ZXh0ID0gc2VsZi50eXBlLl9fbmFtZV9fCi0JCQkJZWxzZToKLQkJCQkJZXJyb3J0ZXh0ID0gc3RyKHNlbGYudHlwZSkKLQkJCQl2YWx1ZSA9IHN0cihzZWxmLnZhbHVlKQotCQkJCWlmIHNlbGYudmFsdWUgYW5kIHZhbHVlOgotCQkJCQllcnJvcnRleHQgPSBlcnJvcnRleHQgKyAiOiAiICsgdmFsdWUKLQkJCQlzZWxmLncudGV4dC5zZXQoZXJyb3J0ZXh0KQotCQkJCXNlbGYuYnVpbGR0Ymxpc3QoKQotCQkJCXNlbGYudy5saXN0LnNldChzZWxmLnRleHRsaXN0KQotCQkJCXNlbGYudy5saXN0LnNldHNlbGVjdGlvbihbbGVuKHNlbGYudGV4dGxpc3QpIC0gMV0pCi0JCQkJc2VsZi53LndpZC5TZWxlY3RXaW5kb3coKQotCQkJCXNlbGYuY2xvc2VkID0gMAotCQkJZWxzZToKLQkJCQlzZWxmLnN5bnRheGVycm9yKCkKLQkJZXhjZXB0OgotCQkJdHJhY2ViYWNrLnByaW50X2V4YygpCi0JCi0JZGVmIHN5bnRheGVycm9yKHNlbGYpOgotCQl0cnk6Ci0JCQl2YWx1ZSwgKGZpbGVuYW1lLCBsaW5lbm8sIGNoYXJubywgbGluZSkgPSBzZWxmLnZhbHVlCi0JCWV4Y2VwdDoKLQkJCWZpbGVuYW1lID0gIiIKLQkJCWxpbmVubyA9IE5vbmUKLQkJCXZhbHVlID0gc2VsZi52YWx1ZQotCQlpZiBub3QgZmlsZW5hbWUgYW5kIHNlbGYubGFzdHdpbmRvd3RpdGxlOgotCQkJZmlsZW5hbWUgPSBzZWxmLmxhc3R3aW5kb3d0aXRsZQotCQllbGlmIG5vdCBmaWxlbmFtZToKLQkJCWZpbGVuYW1lID0gIjx1bmtub3duPiIKLQkJaWYgZmlsZW5hbWUgYW5kIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKLQkJCWZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSlbMV0KLQkJaWYgbGluZW5vIGFuZCBjaGFybm8gaXMgbm90IE5vbmU6Ci0JCQljaGFybm8gPSBjaGFybm8gLSAxCi0JCQl0ZXh0ID0gc3RyKHZhbHVlKSArICdcckZpbGU6ICInICsgc3RyKGZpbGVuYW1lKSArICciLCBsaW5lICcgKyBzdHIobGluZW5vKSArICdcclxyJyArIGxpbmVbOmNoYXJub10gKyAiXHhhNSIgKyBsaW5lW2NoYXJubzotMV0KLQkJZWxzZToKLQkJCXRleHQgPSBzdHIodmFsdWUpICsgJ1xyRmlsZTogIicgKyBzdHIoZmlsZW5hbWUpICsgJyInCi0JCXNlbGYuc3ludGF4ZGlhbG9nID0gVy5Nb2RhbERpYWxvZygoMzYwLCAxMjApLCAiU3ludGF4IEVycm9yIikKLQkJc2VsZi5zeW50YXhkaWFsb2cudGV4dCA9IFcuVGV4dEJveCgoMTAsIDEwLCAtMTAsIC00MCksIHRleHQpCi0JCXNlbGYuc3ludGF4ZGlhbG9nLmNhbmNlbCA9IFcuQnV0dG9uKCgtMTkwLCAtMzIsIDgwLCAxNiksICJDYW5jZWwiLCBzZWxmLnN5bnRheGNsb3NlKQotCQlzZWxmLnN5bnRheGRpYWxvZy5lZGl0ID0gVy5CdXR0b24oKC0xMDAsIC0zMiwgODAsIDE2KSwgIkVkaXQiLCBzZWxmLnN5bnRheGVkaXQpCi0JCXNlbGYuc3ludGF4ZGlhbG9nLnNldGRlZmF1bHRidXR0b24oc2VsZi5zeW50YXhkaWFsb2cuZWRpdCkKLQkJc2VsZi5zeW50YXhkaWFsb2cuYmluZCgiY21kLiIsIHNlbGYuc3ludGF4ZGlhbG9nLmNhbmNlbC5wdXNoKQotCQlzZWxmLnN5bnRheGRpYWxvZy5vcGVuKCkKLQkKLQlkZWYgc3ludGF4Y2xvc2Uoc2VsZik6Ci0JCXNlbGYuc3ludGF4ZGlhbG9nLmNsb3NlKCkKLQkJZGVsIHNlbGYuc3ludGF4ZGlhbG9nCi0JCi0JZGVmIHN5bnRheGVkaXQoc2VsZik6Ci0JCXRyeToKLQkJCXZhbHVlLCAoZmlsZW5hbWUsIGxpbmVubywgY2hhcm5vLCBsaW5lKSA9IHNlbGYudmFsdWUKLQkJZXhjZXB0OgotCQkJZmlsZW5hbWUgPSAiIgotCQkJbGluZW5vID0gTm9uZQotCQlpZiBub3QgZmlsZW5hbWUgYW5kIHNlbGYubGFzdHdpbmRvd3RpdGxlOgotCQkJZmlsZW5hbWUgPSBzZWxmLmxhc3R3aW5kb3d0aXRsZQotCQllbGlmIG5vdCBmaWxlbmFtZToKLQkJCWZpbGVuYW1lID0gIjx1bmtub3duPiIKLQkJc2VsZi5zeW50YXhjbG9zZSgpCi0JCWlmIGxpbmVubzoKLQkJCWlmIGNoYXJubyBpcyBOb25lOgotCQkJCWNoYXJubyA9IDEKLQkJCVcuZ2V0YXBwbGljYXRpb24oKS5vcGVuc2NyaXB0KGZpbGVuYW1lLCBsaW5lbm8sIGNoYXJubyAtIDEpCi0JCWVsc2U6Ci0JCQlXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChmaWxlbmFtZSkKLQkKLQlkZWYgc2hvdyhzZWxmKToKLQkJaWYgc2VsZi5jbG9zZWQ6Ci0JCQlzZWxmLnNldHVwd2lkZ2V0cygpCi0JCQlzZWxmLncub3BlbigpCi0JCWVsc2U6Ci0JCQlzZWxmLncud2lkLlNob3dXaW5kb3coKQotCQkJc2VsZi53LndpZC5TZWxlY3RXaW5kb3coKQotCQotCWRlZiBoaWRlKHNlbGYpOgotCQlpZiBzZWxmLmNsb3NlZDoKLQkJCXJldHVybgotCQlzZWxmLncuY2xvc2UoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5ib3VuZHMgPSBzZWxmLncuZ2V0Ym91bmRzKCkKLQkJc2VsZi5jbG9zZWQgPSAxCi0JCXNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YiA9IE5vbmUsIE5vbmUsIE5vbmUKLQkJc2VsZi50Ymxpc3QgPSBOb25lCi0JCi0JZGVmIGFjdGl2YXRlKHNlbGYsIG9ub2ZmKToKLQkJaWYgb25vZmY6Ci0JCQlpZiBzZWxmLmNsb3NlZDoKLQkJCQlzZWxmLnRyYWNlYmFjaygpCi0JCQlzZWxmLmNsb3NlZCA9IDAKLQkJCXNlbGYuY2hlY2tidXR0b25zKCkKLQkKLQlkZWYgc2V0dXB3aWRnZXRzKHNlbGYpOgotCQlzZWxmLncgPSBXLldpbmRvdyhzZWxmLmJvdW5kcywgc2VsZi50aXRsZSwgbWluc2l6ZSA9ICgzMTYsIDE2OCkpCi0JCXNlbGYudy50ZXh0ID0gVy5UZXh0Qm94KCgxMCwgMTAsIC0xMCwgMzApKQotCQlzZWxmLncudGJ0aXRsZSA9IFcuVGV4dEJveCgoMTAsIDQwLCAtMTAsIDEwKSwgIlRyYWNlYmFjayAoaW5uZXJtb3N0IGxhc3QpOiIpCi0JCXNlbGYudy5saXN0ID0gVy5Ud29MaW5lTGlzdCgoMTAsIDYwLCAtMTAsIC00MCksIGNhbGxiYWNrID0gc2VsZi5saXN0aGl0KQotCQkKLQkJc2VsZi53LmVkaXRidXR0b24gPSBXLkJ1dHRvbigoMTAsIC0zMCwgNjAsIDE2KSwgIkVkaXQiLCBzZWxmLmVkaXQpCi0JCXNlbGYudy5lZGl0YnV0dG9uLmVuYWJsZSgwKQotCQkKLQkJc2VsZi53LmJyb3dzZWxvY2Fsc2J1dHRvbiA9IFcuQnV0dG9uKCg4MCwgLTMwLCAxMDAsIDE2KSwgIkJyb3dzZSBsb2NhbHNceGM5Iiwgc2VsZi5icm93c2Vsb2NhbHMpCi0JCXNlbGYudy5icm93c2Vsb2NhbHNidXR0b24uZW5hYmxlKDApCi0JCQotCQlzZWxmLncucG9zdG1vcnRlbWJ1dHRvbiA9IFcuQnV0dG9uKCgxOTAsIC0zMCwgMTAwLCAxNiksICJQb3N0IG1vcnRlbVx4YzkiLCBzZWxmLnBvc3Rtb3J0ZW0pCi0JCQotCQlzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLncuZWRpdGJ1dHRvbikKLQkJc2VsZi53LmJpbmQoImNtZGIiLCBzZWxmLncuYnJvd3NlbG9jYWxzYnV0dG9uLnB1c2gpCi0JCXNlbGYudy5iaW5kKCI8Y2xvc2U+Iiwgc2VsZi5jbG9zZSkKLQkJc2VsZi53LmJpbmQoIjxhY3RpdmF0ZT4iLCBzZWxmLmFjdGl2YXRlKQotCQotCWRlZiBidWlsZHRibGlzdChzZWxmKToKLQkJdGIgPSBzZWxmLnRiCi0JCWZvciBpIGluIHJhbmdlKHNlbGYuc3RhcnQpOgotCQkJaWYgdGIudGJfbmV4dCBpcyBOb25lOgotCQkJCWJyZWFrCi0JCQl0YiA9IHRiLnRiX25leHQKLQkJc2VsZi50Ymxpc3QgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YikKLQkJc2VsZi50ZXh0bGlzdCA9IFtdCi0JCWZvciBmaWxlbmFtZSwgbGluZW5vLCBmdW5jLCBsaW5lIGluIHNlbGYudGJsaXN0OgotCQkJdGJsaW5lID0gIiIKLQkJCWlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKLQkJCQlmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpWzFdCi0JCQl0YmxpbmUgPSAnRmlsZSAiJXMiLCBsaW5lICVyLCBpbiAlcicgJSAoZmlsZW5hbWUsIGxpbmVubywgZnVuYykKLQkJCWlmIGxpbmU6Ci0JCQkJdGJsaW5lID0gdGJsaW5lICsgJ1xyICAgICAgJyArIGxpbmUKLQkJCXNlbGYudGV4dGxpc3QuYXBwZW5kKHRibGluZVs6MjU1XSkKLQkKLQlkZWYgZWRpdChzZWxmKToKLQkJc2VsID0gc2VsZi53Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKLQkJZm9yIGkgaW4gc2VsOgotCQkJZmlsZW5hbWUsIGxpbmVubywgZnVuYywgbGluZSA9IHNlbGYudGJsaXN0W2ldCi0JCQlXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChmaWxlbmFtZSwgbGluZW5vKQotCQotCWRlZiBicm93c2Vsb2NhbHMoc2VsZik6Ci0JCXNlbCA9IHNlbGYudy5saXN0LmdldHNlbGVjdGlvbigpCi0JCWZvciBpIGluIHNlbDoKLQkJCXRiID0gc2VsZi50YgotCQkJZm9yIGogaW4gcmFuZ2UoaSArIHNlbGYuc3RhcnQpOgotCQkJCXRiID0gdGIudGJfbmV4dAotCQkJc2VsZi5icm93c2UodGIudGJfZnJhbWUuZl9sb2NhbHMpCi0JCi0JZGVmIGJyb3dzZShzZWxmLCBvYmplY3QpOgotCQlpbXBvcnQgUHlCcm93c2VyCi0JCVB5QnJvd3Nlci5Ccm93c2VyKG9iamVjdCkKLQkKLQlkZWYgcG9zdG1vcnRlbShzZWxmKToKLQkJaW1wb3J0IFB5RGVidWdnZXIKLQkJUHlEZWJ1Z2dlci5wb3N0bW9ydGVtKHNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YikKLQkKLQlkZWYgbGlzdGhpdChzZWxmLCBpc2RibCk6Ci0JCWlmIGlzZGJsOgotCQkJc2VsZi53LmVkaXRidXR0b24ucHVzaCgpCi0JCWVsc2U6Ci0JCQlzZWxmLmNoZWNrYnV0dG9ucygpCi0JCi0JZGVmIGNoZWNrYnV0dG9ucyhzZWxmKToKLQkJaGF2ZWZpbGUgPSBsZW4oc2VsZi53Lmxpc3QuZ2V0c2VsZWN0aW9uKCkpID4gMAotCQlzZWxmLncuZWRpdGJ1dHRvbi5lbmFibGUoaGF2ZWZpbGUpCi0JCXNlbGYudy5icm93c2Vsb2NhbHNidXR0b24uZW5hYmxlKGhhdmVmaWxlKQotCQlzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihoYXZlZmlsZSBhbmQgc2VsZi53LmVkaXRidXR0b24gb3Igc2VsZi53LnBvc3Rtb3J0ZW1idXR0b24pCiAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGl0bGUgPSAiVHJhY2ViYWNrIik6CisgICAgICAgIGFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKSAgIyBjaGVja3MgaWYgVyBpcyBwcm9wZXJseSBpbml0aWFsaXplZAorICAgICAgICBzZWxmLnRpdGxlID0gdGl0bGUKKyAgICAgICAgc2VsZi53ID0gTm9uZQorICAgICAgICBzZWxmLmNsb3NlZCA9IDEKKyAgICAgICAgc2VsZi5zdGFydCA9IDAKKyAgICAgICAgc2VsZi5sYXN0d2luZG93dGl0bGUgPSAiIgorICAgICAgICBzZWxmLmJvdW5kcyA9ICgzNjAsIDI5OCkKKworICAgIGRlZiB0cmFjZWJhY2soc2VsZiwgc3RhcnQgPSAwLCBsYXN0d2luZG93dGl0bGUgPSAiIik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYubGFzdHdpbmRvd3RpdGxlID0gbGFzdHdpbmRvd3RpdGxlCisgICAgICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKKyAgICAgICAgICAgIHNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBpZiBzZWxmLnR5cGUgaXMgbm90IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuc2hvdygpCisgICAgICAgICAgICAgICAgaWYgdHlwZShzZWxmLnR5cGUpID09IHR5cGVzLkNsYXNzVHlwZToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3J0ZXh0ID0gc2VsZi50eXBlLl9fbmFtZV9fCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3J0ZXh0ID0gc3RyKHNlbGYudHlwZSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cihzZWxmLnZhbHVlKQorICAgICAgICAgICAgICAgIGlmIHNlbGYudmFsdWUgYW5kIHZhbHVlOgorICAgICAgICAgICAgICAgICAgICBlcnJvcnRleHQgPSBlcnJvcnRleHQgKyAiOiAiICsgdmFsdWUKKyAgICAgICAgICAgICAgICBzZWxmLncudGV4dC5zZXQoZXJyb3J0ZXh0KQorICAgICAgICAgICAgICAgIHNlbGYuYnVpbGR0Ymxpc3QoKQorICAgICAgICAgICAgICAgIHNlbGYudy5saXN0LnNldChzZWxmLnRleHRsaXN0KQorICAgICAgICAgICAgICAgIHNlbGYudy5saXN0LnNldHNlbGVjdGlvbihbbGVuKHNlbGYudGV4dGxpc3QpIC0gMV0pCisgICAgICAgICAgICAgICAgc2VsZi53LndpZC5TZWxlY3RXaW5kb3coKQorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheGVycm9yKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisKKyAgICBkZWYgc3ludGF4ZXJyb3Ioc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlLCAoZmlsZW5hbWUsIGxpbmVubywgY2hhcm5vLCBsaW5lKSA9IHNlbGYudmFsdWUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZmlsZW5hbWUgPSAiIgorICAgICAgICAgICAgbGluZW5vID0gTm9uZQorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLnZhbHVlCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZSBhbmQgc2VsZi5sYXN0d2luZG93dGl0bGU6CisgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYubGFzdHdpbmRvd3RpdGxlCisgICAgICAgIGVsaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSAiPHVua25vd24+IgorICAgICAgICBpZiBmaWxlbmFtZSBhbmQgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXQorICAgICAgICBpZiBsaW5lbm8gYW5kIGNoYXJubyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNoYXJubyA9IGNoYXJubyAtIDEKKyAgICAgICAgICAgIHRleHQgPSBzdHIodmFsdWUpICsgJ1xyRmlsZTogIicgKyBzdHIoZmlsZW5hbWUpICsgJyIsIGxpbmUgJyArIHN0cihsaW5lbm8pICsgJ1xyXHInICsgbGluZVs6Y2hhcm5vXSArICJceGE1IiArIGxpbmVbY2hhcm5vOi0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGV4dCA9IHN0cih2YWx1ZSkgKyAnXHJGaWxlOiAiJyArIHN0cihmaWxlbmFtZSkgKyAnIicKKyAgICAgICAgc2VsZi5zeW50YXhkaWFsb2cgPSBXLk1vZGFsRGlhbG9nKCgzNjAsIDEyMCksICJTeW50YXggRXJyb3IiKQorICAgICAgICBzZWxmLnN5bnRheGRpYWxvZy50ZXh0ID0gVy5UZXh0Qm94KCgxMCwgMTAsIC0xMCwgLTQwKSwgdGV4dCkKKyAgICAgICAgc2VsZi5zeW50YXhkaWFsb2cuY2FuY2VsID0gVy5CdXR0b24oKC0xOTAsIC0zMiwgODAsIDE2KSwgIkNhbmNlbCIsIHNlbGYuc3ludGF4Y2xvc2UpCisgICAgICAgIHNlbGYuc3ludGF4ZGlhbG9nLmVkaXQgPSBXLkJ1dHRvbigoLTEwMCwgLTMyLCA4MCwgMTYpLCAiRWRpdCIsIHNlbGYuc3ludGF4ZWRpdCkKKyAgICAgICAgc2VsZi5zeW50YXhkaWFsb2cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLnN5bnRheGRpYWxvZy5lZGl0KQorICAgICAgICBzZWxmLnN5bnRheGRpYWxvZy5iaW5kKCJjbWQuIiwgc2VsZi5zeW50YXhkaWFsb2cuY2FuY2VsLnB1c2gpCisgICAgICAgIHNlbGYuc3ludGF4ZGlhbG9nLm9wZW4oKQorCisgICAgZGVmIHN5bnRheGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnN5bnRheGRpYWxvZy5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLnN5bnRheGRpYWxvZworCisgICAgZGVmIHN5bnRheGVkaXQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlLCAoZmlsZW5hbWUsIGxpbmVubywgY2hhcm5vLCBsaW5lKSA9IHNlbGYudmFsdWUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZmlsZW5hbWUgPSAiIgorICAgICAgICAgICAgbGluZW5vID0gTm9uZQorICAgICAgICBpZiBub3QgZmlsZW5hbWUgYW5kIHNlbGYubGFzdHdpbmRvd3RpdGxlOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmxhc3R3aW5kb3d0aXRsZQorICAgICAgICBlbGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gIjx1bmtub3duPiIKKyAgICAgICAgc2VsZi5zeW50YXhjbG9zZSgpCisgICAgICAgIGlmIGxpbmVubzoKKyAgICAgICAgICAgIGlmIGNoYXJubyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNoYXJubyA9IDEKKyAgICAgICAgICAgIFcuZ2V0YXBwbGljYXRpb24oKS5vcGVuc2NyaXB0KGZpbGVuYW1lLCBsaW5lbm8sIGNoYXJubyAtIDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChmaWxlbmFtZSkKKworICAgIGRlZiBzaG93KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuc2V0dXB3aWRnZXRzKCkKKyAgICAgICAgICAgIHNlbGYudy5vcGVuKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudy53aWQuU2hvd1dpbmRvdygpCisgICAgICAgICAgICBzZWxmLncud2lkLlNlbGVjdFdpbmRvdygpCisKKyAgICBkZWYgaGlkZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi53LmNsb3NlKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5ib3VuZHMgPSBzZWxmLncuZ2V0Ym91bmRzKCkKKyAgICAgICAgc2VsZi5jbG9zZWQgPSAxCisgICAgICAgIHNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YiA9IE5vbmUsIE5vbmUsIE5vbmUKKyAgICAgICAgc2VsZi50Ymxpc3QgPSBOb25lCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgICAgIHNlbGYudHJhY2ViYWNrKCkKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gMAorICAgICAgICAgICAgc2VsZi5jaGVja2J1dHRvbnMoKQorCisgICAgZGVmIHNldHVwd2lkZ2V0cyhzZWxmKToKKyAgICAgICAgc2VsZi53ID0gVy5XaW5kb3coc2VsZi5ib3VuZHMsIHNlbGYudGl0bGUsIG1pbnNpemUgPSAoMzE2LCAxNjgpKQorICAgICAgICBzZWxmLncudGV4dCA9IFcuVGV4dEJveCgoMTAsIDEwLCAtMTAsIDMwKSkKKyAgICAgICAgc2VsZi53LnRidGl0bGUgPSBXLlRleHRCb3goKDEwLCA0MCwgLTEwLCAxMCksICJUcmFjZWJhY2sgKGlubmVybW9zdCBsYXN0KToiKQorICAgICAgICBzZWxmLncubGlzdCA9IFcuVHdvTGluZUxpc3QoKDEwLCA2MCwgLTEwLCAtNDApLCBjYWxsYmFjayA9IHNlbGYubGlzdGhpdCkKKworICAgICAgICBzZWxmLncuZWRpdGJ1dHRvbiA9IFcuQnV0dG9uKCgxMCwgLTMwLCA2MCwgMTYpLCAiRWRpdCIsIHNlbGYuZWRpdCkKKyAgICAgICAgc2VsZi53LmVkaXRidXR0b24uZW5hYmxlKDApCisKKyAgICAgICAgc2VsZi53LmJyb3dzZWxvY2Fsc2J1dHRvbiA9IFcuQnV0dG9uKCg4MCwgLTMwLCAxMDAsIDE2KSwgIkJyb3dzZSBsb2NhbHNceGM5Iiwgc2VsZi5icm93c2Vsb2NhbHMpCisgICAgICAgIHNlbGYudy5icm93c2Vsb2NhbHNidXR0b24uZW5hYmxlKDApCisKKyAgICAgICAgc2VsZi53LnBvc3Rtb3J0ZW1idXR0b24gPSBXLkJ1dHRvbigoMTkwLCAtMzAsIDEwMCwgMTYpLCAiUG9zdCBtb3J0ZW1ceGM5Iiwgc2VsZi5wb3N0bW9ydGVtKQorCisgICAgICAgIHNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5lZGl0YnV0dG9uKQorICAgICAgICBzZWxmLncuYmluZCgiY21kYiIsIHNlbGYudy5icm93c2Vsb2NhbHNidXR0b24ucHVzaCkKKyAgICAgICAgc2VsZi53LmJpbmQoIjxjbG9zZT4iLCBzZWxmLmNsb3NlKQorICAgICAgICBzZWxmLncuYmluZCgiPGFjdGl2YXRlPiIsIHNlbGYuYWN0aXZhdGUpCisKKyAgICBkZWYgYnVpbGR0Ymxpc3Qoc2VsZik6CisgICAgICAgIHRiID0gc2VsZi50YgorICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLnN0YXJ0KToKKyAgICAgICAgICAgIGlmIHRiLnRiX25leHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisgICAgICAgIHNlbGYudGJsaXN0ID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIpCisgICAgICAgIHNlbGYudGV4dGxpc3QgPSBbXQorICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVubywgZnVuYywgbGluZSBpbiBzZWxmLnRibGlzdDoKKyAgICAgICAgICAgIHRibGluZSA9ICIiCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXQorICAgICAgICAgICAgdGJsaW5lID0gJ0ZpbGUgIiVzIiwgbGluZSAlciwgaW4gJXInICUgKGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmMpCisgICAgICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgICAgIHRibGluZSA9IHRibGluZSArICdcciAgICAgICcgKyBsaW5lCisgICAgICAgICAgICBzZWxmLnRleHRsaXN0LmFwcGVuZCh0YmxpbmVbOjI1NV0pCisKKyAgICBkZWYgZWRpdChzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi53Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVubywgZnVuYywgbGluZSA9IHNlbGYudGJsaXN0W2ldCisgICAgICAgICAgICBXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChmaWxlbmFtZSwgbGluZW5vKQorCisgICAgZGVmIGJyb3dzZWxvY2FscyhzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi53Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgdGIgPSBzZWxmLnRiCisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpICsgc2VsZi5zdGFydCk6CisgICAgICAgICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisgICAgICAgICAgICBzZWxmLmJyb3dzZSh0Yi50Yl9mcmFtZS5mX2xvY2FscykKKworICAgIGRlZiBicm93c2Uoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgaW1wb3J0IFB5QnJvd3NlcgorICAgICAgICBQeUJyb3dzZXIuQnJvd3NlcihvYmplY3QpCisKKyAgICBkZWYgcG9zdG1vcnRlbShzZWxmKToKKyAgICAgICAgaW1wb3J0IFB5RGVidWdnZXIKKyAgICAgICAgUHlEZWJ1Z2dlci5wb3N0bW9ydGVtKHNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YikKKworICAgIGRlZiBsaXN0aGl0KHNlbGYsIGlzZGJsKToKKyAgICAgICAgaWYgaXNkYmw6CisgICAgICAgICAgICBzZWxmLncuZWRpdGJ1dHRvbi5wdXNoKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tidXR0b25zKCkKKworICAgIGRlZiBjaGVja2J1dHRvbnMoc2VsZik6CisgICAgICAgIGhhdmVmaWxlID0gbGVuKHNlbGYudy5saXN0LmdldHNlbGVjdGlvbigpKSA+IDAKKyAgICAgICAgc2VsZi53LmVkaXRidXR0b24uZW5hYmxlKGhhdmVmaWxlKQorICAgICAgICBzZWxmLncuYnJvd3NlbG9jYWxzYnV0dG9uLmVuYWJsZShoYXZlZmlsZSkKKyAgICAgICAgc2VsZi53LnNldGRlZmF1bHRidXR0b24oaGF2ZWZpbGUgYW5kIHNlbGYudy5lZGl0YnV0dG9uIG9yIHNlbGYudy5wb3N0bW9ydGVtYnV0dG9uKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9Xd2luZG93cy5weSBiL01hYy9Ub29scy9JREUvV3dpbmRvd3MucHkKaW5kZXggZDY0NmJjZi4uY2I4ZDg1NSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9Xd2luZG93cy5weQorKysgYi9NYWMvVG9vbHMvSURFL1d3aW5kb3dzLnB5CkBAIC04LDYyOSArOCw2MjkgQEAKIGZyb20gdHlwZXMgaW1wb3J0IEluc3RhbmNlVHlwZSwgU3RyaW5nVHlwZQogCiBpZiBoYXNhdHRyKFdpbiwgIkZyb250Tm9uRmxvYXRpbmdXaW5kb3ciKToKLQlNeUZyb250V2luZG93ID0gV2luLkZyb250Tm9uRmxvYXRpbmdXaW5kb3cKKyAgICBNeUZyb250V2luZG93ID0gV2luLkZyb250Tm9uRmxvYXRpbmdXaW5kb3cKIGVsc2U6Ci0JTXlGcm9udFdpbmRvdyA9IFdpbi5Gcm9udFdpbmRvdworICAgIE15RnJvbnRXaW5kb3cgPSBXaW4uRnJvbnRXaW5kb3cKIAogCiBjbGFzcyBXaW5kb3coRnJhbWVXb3JrLldpbmRvdywgV2Jhc2UuU2VsZWN0YWJsZVdpZGdldCk6Ci0JCi0Jd2luZG93a2luZCA9IFdpbmRvd3MuZG9jdW1lbnRQcm9jCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlPSIiLCBtaW5zaXplPU5vbmUsIG1heHNpemU9Tm9uZSwgCi0JCQl0YWJiYWJsZT0xLCBzaG93PTEsIGZvbnRzZXR0aW5ncz1Ob25lKToKLQkJaW1wb3J0IFcKLQkJaWYgZm9udHNldHRpbmdzIGlzIE5vbmU6Ci0JCQlmb250c2V0dGluZ3MgPSBXLmdldGRlZmF1bHRmb250KCkKLQkJc2VsZi5fZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCi0JCVcuU2VsZWN0YWJsZVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQotCQlzZWxmLl9nbG9iYWxib3VuZHMgPSBsLCB0LCByLCBiID0gc2VsZi5nZXR3aW5kb3dib3VuZHMocG9zc2l6ZSwgbWluc2l6ZSkKLQkJc2VsZi5fYm91bmRzID0gKDAsIDAsIHIgLSBsLCBiIC0gdCkKLQkJc2VsZi5fdGFiY2hhaW4gPSBbXQotCQlzZWxmLl9jdXJyZW50d2lkZ2V0ID0gTm9uZQotCQlzZWxmLnRpdGxlID0gdGl0bGUKLQkJc2VsZi5fcGFyZW50d2luZG93ID0gc2VsZgotCQlzZWxmLl90YWJiYWJsZSA9IHRhYmJhYmxlCi0JCXNlbGYuX2RlZmF1bHRidXR0b24gPSBOb25lCi0JCXNlbGYuX2RyYXd3aWRnZXRib3VuZHMgPSAwCi0JCXNlbGYuX3Nob3cgPSBzaG93Ci0JCXNlbGYuX2xhc3Ryb2xsb3ZlciA9IE5vbmUKLQkJc2VsZi5oYXNjbG9zZWJveCA9IDEKLQkJIyBYWFggdGhlIGZvbGxvd2luZyBpcyBub3QgcmVhbGx5IGNvbXBhdGlibGUgd2l0aCB0aGUKLQkJIyAgbmV3IChzeXN0ZW0gPj0gNy41KSB3aW5kb3cgcHJvY3MuIAotCQlpZiBtaW5zaXplOgotCQkJc2VsZi5faGFzZ3Jvd2JveCA9IDEKLQkJCXNlbGYud2luZG93a2luZCA9IHNlbGYud2luZG93a2luZCB8IDgKLQkJCWwsIHQgPSBtaW5zaXplCi0JCQlpZiBtYXhzaXplOgotCQkJCXIsIGIgPSBtYXhzaXplWzBdICsgMSwgbWF4c2l6ZVsxXSArIDEKLQkJCWVsc2U6Ci0JCQkJciwgYiA9IDMyMDAwLCAzMjAwMAotCQkJc2VsZi5ncm93bGltaXQgPSAobCwgdCwgciwgYikKLQkJZWxzZToKLQkJCXNlbGYuX2hhc2dyb3dib3ggPSAwCi0JCQlpZiAoc2VsZi53aW5kb3draW5kID09IDAgb3Igc2VsZi53aW5kb3draW5kID49IDgpIGFuZCBzZWxmLndpbmRvd2tpbmQgPCAxMDAwOgotCQkJCXNlbGYud2luZG93a2luZCA9IHNlbGYud2luZG93a2luZCB8IDQKLQkJRnJhbWVXb3JrLldpbmRvdy5fX2luaXRfXyhzZWxmLCBXLmdldGFwcGxpY2F0aW9uKCkpCi0JCi0JZGVmIGdldHRpdGxlKHNlbGYpOgotCQlyZXR1cm4gc2VsZi50aXRsZQotCQotCWRlZiBzZXR0aXRsZShzZWxmLCB0aXRsZSk6Ci0JCXNlbGYudGl0bGUgPSB0aXRsZQotCQlpZiBzZWxmLndpZDoKLQkJCXNlbGYud2lkLlNldFdUaXRsZSh0aXRsZSkKLQkKLQlkZWYgZ2V0d2luZG93Ym91bmRzKHNlbGYsIHNpemUsIG1pbnNpemUgPSBOb25lKToKLQkJcmV0dXJuIHdpbmRvd2JvdW5kcyhzaXplLCBtaW5zaXplKQkKLQkKLQlkZWYgZ2V0Y3VycmVudHdpZGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYuX2N1cnJlbnR3aWRnZXQKLQkKLQlkZWYgc2hvdyhzZWxmLCBvbm9mZik6Ci0JCWlmIG9ub2ZmOgotCQkJc2VsZi53aWQuU2hvd1dpbmRvdygpCi0JCWVsc2U6Ci0JCQlzZWxmLndpZC5IaWRlV2luZG93KCkKLQkKLQlkZWYgaXN2aXNpYmxlKHNlbGYpOgotCQlyZXR1cm4gc2VsZi53aWQuSXNXaW5kb3dWaXNpYmxlKCkKLQkKLQlkZWYgc2VsZWN0KHNlbGYpOgotCQlzZWxmLndpZC5TZWxlY3RXaW5kb3coKQotCQkjIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UsIEkgbmVlZCBpdCB3aGVuCi0JCSMgYW4gZWRpdG9yIGdldHMgc2VsZWN0ZWQsIGFuZCBpbW1lZGlhdGVseSBzY3JvbGxlZAotCQkjIHRvIGEgY2VydGFpbiBsaW5lLCB3YXN0ZSBzY3JvbGwgYXNzdW1lcyBldmVyeXRoaW5nIAotCQkjIHRvIGJlIGluIHRhY3QuCi0JCXNlbGYuZG9fcmF3dXBkYXRlKHNlbGYud2lkLCAiRHVtbXlFdmVudCIpCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYud2lkID0gV2luLk5ld0NXaW5kb3coc2VsZi5fZ2xvYmFsYm91bmRzLCBzZWxmLnRpdGxlLCBzZWxmLl9zaG93LAotCQkJc2VsZi53aW5kb3draW5kLCAtMSwgc2VsZi5oYXNjbG9zZWJveCwgMCkKLQkJc2VsZi5TZXRQb3J0KCkKLQkJZm9udG5hbWUsIGZvbnRzdHlsZSwgZm9udHNpemUsIGZvbnRjb2xvciA9IHNlbGYuX2ZvbnRzZXR0aW5ncwotCQlmbnVtID0gRm0uR2V0Rk51bShmb250bmFtZSkKLQkJaWYgZm51bSA9PSAwOgotCQkJZm51bSA9IEZtLkdldEZOdW0oIkdlbmV2YSIpCi0JCVFkLlRleHRGb250KGZudW0pCi0JCVFkLlRleHRGYWNlKGZvbnRzdHlsZSkKLQkJUWQuVGV4dFNpemUoZm9udHNpemUpCi0JCWlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjxvcGVuPiIpOgotCQkJY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1siPG9wZW4+Il0KLQkJCWNhbGxiYWNrKCkKLQkJZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCXcuZm9yYWxsX2Zyb21ib3R0b20oIm9wZW4iKQotCQlzZWxmLl9tYWtldGFiY2hhaW4oKQotCQlpZiBzZWxmLl90YWJiYWJsZToKLQkJCXNlbGYuYmluZCgndGFiJywgc2VsZi5uZXh0d2lkZ2V0KQotCQkJc2VsZi5iaW5kKCdzaGlmdHRhYicsIHNlbGYucHJldmlvdXN3aWRnZXQpCi0JCWVsc2U6Ci0JCQlzZWxmLl9oYXNzZWxmcmFtZXMgPSAwCi0JCWlmIHNlbGYuX3RhYmNoYWluOgotCQkJc2VsZi5fdGFiY2hhaW5bMF0uc2VsZWN0KDEpCi0JCXNlbGYuZG9fcG9zdG9wZW4oKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgbm90IHNlbGYud2lkOgotCQkJcmV0dXJuCSMgd2UgYXJlIGFscmVhZHkgY2xvc2VkCi0JCWlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjxjbG9zZT4iKToKLQkJCWNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxjbG9zZT4iXQotCQkJdHJ5OgotCQkJCXJ2ID0gY2FsbGJhY2soKQotCQkJZXhjZXB0OgotCQkJCXByaW50ICdlcnJvciBpbiA8Y2xvc2U+IGNhbGxiYWNrJwotCQkJCXRyYWNlYmFjay5wcmludF9leGMoKQotCQkJZWxzZToKLQkJCQlpZiBydjoKLQkJCQkJcmV0dXJuIHJ2Ci0JCSNmb3Iga2V5IGluIHNlbGYuX3dpZGdldHNkaWN0LmtleXMoKToKLQkJIwlzZWxmLl9yZW1vdmV3aWRnZXQoa2V5KQotCQlzZWxmLmZvcmFsbF9idXRzZWxmKCJjbG9zZSIpCi0JCVdiYXNlLlNlbGVjdGFibGVXaWRnZXQuY2xvc2Uoc2VsZikKLQkJc2VsZi5fdGFiY2hhaW4gPSBbXQotCQlzZWxmLl9jdXJyZW50d2lkZ2V0ID0gTm9uZQotCQlzZWxmLndpZC5IaWRlV2luZG93KCkKLQkJc2VsZi5kb19wb3N0Y2xvc2UoKQotCQotCWRlZiBkb21lbnVfY2xvc2Uoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLmNsb3NlKCkKLQkKLQlkZWYgZ2V0Ym91bmRzKHNlbGYpOgotCQlyZXR1cm4gc2VsZi5fZ2xvYmFsYm91bmRzCi0JCi0JZGVmIHNldGJvdW5kcyhzZWxmLCBib3VuZHMpOgotCQlsLCB0LCByLCBiID0gYm91bmRzCi0JCXNlbGYubW92ZShsLCB0KQotCQlzZWxmLnJlc2l6ZShyLWwsIGItdCkKLQkKLQlkZWYgbW92ZShzZWxmLCB4LCB5ID0gTm9uZSk6Ci0JCSIiImFic29sdXRlIG1vdmUiIiIKLQkJaWYgeSA9PSBOb25lOgotCQkJeCwgeSA9IHgKLQkJc2VsZi53aWQuTW92ZVdpbmRvdyh4LCB5LCAwKQotCQotCWRlZiByZXNpemUoc2VsZiwgeCwgeSA9IE5vbmUpOgotCQlpZiBub3Qgc2VsZi5faGFzZ3Jvd2JveDoKLQkJCXJldHVybiAgIyBoYW5kcyBvZmYhCi0JCWlmIHkgPT0gTm9uZToKLQkJCXgsIHkgPSB4Ci0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuZ2V0Z3Jvd3JlY3QoKSkKLQkJc2VsZi53aWQuU2l6ZVdpbmRvdyh4LCB5LCAxKQotCQlzZWxmLl9jYWxjYm91bmRzKCkKLQkKLQlkZWYgdGVzdChzZWxmLCBwb2ludCk6Ci0JCXJldHVybiAxCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX2hhc2dyb3dib3g6Ci0JCQlzZWxmLnRlbXBjbGlwcmVjdChzZWxmLmdldGdyb3dyZWN0KCkpCi0JCQlzZWxmLndpZC5EcmF3R3Jvd0ljb24oKQotCQkJc2VsZi5yZXN0b3JlY2xpcCgpCi0JCi0JZGVmIGlkbGUoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLlNldFBvcnQoKQotCQlwb2ludCA9IEV2dC5HZXRNb3VzZSgpCi0JCXdpZGdldCA9IHNlbGYuZmluZHdpZGdldChwb2ludCwgMCkKLQkJaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGlkbGU+Iik6Ci0JCQljYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8aWRsZT4iXQotCQkJaWYgY2FsbGJhY2soKToKLQkJCQlyZXR1cm4KLQkJaWYgc2VsZi5fY3VycmVudHdpZGdldCBpcyBub3QgTm9uZSBhbmQgaGFzYXR0cihzZWxmLl9jdXJyZW50d2lkZ2V0LCAiaWRsZSIpOgotCQkJaWYgc2VsZi5fY3VycmVudHdpZGdldC5fYmluZGluZ3MuaGFzX2tleSgiPGlkbGU+Iik6Ci0JCQkJY2FsbGJhY2sgPSBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5nc1siPGlkbGU+Il0KLQkJCQlpZiBjYWxsYmFjaygpOgotCQkJCQlyZXR1cm4KLQkJCWlmIHNlbGYuX2N1cnJlbnR3aWRnZXQuaWRsZSgpOgotCQkJCXJldHVybgotCQlpZiB3aWRnZXQgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIod2lkZ2V0LCAicm9sbG92ZXIiKToKLQkJCWlmIDE6CSNzZWxmLl9sYXN0cm9sbG92ZXIgPD4gd2lkZ2V0OgotCQkJCWlmIHNlbGYuX2xhc3Ryb2xsb3ZlcjoKLQkJCQkJc2VsZi5fbGFzdHJvbGxvdmVyLnJvbGxvdmVyKHBvaW50LCAwKQotCQkJCXNlbGYuX2xhc3Ryb2xsb3ZlciA9IHdpZGdldAotCQkJCXNlbGYuX2xhc3Ryb2xsb3Zlci5yb2xsb3Zlcihwb2ludCwgMSkKLQkJZWxzZToKLQkJCWlmIHNlbGYuX2xhc3Ryb2xsb3ZlcjoKLQkJCQlzZWxmLl9sYXN0cm9sbG92ZXIucm9sbG92ZXIocG9pbnQsIDApCi0JCQlzZWxmLl9sYXN0cm9sbG92ZXIgPSBOb25lCi0JCQlXYmFzZS5TZXRDdXJzb3IoImFycm93IikKIAotCWRlZiB4eHhfX19zZWxlY3Qoc2VsZiwgd2lkZ2V0KToKLQkJaWYgc2VsZi5fY3VycmVudHdpZGdldCA9PSB3aWRnZXQ6Ci0JCQlyZXR1cm4KLQkJaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPHNlbGVjdD4iKToKLQkJCWNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxzZWxlY3Q+Il0KLQkJCWlmIGNhbGxiYWNrKHdpZGdldCk6Ci0JCQkJcmV0dXJuCi0JCWlmIHdpZGdldCBpcyBOb25lOgotCQkJaWYgc2VsZi5fY3VycmVudHdpZGdldCBpcyBub3QgTm9uZToKLQkJCQlzZWxmLl9jdXJyZW50d2lkZ2V0LnNlbGVjdCgwKQotCQllbGlmIHR5cGUod2lkZ2V0KSA9PSBJbnN0YW5jZVR5cGUgYW5kIHdpZGdldC5fc2VsZWN0YWJsZToKLQkJCXdpZGdldC5zZWxlY3QoMSkKLQkJZWxpZiB3aWRnZXQgPT0gLTEgb3Igd2lkZ2V0ID09IDE6Ci0JCQlpZiBsZW4oc2VsZi5fdGFiY2hhaW4pIDw9IDE6Ci0JCQkJcmV0dXJuCi0JCQl0ZW1wID0gc2VsZi5fdGFiY2hhaW5bKHNlbGYuX3RhYmNoYWluLmluZGV4KHNlbGYuX2N1cnJlbnR3aWRnZXQpICsgd2lkZ2V0KSAlIGxlbihzZWxmLl90YWJjaGFpbildCi0JCQl0ZW1wLnNlbGVjdCgxKQotCQllbHNlOgotCQkJcmFpc2UgVHlwZUVycm9yLCAiV2lkZ2V0IGlzIG5vdCBzZWxlY3RhYmxlIgotCQotCWRlZiBzZXRkZWZhdWx0YnV0dG9uKHNlbGYsIG5ld2RlZmF1bHRidXR0b24gPSBOb25lLCAqa2V5cyk6Ci0JCWlmIG5ld2RlZmF1bHRidXR0b24gPT0gc2VsZi5fZGVmYXVsdGJ1dHRvbjoKLQkJCXJldHVybgotCQlpZiBzZWxmLl9kZWZhdWx0YnV0dG9uOgotCQkJc2VsZi5fZGVmYXVsdGJ1dHRvbi5fc2V0ZGVmYXVsdCgwKQotCQlpZiBub3QgbmV3ZGVmYXVsdGJ1dHRvbjoKLQkJCXNlbGYuYmluZCgicmV0dXJuIiwgTm9uZSkKLQkJCXNlbGYuYmluZCgiZW50ZXIiLCBOb25lKQotCQkJcmV0dXJuCi0JCWltcG9ydCBXY29udHJvbHMKLQkJaWYgbm90IGlzaW5zdGFuY2UobmV3ZGVmYXVsdGJ1dHRvbiwgV2NvbnRyb2xzLkJ1dHRvbik6Ci0JCQlyYWlzZSBUeXBlRXJyb3IsICJ3aWRnZXQgaXMgbm90IGEgYnV0dG9uIgotCQlzZWxmLl9kZWZhdWx0YnV0dG9uID0gbmV3ZGVmYXVsdGJ1dHRvbgotCQlzZWxmLl9kZWZhdWx0YnV0dG9uLl9zZXRkZWZhdWx0KDEpCi0JCWlmIG5vdCBrZXlzOgotCQkJc2VsZi5iaW5kKCJyZXR1cm4iLCBzZWxmLl9kZWZhdWx0YnV0dG9uLnB1c2gpCi0JCQlzZWxmLmJpbmQoImVudGVyIiwgc2VsZi5fZGVmYXVsdGJ1dHRvbi5wdXNoKQotCQllbHNlOgotCQkJZm9yIGtleSBpbiBrZXlzOgotCQkJCXNlbGYuYmluZChrZXksIHNlbGYuX2RlZmF1bHRidXR0b24ucHVzaCkKLQkKLQlkZWYgbmV4dHdpZGdldChzZWxmKToKLQkJc2VsZi54eHhfX19zZWxlY3QoMSkKLQkKLQlkZWYgcHJldmlvdXN3aWRnZXQoc2VsZik6Ci0JCXNlbGYueHh4X19fc2VsZWN0KC0xKQotCQotCWRlZiBkcmF3d2lkZ2V0Ym91bmRzKHNlbGYsIG9ub2ZmKToKLQkJc2VsZi5fZHJhd3dpZGdldGJvdW5kcyA9IG9ub2ZmCi0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuX2JvdW5kcykKLQkKLQlkZWYgX2RyYXdib3VuZHMoc2VsZik6Ci0JCXBhc3MKKyAgICB3aW5kb3draW5kID0gV2luZG93cy5kb2N1bWVudFByb2MKIAotCWRlZiBfbWFrZXRhYmNoYWluKHNlbGYpOgotCQkjIFhYWCBUaGlzIGhhcyB0byBjaGFuZ2UsIGl0J3Mgbm8gZ29vZCB3aGVuIHdlIGFyZSBhZGRpbmcgb3IgZGVsZXRpbmcgd2lkZ2V0cy4KLQkJIyBYWFggUGVyaGFwcyB3ZSBzaG91bGRuJ3Qga2VlcCBhICJ0YWJjaGFpbiIgYXQgYWxsLgotCQlzZWxmLl9oYXNzZWxmcmFtZXMgPSAwCi0JCXNlbGYuX2NvbGxlY3RzZWxlY3RhYmxld2lkZ2V0cyhzZWxmLl93aWRnZXRzKQotCQlpZiBzZWxmLl9oYXNzZWxmcmFtZXMgYW5kIGxlbihzZWxmLl90YWJjaGFpbikgPiAxOgotCQkJc2VsZi5faGFzc2VsZnJhbWVzID0gMQotCQllbHNlOgotCQkJc2VsZi5faGFzc2VsZnJhbWVzID0gMAotCQotCWRlZiBfY29sbGVjdHNlbGVjdGFibGV3aWRnZXRzKHNlbGYsIHdpZGdldHMpOgotCQlpbXBvcnQgVwotCQlmb3IgdyBpbiB3aWRnZXRzOgotCQkJaWYgdy5fc2VsZWN0YWJsZToKLQkJCQlzZWxmLl90YWJjaGFpbi5hcHBlbmQodykKLQkJCQlpZiBpc2luc3RhbmNlKHcsIFcuTGlzdCk6Ci0JCQkJCXNlbGYuX2hhc3NlbGZyYW1lcyA9IDEKLQkJCXNlbGYuX2NvbGxlY3RzZWxlY3RhYmxld2lkZ2V0cyh3Ll93aWRnZXRzKQotCQotCWRlZiBfY2FsY2JvdW5kcyhzZWxmKToKLQkJc2VsZi5fcG9zc2l6ZSA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qm91bmRzKClbMjpdCi0JCXcsIGggPSBzZWxmLl9wb3NzaXplCi0JCXNlbGYuX2JvdW5kcyA9ICgwLCAwLCB3LCBoKQotCQlzZWxmLndpZC5HZXRXaW5kb3dDb250ZW50UmduKHNjcmF0Y2hSZWdpb24pCi0JCWwsIHQsIHIsIGIgPSBHZXRSZ25Cb3VuZHMoc2NyYXRjaFJlZ2lvbikKLQkJc2VsZi5fZ2xvYmFsYm91bmRzID0gbCwgdCwgbCArIHcsIHQgKyBoCi0JCWZvciB3IGluIHNlbGYuX3dpZGdldHM6Ci0JCQl3Ll9jYWxjYm91bmRzKCkKLQkKLQkjIEZyYW1lV29yayBvdmVycmlkZSBtZXRob2RzCi0JZGVmIGRvX2luRHJhZyhzZWxmLCBwYXJ0Y29kZSwgd2luZG93LCBldmVudCk6Ci0JCXdoZXJlID0gZXZlbnRbM10KLQkJc2VsZi53aWQuR2V0V2luZG93Q29udGVudFJnbihzY3JhdGNoUmVnaW9uKQotCQl3YXNfbCwgd2FzX3QsIHIsIGIgPSBHZXRSZ25Cb3VuZHMoc2NyYXRjaFJlZ2lvbikKLQkJd2luZG93LkRyYWdXaW5kb3cod2hlcmUsIHNlbGYuZHJhZ2xpbWl0KQotCQlzZWxmLndpZC5HZXRXaW5kb3dDb250ZW50UmduKHNjcmF0Y2hSZWdpb24pCi0JCWlzX2wsIGlzX3QsIHIsIGIgPSBHZXRSZ25Cb3VuZHMoc2NyYXRjaFJlZ2lvbikKLQkJc2VsZi5fZ2xvYmFsYm91bmRzID0gUWQuT2Zmc2V0UmVjdChzZWxmLl9nbG9iYWxib3VuZHMsIAotCQkJCQlpc19sIC0gd2FzX2wsIGlzX3QgLSB3YXNfdCkKLQkKLQlkZWYgZG9fY2hhcihzZWxmLCBjaGFyLCBldmVudCk6Ci0JCWltcG9ydCBXa2V5cwotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlrZXkgPSBjaGFyCi0JCWlmIFdrZXlzLmtleW5hbWVzLmhhc19rZXkoa2V5KToKLQkJCWtleSA9IFdrZXlzLmtleW5hbWVzW2tleV0KLQkJaWYgbW9kaWZpZXJzICYgRXZlbnRzLnNoaWZ0S2V5OgotCQkJa2V5ID0gJ3NoaWZ0JyArIGtleQotCQlpZiBtb2RpZmllcnMgJiBFdmVudHMuY21kS2V5OgotCQkJa2V5ID0gJ2NtZCcgKyBrZXkKLQkJaWYgbW9kaWZpZXJzICYgRXZlbnRzLmNvbnRyb2xLZXk6Ci0JCQlrZXkgPSAnY29udHJvbCcgKyBrZXkKLQkJaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGtleT4iKToKLQkJCWNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxrZXk+Il0KLQkJCWlmIFdiYXNlLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgY2hhciwgZXZlbnQpOgotCQkJCXJldHVybgotCQlpZiBzZWxmLl9iaW5kaW5ncy5oYXNfa2V5KGtleSk6Ci0JCQljYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzW2tleV0KLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgY2hhciwgZXZlbnQpCi0JCWVsaWYgc2VsZi5fY3VycmVudHdpZGdldCBpcyBub3QgTm9uZToKLQkJCWlmIHNlbGYuX2N1cnJlbnR3aWRnZXQuX2JpbmRpbmdzLmhhc19rZXkoa2V5KToKLQkJCQljYWxsYmFjayA9IHNlbGYuX2N1cnJlbnR3aWRnZXQuX2JpbmRpbmdzW2tleV0KLQkJCQlXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIGNoYXIsIGV2ZW50KQotCQkJZWxzZToKLQkJCQlpZiBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5ncy5oYXNfa2V5KCI8a2V5PiIpOgotCQkJCQljYWxsYmFjayA9IHNlbGYuX2N1cnJlbnR3aWRnZXQuX2JpbmRpbmdzWyI8a2V5PiJdCi0JCQkJCWlmIFdiYXNlLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgY2hhciwgZXZlbnQpOgotCQkJCQkJcmV0dXJuCi0JCQkJc2VsZi5fY3VycmVudHdpZGdldC5rZXkoY2hhciwgZXZlbnQpCi0JCi0JZGVmIGRvX2NvbnRlbnRjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzLCBldmVudCk6Ci0JCXdpZGdldCA9IHNlbGYuZmluZHdpZGdldChwb2ludCkKLQkJaWYgd2lkZ2V0IGlzIG5vdCBOb25lOgotCQkJaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGNsaWNrPiIpOgotCQkJCWNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxjbGljaz4iXQotCQkJCWlmIFdiYXNlLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCQkJCXJldHVybgotCQkJaWYgd2lkZ2V0Ll9iaW5kaW5ncy5oYXNfa2V5KCI8Y2xpY2s+Iik6Ci0JCQkJY2FsbGJhY2sgPSB3aWRnZXQuX2JpbmRpbmdzWyI8Y2xpY2s+Il0KLQkJCQlpZiBXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIHBvaW50LCBtb2RpZmllcnMpOgotCQkJCQlyZXR1cm4KLQkJCWlmIHdpZGdldC5fc2VsZWN0YWJsZToKLQkJCQl3aWRnZXQuc2VsZWN0KDEsIDEpCi0JCQl3aWRnZXQuY2xpY2socG9pbnQsIG1vZGlmaWVycykKLQkKLQlkZWYgZG9fdXBkYXRlKHNlbGYsIHdpbmRvdywgZXZlbnQpOgotCQlRZC5FcmFzZVJnbih3aW5kb3cuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKLQkJc2VsZi5mb3JhbGxfZnJvbWJvdHRvbSgiZHJhdyIsIHdpbmRvdy5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQotCQlpZiBzZWxmLl9kcmF3d2lkZ2V0Ym91bmRzOgotCQkJc2VsZi5mb3JhbGxfZnJvbWJvdHRvbSgiX2RyYXdib3VuZHMiKQotCQotCWRlZiBkb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZlbnQpOgotCQlpZiBub3Qgb25vZmY6Ci0JCQlpZiBzZWxmLl9sYXN0cm9sbG92ZXI6Ci0JCQkJc2VsZi5fbGFzdHJvbGxvdmVyLnJvbGxvdmVyKCgwLCAwKSwgMCkKLQkJCQlzZWxmLl9sYXN0cm9sbG92ZXIgPSBOb25lCi0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuZm9yYWxsKCJhY3RpdmF0ZSIsIG9ub2ZmKQotCQlzZWxmLmRyYXcoKQotCQotCWRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6Ci0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuZ2V0Z3Jvd3JlY3QoKSkKLQkJc2VsZi5fY2FsY2JvdW5kcygpCi0JCi0JZGVmIGRvX2luR29Bd2F5KHNlbGYsIHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KToKLQkJd2hlcmUgPSBldmVudFszXQotCQljbG9zZWFsbCA9IGV2ZW50WzRdICYgRXZlbnRzLm9wdGlvbktleQotCQlpZiB3aW5kb3cuVHJhY2tHb0F3YXkod2hlcmUpOgotCQkJaWYgbm90IGNsb3NlYWxsOgotCQkJCXNlbGYuY2xvc2UoKQotCQkJZWxzZToKLQkJCQlmb3Igd2luZG93IGluIHNlbGYucGFyZW50Ll93aW5kb3dzLnZhbHVlcygpOgotCQkJCQlydiA9IHdpbmRvdy5jbG9zZSgpCi0JCQkJCWlmIHJ2IGFuZCBydiA+IDA6Ci0JCQkJCQlyZXR1cm4KLQkKLQkjIHV0aWxpdGllcwotCWRlZiB0ZW1wY2xpcHJlY3Qoc2VsZiwgdGVtcGNsaXByZWN0KToKLQkJdGVtcGNsaXAgPSBRZC5OZXdSZ24oKQotCQlRZC5SZWN0UmduKHRlbXBjbGlwLCB0ZW1wY2xpcHJlY3QpCi0JCXNlbGYudGVtcGNsaXAodGVtcGNsaXApCi0JCVFkLkRpc3Bvc2VSZ24odGVtcGNsaXApCi0JCi0JZGVmIHRlbXBjbGlwKHNlbGYsIHRlbXBjbGlwKToKLQkJaWYgbm90IGhhc2F0dHIoc2VsZiwgInNhdmVjbGlwIik6Ci0JCQlzZWxmLnNhdmVjbGlwID0gW10KLQkJc2F2ZWNsaXAgPSBRZC5OZXdSZ24oKQotCQlRZC5HZXRDbGlwKHNhdmVjbGlwKQotCQlzZWxmLnNhdmVjbGlwLmFwcGVuZChzYXZlY2xpcCkKLQkJUWQuU2V0Q2xpcCh0ZW1wY2xpcCkKLQkKLQlkZWYgcmVzdG9yZWNsaXAoc2VsZik6Ci0JCVFkLlNldENsaXAoc2VsZi5zYXZlY2xpcFstMV0pCi0JCVFkLkRpc3Bvc2VSZ24oc2VsZi5zYXZlY2xpcFstMV0pCi0JCWRlbCBzZWxmLnNhdmVjbGlwWy0xXQotCQotCWRlZiBnZXRncm93cmVjdChzZWxmKToKLQkJbCwgdCwgciwgYiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qm91bmRzKCkKLQkJcmV0dXJuIChyIC0gMTUsIGIgLSAxNSwgciwgYikKLQkKLQlkZWYgaGFzX2tleShzZWxmLCBrZXkpOgotCQlyZXR1cm4gc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShrZXkpCi0JCi0JZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgotCQlnbG9iYWwgX3N1Y2Nlc3Njb3VudCwgX2ZhaWxjb3VudCwgX21hZ2ljY291bnQKLQkJaWYgc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShhdHRyKToKLQkJCV9zdWNjZXNzY291bnQgPSBfc3VjY2Vzc2NvdW50ICsgMQotCQkJcmV0dXJuIHNlbGYuX3dpZGdldHNkaWN0W2F0dHJdCi0JCWlmIHNlbGYuX2N1cnJlbnR3aWRnZXQgaXMgTm9uZSBvciAoYXR0cls6N10gPD4gJ2RvbWVudV8nIGFuZCAKLQkJCQlhdHRyWzo0XSA8PiAnY2FuXycgYW5kIGF0dHIgPD4gJ2luc2VydCcpOgotCQkJX2ZhaWxjb3VudCA9IF9mYWlsY291bnQgKyAxCi0JCQlyYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgotCQkjIHNwZWNpYWwgY2FzZTogaWYgYSBkb21lbnVfeHh4LCBjYW5feHh4IG9yIGluc2VydCBtZXRob2QgaXMgYXNrZWQgZm9yLCAKLQkJIyBzZWUgaWYgdGhlIGFjdGl2ZSB3aWRnZXQgc3VwcG9ydHMgaXQKLQkJX21hZ2ljY291bnQgPSBfbWFnaWNjb3VudCArIDEKLQkJcmV0dXJuIGdldGF0dHIoc2VsZi5fY3VycmVudHdpZGdldCwgYXR0cikKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGU9IiIsIG1pbnNpemU9Tm9uZSwgbWF4c2l6ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICB0YWJiYWJsZT0xLCBzaG93PTEsIGZvbnRzZXR0aW5ncz1Ob25lKToKKyAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgaWYgZm9udHNldHRpbmdzIGlzIE5vbmU6CisgICAgICAgICAgICBmb250c2V0dGluZ3MgPSBXLmdldGRlZmF1bHRmb250KCkKKyAgICAgICAgc2VsZi5fZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCisgICAgICAgIFcuU2VsZWN0YWJsZVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQorICAgICAgICBzZWxmLl9nbG9iYWxib3VuZHMgPSBsLCB0LCByLCBiID0gc2VsZi5nZXR3aW5kb3dib3VuZHMocG9zc2l6ZSwgbWluc2l6ZSkKKyAgICAgICAgc2VsZi5fYm91bmRzID0gKDAsIDAsIHIgLSBsLCBiIC0gdCkKKyAgICAgICAgc2VsZi5fdGFiY2hhaW4gPSBbXQorICAgICAgICBzZWxmLl9jdXJyZW50d2lkZ2V0ID0gTm9uZQorICAgICAgICBzZWxmLnRpdGxlID0gdGl0bGUKKyAgICAgICAgc2VsZi5fcGFyZW50d2luZG93ID0gc2VsZgorICAgICAgICBzZWxmLl90YWJiYWJsZSA9IHRhYmJhYmxlCisgICAgICAgIHNlbGYuX2RlZmF1bHRidXR0b24gPSBOb25lCisgICAgICAgIHNlbGYuX2RyYXd3aWRnZXRib3VuZHMgPSAwCisgICAgICAgIHNlbGYuX3Nob3cgPSBzaG93CisgICAgICAgIHNlbGYuX2xhc3Ryb2xsb3ZlciA9IE5vbmUKKyAgICAgICAgc2VsZi5oYXNjbG9zZWJveCA9IDEKKyAgICAgICAgIyBYWFggdGhlIGZvbGxvd2luZyBpcyBub3QgcmVhbGx5IGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgICAgIyAgbmV3IChzeXN0ZW0gPj0gNy41KSB3aW5kb3cgcHJvY3MuCisgICAgICAgIGlmIG1pbnNpemU6CisgICAgICAgICAgICBzZWxmLl9oYXNncm93Ym94ID0gMQorICAgICAgICAgICAgc2VsZi53aW5kb3draW5kID0gc2VsZi53aW5kb3draW5kIHwgOAorICAgICAgICAgICAgbCwgdCA9IG1pbnNpemUKKyAgICAgICAgICAgIGlmIG1heHNpemU6CisgICAgICAgICAgICAgICAgciwgYiA9IG1heHNpemVbMF0gKyAxLCBtYXhzaXplWzFdICsgMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByLCBiID0gMzIwMDAsIDMyMDAwCisgICAgICAgICAgICBzZWxmLmdyb3dsaW1pdCA9IChsLCB0LCByLCBiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5faGFzZ3Jvd2JveCA9IDAKKyAgICAgICAgICAgIGlmIChzZWxmLndpbmRvd2tpbmQgPT0gMCBvciBzZWxmLndpbmRvd2tpbmQgPj0gOCkgYW5kIHNlbGYud2luZG93a2luZCA8IDEwMDA6CisgICAgICAgICAgICAgICAgc2VsZi53aW5kb3draW5kID0gc2VsZi53aW5kb3draW5kIHwgNAorICAgICAgICBGcmFtZVdvcmsuV2luZG93Ll9faW5pdF9fKHNlbGYsIFcuZ2V0YXBwbGljYXRpb24oKSkKKworICAgIGRlZiBnZXR0aXRsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGl0bGUKKworICAgIGRlZiBzZXR0aXRsZShzZWxmLCB0aXRsZSk6CisgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorICAgICAgICBpZiBzZWxmLndpZDoKKyAgICAgICAgICAgIHNlbGYud2lkLlNldFdUaXRsZSh0aXRsZSkKKworICAgIGRlZiBnZXR3aW5kb3dib3VuZHMoc2VsZiwgc2l6ZSwgbWluc2l6ZSA9IE5vbmUpOgorICAgICAgICByZXR1cm4gd2luZG93Ym91bmRzKHNpemUsIG1pbnNpemUpCisKKyAgICBkZWYgZ2V0Y3VycmVudHdpZGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2N1cnJlbnR3aWRnZXQKKworICAgIGRlZiBzaG93KHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBzZWxmLndpZC5TaG93V2luZG93KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud2lkLkhpZGVXaW5kb3coKQorCisgICAgZGVmIGlzdmlzaWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYud2lkLklzV2luZG93VmlzaWJsZSgpCisKKyAgICBkZWYgc2VsZWN0KHNlbGYpOgorICAgICAgICBzZWxmLndpZC5TZWxlY3RXaW5kb3coKQorICAgICAgICAjIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UsIEkgbmVlZCBpdCB3aGVuCisgICAgICAgICMgYW4gZWRpdG9yIGdldHMgc2VsZWN0ZWQsIGFuZCBpbW1lZGlhdGVseSBzY3JvbGxlZAorICAgICAgICAjIHRvIGEgY2VydGFpbiBsaW5lLCB3YXN0ZSBzY3JvbGwgYXNzdW1lcyBldmVyeXRoaW5nCisgICAgICAgICMgdG8gYmUgaW4gdGFjdC4KKyAgICAgICAgc2VsZi5kb19yYXd1cGRhdGUoc2VsZi53aWQsICJEdW1teUV2ZW50IikKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBzZWxmLndpZCA9IFdpbi5OZXdDV2luZG93KHNlbGYuX2dsb2JhbGJvdW5kcywgc2VsZi50aXRsZSwgc2VsZi5fc2hvdywKKyAgICAgICAgICAgICAgICBzZWxmLndpbmRvd2tpbmQsIC0xLCBzZWxmLmhhc2Nsb3NlYm94LCAwKQorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBmb250bmFtZSwgZm9udHN0eWxlLCBmb250c2l6ZSwgZm9udGNvbG9yID0gc2VsZi5fZm9udHNldHRpbmdzCisgICAgICAgIGZudW0gPSBGbS5HZXRGTnVtKGZvbnRuYW1lKQorICAgICAgICBpZiBmbnVtID09IDA6CisgICAgICAgICAgICBmbnVtID0gRm0uR2V0Rk51bSgiR2VuZXZhIikKKyAgICAgICAgUWQuVGV4dEZvbnQoZm51bSkKKyAgICAgICAgUWQuVGV4dEZhY2UoZm9udHN0eWxlKQorICAgICAgICBRZC5UZXh0U2l6ZShmb250c2l6ZSkKKyAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPG9wZW4+Iik6CisgICAgICAgICAgICBjYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8b3Blbj4iXQorICAgICAgICAgICAgY2FsbGJhY2soKQorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgdy5mb3JhbGxfZnJvbWJvdHRvbSgib3BlbiIpCisgICAgICAgIHNlbGYuX21ha2V0YWJjaGFpbigpCisgICAgICAgIGlmIHNlbGYuX3RhYmJhYmxlOgorICAgICAgICAgICAgc2VsZi5iaW5kKCd0YWInLCBzZWxmLm5leHR3aWRnZXQpCisgICAgICAgICAgICBzZWxmLmJpbmQoJ3NoaWZ0dGFiJywgc2VsZi5wcmV2aW91c3dpZGdldCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2hhc3NlbGZyYW1lcyA9IDAKKyAgICAgICAgaWYgc2VsZi5fdGFiY2hhaW46CisgICAgICAgICAgICBzZWxmLl90YWJjaGFpblswXS5zZWxlY3QoMSkKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLndpZDoKKyAgICAgICAgICAgIHJldHVybiAgIyB3ZSBhcmUgYWxyZWFkeSBjbG9zZWQKKyAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGNsb3NlPiIpOgorICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1siPGNsb3NlPiJdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcnYgPSBjYWxsYmFjaygpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcHJpbnQgJ2Vycm9yIGluIDxjbG9zZT4gY2FsbGJhY2snCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHJ2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnYKKyAgICAgICAgI2ZvciBrZXkgaW4gc2VsZi5fd2lkZ2V0c2RpY3Qua2V5cygpOgorICAgICAgICAjICAgICAgIHNlbGYuX3JlbW92ZXdpZGdldChrZXkpCisgICAgICAgIHNlbGYuZm9yYWxsX2J1dHNlbGYoImNsb3NlIikKKyAgICAgICAgV2Jhc2UuU2VsZWN0YWJsZVdpZGdldC5jbG9zZShzZWxmKQorICAgICAgICBzZWxmLl90YWJjaGFpbiA9IFtdCisgICAgICAgIHNlbGYuX2N1cnJlbnR3aWRnZXQgPSBOb25lCisgICAgICAgIHNlbGYud2lkLkhpZGVXaW5kb3coKQorICAgICAgICBzZWxmLmRvX3Bvc3RjbG9zZSgpCisKKyAgICBkZWYgZG9tZW51X2Nsb3NlKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZ2V0Ym91bmRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZ2xvYmFsYm91bmRzCisKKyAgICBkZWYgc2V0Ym91bmRzKHNlbGYsIGJvdW5kcyk6CisgICAgICAgIGwsIHQsIHIsIGIgPSBib3VuZHMKKyAgICAgICAgc2VsZi5tb3ZlKGwsIHQpCisgICAgICAgIHNlbGYucmVzaXplKHItbCwgYi10KQorCisgICAgZGVmIG1vdmUoc2VsZiwgeCwgeSA9IE5vbmUpOgorICAgICAgICAiIiJhYnNvbHV0ZSBtb3ZlIiIiCisgICAgICAgIGlmIHkgPT0gTm9uZToKKyAgICAgICAgICAgIHgsIHkgPSB4CisgICAgICAgIHNlbGYud2lkLk1vdmVXaW5kb3coeCwgeSwgMCkKKworICAgIGRlZiByZXNpemUoc2VsZiwgeCwgeSA9IE5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5faGFzZ3Jvd2JveDoKKyAgICAgICAgICAgIHJldHVybiAgIyBoYW5kcyBvZmYhCisgICAgICAgIGlmIHkgPT0gTm9uZToKKyAgICAgICAgICAgIHgsIHkgPSB4CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuZ2V0Z3Jvd3JlY3QoKSkKKyAgICAgICAgc2VsZi53aWQuU2l6ZVdpbmRvdyh4LCB5LCAxKQorICAgICAgICBzZWxmLl9jYWxjYm91bmRzKCkKKworICAgIGRlZiB0ZXN0KHNlbGYsIHBvaW50KToKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl9oYXNncm93Ym94OgorICAgICAgICAgICAgc2VsZi50ZW1wY2xpcHJlY3Qoc2VsZi5nZXRncm93cmVjdCgpKQorICAgICAgICAgICAgc2VsZi53aWQuRHJhd0dyb3dJY29uKCkKKyAgICAgICAgICAgIHNlbGYucmVzdG9yZWNsaXAoKQorCisgICAgZGVmIGlkbGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBwb2ludCA9IEV2dC5HZXRNb3VzZSgpCisgICAgICAgIHdpZGdldCA9IHNlbGYuZmluZHdpZGdldChwb2ludCwgMCkKKyAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGlkbGU+Iik6CisgICAgICAgICAgICBjYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8aWRsZT4iXQorICAgICAgICAgICAgaWYgY2FsbGJhY2soKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fY3VycmVudHdpZGdldCBpcyBub3QgTm9uZSBhbmQgaGFzYXR0cihzZWxmLl9jdXJyZW50d2lkZ2V0LCAiaWRsZSIpOgorICAgICAgICAgICAgaWYgc2VsZi5fY3VycmVudHdpZGdldC5fYmluZGluZ3MuaGFzX2tleSgiPGlkbGU+Iik6CisgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5nc1siPGlkbGU+Il0KKyAgICAgICAgICAgICAgICBpZiBjYWxsYmFjaygpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHNlbGYuX2N1cnJlbnR3aWRnZXQuaWRsZSgpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiB3aWRnZXQgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIod2lkZ2V0LCAicm9sbG92ZXIiKToKKyAgICAgICAgICAgIGlmIDE6ICAgI3NlbGYuX2xhc3Ryb2xsb3ZlciA8PiB3aWRnZXQ6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fbGFzdHJvbGxvdmVyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0cm9sbG92ZXIucm9sbG92ZXIocG9pbnQsIDApCisgICAgICAgICAgICAgICAgc2VsZi5fbGFzdHJvbGxvdmVyID0gd2lkZ2V0CisgICAgICAgICAgICAgICAgc2VsZi5fbGFzdHJvbGxvdmVyLnJvbGxvdmVyKHBvaW50LCAxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5fbGFzdHJvbGxvdmVyOgorICAgICAgICAgICAgICAgIHNlbGYuX2xhc3Ryb2xsb3Zlci5yb2xsb3Zlcihwb2ludCwgMCkKKyAgICAgICAgICAgIHNlbGYuX2xhc3Ryb2xsb3ZlciA9IE5vbmUKKyAgICAgICAgICAgIFdiYXNlLlNldEN1cnNvcigiYXJyb3ciKQorCisgICAgZGVmIHh4eF9fX3NlbGVjdChzZWxmLCB3aWRnZXQpOgorICAgICAgICBpZiBzZWxmLl9jdXJyZW50d2lkZ2V0ID09IHdpZGdldDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9iaW5kaW5ncy5oYXNfa2V5KCI8c2VsZWN0PiIpOgorICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1siPHNlbGVjdD4iXQorICAgICAgICAgICAgaWYgY2FsbGJhY2sod2lkZ2V0KToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgd2lkZ2V0IGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLl9jdXJyZW50d2lkZ2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX2N1cnJlbnR3aWRnZXQuc2VsZWN0KDApCisgICAgICAgIGVsaWYgdHlwZSh3aWRnZXQpID09IEluc3RhbmNlVHlwZSBhbmQgd2lkZ2V0Ll9zZWxlY3RhYmxlOgorICAgICAgICAgICAgd2lkZ2V0LnNlbGVjdCgxKQorICAgICAgICBlbGlmIHdpZGdldCA9PSAtMSBvciB3aWRnZXQgPT0gMToKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLl90YWJjaGFpbikgPD0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHRlbXAgPSBzZWxmLl90YWJjaGFpblsoc2VsZi5fdGFiY2hhaW4uaW5kZXgoc2VsZi5fY3VycmVudHdpZGdldCkgKyB3aWRnZXQpICUgbGVuKHNlbGYuX3RhYmNoYWluKV0KKyAgICAgICAgICAgIHRlbXAuc2VsZWN0KDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJXaWRnZXQgaXMgbm90IHNlbGVjdGFibGUiCisKKyAgICBkZWYgc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLCBuZXdkZWZhdWx0YnV0dG9uID0gTm9uZSwgKmtleXMpOgorICAgICAgICBpZiBuZXdkZWZhdWx0YnV0dG9uID09IHNlbGYuX2RlZmF1bHRidXR0b246CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fZGVmYXVsdGJ1dHRvbjoKKyAgICAgICAgICAgIHNlbGYuX2RlZmF1bHRidXR0b24uX3NldGRlZmF1bHQoMCkKKyAgICAgICAgaWYgbm90IG5ld2RlZmF1bHRidXR0b246CisgICAgICAgICAgICBzZWxmLmJpbmQoInJldHVybiIsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmJpbmQoImVudGVyIiwgTm9uZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpbXBvcnQgV2NvbnRyb2xzCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5ld2RlZmF1bHRidXR0b24sIFdjb250cm9scy5CdXR0b24pOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAid2lkZ2V0IGlzIG5vdCBhIGJ1dHRvbiIKKyAgICAgICAgc2VsZi5fZGVmYXVsdGJ1dHRvbiA9IG5ld2RlZmF1bHRidXR0b24KKyAgICAgICAgc2VsZi5fZGVmYXVsdGJ1dHRvbi5fc2V0ZGVmYXVsdCgxKQorICAgICAgICBpZiBub3Qga2V5czoKKyAgICAgICAgICAgIHNlbGYuYmluZCgicmV0dXJuIiwgc2VsZi5fZGVmYXVsdGJ1dHRvbi5wdXNoKQorICAgICAgICAgICAgc2VsZi5iaW5kKCJlbnRlciIsIHNlbGYuX2RlZmF1bHRidXR0b24ucHVzaCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgICAgICAgICBzZWxmLmJpbmQoa2V5LCBzZWxmLl9kZWZhdWx0YnV0dG9uLnB1c2gpCisKKyAgICBkZWYgbmV4dHdpZGdldChzZWxmKToKKyAgICAgICAgc2VsZi54eHhfX19zZWxlY3QoMSkKKworICAgIGRlZiBwcmV2aW91c3dpZGdldChzZWxmKToKKyAgICAgICAgc2VsZi54eHhfX19zZWxlY3QoLTEpCisKKyAgICBkZWYgZHJhd3dpZGdldGJvdW5kcyhzZWxmLCBvbm9mZik6CisgICAgICAgIHNlbGYuX2RyYXd3aWRnZXRib3VuZHMgPSBvbm9mZgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCisKKyAgICBkZWYgX2RyYXdib3VuZHMoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfbWFrZXRhYmNoYWluKHNlbGYpOgorICAgICAgICAjIFhYWCBUaGlzIGhhcyB0byBjaGFuZ2UsIGl0J3Mgbm8gZ29vZCB3aGVuIHdlIGFyZSBhZGRpbmcgb3IgZGVsZXRpbmcgd2lkZ2V0cy4KKyAgICAgICAgIyBYWFggUGVyaGFwcyB3ZSBzaG91bGRuJ3Qga2VlcCBhICJ0YWJjaGFpbiIgYXQgYWxsLgorICAgICAgICBzZWxmLl9oYXNzZWxmcmFtZXMgPSAwCisgICAgICAgIHNlbGYuX2NvbGxlY3RzZWxlY3RhYmxld2lkZ2V0cyhzZWxmLl93aWRnZXRzKQorICAgICAgICBpZiBzZWxmLl9oYXNzZWxmcmFtZXMgYW5kIGxlbihzZWxmLl90YWJjaGFpbikgPiAxOgorICAgICAgICAgICAgc2VsZi5faGFzc2VsZnJhbWVzID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5faGFzc2VsZnJhbWVzID0gMAorCisgICAgZGVmIF9jb2xsZWN0c2VsZWN0YWJsZXdpZGdldHMoc2VsZiwgd2lkZ2V0cyk6CisgICAgICAgIGltcG9ydCBXCisgICAgICAgIGZvciB3IGluIHdpZGdldHM6CisgICAgICAgICAgICBpZiB3Ll9zZWxlY3RhYmxlOgorICAgICAgICAgICAgICAgIHNlbGYuX3RhYmNoYWluLmFwcGVuZCh3KQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodywgVy5MaXN0KToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFzc2VsZnJhbWVzID0gMQorICAgICAgICAgICAgc2VsZi5fY29sbGVjdHNlbGVjdGFibGV3aWRnZXRzKHcuX3dpZGdldHMpCisKKyAgICBkZWYgX2NhbGNib3VuZHMoc2VsZik6CisgICAgICAgIHNlbGYuX3Bvc3NpemUgPSBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpWzI6XQorICAgICAgICB3LCBoID0gc2VsZi5fcG9zc2l6ZQorICAgICAgICBzZWxmLl9ib3VuZHMgPSAoMCwgMCwgdywgaCkKKyAgICAgICAgc2VsZi53aWQuR2V0V2luZG93Q29udGVudFJnbihzY3JhdGNoUmVnaW9uKQorICAgICAgICBsLCB0LCByLCBiID0gR2V0UmduQm91bmRzKHNjcmF0Y2hSZWdpb24pCisgICAgICAgIHNlbGYuX2dsb2JhbGJvdW5kcyA9IGwsIHQsIGwgKyB3LCB0ICsgaAorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgdy5fY2FsY2JvdW5kcygpCisKKyAgICAjIEZyYW1lV29yayBvdmVycmlkZSBtZXRob2RzCisgICAgZGVmIGRvX2luRHJhZyhzZWxmLCBwYXJ0Y29kZSwgd2luZG93LCBldmVudCk6CisgICAgICAgIHdoZXJlID0gZXZlbnRbM10KKyAgICAgICAgc2VsZi53aWQuR2V0V2luZG93Q29udGVudFJnbihzY3JhdGNoUmVnaW9uKQorICAgICAgICB3YXNfbCwgd2FzX3QsIHIsIGIgPSBHZXRSZ25Cb3VuZHMoc2NyYXRjaFJlZ2lvbikKKyAgICAgICAgd2luZG93LkRyYWdXaW5kb3cod2hlcmUsIHNlbGYuZHJhZ2xpbWl0KQorICAgICAgICBzZWxmLndpZC5HZXRXaW5kb3dDb250ZW50UmduKHNjcmF0Y2hSZWdpb24pCisgICAgICAgIGlzX2wsIGlzX3QsIHIsIGIgPSBHZXRSZ25Cb3VuZHMoc2NyYXRjaFJlZ2lvbikKKyAgICAgICAgc2VsZi5fZ2xvYmFsYm91bmRzID0gUWQuT2Zmc2V0UmVjdChzZWxmLl9nbG9iYWxib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2wgLSB3YXNfbCwgaXNfdCAtIHdhc190KQorCisgICAgZGVmIGRvX2NoYXIoc2VsZiwgY2hhciwgZXZlbnQpOgorICAgICAgICBpbXBvcnQgV2tleXMKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAga2V5ID0gY2hhcgorICAgICAgICBpZiBXa2V5cy5rZXluYW1lcy5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICBrZXkgPSBXa2V5cy5rZXluYW1lc1trZXldCisgICAgICAgIGlmIG1vZGlmaWVycyAmIEV2ZW50cy5zaGlmdEtleToKKyAgICAgICAgICAgIGtleSA9ICdzaGlmdCcgKyBrZXkKKyAgICAgICAgaWYgbW9kaWZpZXJzICYgRXZlbnRzLmNtZEtleToKKyAgICAgICAgICAgIGtleSA9ICdjbWQnICsga2V5CisgICAgICAgIGlmIG1vZGlmaWVycyAmIEV2ZW50cy5jb250cm9sS2V5OgorICAgICAgICAgICAga2V5ID0gJ2NvbnRyb2wnICsga2V5CisgICAgICAgIGlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjxrZXk+Iik6CisgICAgICAgICAgICBjYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8a2V5PiJdCisgICAgICAgICAgICBpZiBXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIGNoYXIsIGV2ZW50KToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1trZXldCisgICAgICAgICAgICBXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIGNoYXIsIGV2ZW50KQorICAgICAgICBlbGlmIHNlbGYuX2N1cnJlbnR3aWRnZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5ncy5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5nc1trZXldCisgICAgICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKGNhbGxiYWNrLCAwLCBjaGFyLCBldmVudCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fY3VycmVudHdpZGdldC5fYmluZGluZ3MuaGFzX2tleSgiPGtleT4iKToKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5nc1siPGtleT4iXQorICAgICAgICAgICAgICAgICAgICBpZiBXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIGNoYXIsIGV2ZW50KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHNlbGYuX2N1cnJlbnR3aWRnZXQua2V5KGNoYXIsIGV2ZW50KQorCisgICAgZGVmIGRvX2NvbnRlbnRjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzLCBldmVudCk6CisgICAgICAgIHdpZGdldCA9IHNlbGYuZmluZHdpZGdldChwb2ludCkKKyAgICAgICAgaWYgd2lkZ2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGNsaWNrPiIpOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxjbGljaz4iXQorICAgICAgICAgICAgICAgIGlmIFdiYXNlLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgcG9pbnQsIG1vZGlmaWVycyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgd2lkZ2V0Ll9iaW5kaW5ncy5oYXNfa2V5KCI8Y2xpY2s+Iik6CisgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB3aWRnZXQuX2JpbmRpbmdzWyI8Y2xpY2s+Il0KKyAgICAgICAgICAgICAgICBpZiBXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHdpZGdldC5fc2VsZWN0YWJsZToKKyAgICAgICAgICAgICAgICB3aWRnZXQuc2VsZWN0KDEsIDEpCisgICAgICAgICAgICB3aWRnZXQuY2xpY2socG9pbnQsIG1vZGlmaWVycykKKworICAgIGRlZiBkb191cGRhdGUoc2VsZiwgd2luZG93LCBldmVudCk6CisgICAgICAgIFFkLkVyYXNlUmduKHdpbmRvdy5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQorICAgICAgICBzZWxmLmZvcmFsbF9mcm9tYm90dG9tKCJkcmF3Iiwgd2luZG93LkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCisgICAgICAgIGlmIHNlbGYuX2RyYXd3aWRnZXRib3VuZHM6CisgICAgICAgICAgICBzZWxmLmZvcmFsbF9mcm9tYm90dG9tKCJfZHJhd2JvdW5kcyIpCisKKyAgICBkZWYgZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IG9ub2ZmOgorICAgICAgICAgICAgaWYgc2VsZi5fbGFzdHJvbGxvdmVyOgorICAgICAgICAgICAgICAgIHNlbGYuX2xhc3Ryb2xsb3Zlci5yb2xsb3ZlcigoMCwgMCksIDApCisgICAgICAgICAgICAgICAgc2VsZi5fbGFzdHJvbGxvdmVyID0gTm9uZQorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLmZvcmFsbCgiYWN0aXZhdGUiLCBvbm9mZikKKyAgICAgICAgc2VsZi5kcmF3KCkKKworICAgIGRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6CisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuZ2V0Z3Jvd3JlY3QoKSkKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisKKyAgICBkZWYgZG9faW5Hb0F3YXkoc2VsZiwgcGFydGNvZGUsIHdpbmRvdywgZXZlbnQpOgorICAgICAgICB3aGVyZSA9IGV2ZW50WzNdCisgICAgICAgIGNsb3NlYWxsID0gZXZlbnRbNF0gJiBFdmVudHMub3B0aW9uS2V5CisgICAgICAgIGlmIHdpbmRvdy5UcmFja0dvQXdheSh3aGVyZSk6CisgICAgICAgICAgICBpZiBub3QgY2xvc2VhbGw6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciB3aW5kb3cgaW4gc2VsZi5wYXJlbnQuX3dpbmRvd3MudmFsdWVzKCk6CisgICAgICAgICAgICAgICAgICAgIHJ2ID0gd2luZG93LmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcnYgYW5kIHJ2ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgIyB1dGlsaXRpZXMKKyAgICBkZWYgdGVtcGNsaXByZWN0KHNlbGYsIHRlbXBjbGlwcmVjdCk6CisgICAgICAgIHRlbXBjbGlwID0gUWQuTmV3UmduKCkKKyAgICAgICAgUWQuUmVjdFJnbih0ZW1wY2xpcCwgdGVtcGNsaXByZWN0KQorICAgICAgICBzZWxmLnRlbXBjbGlwKHRlbXBjbGlwKQorICAgICAgICBRZC5EaXNwb3NlUmduKHRlbXBjbGlwKQorCisgICAgZGVmIHRlbXBjbGlwKHNlbGYsIHRlbXBjbGlwKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgInNhdmVjbGlwIik6CisgICAgICAgICAgICBzZWxmLnNhdmVjbGlwID0gW10KKyAgICAgICAgc2F2ZWNsaXAgPSBRZC5OZXdSZ24oKQorICAgICAgICBRZC5HZXRDbGlwKHNhdmVjbGlwKQorICAgICAgICBzZWxmLnNhdmVjbGlwLmFwcGVuZChzYXZlY2xpcCkKKyAgICAgICAgUWQuU2V0Q2xpcCh0ZW1wY2xpcCkKKworICAgIGRlZiByZXN0b3JlY2xpcChzZWxmKToKKyAgICAgICAgUWQuU2V0Q2xpcChzZWxmLnNhdmVjbGlwWy0xXSkKKyAgICAgICAgUWQuRGlzcG9zZVJnbihzZWxmLnNhdmVjbGlwWy0xXSkKKyAgICAgICAgZGVsIHNlbGYuc2F2ZWNsaXBbLTFdCisKKyAgICBkZWYgZ2V0Z3Jvd3JlY3Qoc2VsZik6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpCisgICAgICAgIHJldHVybiAociAtIDE1LCBiIC0gMTUsIHIsIGIpCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShrZXkpCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIGdsb2JhbCBfc3VjY2Vzc2NvdW50LCBfZmFpbGNvdW50LCBfbWFnaWNjb3VudAorICAgICAgICBpZiBzZWxmLl93aWRnZXRzZGljdC5oYXNfa2V5KGF0dHIpOgorICAgICAgICAgICAgX3N1Y2Nlc3Njb3VudCA9IF9zdWNjZXNzY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fd2lkZ2V0c2RpY3RbYXR0cl0KKyAgICAgICAgaWYgc2VsZi5fY3VycmVudHdpZGdldCBpcyBOb25lIG9yIChhdHRyWzo3XSA8PiAnZG9tZW51XycgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyWzo0XSA8PiAnY2FuXycgYW5kIGF0dHIgPD4gJ2luc2VydCcpOgorICAgICAgICAgICAgX2ZhaWxjb3VudCA9IF9mYWlsY291bnQgKyAxCisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgorICAgICAgICAjIHNwZWNpYWwgY2FzZTogaWYgYSBkb21lbnVfeHh4LCBjYW5feHh4IG9yIGluc2VydCBtZXRob2QgaXMgYXNrZWQgZm9yLAorICAgICAgICAjIHNlZSBpZiB0aGUgYWN0aXZlIHdpZGdldCBzdXBwb3J0cyBpdAorICAgICAgICBfbWFnaWNjb3VudCA9IF9tYWdpY2NvdW50ICsgMQorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9jdXJyZW50d2lkZ2V0LCBhdHRyKQogCiBfc3VjY2Vzc2NvdW50ID0gMAogX2ZhaWxjb3VudCA9IDAKIF9tYWdpY2NvdW50ID0gMAogCiBjbGFzcyBEaWFsb2coV2luZG93KToKLQkKLQl3aW5kb3draW5kID0gV2luZG93cy5tb3ZhYmxlREJveFByb2MKLQkKLQkjIHRoaXMgX19pbml0X18gc2VlbXMgcmVkdW5kYW50LCBidXQgaXQncyBub3Q6IGl0IGhhcyBsZXNzIGFyZ3MKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUgPSAiIik6Ci0JCVdpbmRvdy5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0aXRsZSkKLQkKLQlkZWYgY2FuX2Nsb3NlKHNlbGYsICphcmdzKToKLQkJcmV0dXJuIDAKLQkKLQlkZWYgZ2V0d2luZG93Ym91bmRzKHNlbGYsIHNpemUsIG1pbnNpemUgPSBOb25lKToKLQkJc2NyZWVuYm91bmRzID0gc2wsIHN0LCBzciwgc2IgPSBRZC5HZXRRREdsb2JhbHNTY3JlZW5CaXRzKCkuYm91bmRzCi0JCXcsIGggPSBzaXplCi0JCWwgPSBzbCArIChzciAtIHNsIC0gdykgLyAyCi0JCXQgPSBzdCArIChzYiAtIHN0IC0gaCkgLyAzCi0JCXJldHVybiBsLCB0LCBsICsgdywgdCArIGgKKworICAgIHdpbmRvd2tpbmQgPSBXaW5kb3dzLm1vdmFibGVEQm94UHJvYworCisgICAgIyB0aGlzIF9faW5pdF9fIHNlZW1zIHJlZHVuZGFudCwgYnV0IGl0J3Mgbm90OiBpdCBoYXMgbGVzcyBhcmdzCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIiIpOgorICAgICAgICBXaW5kb3cuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUpCisKKyAgICBkZWYgY2FuX2Nsb3NlKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBnZXR3aW5kb3dib3VuZHMoc2VsZiwgc2l6ZSwgbWluc2l6ZSA9IE5vbmUpOgorICAgICAgICBzY3JlZW5ib3VuZHMgPSBzbCwgc3QsIHNyLCBzYiA9IFFkLkdldFFER2xvYmFsc1NjcmVlbkJpdHMoKS5ib3VuZHMKKyAgICAgICAgdywgaCA9IHNpemUKKyAgICAgICAgbCA9IHNsICsgKHNyIC0gc2wgLSB3KSAvIDIKKyAgICAgICAgdCA9IHN0ICsgKHNiIC0gc3QgLSBoKSAvIDMKKyAgICAgICAgcmV0dXJuIGwsIHQsIGwgKyB3LCB0ICsgaAogCiAKIGNsYXNzIE1vZGFsRGlhbG9nKERpYWxvZyk6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIiIpOgotCQlEaWFsb2cuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUpCi0JCWlmIHRpdGxlOgotCQkJc2VsZi53aW5kb3draW5kID0gV2luZG93cy5tb3ZhYmxlREJveFByb2MKLQkJZWxzZToKLQkJCXNlbGYud2luZG93a2luZCA9IFdpbmRvd3MuZEJveFByb2MKLQkKLQlkZWYgb3BlbihzZWxmKToKLQkJaW1wb3J0IFcKLQkJRGlhbG9nLm9wZW4oc2VsZikKLQkJc2VsZi5hcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKLQkJc2VsZi5kb25lID0gMAotCQlNZW51LkhpbGl0ZU1lbnUoMCkKLQkJYXBwID0gc2VsZi5wYXJlbnQKLQkJYXBwLmVuYWJsZW1lbnViYXIoMCkKLQkJdHJ5OgotCQkJc2VsZi5tYWlubG9vcCgpCi0JCWZpbmFsbHk6Ci0JCQlhcHAuZW5hYmxlbWVudWJhcigxKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgbm90IHNlbGYud2lkOgotCQkJcmV0dXJuCSMgd2UgYXJlIGFscmVhZHkgY2xvc2VkCi0JCXNlbGYuZG9uZSA9IDEKLQkJZGVsIHNlbGYuYXBwCi0JCURpYWxvZy5jbG9zZShzZWxmKQotCQotCWRlZiBtYWlubG9vcChzZWxmKToKLQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJc2F2ZXlpZWxkID0gTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQotCQl3aGlsZSBub3Qgc2VsZi5kb25lOgotCQkJI3NlbGYuZG8xZXZlbnQoKQotCQkJc2VsZi5kbzFldmVudCgJRXZlbnRzLmtleURvd25NYXNrICsgCi0JCQkJCQlFdmVudHMuYXV0b0tleU1hc2sgKyAKLQkJCQkJCUV2ZW50cy5hY3Rpdk1hc2sgKyAKLQkJCQkJCUV2ZW50cy51cGRhdGVNYXNrICsgCi0JCQkJCQlFdmVudHMubURvd25NYXNrICsKLQkJCQkJCUV2ZW50cy5tVXBNYXNrLCAKLQkJCQkJCTEwKQotCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goc2F2ZXlpZWxkKQotCQotCWRlZiBkbzFldmVudChzZWxmLCBtYXNrID0gRXZlbnRzLmV2ZXJ5RXZlbnQsIHdhaXQgPSAwKToKLQkJb2ssIGV2ZW50ID0gc2VsZi5hcHAuZ2V0ZXZlbnQobWFzaywgd2FpdCkKLQkJaWYgRGxnLklzRGlhbG9nRXZlbnQoZXZlbnQpOgotCQkJaWYgc2VsZi5hcHAuZG9fZGlhbG9nZXZlbnQoZXZlbnQpOgotCQkJCXJldHVybgotCQlpZiBvazoKLQkJCXNlbGYuZGlzcGF0Y2goZXZlbnQpCi0JCWVsc2U6Ci0JCQlzZWxmLmFwcC5pZGxlKGV2ZW50KQotCQotCWRlZiBkb19rZXlEb3duKHNlbGYsIGV2ZW50KToKLQkJc2VsZi5kb19rZXkoZXZlbnQpCi0JCi0JZGVmIGRvX2F1dG9LZXkoc2VsZiwgZXZlbnQpOgotCQlpZiBub3QgZXZlbnRbLTFdICYgRXZlbnRzLmNtZEtleToKLQkJCXNlbGYuZG9fa2V5KGV2ZW50KQotCQotCWRlZiBkb19rZXkoc2VsZiwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQkjdyA9IFdpbi5Gcm9udFdpbmRvdygpCi0JCSNpZiB3IDw+IHNlbGYud2lkOgotCQkjCXJldHVybgotCQljID0gY2hyKG1lc3NhZ2UgJiBFdmVudHMuY2hhckNvZGVNYXNrKQotCQlpZiBtb2RpZmllcnMgJiBFdmVudHMuY21kS2V5OgotCQkJc2VsZi5hcHAuY2hlY2ttZW51cyhzZWxmKQotCQkJcmVzdWx0ID0gTWVudS5NZW51S2V5KG9yZChjKSkKLQkJCWlkID0gKHJlc3VsdD4+MTYpICYgMHhmZmZmCSMgSGkgd29yZAotCQkJaXRlbSA9IHJlc3VsdCAmIDB4ZmZmZgkJIyBMbyB3b3JkCi0JCQlpZiBpZDoKLQkJCQlzZWxmLmFwcC5kb19yYXdtZW51KGlkLCBpdGVtLCBOb25lLCBldmVudCkKLQkJCQlyZXR1cm4KLQkJc2VsZi5kb19jaGFyKGMsIGV2ZW50KQotCQotCWRlZiBkb19tb3VzZURvd24oc2VsZiwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlwYXJ0Y29kZSwgd2lkID0gV2luLkZpbmRXaW5kb3cod2hlcmUpCi0JCSMKLQkJIyBGaW5kIHRoZSBjb3JyZWN0IG5hbWUuCi0JCSMKLQkJaWYgRnJhbWVXb3JrLnBhcnRuYW1lLmhhc19rZXkocGFydGNvZGUpOgotCQkJbmFtZSA9ICJkb18iICsgRnJhbWVXb3JrLnBhcnRuYW1lW3BhcnRjb2RlXQotCQllbHNlOgotCQkJbmFtZSA9ICJkb18lZCIgJSBwYXJ0Y29kZQotCQkKLQkJaWYgbmFtZSA9PSAiZG9faW5EZXNrIjoKLQkJCWlmIGhhc2F0dHIoTWFjT1MsICJIYW5kbGVFdmVudCIpOgotCQkJCU1hY09TLkhhbmRsZUV2ZW50KGV2ZW50KQotCQkJZWxzZToKLQkJCQlwcmludCAnVW5leHBlY3RlZCBpbkRlc2sgZXZlbnQ6JywgZXZlbnQKLQkJCXJldHVybgotCQlpZiB3aWQgPT0gc2VsZi53aWQ6Ci0JCQl0cnk6Ci0JCQkJaGFuZGxlciA9IGdldGF0dHIoc2VsZiwgbmFtZSkKLQkJCWV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLQkJCQloYW5kbGVyID0gc2VsZi5hcHAuZG9fdW5rbm93bnBhcnRjb2RlCi0JCWVsc2U6Ci0JCQkjTWFjT1MuSGFuZGxlRXZlbnQoZXZlbnQpCi0JCQlpZiBuYW1lID09ICdkb19pbk1lbnVCYXInOgotCQkJCWhhbmRsZXIgPSBnZXRhdHRyKHNlbGYucGFyZW50LCBuYW1lKQotCQkJZWxzZToKLQkJCQlyZXR1cm4JCQotCQloYW5kbGVyKHBhcnRjb2RlLCB3aWQsIGV2ZW50KQotCQotCWRlZiBkaXNwYXRjaChzZWxmLCBldmVudCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCWlmIEZyYW1lV29yay5ldmVudG5hbWUuaGFzX2tleSh3aGF0KToKLQkJCW5hbWUgPSAiZG9fIiArIEZyYW1lV29yay5ldmVudG5hbWVbd2hhdF0KLQkJZWxzZToKLQkJCW5hbWUgPSAiZG9fJWQiICUgd2hhdAotCQl0cnk6Ci0JCQloYW5kbGVyID0gZ2V0YXR0cihzZWxmLCBuYW1lKQotCQlleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0JCQl0cnk6Ci0JCQkJaGFuZGxlciA9IGdldGF0dHIoc2VsZi5hcHAsIG5hbWUpCi0JCQlleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0JCQkJaGFuZGxlciA9IHNlbGYuYXBwLmRvX3Vua25vd25ldmVudAotCQloYW5kbGVyKGV2ZW50KQotCQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIiIpOgorICAgICAgICBEaWFsb2cuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUpCisgICAgICAgIGlmIHRpdGxlOgorICAgICAgICAgICAgc2VsZi53aW5kb3draW5kID0gV2luZG93cy5tb3ZhYmxlREJveFByb2MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud2luZG93a2luZCA9IFdpbmRvd3MuZEJveFByb2MKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpbXBvcnQgVworICAgICAgICBEaWFsb2cub3BlbihzZWxmKQorICAgICAgICBzZWxmLmFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKQorICAgICAgICBzZWxmLmRvbmUgPSAwCisgICAgICAgIE1lbnUuSGlsaXRlTWVudSgwKQorICAgICAgICBhcHAgPSBzZWxmLnBhcmVudAorICAgICAgICBhcHAuZW5hYmxlbWVudWJhcigwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLm1haW5sb29wKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGFwcC5lbmFibGVtZW51YmFyKDEpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLndpZDoKKyAgICAgICAgICAgIHJldHVybiAgIyB3ZSBhcmUgYWxyZWFkeSBjbG9zZWQKKyAgICAgICAgc2VsZi5kb25lID0gMQorICAgICAgICBkZWwgc2VsZi5hcHAKKyAgICAgICAgRGlhbG9nLmNsb3NlKHNlbGYpCisKKyAgICBkZWYgbWFpbmxvb3Aoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgIHNhdmV5aWVsZCA9IE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuZG9uZToKKyAgICAgICAgICAgICNzZWxmLmRvMWV2ZW50KCkKKyAgICAgICAgICAgIHNlbGYuZG8xZXZlbnQoICBFdmVudHMua2V5RG93bk1hc2sgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRzLmF1dG9LZXlNYXNrICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50cy5hY3Rpdk1hc2sgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRzLnVwZGF0ZU1hc2sgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRzLm1Eb3duTWFzayArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudHMubVVwTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwKQorICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goc2F2ZXlpZWxkKQorCisgICAgZGVmIGRvMWV2ZW50KHNlbGYsIG1hc2sgPSBFdmVudHMuZXZlcnlFdmVudCwgd2FpdCA9IDApOgorICAgICAgICBvaywgZXZlbnQgPSBzZWxmLmFwcC5nZXRldmVudChtYXNrLCB3YWl0KQorICAgICAgICBpZiBEbGcuSXNEaWFsb2dFdmVudChldmVudCk6CisgICAgICAgICAgICBpZiBzZWxmLmFwcC5kb19kaWFsb2dldmVudChldmVudCk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaChldmVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXBwLmlkbGUoZXZlbnQpCisKKyAgICBkZWYgZG9fa2V5RG93bihzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuZG9fa2V5KGV2ZW50KQorCisgICAgZGVmIGRvX2F1dG9LZXkoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBub3QgZXZlbnRbLTFdICYgRXZlbnRzLmNtZEtleToKKyAgICAgICAgICAgIHNlbGYuZG9fa2V5KGV2ZW50KQorCisgICAgZGVmIGRvX2tleShzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgICN3ID0gV2luLkZyb250V2luZG93KCkKKyAgICAgICAgI2lmIHcgPD4gc2VsZi53aWQ6CisgICAgICAgICMgICAgICAgcmV0dXJuCisgICAgICAgIGMgPSBjaHIobWVzc2FnZSAmIEV2ZW50cy5jaGFyQ29kZU1hc2spCisgICAgICAgIGlmIG1vZGlmaWVycyAmIEV2ZW50cy5jbWRLZXk6CisgICAgICAgICAgICBzZWxmLmFwcC5jaGVja21lbnVzKHNlbGYpCisgICAgICAgICAgICByZXN1bHQgPSBNZW51Lk1lbnVLZXkob3JkKGMpKQorICAgICAgICAgICAgaWQgPSAocmVzdWx0Pj4xNikgJiAweGZmZmYgICAgICAjIEhpIHdvcmQKKyAgICAgICAgICAgIGl0ZW0gPSByZXN1bHQgJiAweGZmZmYgICAgICAgICAgIyBMbyB3b3JkCisgICAgICAgICAgICBpZiBpZDoKKyAgICAgICAgICAgICAgICBzZWxmLmFwcC5kb19yYXdtZW51KGlkLCBpdGVtLCBOb25lLCBldmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5kb19jaGFyKGMsIGV2ZW50KQorCisgICAgZGVmIGRvX21vdXNlRG93bihzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIHBhcnRjb2RlLCB3aWQgPSBXaW4uRmluZFdpbmRvdyh3aGVyZSkKKyAgICAgICAgIworICAgICAgICAjIEZpbmQgdGhlIGNvcnJlY3QgbmFtZS4KKyAgICAgICAgIworICAgICAgICBpZiBGcmFtZVdvcmsucGFydG5hbWUuaGFzX2tleShwYXJ0Y29kZSk6CisgICAgICAgICAgICBuYW1lID0gImRvXyIgKyBGcmFtZVdvcmsucGFydG5hbWVbcGFydGNvZGVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lID0gImRvXyVkIiAlIHBhcnRjb2RlCisKKyAgICAgICAgaWYgbmFtZSA9PSAiZG9faW5EZXNrIjoKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICJIYW5kbGVFdmVudCIpOgorICAgICAgICAgICAgICAgIE1hY09TLkhhbmRsZUV2ZW50KGV2ZW50KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnVW5leHBlY3RlZCBpbkRlc2sgZXZlbnQ6JywgZXZlbnQKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiB3aWQgPT0gc2VsZi53aWQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldGF0dHIoc2VsZiwgbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gc2VsZi5hcHAuZG9fdW5rbm93bnBhcnRjb2RlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjTWFjT1MuSGFuZGxlRXZlbnQoZXZlbnQpCisgICAgICAgICAgICBpZiBuYW1lID09ICdkb19pbk1lbnVCYXInOgorICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBnZXRhdHRyKHNlbGYucGFyZW50LCBuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaGFuZGxlcihwYXJ0Y29kZSwgd2lkLCBldmVudCkKKworICAgIGRlZiBkaXNwYXRjaChzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIGlmIEZyYW1lV29yay5ldmVudG5hbWUuaGFzX2tleSh3aGF0KToKKyAgICAgICAgICAgIG5hbWUgPSAiZG9fIiArIEZyYW1lV29yay5ldmVudG5hbWVbd2hhdF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSAiZG9fJWQiICUgd2hhdAorICAgICAgICB0cnk6CisgICAgICAgICAgICBoYW5kbGVyID0gZ2V0YXR0cihzZWxmLCBuYW1lKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldGF0dHIoc2VsZi5hcHAsIG5hbWUpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuYXBwLmRvX3Vua25vd25ldmVudAorICAgICAgICBoYW5kbGVyKGV2ZW50KQorCiAKIGRlZiBGcm9udFdpbmRvd0luc2VydChzdHVmZik6Ci0JaWYgbm90IHN0dWZmOgotCQlyZXR1cm4KLQlpZiB0eXBlKHN0dWZmKSA8PiBTdHJpbmdUeXBlOgotCQlyYWlzZSBUeXBlRXJyb3IsICdzdHJpbmcgZXhwZWN0ZWQnCi0JaW1wb3J0IFcKLQlhcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKLQl3aWQgPSBNeUZyb250V2luZG93KCkKLQlpZiB3aWQgYW5kIGFwcC5fd2luZG93cy5oYXNfa2V5KHdpZCk6Ci0JCXdpbmRvdyA9IGFwcC5fd2luZG93c1t3aWRdCi0JCWlmIGhhc2F0dHIod2luZG93LCAiaW5zZXJ0Iik6Ci0JCQl0cnk6Ci0JCQkJd2luZG93Lmluc2VydChzdHVmZikKLQkJCQlyZXR1cm4KLQkJCWV4Y2VwdDoKLQkJCQlwYXNzCi0JaW1wb3J0IEVhc3lEaWFsb2dzCi0JaWYgRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoCi0JCQkiQ2FuJ3QgZmluZCB3aW5kb3cgb3Igd2lkZ2V0IHRvIGluc2VydCB0ZXh0IGludG87IGNvcHkgdG8gY2xpcGJvYXJkIGluc3RlYWQ/IiwgCi0JCQkxKSA9PSAxOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgU2NyYXAKLQkJaWYgaGFzYXR0cihTY3JhcCwgJ1B1dFNjcmFwJyk6Ci0JCQlTY3JhcC5aZXJvU2NyYXAoKQotCQkJU2NyYXAuUHV0U2NyYXAoJ1RFWFQnLCBzdHVmZikKLQkJZWxzZToKLQkJCVNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKLQkJCXNjID0gU2NyYXAuR2V0Q3VycmVudFNjcmFwKCkKLQkJCXNjLlB1dFNjcmFwRmxhdm9yKCdURVhUJywgMCwgc3R1ZmYpCisgICAgaWYgbm90IHN0dWZmOgorICAgICAgICByZXR1cm4KKyAgICBpZiB0eXBlKHN0dWZmKSA8PiBTdHJpbmdUeXBlOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdzdHJpbmcgZXhwZWN0ZWQnCisgICAgaW1wb3J0IFcKKyAgICBhcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKKyAgICB3aWQgPSBNeUZyb250V2luZG93KCkKKyAgICBpZiB3aWQgYW5kIGFwcC5fd2luZG93cy5oYXNfa2V5KHdpZCk6CisgICAgICAgIHdpbmRvdyA9IGFwcC5fd2luZG93c1t3aWRdCisgICAgICAgIGlmIGhhc2F0dHIod2luZG93LCAiaW5zZXJ0Iik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2luZG93Lmluc2VydChzdHVmZikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgaW1wb3J0IEVhc3lEaWFsb2dzCisgICAgaWYgRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBmaW5kIHdpbmRvdyBvciB3aWRnZXQgdG8gaW5zZXJ0IHRleHQgaW50bzsgY29weSB0byBjbGlwYm9hcmQgaW5zdGVhZD8iLAorICAgICAgICAgICAgICAgICAgICAxKSA9PSAxOgorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgU2NyYXAKKyAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ1B1dFNjcmFwJyk6CisgICAgICAgICAgICBTY3JhcC5aZXJvU2NyYXAoKQorICAgICAgICAgICAgU2NyYXAuUHV0U2NyYXAoJ1RFWFQnLCBzdHVmZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKKyAgICAgICAgICAgIHNjID0gU2NyYXAuR2V0Q3VycmVudFNjcmFwKCkKKyAgICAgICAgICAgIHNjLlB1dFNjcmFwRmxhdm9yKCdURVhUJywgMCwgc3R1ZmYpCiAKIAotIyBub3QgcXVpdGUgYmFzZWQgb24gdGhlIHNhbWUgZnVuY3Rpb24gaW4gRnJhbWVXb3JrCQorIyBub3QgcXVpdGUgYmFzZWQgb24gdGhlIHNhbWUgZnVuY3Rpb24gaW4gRnJhbWVXb3JrCiBfd2luZG93Y291bnRlciA9IDAKIAogZGVmIGdldG5leHR3aW5kb3dwb3MoKToKLQlnbG9iYWwgX3dpbmRvd2NvdW50ZXIKLQlyb3dzID0gOAotCWwgPSA0ICogKHJvd3MgKyAxIC0gKF93aW5kb3djb3VudGVyICUgcm93cykgKyBfd2luZG93Y291bnRlciAvIHJvd3MpCi0JdCA9IDQ0ICsgMjAgKiAoX3dpbmRvd2NvdW50ZXIgJSByb3dzKQotCV93aW5kb3djb3VudGVyID0gX3dpbmRvd2NvdW50ZXIgKyAxCi0JcmV0dXJuIGwsIHQKKyAgICBnbG9iYWwgX3dpbmRvd2NvdW50ZXIKKyAgICByb3dzID0gOAorICAgIGwgPSA0ICogKHJvd3MgKyAxIC0gKF93aW5kb3djb3VudGVyICUgcm93cykgKyBfd2luZG93Y291bnRlciAvIHJvd3MpCisgICAgdCA9IDQ0ICsgMjAgKiAoX3dpbmRvd2NvdW50ZXIgJSByb3dzKQorICAgIF93aW5kb3djb3VudGVyID0gX3dpbmRvd2NvdW50ZXIgKyAxCisgICAgcmV0dXJuIGwsIHQKIAogZGVmIHdpbmRvd2JvdW5kcyhwcmVmZXJyZWRzaXplLCBtaW5zaXplPU5vbmUpOgotCSJSZXR1cm4gc2Vuc2libGUgd2luZG93IGJvdW5kcyIKLQkKLQlnbG9iYWwgX3dpbmRvd2NvdW50ZXIKLQlpZiBsZW4ocHJlZmVycmVkc2l6ZSkgPT0gNDoKLQkJYm91bmRzID0gbCwgdCwgciwgYiA9IHByZWZlcnJlZHNpemUKLQkJZGVza3RvcFJnbiA9IFdpbi5HZXRHcmF5UmduKCkKLQkJdGVtcFJnbiA9IFFkLk5ld1JnbigpCi0JCVFkLlJlY3RSZ24odGVtcFJnbiwgYm91bmRzKQotCQl1bmlvbiA9IFFkLlVuaW9uUmduKHRlbXBSZ24sIGRlc2t0b3BSZ24sIHRlbXBSZ24pCi0JCWVxdWFsID0gUWQuRXF1YWxSZ24odGVtcFJnbiwgZGVza3RvcFJnbikKLQkJUWQuRGlzcG9zZVJnbih0ZW1wUmduKQotCQlpZiBlcXVhbDoKLQkJCXJldHVybiBib3VuZHMKLQkJZWxzZToKLQkJCXByZWZlcnJlZHNpemUgPSByIC0gbCwgYiAtIHQKLQlpZiBub3QgbWluc2l6ZToKLQkJbWluc2l6ZSA9IHByZWZlcnJlZHNpemUKLQltaW53aWR0aCwgbWluaGVpZ2h0ID0gbWluc2l6ZQotCXdpZHRoLCBoZWlnaHQgPSBwcmVmZXJyZWRzaXplCi0JCi0Jc2wsIHN0LCBzciwgc2IgPSBzY3JlZW5ib3VuZHMgPSBRZC5JbnNldFJlY3QoUWQuR2V0UURHbG9iYWxzU2NyZWVuQml0cygpLmJvdW5kcywgNCwgNCkKLQlsLCB0ID0gZ2V0bmV4dHdpbmRvd3BvcygpCi0JaWYgKGwgKyB3aWR0aCkgPiBzcjoKLQkJX3dpbmRvd2NvdW50ZXIgPSAwCi0JCWwsIHQgPSBnZXRuZXh0d2luZG93cG9zKCkKLQlyID0gbCArIHdpZHRoCi0JYiA9IHQgKyBoZWlnaHQKLQlpZiAodCArIGhlaWdodCkgPiBzYjoKLQkJYiA9IHNiCi0JCWlmIChiIC0gdCkgPCBtaW5oZWlnaHQ6Ci0JCQliID0gdCArIG1pbmhlaWdodAotCXJldHVybiBsLCB0LCByLCBiCisgICAgIlJldHVybiBzZW5zaWJsZSB3aW5kb3cgYm91bmRzIgorCisgICAgZ2xvYmFsIF93aW5kb3djb3VudGVyCisgICAgaWYgbGVuKHByZWZlcnJlZHNpemUpID09IDQ6CisgICAgICAgIGJvdW5kcyA9IGwsIHQsIHIsIGIgPSBwcmVmZXJyZWRzaXplCisgICAgICAgIGRlc2t0b3BSZ24gPSBXaW4uR2V0R3JheVJnbigpCisgICAgICAgIHRlbXBSZ24gPSBRZC5OZXdSZ24oKQorICAgICAgICBRZC5SZWN0UmduKHRlbXBSZ24sIGJvdW5kcykKKyAgICAgICAgdW5pb24gPSBRZC5VbmlvblJnbih0ZW1wUmduLCBkZXNrdG9wUmduLCB0ZW1wUmduKQorICAgICAgICBlcXVhbCA9IFFkLkVxdWFsUmduKHRlbXBSZ24sIGRlc2t0b3BSZ24pCisgICAgICAgIFFkLkRpc3Bvc2VSZ24odGVtcFJnbikKKyAgICAgICAgaWYgZXF1YWw6CisgICAgICAgICAgICByZXR1cm4gYm91bmRzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmVmZXJyZWRzaXplID0gciAtIGwsIGIgLSB0CisgICAgaWYgbm90IG1pbnNpemU6CisgICAgICAgIG1pbnNpemUgPSBwcmVmZXJyZWRzaXplCisgICAgbWlud2lkdGgsIG1pbmhlaWdodCA9IG1pbnNpemUKKyAgICB3aWR0aCwgaGVpZ2h0ID0gcHJlZmVycmVkc2l6ZQorCisgICAgc2wsIHN0LCBzciwgc2IgPSBzY3JlZW5ib3VuZHMgPSBRZC5JbnNldFJlY3QoUWQuR2V0UURHbG9iYWxzU2NyZWVuQml0cygpLmJvdW5kcywgNCwgNCkKKyAgICBsLCB0ID0gZ2V0bmV4dHdpbmRvd3BvcygpCisgICAgaWYgKGwgKyB3aWR0aCkgPiBzcjoKKyAgICAgICAgX3dpbmRvd2NvdW50ZXIgPSAwCisgICAgICAgIGwsIHQgPSBnZXRuZXh0d2luZG93cG9zKCkKKyAgICByID0gbCArIHdpZHRoCisgICAgYiA9IHQgKyBoZWlnaHQKKyAgICBpZiAodCArIGhlaWdodCkgPiBzYjoKKyAgICAgICAgYiA9IHNiCisgICAgICAgIGlmIChiIC0gdCkgPCBtaW5oZWlnaHQ6CisgICAgICAgICAgICBiID0gdCArIG1pbmhlaWdodAorICAgIHJldHVybiBsLCB0LCByLCBiCiAKIHNjcmF0Y2hSZWdpb24gPSBRZC5OZXdSZ24oKQogCiAjIHV0aWwgLS0gbW92ZSBzb21ld2hlcmUgY29udmVuaWVudD8/PwogZGVmIEdldFJnbkJvdW5kcyh0aGVfUmduKToKLQkodCwgbCwgYiwgcikgPSBzdHJ1Y3QudW5wYWNrKCJoaGhoIiwgdGhlX1Jnbi5kYXRhWzI6MTBdKQotCXJldHVybiAobCwgdCwgciwgYikKKyAgICAodCwgbCwgYiwgcikgPSBzdHJ1Y3QudW5wYWNrKCJoaGhoIiwgdGhlX1Jnbi5kYXRhWzI6MTBdKQorICAgIHJldHVybiAobCwgdCwgciwgYikKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9tYWNmcmVlemUvZGlyZWN0aXZlcy5weSBiL01hYy9Ub29scy9tYWNmcmVlemUvZGlyZWN0aXZlcy5weQppbmRleCAzZWY5NjYxLi43ZjYxNDJlIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvbWFjZnJlZXplL2RpcmVjdGl2ZXMucHkKKysrIGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9kaXJlY3RpdmVzLnB5CkBAIC0xNywyNyArMTcsMjYgQEAKIFJFUFJPRz1yZS5jb21waWxlKERJUkVDVElWRV9SRSkKIAogZGVmIGZpbmRmcmVlemVkaXJlY3RpdmVzKHByb2dyYW0pOgotCWV4dHJhX21vZHVsZXMgPSBbXQotCWV4Y2x1ZGVfbW9kdWxlcyA9IFtdCi0Jb3B0aW9uYWxfbW9kdWxlcyA9IFtdCi0JZXh0cmFfcGF0aCA9IFtdCi0JcHJvZ2RpciwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHByb2dyYW0pCi0JZnAgPSBvcGVuKHByb2dyYW0pCi0JZm9yIGxpbmUgaW4gZnAucmVhZGxpbmVzKCk6Ci0JCW1hdGNoID0gUkVQUk9HLm1hdGNoKGxpbmUpCi0JCWlmIG1hdGNoOgotCQkJZGlyZWN0aXZlID0gbWF0Y2guZ3JvdXAoMSkKLQkJCWFyZ3VtZW50ID0gbWF0Y2guZ3JvdXAoMikKLQkJCWlmIGRpcmVjdGl2ZSA9PSAnaW5jbHVkZSc6Ci0JCQkJZXh0cmFfbW9kdWxlcy5hcHBlbmQoYXJndW1lbnQpCi0JCQllbGlmIGRpcmVjdGl2ZSA9PSAnZXhjbHVkZSc6Ci0JCQkJZXhjbHVkZV9tb2R1bGVzLmFwcGVuZChhcmd1bWVudCkKLQkJCWVsaWYgZGlyZWN0aXZlID09ICdvcHRpb25hbCc6Ci0JCQkJb3B0aW9uYWxfbW9kdWxlcy5hcHBlbmQoYXJndW1lbnQpCi0JCQllbGlmIGRpcmVjdGl2ZSA9PSAncGF0aCc6Ci0JCQkJYXJndW1lbnQgPSBvcy5wYXRoLmpvaW4ocHJvZ2RpciwgYXJndW1lbnQpCi0JCQkJZXh0cmFfcGF0aC5hcHBlbmQoYXJndW1lbnQpCi0JCQllbHNlOgotCQkJCXByaW50ICcqKiBVbmtub3duIGRpcmVjdGl2ZScsIGxpbmUKLQlyZXR1cm4gZXh0cmFfbW9kdWxlcywgZXhjbHVkZV9tb2R1bGVzLCBvcHRpb25hbF9tb2R1bGVzLCBleHRyYV9wYXRoCi0JCisgICAgZXh0cmFfbW9kdWxlcyA9IFtdCisgICAgZXhjbHVkZV9tb2R1bGVzID0gW10KKyAgICBvcHRpb25hbF9tb2R1bGVzID0gW10KKyAgICBleHRyYV9wYXRoID0gW10KKyAgICBwcm9nZGlyLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQocHJvZ3JhbSkKKyAgICBmcCA9IG9wZW4ocHJvZ3JhbSkKKyAgICBmb3IgbGluZSBpbiBmcC5yZWFkbGluZXMoKToKKyAgICAgICAgbWF0Y2ggPSBSRVBST0cubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBkaXJlY3RpdmUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgYXJndW1lbnQgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICAgICAgaWYgZGlyZWN0aXZlID09ICdpbmNsdWRlJzoKKyAgICAgICAgICAgICAgICBleHRyYV9tb2R1bGVzLmFwcGVuZChhcmd1bWVudCkKKyAgICAgICAgICAgIGVsaWYgZGlyZWN0aXZlID09ICdleGNsdWRlJzoKKyAgICAgICAgICAgICAgICBleGNsdWRlX21vZHVsZXMuYXBwZW5kKGFyZ3VtZW50KQorICAgICAgICAgICAgZWxpZiBkaXJlY3RpdmUgPT0gJ29wdGlvbmFsJzoKKyAgICAgICAgICAgICAgICBvcHRpb25hbF9tb2R1bGVzLmFwcGVuZChhcmd1bWVudCkKKyAgICAgICAgICAgIGVsaWYgZGlyZWN0aXZlID09ICdwYXRoJzoKKyAgICAgICAgICAgICAgICBhcmd1bWVudCA9IG9zLnBhdGguam9pbihwcm9nZGlyLCBhcmd1bWVudCkKKyAgICAgICAgICAgICAgICBleHRyYV9wYXRoLmFwcGVuZChhcmd1bWVudCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJyoqIFVua25vd24gZGlyZWN0aXZlJywgbGluZQorICAgIHJldHVybiBleHRyYV9tb2R1bGVzLCBleGNsdWRlX21vZHVsZXMsIG9wdGlvbmFsX21vZHVsZXMsIGV4dHJhX3BhdGgKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZnJlZXplLnB5IGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNmcmVlemUucHkKaW5kZXggOGEyY2E3Ni4uYjJjZjcyZSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNmcmVlemUucHkKKysrIGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNmcmVlemUucHkKQEAgLTI2LDUwICsyNiw1MCBAQAogIwogCiBkZWYgbWFpbigpOgotCWlmIGxlbihzeXMuYXJndikgPCAyOgotCQlnZW50eXBlLCBwcm9ncmFtLCBvdXRwdXQsIGRlYnVnID0gbWFjZnJlZXplZ3VpLmRpYWxvZygpCi0JZWxpZiBsZW4oc3lzLmFyZ3YpID09IDI6Ci0JCWdlbnR5cGUsIHByb2dyYW0sIG91dHB1dCwgZGVidWcgPSBtYWNmcmVlemVndWkuZGlhbG9nKHN5cy5hcmd2WzFdKQotCWVsc2U6Ci0JCUVhc3lEaWFsb2cuTWVzc2FnZSgKLQkJICAiUGxlYXNlIHBhc3MgYSBzaW5nbGUgc2NyaXB0LiBBZGRpdGlvbmFsIG1vZHVsZXMgY2FuIGJlIHNwZWNpZmllZCB3aXRoIGRpcmVjdGl2ZXMiKQotCQlzeXMuZXhpdCgwKQotCW11c3R3YWl0ID0gcHJvY2VzcyhnZW50eXBlLCBwcm9ncmFtLCBvdXRwdXQsIGRlYnVnPWRlYnVnKQotCWlmIG11c3R3YWl0OgotCQlzeXMuZXhpdCgxKQorICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgorICAgICAgICBnZW50eXBlLCBwcm9ncmFtLCBvdXRwdXQsIGRlYnVnID0gbWFjZnJlZXplZ3VpLmRpYWxvZygpCisgICAgZWxpZiBsZW4oc3lzLmFyZ3YpID09IDI6CisgICAgICAgIGdlbnR5cGUsIHByb2dyYW0sIG91dHB1dCwgZGVidWcgPSBtYWNmcmVlemVndWkuZGlhbG9nKHN5cy5hcmd2WzFdKQorICAgIGVsc2U6CisgICAgICAgIEVhc3lEaWFsb2cuTWVzc2FnZSgKKyAgICAgICAgICAiUGxlYXNlIHBhc3MgYSBzaW5nbGUgc2NyaXB0LiBBZGRpdGlvbmFsIG1vZHVsZXMgY2FuIGJlIHNwZWNpZmllZCB3aXRoIGRpcmVjdGl2ZXMiKQorICAgICAgICBzeXMuZXhpdCgwKQorICAgIG11c3R3YWl0ID0gcHJvY2VzcyhnZW50eXBlLCBwcm9ncmFtLCBvdXRwdXQsIGRlYnVnPWRlYnVnKQorICAgIGlmIG11c3R3YWl0OgorICAgICAgICBzeXMuZXhpdCgxKQogCiBkZWYgcHJvY2VzcyhnZW50eXBlLCBwcm9ncmFtLCBvdXRwdXQsIG1vZHVsZXM9Tm9uZSwgbW9kdWxlX2ZpbGVzPU5vbmUsIGRlYnVnPTAsIHdpdGhfaWZkZWY9MCk6Ci0JaWYgbW9kdWxlcyBpcyBOb25lOgotCQltb2R1bGVzID0gW10KLQlpZiBtb2R1bGVfZmlsZXMgaXMgTm9uZToKLQkJbW9kdWxlX2ZpbGVzID0gW10KLQltb2R1bGVfZGljdCwgbWlzc2luZyA9IG1hY21vZHVsZWZpbmRlci5wcm9jZXNzKHByb2dyYW0sIG1vZHVsZXMsIG1vZHVsZV9maWxlcywgZGVidWcpCi0JaWYgbWlzc2luZzoKLQkJbWlzc2luZy5zb3J0KCkKLQkJcHJpbnQgJyoqIE1pc3NpbmcgbW9kdWxlczonLCBzdHJpbmcuam9pbihtaXNzaW5nLCAnICcpCi0JCXN5cy5leGl0KDEpCi0JIwotCSMgQW5kIGdlbmVyYXRlCi0JIwotCWlmIGdlbnR5cGUgPT0gJ2luZm8nOgotCQlpbXBvcnQgbWFjZ2VuX2luZm8KLQkJbWFjZ2VuX2luZm8uZ2VuZXJhdGUob3V0cHV0LCBtb2R1bGVfZGljdCkKLQkJcmV0dXJuIDEJCSMgU28gdGhlIHVzZXIgY2FuIGluc3BlY3QgaXQKLQllbGlmIGdlbnR5cGUgPT0gJ3NvdXJjZSc6Ci0JCWltcG9ydCBtYWNnZW5fc3JjCi0JCXdhcm5pbmdzID0gbWFjZ2VuX3NyYy5nZW5lcmF0ZShvdXRwdXQsIG1vZHVsZV9kaWN0LCBkZWJ1Zywgd2l0aF9pZmRlZikKLQkJcmV0dXJuIHdhcm5pbmdzCi0JZWxpZiBnZW50eXBlID09ICdyZXNvdXJjZSc6Ci0JCWltcG9ydCBtYWNnZW5fcnNyYwotCQltYWNnZW5fcnNyYy5nZW5lcmF0ZShvdXRwdXQsIG1vZHVsZV9kaWN0LCBkZWJ1ZykKLQkJd2FybmluZ3MgPSBtYWNnZW5fcnNyYy53YXJuaW5ncyhtb2R1bGVfZGljdCkKLQkJcmV0dXJuIHdhcm5pbmdzCi0JZWxpZiBnZW50eXBlID09ICdhcHBsZXQnOgotCQlpbXBvcnQgbWFjZ2VuX2JpbgotCQlhcmNoaXRlY3R1cmUgPSAnZmF0JyAjIHVzZXIgc2hvdWxkIGNob29zZQotCQltYWNnZW5fYmluLmdlbmVyYXRlKHByb2dyYW0sIG91dHB1dCwgbW9kdWxlX2RpY3QsIGFyY2hpdGVjdHVyZSwgZGVidWcpCi0JZWxzZToKLQkJcmFpc2UgJ3Vua25vd24gZ2VudHlwZScsIGdlbnR5cGUKKyAgICBpZiBtb2R1bGVzIGlzIE5vbmU6CisgICAgICAgIG1vZHVsZXMgPSBbXQorICAgIGlmIG1vZHVsZV9maWxlcyBpcyBOb25lOgorICAgICAgICBtb2R1bGVfZmlsZXMgPSBbXQorICAgIG1vZHVsZV9kaWN0LCBtaXNzaW5nID0gbWFjbW9kdWxlZmluZGVyLnByb2Nlc3MocHJvZ3JhbSwgbW9kdWxlcywgbW9kdWxlX2ZpbGVzLCBkZWJ1ZykKKyAgICBpZiBtaXNzaW5nOgorICAgICAgICBtaXNzaW5nLnNvcnQoKQorICAgICAgICBwcmludCAnKiogTWlzc2luZyBtb2R1bGVzOicsIHN0cmluZy5qb2luKG1pc3NpbmcsICcgJykKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAjCisgICAgIyBBbmQgZ2VuZXJhdGUKKyAgICAjCisgICAgaWYgZ2VudHlwZSA9PSAnaW5mbyc6CisgICAgICAgIGltcG9ydCBtYWNnZW5faW5mbworICAgICAgICBtYWNnZW5faW5mby5nZW5lcmF0ZShvdXRwdXQsIG1vZHVsZV9kaWN0KQorICAgICAgICByZXR1cm4gMSAgICAgICAgICAgICAgICAjIFNvIHRoZSB1c2VyIGNhbiBpbnNwZWN0IGl0CisgICAgZWxpZiBnZW50eXBlID09ICdzb3VyY2UnOgorICAgICAgICBpbXBvcnQgbWFjZ2VuX3NyYworICAgICAgICB3YXJuaW5ncyA9IG1hY2dlbl9zcmMuZ2VuZXJhdGUob3V0cHV0LCBtb2R1bGVfZGljdCwgZGVidWcsIHdpdGhfaWZkZWYpCisgICAgICAgIHJldHVybiB3YXJuaW5ncworICAgIGVsaWYgZ2VudHlwZSA9PSAncmVzb3VyY2UnOgorICAgICAgICBpbXBvcnQgbWFjZ2VuX3JzcmMKKyAgICAgICAgbWFjZ2VuX3JzcmMuZ2VuZXJhdGUob3V0cHV0LCBtb2R1bGVfZGljdCwgZGVidWcpCisgICAgICAgIHdhcm5pbmdzID0gbWFjZ2VuX3JzcmMud2FybmluZ3MobW9kdWxlX2RpY3QpCisgICAgICAgIHJldHVybiB3YXJuaW5ncworICAgIGVsaWYgZ2VudHlwZSA9PSAnYXBwbGV0JzoKKyAgICAgICAgaW1wb3J0IG1hY2dlbl9iaW4KKyAgICAgICAgYXJjaGl0ZWN0dXJlID0gJ2ZhdCcgIyB1c2VyIHNob3VsZCBjaG9vc2UKKyAgICAgICAgbWFjZ2VuX2Jpbi5nZW5lcmF0ZShwcm9ncmFtLCBvdXRwdXQsIG1vZHVsZV9kaWN0LCBhcmNoaXRlY3R1cmUsIGRlYnVnKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlICd1bmtub3duIGdlbnR5cGUnLCBnZW50eXBlCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2ZyZWV6ZWd1aS5weSBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZnJlZXplZ3VpLnB5CmluZGV4IDVkZDM0MzUuLjQxZDBlYzggMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZnJlZXplZ3VpLnB5CisrKyBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZnJlZXplZ3VpLnB5CkBAIC0zMCwxMjEgKzMwLDEyMSBAQAogSVRFTV9HRU5JTkZPPTIwCiAKIFJBRElPX0dST1VQSU5HPXsKLQlJVEVNX0dFTlNPVVJDRTogSVRFTV9HRU5TT1VSQ0VfSVRFTVMsCi0JSVRFTV9HRU5SRVNPVVJDRTogSVRFTV9HRU5SRVNPVVJDRV9JVEVNUywKLQlJVEVNX0dFTkFQUExFVDogSVRFTV9HRU5BUFBMRVRfSVRFTVMsCi0JSVRFTV9HRU5JTkZPOiAoKQorICAgICAgICBJVEVNX0dFTlNPVVJDRTogSVRFTV9HRU5TT1VSQ0VfSVRFTVMsCisgICAgICAgIElURU1fR0VOUkVTT1VSQ0U6IElURU1fR0VOUkVTT1VSQ0VfSVRFTVMsCisgICAgICAgIElURU1fR0VOQVBQTEVUOiBJVEVNX0dFTkFQUExFVF9JVEVNUywKKyAgICAgICAgSVRFTV9HRU5JTkZPOiAoKQogfQogCiBkZWYgZGlhbG9nKHNjcmlwdD1Ob25lKToKIAotCSMgSW52ZW50IHRoZSB2YXJpb3VzIG5hbWVzCi0JaWYgbm90IHNjcmlwdDoKLQkJZnNzLCBvayA9IG1hY2ZzLlByb21wdEdldEZpbGUoIlNjcmlwdD8iLCAiVEVYVCIpCi0JCWlmIG5vdCBvazoKLQkJCXN5cy5leGl0KDApCi0JCXNjcmlwdCA9IGZzcy5hc19wYXRobmFtZSgpCi0JYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2NyaXB0KQotCWlmIGV4dDoKLQkJYXBwbGV0bmFtZSA9IGJhc2VuYW1lCi0JCXJzcmNuYW1lID0gYmFzZW5hbWUgKyAnbW9kdWxlcy5yc3JjJwotCWVsc2U6Ci0JCWFwcGxldG5hbWUgPSBzY3JpcHQgKyAnLmFwcGxldCcKLQkJcnNyY25hbWUgPSBzY3JpcHQgKyAnbW9kdWxlcy5yc3JjJwotCWRpcm5hbWUsIGJhc2ViYXNlID0gb3MucGF0aC5zcGxpdChiYXNlbmFtZSkKLQlkaXJuYW1lID0gb3MucGF0aC5qb2luKGRpcm5hbWUsICdidWlsZC4nK2Jhc2ViYXNlKQotCQotCSMgR2V0IHRoZSBkaWFsb2csIHBvc3NpYmx5IG9wZW5pbmcgdGhlIHJlc291cmNlIGZpbGUgKGlmIG5lZWRlZCkKLQltYWNyZXNvdXJjZS5uZWVkKCdETE9HJywgSURfTUFJTkRJQUxPRywgJ21hY2ZyZWV6ZS5yc3JjJykKLQlkID0gRGxnLkdldE5ld0RpYWxvZyhJRF9NQUlORElBTE9HLCAtMSkKLQlpZiBkID09IE5vbmU6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIkRpYWxvZyByZXNvdXJjZSBub3QgZm91bmQgb3IgZmF1bHR5IikKLQkJc3lzLmV4aXQoMSkKLQkKLQkjIEZpbGwgdGhlIGRpYWxvZwotCWQuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oSVRFTV9PSykKLQlkLlNldERpYWxvZ0NhbmNlbEl0ZW0oSVRFTV9DQU5DRUwpCi0JCi0JX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9TQ1JJUFROQU1FLCBzY3JpcHQpCi0JX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9TT1VSQ0VESVJOQU1FLCBkaXJuYW1lKQotCV9kaWFsb2dzZXRmaWxlKGQsIElURU1fUkVTT1VSQ0VOQU1FLCByc3JjbmFtZSkKLQlfZGlhbG9nc2V0ZmlsZShkLCBJVEVNX0FQUExFVE5BTUUsIGFwcGxldG5hbWUpCisgICAgIyBJbnZlbnQgdGhlIHZhcmlvdXMgbmFtZXMKKyAgICBpZiBub3Qgc2NyaXB0OgorICAgICAgICBmc3MsIG9rID0gbWFjZnMuUHJvbXB0R2V0RmlsZSgiU2NyaXB0PyIsICJURVhUIikKKyAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgc2NyaXB0ID0gZnNzLmFzX3BhdGhuYW1lKCkKKyAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzY3JpcHQpCisgICAgaWYgZXh0OgorICAgICAgICBhcHBsZXRuYW1lID0gYmFzZW5hbWUKKyAgICAgICAgcnNyY25hbWUgPSBiYXNlbmFtZSArICdtb2R1bGVzLnJzcmMnCisgICAgZWxzZToKKyAgICAgICAgYXBwbGV0bmFtZSA9IHNjcmlwdCArICcuYXBwbGV0JworICAgICAgICByc3JjbmFtZSA9IHNjcmlwdCArICdtb2R1bGVzLnJzcmMnCisgICAgZGlybmFtZSwgYmFzZWJhc2UgPSBvcy5wYXRoLnNwbGl0KGJhc2VuYW1lKQorICAgIGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgJ2J1aWxkLicrYmFzZWJhc2UpCiAKLQlnZW50eXBlID0gSVRFTV9HRU5TT1VSQ0UKLQlfZGlhbG9ncmFkaW9ncm91cChkLCBJVEVNX0dFTlNPVVJDRSkKKyAgICAjIEdldCB0aGUgZGlhbG9nLCBwb3NzaWJseSBvcGVuaW5nIHRoZSByZXNvdXJjZSBmaWxlIChpZiBuZWVkZWQpCisgICAgbWFjcmVzb3VyY2UubmVlZCgnRExPRycsIElEX01BSU5ESUFMT0csICdtYWNmcmVlemUucnNyYycpCisgICAgZCA9IERsZy5HZXROZXdEaWFsb2coSURfTUFJTkRJQUxPRywgLTEpCisgICAgaWYgZCA9PSBOb25lOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJEaWFsb2cgcmVzb3VyY2Ugbm90IGZvdW5kIG9yIGZhdWx0eSIpCisgICAgICAgIHN5cy5leGl0KDEpCiAKLQkjIEludGVyYWN0Ci0JZC5HZXREaWFsb2dXaW5kb3coKS5TZXRXVGl0bGUoIlN0YW5kYWxvbmUgYXBwbGljYXRpb24gY3JlYXRpb24gb3B0aW9ucyIpCi0JZC5HZXREaWFsb2dXaW5kb3coKS5TaG93V2luZG93KCkKLQlkLkRyYXdEaWFsb2coKQotCXdoaWxlIDE6Ci0JCWl0ZW0gPSBEbGcuTW9kYWxEaWFsb2coTm9uZSkKLQkJaWYgaXRlbSA9PSBJVEVNX09LOgotCQkJYnJlYWsKLQkJZWxpZiBpdGVtID09IElURU1fQ0FOQ0VMOgotCQkJc3lzLmV4aXQoMCkKLQkJZWxpZiBpdGVtIGluIFJBRElPX0dST1VQSU5HLmtleXMoKToKLQkJCWdlbnR5cGUgPSBpdGVtCi0JCQlfZGlhbG9ncmFkaW9ncm91cChkLCBpdGVtKQotCQllbGlmIGl0ZW0gPT0gSVRFTV9TQ1JJUFRCUk9XU0U6Ci0JCQlmc3MsIG9rID0gbWFjZnMuUHJvbXB0R2V0RmlsZSgiU2NyaXB0PyIpCi0JCQlpZiBvazoKLQkJCQlzY3JpcHQgPSBmc3MuYXNfcGF0aG5hbWUoKQotCQkJCV9kaWFsb2dzZXRmaWxlKGQsIElURU1fU0NSSVBUTkFNRSwgc2NyaXB0KQotCQllbGlmIGl0ZW0gPT0gSVRFTV9TT1VSQ0VESVJCUk9XU0U6Ci0JCQlmc3MsIG9rID0gbWFjZnMuU3RhbmRhcmRQdXRGaWxlKCJPdXRwdXQgZm9sZGVyIG5hbWUiLCBvcy5wYXRoLnNwbGl0KGRpcm5hbWUpWzFdKQotCQkJaWYgb2s6Ci0JCQkJZGlybmFtZSA9IGZzcy5hc19wYXRobmFtZSgpCi0JCQkJX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9TT1VSQ0VESVJOQU1FLCBkaXJuYW1lKQotCQllbGlmIGl0ZW0gPT0gSVRFTV9SRVNPVVJDRUJST1dTRToKLQkJCWZzcywgb2sgPSBtYWNmcy5TdGFuZGFyZFB1dEZpbGUoIlJlc291cmNlIG91dHB1dCBmaWxlIiwgb3MucGF0aC5zcGxpdChyc3JjbmFtZSlbMV0pCi0JCQlpZiBvazoKLQkJCQlyc3JjbmFtZSA9IGZzcy5hc19wYXRobmFtZSgpCi0JCQkJX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9SRVNPVVJDRU5BTUUsIHJzcmNuYW1lKQotCQllbGlmIGl0ZW0gPT0gSVRFTV9BUFBMRVRCUk9XU0U6Ci0JCQlmc3MsIG9rID0gbWFjZnMuU3RhbmRhcmRQdXRGaWxlKCJBcHBsZXQgb3V0cHV0IGZpbGUiLCBvcy5wYXRoLnNwbGl0KGFwcGxldG5hbWUpWzFdKQotCQkJaWYgb2s6Ci0JCQkJYXBwbGV0bmFtZSA9IGZzcy5hc19wYXRobmFtZSgpCi0JCQkJX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9BUFBMRVROQU1FLCBhcHBsZXRuYW1lKQotCQllbHNlOgotCQkJcGFzcwotCXRwLCBoLCByZWN0ID0gZC5HZXREaWFsb2dJdGVtKElURU1fREVCVUcpCi0JZGVidWcgPSBEbGcuR2V0RGlhbG9nSXRlbVRleHQoaCkKLQl0cnk6Ci0JCWRlYnVnID0gc3RyaW5nLmF0b2koc3RyaW5nLnN0cmlwKGRlYnVnKSkKLQlleGNlcHQgVmFsdWVFcnJvcjoKLQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiSWxsZWdhbCBkZWJ1ZyB2YWx1ZSAlciwgc2V0IHRvIHplcm8uIiUoZGVidWcsKSkKLQkJZGVidWcgPSAwCi0JaWYgZ2VudHlwZSA9PSBJVEVNX0dFTlNPVVJDRToKLQkJcmV0dXJuICdzb3VyY2UnLCBzY3JpcHQsIGRpcm5hbWUsIGRlYnVnCi0JZWxpZiBnZW50eXBlID09IElURU1fR0VOUkVTT1VSQ0U6Ci0JCXJldHVybiAncmVzb3VyY2UnLCBzY3JpcHQsIHJzcmNuYW1lLCBkZWJ1ZwotCWVsaWYgZ2VudHlwZSA9PSBJVEVNX0dFTkFQUExFVDoKLQkJcmV0dXJuICdhcHBsZXQnLCBzY3JpcHQsIGFwcGxldG5hbWUsIGRlYnVnCi0JZWxpZiBnZW50eXBlID09IElURU1fR0VOSU5GTzoKLQkJcmV0dXJuICdpbmZvJywgc2NyaXB0LCAnJywgZGVidWcKLQlyYWlzZSAnRXJyb3IgaW4gZ2VudHlwZScsIGdlbnR5cGUKKyAgICAjIEZpbGwgdGhlIGRpYWxvZworICAgIGQuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oSVRFTV9PSykKKyAgICBkLlNldERpYWxvZ0NhbmNlbEl0ZW0oSVRFTV9DQU5DRUwpCisKKyAgICBfZGlhbG9nc2V0ZmlsZShkLCBJVEVNX1NDUklQVE5BTUUsIHNjcmlwdCkKKyAgICBfZGlhbG9nc2V0ZmlsZShkLCBJVEVNX1NPVVJDRURJUk5BTUUsIGRpcm5hbWUpCisgICAgX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9SRVNPVVJDRU5BTUUsIHJzcmNuYW1lKQorICAgIF9kaWFsb2dzZXRmaWxlKGQsIElURU1fQVBQTEVUTkFNRSwgYXBwbGV0bmFtZSkKKworICAgIGdlbnR5cGUgPSBJVEVNX0dFTlNPVVJDRQorICAgIF9kaWFsb2dyYWRpb2dyb3VwKGQsIElURU1fR0VOU09VUkNFKQorCisgICAgIyBJbnRlcmFjdAorICAgIGQuR2V0RGlhbG9nV2luZG93KCkuU2V0V1RpdGxlKCJTdGFuZGFsb25lIGFwcGxpY2F0aW9uIGNyZWF0aW9uIG9wdGlvbnMiKQorICAgIGQuR2V0RGlhbG9nV2luZG93KCkuU2hvd1dpbmRvdygpCisgICAgZC5EcmF3RGlhbG9nKCkKKyAgICB3aGlsZSAxOgorICAgICAgICBpdGVtID0gRGxnLk1vZGFsRGlhbG9nKE5vbmUpCisgICAgICAgIGlmIGl0ZW0gPT0gSVRFTV9PSzoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsaWYgaXRlbSA9PSBJVEVNX0NBTkNFTDoKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgIGVsaWYgaXRlbSBpbiBSQURJT19HUk9VUElORy5rZXlzKCk6CisgICAgICAgICAgICBnZW50eXBlID0gaXRlbQorICAgICAgICAgICAgX2RpYWxvZ3JhZGlvZ3JvdXAoZCwgaXRlbSkKKyAgICAgICAgZWxpZiBpdGVtID09IElURU1fU0NSSVBUQlJPV1NFOgorICAgICAgICAgICAgZnNzLCBvayA9IG1hY2ZzLlByb21wdEdldEZpbGUoIlNjcmlwdD8iKQorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgc2NyaXB0ID0gZnNzLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgICAgICAgICBfZGlhbG9nc2V0ZmlsZShkLCBJVEVNX1NDUklQVE5BTUUsIHNjcmlwdCkKKyAgICAgICAgZWxpZiBpdGVtID09IElURU1fU09VUkNFRElSQlJPV1NFOgorICAgICAgICAgICAgZnNzLCBvayA9IG1hY2ZzLlN0YW5kYXJkUHV0RmlsZSgiT3V0cHV0IGZvbGRlciBuYW1lIiwgb3MucGF0aC5zcGxpdChkaXJuYW1lKVsxXSkKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIGRpcm5hbWUgPSBmc3MuYXNfcGF0aG5hbWUoKQorICAgICAgICAgICAgICAgIF9kaWFsb2dzZXRmaWxlKGQsIElURU1fU09VUkNFRElSTkFNRSwgZGlybmFtZSkKKyAgICAgICAgZWxpZiBpdGVtID09IElURU1fUkVTT1VSQ0VCUk9XU0U6CisgICAgICAgICAgICBmc3MsIG9rID0gbWFjZnMuU3RhbmRhcmRQdXRGaWxlKCJSZXNvdXJjZSBvdXRwdXQgZmlsZSIsIG9zLnBhdGguc3BsaXQocnNyY25hbWUpWzFdKQorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgcnNyY25hbWUgPSBmc3MuYXNfcGF0aG5hbWUoKQorICAgICAgICAgICAgICAgIF9kaWFsb2dzZXRmaWxlKGQsIElURU1fUkVTT1VSQ0VOQU1FLCByc3JjbmFtZSkKKyAgICAgICAgZWxpZiBpdGVtID09IElURU1fQVBQTEVUQlJPV1NFOgorICAgICAgICAgICAgZnNzLCBvayA9IG1hY2ZzLlN0YW5kYXJkUHV0RmlsZSgiQXBwbGV0IG91dHB1dCBmaWxlIiwgb3MucGF0aC5zcGxpdChhcHBsZXRuYW1lKVsxXSkKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIGFwcGxldG5hbWUgPSBmc3MuYXNfcGF0aG5hbWUoKQorICAgICAgICAgICAgICAgIF9kaWFsb2dzZXRmaWxlKGQsIElURU1fQVBQTEVUTkFNRSwgYXBwbGV0bmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3MKKyAgICB0cCwgaCwgcmVjdCA9IGQuR2V0RGlhbG9nSXRlbShJVEVNX0RFQlVHKQorICAgIGRlYnVnID0gRGxnLkdldERpYWxvZ0l0ZW1UZXh0KGgpCisgICAgdHJ5OgorICAgICAgICBkZWJ1ZyA9IHN0cmluZy5hdG9pKHN0cmluZy5zdHJpcChkZWJ1ZykpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIklsbGVnYWwgZGVidWcgdmFsdWUgJXIsIHNldCB0byB6ZXJvLiIlKGRlYnVnLCkpCisgICAgICAgIGRlYnVnID0gMAorICAgIGlmIGdlbnR5cGUgPT0gSVRFTV9HRU5TT1VSQ0U6CisgICAgICAgIHJldHVybiAnc291cmNlJywgc2NyaXB0LCBkaXJuYW1lLCBkZWJ1ZworICAgIGVsaWYgZ2VudHlwZSA9PSBJVEVNX0dFTlJFU09VUkNFOgorICAgICAgICByZXR1cm4gJ3Jlc291cmNlJywgc2NyaXB0LCByc3JjbmFtZSwgZGVidWcKKyAgICBlbGlmIGdlbnR5cGUgPT0gSVRFTV9HRU5BUFBMRVQ6CisgICAgICAgIHJldHVybiAnYXBwbGV0Jywgc2NyaXB0LCBhcHBsZXRuYW1lLCBkZWJ1ZworICAgIGVsaWYgZ2VudHlwZSA9PSBJVEVNX0dFTklORk86CisgICAgICAgIHJldHVybiAnaW5mbycsIHNjcmlwdCwgJycsIGRlYnVnCisgICAgcmFpc2UgJ0Vycm9yIGluIGdlbnR5cGUnLCBnZW50eXBlCiAKIGRlZiBfZGlhbG9ncmFkaW9ncm91cChkLCBpdGVtKToKLQlmb3IgayBpbiBSQURJT19HUk9VUElORy5rZXlzKCk6Ci0JCXN1Yml0ZW1zID0gUkFESU9fR1JPVVBJTkdba10KLQkJdHAsIGgsIHJlY3QgPSBkLkdldERpYWxvZ0l0ZW0oaykKLQkJaWYgayA9PSBpdGVtOgotCQkJaC5hc19Db250cm9sKCkuU2V0Q29udHJvbFZhbHVlKDEpCi0JCQlmb3IgaTIgaW4gc3ViaXRlbXM6Ci0JCQkJZC5TaG93RGlhbG9nSXRlbShpMikKLQkJZWxzZToKLQkJCWguYXNfQ29udHJvbCgpLlNldENvbnRyb2xWYWx1ZSgwKQotCQkJZm9yIGkyIGluIHN1Yml0ZW1zOgotCQkJCWQuSGlkZURpYWxvZ0l0ZW0oaTIpCisgICAgZm9yIGsgaW4gUkFESU9fR1JPVVBJTkcua2V5cygpOgorICAgICAgICBzdWJpdGVtcyA9IFJBRElPX0dST1VQSU5HW2tdCisgICAgICAgIHRwLCBoLCByZWN0ID0gZC5HZXREaWFsb2dJdGVtKGspCisgICAgICAgIGlmIGsgPT0gaXRlbToKKyAgICAgICAgICAgIGguYXNfQ29udHJvbCgpLlNldENvbnRyb2xWYWx1ZSgxKQorICAgICAgICAgICAgZm9yIGkyIGluIHN1Yml0ZW1zOgorICAgICAgICAgICAgICAgIGQuU2hvd0RpYWxvZ0l0ZW0oaTIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoLmFzX0NvbnRyb2woKS5TZXRDb250cm9sVmFsdWUoMCkKKyAgICAgICAgICAgIGZvciBpMiBpbiBzdWJpdGVtczoKKyAgICAgICAgICAgICAgICBkLkhpZGVEaWFsb2dJdGVtKGkyKQogCiBkZWYgX2RpYWxvZ3NldGZpbGUoZCwgaXRlbSwgZmlsZSk6Ci0JaWYgbGVuKGZpbGUpID4gMzI6Ci0JCWZpbGUgPSAnXDMxMTonICsgb3MucGF0aC5zcGxpdChmaWxlKVsxXQotCXRwLCBoLCByZWN0ID0gZC5HZXREaWFsb2dJdGVtKGl0ZW0pCi0JRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIGZpbGUpCi0JCQkKKyAgICBpZiBsZW4oZmlsZSkgPiAzMjoKKyAgICAgICAgZmlsZSA9ICdcMzExOicgKyBvcy5wYXRoLnNwbGl0KGZpbGUpWzFdCisgICAgdHAsIGgsIHJlY3QgPSBkLkdldERpYWxvZ0l0ZW0oaXRlbSkKKyAgICBEbGcuU2V0RGlhbG9nSXRlbVRleHQoaCwgZmlsZSkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQl0eXBlLCBzY3JpcHQsIGZpbGUsIGRlYnVnID0gZGlhbG9nKCkKLQlwcmludCB0eXBlLCBzY3JpcHQsIGZpbGUsICdkZWJ1Zz0lZCclZGVidWcKLQlzeXMuZXhpdCgxKQorICAgIHR5cGUsIHNjcmlwdCwgZmlsZSwgZGVidWcgPSBkaWFsb2coKQorICAgIHByaW50IHR5cGUsIHNjcmlwdCwgZmlsZSwgJ2RlYnVnPSVkJyVkZWJ1ZworICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9iaW4ucHkgYi9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9iaW4ucHkKaW5kZXggODczNWUxNy4uYmZjZGM4YiAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5fYmluLnB5CisrKyBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuX2Jpbi5weQpAQCAtMTQsMjA4ICsxNCwyMDggQEAKIAogCiBkZWYgZ2VuZXJhdGUoaW5wdXQsIG91dHB1dCwgbW9kdWxlX2RpY3Q9Tm9uZSwgYXJjaGl0ZWN0dXJlPSdmYXQnLCBkZWJ1Zz0wKToKLQkjIHRyeSB0byByZW1vdmUgb2xkIGZpbGUKLQl0cnk6Ci0JCW9zLnJlbW92ZShvdXRwdXQpCi0JZXhjZXB0OgotCQlwYXNzCi0JCi0JaWYgbW9kdWxlX2RpY3QgaXMgTm9uZToKLQkJaW1wb3J0IG1hY21vZHVsZWZpbmRlcgotCQlwcmludCAiU2VhcmNoaW5nIGZvciBtb2R1bGVzLi4uIgotCQltb2R1bGVfZGljdCwgbWlzc2luZyA9IG1hY21vZHVsZWZpbmRlci5wcm9jZXNzKGlucHV0LCBbXSwgW10sIDEpCi0JCWlmIG1pc3Npbmc6Ci0JCQlpbXBvcnQgRWFzeURpYWxvZ3MKLQkJCW1pc3Npbmcuc29ydCgpCi0JCQlhbnN3ZXIgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgiU29tZSBtb2R1bGVzIGNvdWxkIG5vdCBiZSBmb3VuZDsgY29udGludWUgYW55d2F5P1xuKCVzKSIgCi0JCQkJCSUgc3RyaW5nLmpvaW4obWlzc2luZywgIiwgIikpCi0JCQlpZiBhbnN3ZXIgPD4gMToKLQkJCQlzeXMuZXhpdCgwKQotCQotCWFwcGxldHRlbXBsYXRlcGF0aCA9IGJ1aWxkdG9vbHMuZmluZHRlbXBsYXRlKCkKLQljb3JlcGF0aCA9IGZpbmRweXRob25jb3JlKCkKLQkKLQlkeW5hbWljbW9kdWxlcywgZHluYW1pY2ZpbGVzLCBleHRyYXJlc2ZpbGVzID0gZmluZGZyYWdtZW50cyhtb2R1bGVfZGljdCwgYXJjaGl0ZWN0dXJlKQotCQotCXByaW50ICdBZGRpbmcgIl9fbWFpbl9fIicKLQlidWlsZHRvb2xzLnByb2Nlc3MoYXBwbGV0dGVtcGxhdGVwYXRoLCBpbnB1dCwgb3V0cHV0LCAwKQotCQotCW91dHB1dHJlZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShvdXRwdXQsIDMpCi0JdHJ5OgotCQlSZXMuVXNlUmVzRmlsZShvdXRwdXRyZWYpCi0JCQotCQlwcmludCAiQWRkaW5nIFB5dGhvbiBtb2R1bGVzIgotCQlhZGRweXRob25tb2R1bGVzKG1vZHVsZV9kaWN0KQotCQkKLQkJcHJpbnQgIkFkZGluZyBQeXRob25Db3JlIHJlc291cmNlcyIKLQkJY29weXJlcyhjb3JlcGF0aCwgb3V0cHV0cmVmLCBbJ2NmcmcnLCAnUG9wdCcsICdHVVwyNjdJJ10sIDEpCi0JCQotCQlwcmludCAiQWRkaW5nIHJlc291cmNlcyBmcm9tIHNoYXJlZCBsaWJyYXJpZXMiCi0JCWZvciBwcGNwYXRoLCBjZm02OGtwYXRoIGluIGV4dHJhcmVzZmlsZXM6Ci0JCQlpZiBvcy5wYXRoLmV4aXN0cyhwcGNwYXRoKToKLQkJCQljb3B5cmVzKHBwY3BhdGgsIG91dHB1dHJlZiwgWydjZnJnJ10sIDEpCi0JCQllbGlmIG9zLnBhdGguZXhpc3RzKGNmbTY4a3BhdGgpOgotCQkJCWNvcHlyZXMoY2ZtNjhrcGF0aCwgb3V0cHV0cmVmLCBbJ2NmcmcnXSwgMSkKLQkJCi0JCXByaW50ICJGaXhpbmcgc3lzLnBhdGggcHJlZnMiCi0JCVJlcy5Vc2VSZXNGaWxlKG91dHB1dHJlZikKLQkJdHJ5OgotCQkJcmVzID0gUmVzLkdldDFSZXNvdXJjZSgnU1RSIycsIDIyOCkgIyBmcm9tIFB5dGhvbkNvcmUKLQkJZXhjZXB0IFJlcy5FcnJvcjogcGFzcwotCQllbHNlOgotCQkJcmVzLlJlbW92ZVJlc291cmNlKCkKLQkJIyBzZXR0aW5nIHByZWYgZmlsZSBuYW1lIHRvIGVtcHR5IHN0cmluZwotCQlyZXMgPSBSZXMuR2V0MU5hbWVkUmVzb3VyY2UoJ1NUUiAnLCAiUHl0aG9uUHJlZmVyZW5jZUZpbGVOYW1lIikKLQkJcmVzLmRhdGEgPSBQc3RyaW5nKCIiKQotCQlyZXMuQ2hhbmdlZFJlc291cmNlKCkKLQkJc3lzcGF0aHByZWYgPSAiJChBUFBMSUNBVElPTikiCi0JCXJlcyA9IFJlcy5SZXNvdXJjZSgiXDAwMFwwMDEiICsgUHN0cmluZyhzeXNwYXRocHJlZikpCi0JCXJlcy5BZGRSZXNvdXJjZSgiU1RSIyIsIDIyOSwgInN5cy5wYXRoIHByZWZlcmVuY2UiKQotCQkKLQkJcHJpbnQgIkNyZWF0aW5nICdQWUQgJyByZXNvdXJjZXMiCi0JCWZvciBtb2RuYW1lLCAocHBjZnJhZywgY2ZtNjhrZnJhZykgaW4gZHluYW1pY21vZHVsZXMuaXRlbXMoKToKLQkJCXJlcyA9IFJlcy5SZXNvdXJjZShQc3RyaW5nKHBwY2ZyYWcpICsgUHN0cmluZyhjZm02OGtmcmFnKSkKLQkJCWlkID0gMAotCQkJd2hpbGUgaWQgPCAxMjg6Ci0JCQkJaWQgPSBSZXMuVW5pcXVlMUlEKCdQWUQgJykKLQkJCXJlcy5BZGRSZXNvdXJjZSgnUFlEICcsIGlkLCBtb2RuYW1lKQotCWZpbmFsbHk6Ci0JCVJlcy5DbG9zZVJlc0ZpbGUob3V0cHV0cmVmKQotCXByaW50ICJNZXJnaW5nIGNvZGUgZnJhZ21lbnRzIgotCWNmbWZpbGUubWVyZ2VjZm1maWxlcyhbYXBwbGV0dGVtcGxhdGVwYXRoLCBjb3JlcGF0aF0gKyBkeW5hbWljZmlsZXMua2V5cygpLCAKLQkJCW91dHB1dCwgYXJjaGl0ZWN0dXJlKQotCQotCXByaW50ICJkb25lISIKKyAgICAjIHRyeSB0byByZW1vdmUgb2xkIGZpbGUKKyAgICB0cnk6CisgICAgICAgIG9zLnJlbW92ZShvdXRwdXQpCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisKKyAgICBpZiBtb2R1bGVfZGljdCBpcyBOb25lOgorICAgICAgICBpbXBvcnQgbWFjbW9kdWxlZmluZGVyCisgICAgICAgIHByaW50ICJTZWFyY2hpbmcgZm9yIG1vZHVsZXMuLi4iCisgICAgICAgIG1vZHVsZV9kaWN0LCBtaXNzaW5nID0gbWFjbW9kdWxlZmluZGVyLnByb2Nlc3MoaW5wdXQsIFtdLCBbXSwgMSkKKyAgICAgICAgaWYgbWlzc2luZzoKKyAgICAgICAgICAgIGltcG9ydCBFYXN5RGlhbG9ncworICAgICAgICAgICAgbWlzc2luZy5zb3J0KCkKKyAgICAgICAgICAgIGFuc3dlciA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCJTb21lIG1vZHVsZXMgY291bGQgbm90IGJlIGZvdW5kOyBjb250aW51ZSBhbnl3YXk/XG4oJXMpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3RyaW5nLmpvaW4obWlzc2luZywgIiwgIikpCisgICAgICAgICAgICBpZiBhbnN3ZXIgPD4gMToKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgYXBwbGV0dGVtcGxhdGVwYXRoID0gYnVpbGR0b29scy5maW5kdGVtcGxhdGUoKQorICAgIGNvcmVwYXRoID0gZmluZHB5dGhvbmNvcmUoKQorCisgICAgZHluYW1pY21vZHVsZXMsIGR5bmFtaWNmaWxlcywgZXh0cmFyZXNmaWxlcyA9IGZpbmRmcmFnbWVudHMobW9kdWxlX2RpY3QsIGFyY2hpdGVjdHVyZSkKKworICAgIHByaW50ICdBZGRpbmcgIl9fbWFpbl9fIicKKyAgICBidWlsZHRvb2xzLnByb2Nlc3MoYXBwbGV0dGVtcGxhdGVwYXRoLCBpbnB1dCwgb3V0cHV0LCAwKQorCisgICAgb3V0cHV0cmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKG91dHB1dCwgMykKKyAgICB0cnk6CisgICAgICAgIFJlcy5Vc2VSZXNGaWxlKG91dHB1dHJlZikKKworICAgICAgICBwcmludCAiQWRkaW5nIFB5dGhvbiBtb2R1bGVzIgorICAgICAgICBhZGRweXRob25tb2R1bGVzKG1vZHVsZV9kaWN0KQorCisgICAgICAgIHByaW50ICJBZGRpbmcgUHl0aG9uQ29yZSByZXNvdXJjZXMiCisgICAgICAgIGNvcHlyZXMoY29yZXBhdGgsIG91dHB1dHJlZiwgWydjZnJnJywgJ1BvcHQnLCAnR1VcMjY3SSddLCAxKQorCisgICAgICAgIHByaW50ICJBZGRpbmcgcmVzb3VyY2VzIGZyb20gc2hhcmVkIGxpYnJhcmllcyIKKyAgICAgICAgZm9yIHBwY3BhdGgsIGNmbTY4a3BhdGggaW4gZXh0cmFyZXNmaWxlczoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBwY3BhdGgpOgorICAgICAgICAgICAgICAgIGNvcHlyZXMocHBjcGF0aCwgb3V0cHV0cmVmLCBbJ2NmcmcnXSwgMSkKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoY2ZtNjhrcGF0aCk6CisgICAgICAgICAgICAgICAgY29weXJlcyhjZm02OGtwYXRoLCBvdXRwdXRyZWYsIFsnY2ZyZyddLCAxKQorCisgICAgICAgIHByaW50ICJGaXhpbmcgc3lzLnBhdGggcHJlZnMiCisgICAgICAgIFJlcy5Vc2VSZXNGaWxlKG91dHB1dHJlZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzID0gUmVzLkdldDFSZXNvdXJjZSgnU1RSIycsIDIyOCkgIyBmcm9tIFB5dGhvbkNvcmUKKyAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjogcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzLlJlbW92ZVJlc291cmNlKCkKKyAgICAgICAgIyBzZXR0aW5nIHByZWYgZmlsZSBuYW1lIHRvIGVtcHR5IHN0cmluZworICAgICAgICByZXMgPSBSZXMuR2V0MU5hbWVkUmVzb3VyY2UoJ1NUUiAnLCAiUHl0aG9uUHJlZmVyZW5jZUZpbGVOYW1lIikKKyAgICAgICAgcmVzLmRhdGEgPSBQc3RyaW5nKCIiKQorICAgICAgICByZXMuQ2hhbmdlZFJlc291cmNlKCkKKyAgICAgICAgc3lzcGF0aHByZWYgPSAiJChBUFBMSUNBVElPTikiCisgICAgICAgIHJlcyA9IFJlcy5SZXNvdXJjZSgiXDAwMFwwMDEiICsgUHN0cmluZyhzeXNwYXRocHJlZikpCisgICAgICAgIHJlcy5BZGRSZXNvdXJjZSgiU1RSIyIsIDIyOSwgInN5cy5wYXRoIHByZWZlcmVuY2UiKQorCisgICAgICAgIHByaW50ICJDcmVhdGluZyAnUFlEICcgcmVzb3VyY2VzIgorICAgICAgICBmb3IgbW9kbmFtZSwgKHBwY2ZyYWcsIGNmbTY4a2ZyYWcpIGluIGR5bmFtaWNtb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICByZXMgPSBSZXMuUmVzb3VyY2UoUHN0cmluZyhwcGNmcmFnKSArIFBzdHJpbmcoY2ZtNjhrZnJhZykpCisgICAgICAgICAgICBpZCA9IDAKKyAgICAgICAgICAgIHdoaWxlIGlkIDwgMTI4OgorICAgICAgICAgICAgICAgIGlkID0gUmVzLlVuaXF1ZTFJRCgnUFlEICcpCisgICAgICAgICAgICByZXMuQWRkUmVzb3VyY2UoJ1BZRCAnLCBpZCwgbW9kbmFtZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBSZXMuQ2xvc2VSZXNGaWxlKG91dHB1dHJlZikKKyAgICBwcmludCAiTWVyZ2luZyBjb2RlIGZyYWdtZW50cyIKKyAgICBjZm1maWxlLm1lcmdlY2ZtZmlsZXMoW2FwcGxldHRlbXBsYXRlcGF0aCwgY29yZXBhdGhdICsgZHluYW1pY2ZpbGVzLmtleXMoKSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBhcmNoaXRlY3R1cmUpCisKKyAgICBwcmludCAiZG9uZSEiCiAKIAogZGVmIGZpbmRmcmFnbWVudHMobW9kdWxlX2RpY3QsIGFyY2hpdGVjdHVyZSk6Ci0JZHluYW1pY21vZHVsZXMgPSB7fQotCWR5bmFtaWNmaWxlcyA9IHt9Ci0JZXh0cmFyZXNmaWxlcyA9IFtdCi0JZm9yIG5hbWUsIG1vZHVsZSBpbiBtb2R1bGVfZGljdC5pdGVtcygpOgotCQlpZiBtb2R1bGUuZ2V0dHlwZSgpIDw+ICdkeW5hbWljJzoKLQkJCWNvbnRpbnVlCi0JCXBhdGggPSByZXNvbHZlYWxpYXNmaWxlKG1vZHVsZS5fX2ZpbGVfXykKLQkJZGlyLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKLSMjCQlwcGNmaWxlLCBjZm02OGtmaWxlID0gbWFrZWZpbGVuYW1lcyhmaWxlbmFtZSkKLQkJcHBjZmlsZSA9IGZpbGVuYW1lCi0JCWNmbTY4a2ZpbGUgPSAiZHVtbXkuY2ZtNjhrLnNsYiIKLQkJCi0JCSMgcHBjIHN0dWZmCi0JCXBwY3BhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCBwcGNmaWxlKQotCQlpZiBhcmNoaXRlY3R1cmUgPD4gJ202OGsnOgotCQkJcHBjZnJhZywgZHluYW1pY2ZpbGVzID0gZ2V0ZnJhZ25hbWUocHBjcGF0aCwgZHluYW1pY2ZpbGVzKQotCQllbHNlOgotCQkJcHBjZnJhZyA9ICJfbm9fZnJhZ21lbnRfIgotCQkKLQkJIyA2OGsgc3R1ZmYKLQkJY2ZtNjhrcGF0aCA9IG9zLnBhdGguam9pbihkaXIsIGNmbTY4a2ZpbGUpCi0JCWlmIGFyY2hpdGVjdHVyZSA8PiAncHdwYyc6Ci0JCQljZm02OGtmcmFnLCBkeW5hbWljZmlsZXMgPSBnZXRmcmFnbmFtZShjZm02OGtwYXRoLCBkeW5hbWljZmlsZXMpCi0JCWVsc2U6Ci0JCQljZm02OGtmcmFnID0gIl9ub19mcmFnbWVudF8iCi0JCQotCQlkeW5hbWljbW9kdWxlc1tuYW1lXSA9IHBwY2ZyYWcsIGNmbTY4a2ZyYWcKLQkJaWYgKHBwY3BhdGgsIGNmbTY4a3BhdGgpIG5vdCBpbiBleHRyYXJlc2ZpbGVzOgotCQkJZXh0cmFyZXNmaWxlcy5hcHBlbmQoKHBwY3BhdGgsIGNmbTY4a3BhdGgpKQotCXJldHVybiBkeW5hbWljbW9kdWxlcywgZHluYW1pY2ZpbGVzLCBleHRyYXJlc2ZpbGVzCisgICAgZHluYW1pY21vZHVsZXMgPSB7fQorICAgIGR5bmFtaWNmaWxlcyA9IHt9CisgICAgZXh0cmFyZXNmaWxlcyA9IFtdCisgICAgZm9yIG5hbWUsIG1vZHVsZSBpbiBtb2R1bGVfZGljdC5pdGVtcygpOgorICAgICAgICBpZiBtb2R1bGUuZ2V0dHlwZSgpIDw+ICdkeW5hbWljJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHBhdGggPSByZXNvbHZlYWxpYXNmaWxlKG1vZHVsZS5fX2ZpbGVfXykKKyAgICAgICAgZGlyLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyMjICAgICAgICAgICAgICBwcGNmaWxlLCBjZm02OGtmaWxlID0gbWFrZWZpbGVuYW1lcyhmaWxlbmFtZSkKKyAgICAgICAgcHBjZmlsZSA9IGZpbGVuYW1lCisgICAgICAgIGNmbTY4a2ZpbGUgPSAiZHVtbXkuY2ZtNjhrLnNsYiIKKworICAgICAgICAjIHBwYyBzdHVmZgorICAgICAgICBwcGNwYXRoID0gb3MucGF0aC5qb2luKGRpciwgcHBjZmlsZSkKKyAgICAgICAgaWYgYXJjaGl0ZWN0dXJlIDw+ICdtNjhrJzoKKyAgICAgICAgICAgIHBwY2ZyYWcsIGR5bmFtaWNmaWxlcyA9IGdldGZyYWduYW1lKHBwY3BhdGgsIGR5bmFtaWNmaWxlcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBwY2ZyYWcgPSAiX25vX2ZyYWdtZW50XyIKKworICAgICAgICAjIDY4ayBzdHVmZgorICAgICAgICBjZm02OGtwYXRoID0gb3MucGF0aC5qb2luKGRpciwgY2ZtNjhrZmlsZSkKKyAgICAgICAgaWYgYXJjaGl0ZWN0dXJlIDw+ICdwd3BjJzoKKyAgICAgICAgICAgIGNmbTY4a2ZyYWcsIGR5bmFtaWNmaWxlcyA9IGdldGZyYWduYW1lKGNmbTY4a3BhdGgsIGR5bmFtaWNmaWxlcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNmbTY4a2ZyYWcgPSAiX25vX2ZyYWdtZW50XyIKKworICAgICAgICBkeW5hbWljbW9kdWxlc1tuYW1lXSA9IHBwY2ZyYWcsIGNmbTY4a2ZyYWcKKyAgICAgICAgaWYgKHBwY3BhdGgsIGNmbTY4a3BhdGgpIG5vdCBpbiBleHRyYXJlc2ZpbGVzOgorICAgICAgICAgICAgZXh0cmFyZXNmaWxlcy5hcHBlbmQoKHBwY3BhdGgsIGNmbTY4a3BhdGgpKQorICAgIHJldHVybiBkeW5hbWljbW9kdWxlcywgZHluYW1pY2ZpbGVzLCBleHRyYXJlc2ZpbGVzCiAKIAogZGVmIGdldGZyYWduYW1lKHBhdGgsIGR5bmFtaWNmaWxlcyk6Ci0JaWYgbm90IGR5bmFtaWNmaWxlcy5oYXNfa2V5KHBhdGgpOgotCQlpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLQkJCWxpYiA9IGNmbWZpbGUuQ2ZyZ1Jlc291cmNlKHBhdGgpCi0JCQlmcmFnbmFtZSA9IGxpYi5mcmFnbWVudHNbMF0ubmFtZQotCQllbHNlOgotCQkJcHJpbnQgInNoYXJlZCBsaWIgbm90IGZvdW5kOiIsIHBhdGgKLQkJCWZyYWduYW1lID0gIl9ub19mcmFnbWVudF8iCi0JCWR5bmFtaWNmaWxlc1twYXRoXSA9IGZyYWduYW1lCi0JZWxzZToKLQkJZnJhZ25hbWUgPSBkeW5hbWljZmlsZXNbcGF0aF0KLQlyZXR1cm4gZnJhZ25hbWUsIGR5bmFtaWNmaWxlcworICAgIGlmIG5vdCBkeW5hbWljZmlsZXMuaGFzX2tleShwYXRoKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICBsaWIgPSBjZm1maWxlLkNmcmdSZXNvdXJjZShwYXRoKQorICAgICAgICAgICAgZnJhZ25hbWUgPSBsaWIuZnJhZ21lbnRzWzBdLm5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJzaGFyZWQgbGliIG5vdCBmb3VuZDoiLCBwYXRoCisgICAgICAgICAgICBmcmFnbmFtZSA9ICJfbm9fZnJhZ21lbnRfIgorICAgICAgICBkeW5hbWljZmlsZXNbcGF0aF0gPSBmcmFnbmFtZQorICAgIGVsc2U6CisgICAgICAgIGZyYWduYW1lID0gZHluYW1pY2ZpbGVzW3BhdGhdCisgICAgcmV0dXJuIGZyYWduYW1lLCBkeW5hbWljZmlsZXMKIAogCiBkZWYgYWRkcHl0aG9ubW9kdWxlcyhtb2R1bGVfZGljdCk6Ci0JIyBYWFggc2hvdWxkIHJlYWxseSB1c2UgbWFjZ2VuX3JzcmMuZ2VuZXJhdGUoKSwgdGhpcyBkb2VzIHRoZSBzYW1lLCBidXQgc2tpcHMgX19tYWluX18KLQlpdGVtcyA9IG1vZHVsZV9kaWN0Lml0ZW1zKCkKLQlpdGVtcy5zb3J0KCkKLQlmb3IgbmFtZSwgbW9kdWxlIGluIGl0ZW1zOgotCQltdHlwZSA9IG1vZHVsZS5nZXR0eXBlKCkKLQkJaWYgbXR5cGUgbm90IGluIFsnbW9kdWxlJywgJ3BhY2thZ2UnXSBvciBuYW1lID09ICJfX21haW5fXyI6Ci0JCQljb250aW51ZQotCQlsb2NhdGlvbiA9IG1vZHVsZS5fX2ZpbGVfXwotCQkKLQkJaWYgbG9jYXRpb25bLTQ6XSA9PSAnLnB5Yyc6Ci0JCQkjIEF0dGVtcHQgY29ycmVzcG9uZGluZyAucHkKLQkJCWxvY2F0aW9uID0gbG9jYXRpb25bOi0xXQotCQlpZiBsb2NhdGlvblstMzpdICE9ICcucHknOgotCQkJcHJpbnQgJyoqKiBza2lwcGluZycsIGxvY2F0aW9uCi0JCQljb250aW51ZQotCQkKLQkJcHJpbnQgJ0FkZGluZyBtb2R1bGUgIiVzIicgJSBuYW1lCi0JCWlkLCBuYW1lID0gcHlfcmVzb3VyY2UuZnJvbXB5ZmlsZShsb2NhdGlvbiwgbmFtZSwgcHJlbG9hZD0wLCAKLQkJCQlpc3BhY2thZ2U9bXR5cGU9PSdwYWNrYWdlJykKKyAgICAjIFhYWCBzaG91bGQgcmVhbGx5IHVzZSBtYWNnZW5fcnNyYy5nZW5lcmF0ZSgpLCB0aGlzIGRvZXMgdGhlIHNhbWUsIGJ1dCBza2lwcyBfX21haW5fXworICAgIGl0ZW1zID0gbW9kdWxlX2RpY3QuaXRlbXMoKQorICAgIGl0ZW1zLnNvcnQoKQorICAgIGZvciBuYW1lLCBtb2R1bGUgaW4gaXRlbXM6CisgICAgICAgIG10eXBlID0gbW9kdWxlLmdldHR5cGUoKQorICAgICAgICBpZiBtdHlwZSBub3QgaW4gWydtb2R1bGUnLCAncGFja2FnZSddIG9yIG5hbWUgPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGxvY2F0aW9uID0gbW9kdWxlLl9fZmlsZV9fCisKKyAgICAgICAgaWYgbG9jYXRpb25bLTQ6XSA9PSAnLnB5Yyc6CisgICAgICAgICAgICAjIEF0dGVtcHQgY29ycmVzcG9uZGluZyAucHkKKyAgICAgICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb25bOi0xXQorICAgICAgICBpZiBsb2NhdGlvblstMzpdICE9ICcucHknOgorICAgICAgICAgICAgcHJpbnQgJyoqKiBza2lwcGluZycsIGxvY2F0aW9uCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHByaW50ICdBZGRpbmcgbW9kdWxlICIlcyInICUgbmFtZQorICAgICAgICBpZCwgbmFtZSA9IHB5X3Jlc291cmNlLmZyb21weWZpbGUobG9jYXRpb24sIG5hbWUsIHByZWxvYWQ9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzcGFja2FnZT1tdHlwZT09J3BhY2thZ2UnKQogCiBkZWYgUHN0cmluZyhzdHIpOgotCWlmIGxlbihzdHIpID4gMjU1OgotCQlyYWlzZSBUeXBlRXJyb3IsICJTdHIyNTUgbXVzdCBiZSBhdCBtb3N0IDI1NSBjaGFycyBsb25nIgotCXJldHVybiBjaHIobGVuKHN0cikpICsgc3RyCisgICAgaWYgbGVuKHN0cikgPiAyNTU6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIlN0cjI1NSBtdXN0IGJlIGF0IG1vc3QgMjU1IGNoYXJzIGxvbmciCisgICAgcmV0dXJuIGNocihsZW4oc3RyKSkgKyBzdHIKIAogIyNkZWYgbWFrZWZpbGVuYW1lcyhuYW1lKToKLSMjCWxuYW1lID0gc3RyaW5nLmxvd2VyKG5hbWUpCi0jIwlwb3MgPSBzdHJpbmcuZmluZChsbmFtZSwgIi5wcGMuIikKLSMjCWlmIHBvcyA+IDA6Ci0jIwkJcmV0dXJuIG5hbWUsIG5hbWVbOnBvc10gKyAnLkNGTTY4Sy4nICsgbmFtZVtwb3MrNTpdCi0jIwlwb3MgPSBzdHJpbmcuZmluZChsbmFtZSwgIi5jZm02OGsuIikKLSMjCWlmIHBvcyA+IDA6Ci0jIwkJcmV0dXJuIG5hbWVbOnBvc10gKyAnLnBwYy4nICsgbmFtZVtwb3MrODpdLCBuYW1lCi0jIwlyYWlzZSBWYWx1ZUVycm9yLCAiY2FuJ3QgbWFrZSBwcGMvY2ZtNjhrIGZpbGVuYW1lcyIKKyMjICAgICAgbG5hbWUgPSBzdHJpbmcubG93ZXIobmFtZSkKKyMjICAgICAgcG9zID0gc3RyaW5nLmZpbmQobG5hbWUsICIucHBjLiIpCisjIyAgICAgIGlmIHBvcyA+IDA6CisjIyAgICAgICAgICAgICAgcmV0dXJuIG5hbWUsIG5hbWVbOnBvc10gKyAnLkNGTTY4Sy4nICsgbmFtZVtwb3MrNTpdCisjIyAgICAgIHBvcyA9IHN0cmluZy5maW5kKGxuYW1lLCAiLmNmbTY4ay4iKQorIyMgICAgICBpZiBwb3MgPiAwOgorIyMgICAgICAgICAgICAgIHJldHVybiBuYW1lWzpwb3NdICsgJy5wcGMuJyArIG5hbWVbcG9zKzg6XSwgbmFtZQorIyMgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiY2FuJ3QgbWFrZSBwcGMvY2ZtNjhrIGZpbGVuYW1lcyIKIAogZGVmIGNvcHlyZXMoaW5wdXQsIG91dHB1dCwgKmFyZ3MsICoqa3dhcmdzKToKLQlvcGVuZWRpbiA9IG9wZW5lZG91dCA9IDAKLQlpZiB0eXBlKGlucHV0KSA9PSB0eXBlcy5TdHJpbmdUeXBlOgotCQlpbnB1dCA9IFJlcy5GU3BPcGVuUmVzRmlsZShpbnB1dCwgMSkKLQkJb3BlbmVkaW4gPSAxCi0JaWYgdHlwZShvdXRwdXQpID09IHR5cGVzLlN0cmluZ1R5cGU6Ci0JCW91dHB1dCA9IFJlcy5GU3BPcGVuUmVzRmlsZShvdXRwdXQsIDMpCi0JCW9wZW5lZG91dCA9IDEKLQl0cnk6Ci0JCWFwcGx5KGJ1aWxkdG9vbHMuY29weXJlcywgKGlucHV0LCBvdXRwdXQpICsgYXJncywga3dhcmdzKQotCWZpbmFsbHk6Ci0JCWlmIG9wZW5lZGluOgotCQkJUmVzLkNsb3NlUmVzRmlsZShpbnB1dCkKLQkJaWYgb3BlbmVkb3V0OgotCQkJUmVzLkNsb3NlUmVzRmlsZShvdXRwdXQpCisgICAgb3BlbmVkaW4gPSBvcGVuZWRvdXQgPSAwCisgICAgaWYgdHlwZShpbnB1dCkgPT0gdHlwZXMuU3RyaW5nVHlwZToKKyAgICAgICAgaW5wdXQgPSBSZXMuRlNwT3BlblJlc0ZpbGUoaW5wdXQsIDEpCisgICAgICAgIG9wZW5lZGluID0gMQorICAgIGlmIHR5cGUob3V0cHV0KSA9PSB0eXBlcy5TdHJpbmdUeXBlOgorICAgICAgICBvdXRwdXQgPSBSZXMuRlNwT3BlblJlc0ZpbGUob3V0cHV0LCAzKQorICAgICAgICBvcGVuZWRvdXQgPSAxCisgICAgdHJ5OgorICAgICAgICBhcHBseShidWlsZHRvb2xzLmNvcHlyZXMsIChpbnB1dCwgb3V0cHV0KSArIGFyZ3MsIGt3YXJncykKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBvcGVuZWRpbjoKKyAgICAgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUoaW5wdXQpCisgICAgICAgIGlmIG9wZW5lZG91dDoKKyAgICAgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUob3V0cHV0KQogCiBkZWYgZmluZHB5dGhvbmNvcmUoKToKLQkiIiJmaW5kIHRoZSBQeXRob25Db3JlIHNoYXJlZCBsaWJyYXJ5LCBwb3NzaWJseSBhc2tpbmcgdGhlIHVzZXIgaWYgd2UgY2FuJ3QgZmluZCBpdCIiIgotCQotCXRyeToKLQkJdlJlZk51bSwgZGlySUQgPSBtYWNmcy5GaW5kRm9sZGVyKGtPblN5c3RlbURpc2ssIGtTaGFyZWRMaWJyYXJpZXNGb2xkZXJUeXBlLCAwKQotCWV4Y2VwdCBtYWNmcy5lcnJvcjoKLQkJZXh0cGF0aCA9ICI6IgotCWVsc2U6Ci0JCWV4dHBhdGggPSBtYWNmcy5GU1NwZWMoKHZSZWZOdW0sIGRpcklELCAiIikpLmFzX3BhdGhuYW1lKCkKLQl2ZXJzaW9uID0gc3RyaW5nLnNwbGl0KHN5cy52ZXJzaW9uKVswXQotCWlmIE1hY09TLnJ1bnRpbWVtb2RlbCA9PSAnY2FyYm9uJzoKLQkJY29yZW5hbWUgPSAiUHl0aG9uQ29yZUNhcmJvbiAiICsgdmVyc2lvbgotCWVsaWYgTWFjT1MucnVudGltZW1vZGVsID09ICdwcGMnOgotCQljb3JlbmFtZSA9ICJQeXRob25Db3JlICIgKyB2ZXJzaW9uCi0JZWxzZToKLQkJcmFpc2UgIlVua25vd24gTWFjT1MucnVudGltZW1vZGVsIiwgTWFjT1MucnVudGltZW1vZGVsCi0JY29yZXBhdGggPSBvcy5wYXRoLmpvaW4oZXh0cGF0aCwgY29yZW5hbWUpCi0JaWYgbm90IG9zLnBhdGguZXhpc3RzKGNvcmVwYXRoKToKLQkJY29yZXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSJQbGVhc2UgbG9jYXRlIFB5dGhvbkNvcmU6IiwgCi0JCQl0eXBlTGlzdD0oInNobGIiLCkpCi0JCWlmIG5vdCBjb3JlcGF0aDoKLQkJCXJhaXNlIEtleWJvYXJkSW50ZXJydXB0LCAiY2FuY2VsbGVkIgotCXJldHVybiByZXNvbHZlYWxpYXNmaWxlKGNvcmVwYXRoKQorICAgICIiImZpbmQgdGhlIFB5dGhvbkNvcmUgc2hhcmVkIGxpYnJhcnksIHBvc3NpYmx5IGFza2luZyB0aGUgdXNlciBpZiB3ZSBjYW4ndCBmaW5kIGl0IiIiCisKKyAgICB0cnk6CisgICAgICAgIHZSZWZOdW0sIGRpcklEID0gbWFjZnMuRmluZEZvbGRlcihrT25TeXN0ZW1EaXNrLCBrU2hhcmVkTGlicmFyaWVzRm9sZGVyVHlwZSwgMCkKKyAgICBleGNlcHQgbWFjZnMuZXJyb3I6CisgICAgICAgIGV4dHBhdGggPSAiOiIKKyAgICBlbHNlOgorICAgICAgICBleHRwYXRoID0gbWFjZnMuRlNTcGVjKCh2UmVmTnVtLCBkaXJJRCwgIiIpKS5hc19wYXRobmFtZSgpCisgICAgdmVyc2lvbiA9IHN0cmluZy5zcGxpdChzeXMudmVyc2lvbilbMF0KKyAgICBpZiBNYWNPUy5ydW50aW1lbW9kZWwgPT0gJ2NhcmJvbic6CisgICAgICAgIGNvcmVuYW1lID0gIlB5dGhvbkNvcmVDYXJib24gIiArIHZlcnNpb24KKyAgICBlbGlmIE1hY09TLnJ1bnRpbWVtb2RlbCA9PSAncHBjJzoKKyAgICAgICAgY29yZW5hbWUgPSAiUHl0aG9uQ29yZSAiICsgdmVyc2lvbgorICAgIGVsc2U6CisgICAgICAgIHJhaXNlICJVbmtub3duIE1hY09TLnJ1bnRpbWVtb2RlbCIsIE1hY09TLnJ1bnRpbWVtb2RlbAorICAgIGNvcmVwYXRoID0gb3MucGF0aC5qb2luKGV4dHBhdGgsIGNvcmVuYW1lKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhjb3JlcGF0aCk6CisgICAgICAgIGNvcmVwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iUGxlYXNlIGxvY2F0ZSBQeXRob25Db3JlOiIsCisgICAgICAgICAgICAgICAgdHlwZUxpc3Q9KCJzaGxiIiwpKQorICAgICAgICBpZiBub3QgY29yZXBhdGg6CisgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdCwgImNhbmNlbGxlZCIKKyAgICByZXR1cm4gcmVzb2x2ZWFsaWFzZmlsZShjb3JlcGF0aCkKIAogZGVmIHJlc29sdmVhbGlhc2ZpbGUocGF0aCk6Ci0JdHJ5OgotCQlmc3MsIGR1bW15MSwgZHVtbXkyID0gbWFjZnMuUmVzb2x2ZUFsaWFzRmlsZShwYXRoKQotCWV4Y2VwdCBtYWNmcy5lcnJvcjoKLQkJcGFzcwotCWVsc2U6Ci0JCXBhdGggPSBmc3MuYXNfcGF0aG5hbWUoKQotCXJldHVybiBwYXRoCisgICAgdHJ5OgorICAgICAgICBmc3MsIGR1bW15MSwgZHVtbXkyID0gbWFjZnMuUmVzb2x2ZUFsaWFzRmlsZShwYXRoKQorICAgIGV4Y2VwdCBtYWNmcy5lcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHBhdGggPSBmc3MuYXNfcGF0aG5hbWUoKQorICAgIHJldHVybiBwYXRoCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9pbmZvLnB5IGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5faW5mby5weQppbmRleCAyZDk4NGMxLi5kMmVkYjkyIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9pbmZvLnB5CisrKyBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuX2luZm8ucHkKQEAgLTEsOCArMSw4IEBACiAiIiJtYWNnZW5faW5mbyAtIEdlbmVyYXRlIGluZm9ybWF0aW9uYWwgb3V0cHV0IiIiCiAKIGRlZiBnZW5lcmF0ZShvdXRwdXQsIG1vZHVsZV9kaWN0KToKLQlmb3IgbmFtZSBpbiBtb2R1bGVfZGljdC5rZXlzKCk6Ci0JCXByaW50ICdJbmNsdWRlICUtMjBzXHQnJW5hbWUsCi0JCW1vZHVsZSA9IG1vZHVsZV9kaWN0W25hbWVdCi0JCXByaW50IG1vZHVsZS5nZXR0eXBlKCksICdcdCcsIHJlcHIobW9kdWxlKQotCXJldHVybiAwCisgICAgZm9yIG5hbWUgaW4gbW9kdWxlX2RpY3Qua2V5cygpOgorICAgICAgICBwcmludCAnSW5jbHVkZSAlLTIwc1x0JyVuYW1lLAorICAgICAgICBtb2R1bGUgPSBtb2R1bGVfZGljdFtuYW1lXQorICAgICAgICBwcmludCBtb2R1bGUuZ2V0dHlwZSgpLCAnXHQnLCByZXByKG1vZHVsZSkKKyAgICByZXR1cm4gMApkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5fcnNyYy5weSBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuX3JzcmMucHkKaW5kZXggMDNmYzBhZi4uMzRjMTdmZiAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5fcnNyYy5weQorKysgYi9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9yc3JjLnB5CkBAIC01LDMzICs1LDMyIEBACiBpbXBvcnQgc3lzCiAKIGRlZiBnZW5lcmF0ZShvdXRwdXQsIG1vZHVsZV9kaWN0LCBkZWJ1Zz0wLCBwcmVsb2FkPTEpOgotCWZzaWQgPSBweV9yZXNvdXJjZS5jcmVhdGUob3V0cHV0KQotCQotCWZvciBuYW1lLCBtb2R1bGUgaW4gbW9kdWxlX2RpY3QuaXRlbXMoKToKLQkJbXR5cGUgPSBtb2R1bGUuZ2V0dHlwZSgpCi0JCWlmIG10eXBlIG5vdCBpbiBbJ21vZHVsZScsICdwYWNrYWdlJ106Ci0JCQljb250aW51ZQotCQlsb2NhdGlvbiA9IG1vZHVsZS5fX2ZpbGVfXwotCQkKLQkJaWYgbG9jYXRpb25bLTQ6XSA9PSAnLnB5Yyc6Ci0JCQkjIEF0dGVtcHQgY29ycmVzcG9uZGluZyAucHkKLQkJCWxvY2F0aW9uID0gbG9jYXRpb25bOi0xXQotCQlpZiBsb2NhdGlvblstMzpdICE9ICcucHknOgotCQkJcHJpbnQgJyoqKiBza2lwcGluZycsIGxvY2F0aW9uCi0JCQljb250aW51ZQotCQkJCi0JCWlkLCBuYW1lID0gcHlfcmVzb3VyY2UuZnJvbXB5ZmlsZShsb2NhdGlvbiwgbmFtZSwgcHJlbG9hZD1wcmVsb2FkLCAKLQkJCQlpc3BhY2thZ2U9bXR5cGU9PSdwYWNrYWdlJykKLQkJaWYgZGVidWcgPiAwOgotCQkJcHJpbnQgJ1BZQyByZXNvdXJjZSAlNWRcdCVzXHQlcyclKGlkLCBuYW1lLCBsb2NhdGlvbikKLQkKLQlSZXMuQ2xvc2VSZXNGaWxlKGZzaWQpCi0JCisgICAgZnNpZCA9IHB5X3Jlc291cmNlLmNyZWF0ZShvdXRwdXQpCisKKyAgICBmb3IgbmFtZSwgbW9kdWxlIGluIG1vZHVsZV9kaWN0Lml0ZW1zKCk6CisgICAgICAgIG10eXBlID0gbW9kdWxlLmdldHR5cGUoKQorICAgICAgICBpZiBtdHlwZSBub3QgaW4gWydtb2R1bGUnLCAncGFja2FnZSddOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbG9jYXRpb24gPSBtb2R1bGUuX19maWxlX18KKworICAgICAgICBpZiBsb2NhdGlvblstNDpdID09ICcucHljJzoKKyAgICAgICAgICAgICMgQXR0ZW1wdCBjb3JyZXNwb25kaW5nIC5weQorICAgICAgICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbls6LTFdCisgICAgICAgIGlmIGxvY2F0aW9uWy0zOl0gIT0gJy5weSc6CisgICAgICAgICAgICBwcmludCAnKioqIHNraXBwaW5nJywgbG9jYXRpb24KKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWQsIG5hbWUgPSBweV9yZXNvdXJjZS5mcm9tcHlmaWxlKGxvY2F0aW9uLCBuYW1lLCBwcmVsb2FkPXByZWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBpc3BhY2thZ2U9bXR5cGU9PSdwYWNrYWdlJykKKyAgICAgICAgaWYgZGVidWcgPiAwOgorICAgICAgICAgICAgcHJpbnQgJ1BZQyByZXNvdXJjZSAlNWRcdCVzXHQlcyclKGlkLCBuYW1lLCBsb2NhdGlvbikKKworICAgIFJlcy5DbG9zZVJlc0ZpbGUoZnNpZCkKKwogZGVmIHdhcm5pbmdzKG1vZHVsZV9kaWN0KToKLQlwcm9ibGVtcyA9IDAKLQlmb3IgbmFtZSwgbW9kdWxlIGluIG1vZHVsZV9kaWN0Lml0ZW1zKCk6Ci0JCWlmIG1vZHVsZS5nZXR0eXBlKCkgbm90IGluICgnYnVpbHRpbicsICdtb2R1bGUnLCAncGFja2FnZScpOgotCQkJcHJvYmxlbXMgPSBwcm9ibGVtcyArIDEKLQkJCXByaW50ICdXYXJuaW5nOiAlcyBub3QgaW5jbHVkZWQ6ICVzICVzJyUobmFtZSwgbW9kdWxlLmdldHR5cGUoKSwgbW9kdWxlKQotCXJldHVybiBwcm9ibGVtcwotCQorICAgIHByb2JsZW1zID0gMAorICAgIGZvciBuYW1lLCBtb2R1bGUgaW4gbW9kdWxlX2RpY3QuaXRlbXMoKToKKyAgICAgICAgaWYgbW9kdWxlLmdldHR5cGUoKSBub3QgaW4gKCdidWlsdGluJywgJ21vZHVsZScsICdwYWNrYWdlJyk6CisgICAgICAgICAgICBwcm9ibGVtcyA9IHByb2JsZW1zICsgMQorICAgICAgICAgICAgcHJpbnQgJ1dhcm5pbmc6ICVzIG5vdCBpbmNsdWRlZDogJXMgJXMnJShuYW1lLCBtb2R1bGUuZ2V0dHlwZSgpLCBtb2R1bGUpCisgICAgcmV0dXJuIHByb2JsZW1zCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9zcmMucHkgYi9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9zcmMucHkKaW5kZXggMDg5NzI3YS4uMzAxZTg1ZSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5fc3JjLnB5CisrKyBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuX3NyYy5weQpAQCAtMTYsOTggKzE2LDk4IEBACiBCVU5ETEVfVEVNUExBVEU9b3MucGF0aC5qb2luKFRFTVBMQVRFRElSLCAnOmZyb3plbmJ1bmRsZS5yc3JjJykKIAogZGVmIGdlbmVyYXRlKG91dHB1dCwgbW9kdWxlX2RpY3QsIGRlYnVnPTAsIHdpdGhfaWZkZWY9MCk6Ci0JcHJvYmxlbXMgPSAwCi0Jb3V0cHV0X2NyZWF0ZWQ9MAotCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvdXRwdXQpOgotCQlwcmludCAnQ3JlYXRpbmcgcHJvamVjdCBmb2xkZXInLCBvdXRwdXQKLQkJb3MubWtkaXIob3V0cHV0KQotCQlvdXRwdXRfY3JlYXRlZCA9IDEKLQkjIFJlc29sdmUgYWxpYXNlcywgaWYgbmVlZGVkCi0JdHJ5OgotCQlmc3MsIGR1bW15MSwgZHVtbXkyID0gbWFjZnMuUmVzb2x2ZUFsaWFzRmlsZShvdXRwdXQpCi0JZXhjZXB0IG1hY2ZzLmVycm9yOgotCQlwYXNzCi0JZWxzZToKLQkJbmV3bmFtZSA9IGZzcy5hc19wYXRobmFtZSgpCi0JCWlmIG5ld25hbWUgIT0gb3V0cHV0OgotCQkJaWYgZGVidWc6Ci0JCQkJcHJpbnQgJ0FsaWFzJywgb3V0cHV0Ci0JCQkJcHJpbnQgJ1Jlc29sdmVkIHRvJywgbmV3bmFtZQotCQkJb3V0cHV0ID0gbmV3bmFtZQkKLQkjIENvbnN0cnVjdCB0aGUgZmlsZW5hbWVzCi0JZHVtbXksIG91dGZpbGUgPSBvcy5wYXRoLnNwbGl0KG91dHB1dCkKLQlidWlsZCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChvdXRmaWxlKQotCWlmIGJ1aWxkID09ICdidWlsZCcgYW5kIGV4dFswXSA9PSAnLic6Ci0JCSMgVGhpcyBpcyBwcm9iYWJseSBhIGdvb2QgbmFtZSBmb3IgdGhlIHByb2plY3QKLQkJcHJvam5hbWUgPSBleHRbMTpdCi0JZWxzZToKLQkJcHJvam5hbWUgPSAnZnJvemVuYXBwbGV0LnByaicKLQljb25maWdfbmFtZSA9IG9zLnBhdGguam9pbihvdXRwdXQsICc6bWFjZnJvemVuY29uZmlnLmMnKQotCXByb2plY3RfbmFtZSA9IG9zLnBhdGguam9pbihvdXRwdXQsICc6JyArIHByb2puYW1lICsgJy5wcmonKQotCXJlc291cmNlX25hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0LCAnOmZyb3plbm1vZHVsZXMucnNyYycpCi0JYnVuZGxlX25hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0LCAnOmZyb3plbmJ1bmRsZS5yc3JjJykKKyAgICBwcm9ibGVtcyA9IDAKKyAgICBvdXRwdXRfY3JlYXRlZD0wCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG91dHB1dCk6CisgICAgICAgIHByaW50ICdDcmVhdGluZyBwcm9qZWN0IGZvbGRlcicsIG91dHB1dAorICAgICAgICBvcy5ta2RpcihvdXRwdXQpCisgICAgICAgIG91dHB1dF9jcmVhdGVkID0gMQorICAgICMgUmVzb2x2ZSBhbGlhc2VzLCBpZiBuZWVkZWQKKyAgICB0cnk6CisgICAgICAgIGZzcywgZHVtbXkxLCBkdW1teTIgPSBtYWNmcy5SZXNvbHZlQWxpYXNGaWxlKG91dHB1dCkKKyAgICBleGNlcHQgbWFjZnMuZXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBuZXduYW1lID0gZnNzLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgaWYgbmV3bmFtZSAhPSBvdXRwdXQ6CisgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICBwcmludCAnQWxpYXMnLCBvdXRwdXQKKyAgICAgICAgICAgICAgICBwcmludCAnUmVzb2x2ZWQgdG8nLCBuZXduYW1lCisgICAgICAgICAgICBvdXRwdXQgPSBuZXduYW1lCisgICAgIyBDb25zdHJ1Y3QgdGhlIGZpbGVuYW1lcworICAgIGR1bW15LCBvdXRmaWxlID0gb3MucGF0aC5zcGxpdChvdXRwdXQpCisgICAgYnVpbGQsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQob3V0ZmlsZSkKKyAgICBpZiBidWlsZCA9PSAnYnVpbGQnIGFuZCBleHRbMF0gPT0gJy4nOgorICAgICAgICAjIFRoaXMgaXMgcHJvYmFibHkgYSBnb29kIG5hbWUgZm9yIHRoZSBwcm9qZWN0CisgICAgICAgIHByb2puYW1lID0gZXh0WzE6XQorICAgIGVsc2U6CisgICAgICAgIHByb2puYW1lID0gJ2Zyb3plbmFwcGxldC5wcmonCisgICAgY29uZmlnX25hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0LCAnOm1hY2Zyb3plbmNvbmZpZy5jJykKKyAgICBwcm9qZWN0X25hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0LCAnOicgKyBwcm9qbmFtZSArICcucHJqJykKKyAgICByZXNvdXJjZV9uYW1lID0gb3MucGF0aC5qb2luKG91dHB1dCwgJzpmcm96ZW5tb2R1bGVzLnJzcmMnKQorICAgIGJ1bmRsZV9uYW1lID0gb3MucGF0aC5qb2luKG91dHB1dCwgJzpmcm96ZW5idW5kbGUucnNyYycpCiAKLQkjIEZpbGwgdGhlIG91dHB1dCBmb2xkZXIsIGlmIG5lZWRlZC4KLQlpZiBvdXRwdXRfY3JlYXRlZDoKLQkJIyBDcmVhdGUgdGhlIHByb2plY3QsIGlmIG5lZWRlZAotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMocHJvamVjdF9uYW1lKToKLQkJCXByaW50ICdDcmVhdGluZyBwcm9qZWN0JywgcHJvamVjdF9uYW1lCi0JCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoUFJPSkVDVF9URU1QTEFURSk6Ci0JCQkJcHJpbnQgJyoqIE5vIHRlbXBsYXRlIENvZGVXYXJyaW9yIHByb2plY3QgZm91bmQgYXQnLCBQUk9KRUNUX1RFTVBMQVRFCi0JCQkJcHJpbnQgJyAgIFRvIGdlbmVyYXRlIHN0YW5kYWxvbmUgUHl0aG9uIGFwcGxpY2F0aW9ucyBmcm9tIHNvdXJjZSB5b3UgbmVlZCcKLQkJCQlwcmludCAnICAgYSBmdWxsIHNvdXJjZSBkaXN0cmlidXRpb24uIENoZWNrIGh0dHA6Ly93d3cuY3dpLm5sL35qYWNrL21hY3B5dGhvbi5odG1sJwotCQkJCXByaW50ICcgICBmb3IgZGV0YWlscy4nCi0JCQkJcHJvYmxlbXMgPSAxCi0JCQllbHNlOgkJCi0JCQkJbWFjb3N0b29scy5jb3B5KFBST0pFQ1RfVEVNUExBVEUsIHByb2plY3RfbmFtZSkKLQkJCQlwcmludCAnQSB0ZW1wbGF0ZSBDb2RlV2FycmlvciBwcm9qZWN0IGhhcyBiZWVuIGNvcGllZCB0bycsIHByb2plY3RfbmFtZQotCQkJCXByaW50ICdJdCBpcyB1cCB0byB5b3UgdG8gbWFrZSB0aGUgZm9sbG93aW5nIGNoYW5nZXM6JwotCQkJCXByaW50ICctIENoYW5nZSB0aGUgb3V0cHV0IGZpbGUgbmFtZScKLQkJCQlwcmludCAnLSBDaGFuZ2UgdGhlIHNlYXJjaCBwYXRoLCB1bmxlc3MgdGhlIGZvbGRlciBpcyBpbiB0aGUgcHl0aG9uIGhvbWUnCi0JCQkJcHJpbnQgJy0gQWRkIHNvdXJjZWZpbGVzL2xpYnJhcmllcyBmb3IgYW55IGV4dGVuc2lvbiBtb2R1bGVzIHVzZWQnCi0JCQkJcHJpbnQgJy0gUmVtb3ZlIHVudXNlZCBzb3VyY2VzLCB0byBzcGVlZCB1cCB0aGUgYnVpbGQgcHJvY2VzcycKLQkJCQlwcmludCAnLSBSZW1vdmUgdW51c2VkIHJlc291cmNlIGZpbGVzIChsaWtlIHRjbC90aykgZm9yIGEgc21hbGxlciBiaW5hcnknCi0JCQkJcHJvYmxlbXMgPSAxCi0JCQkJbWFjb3N0b29scy5jb3B5KEJVTkRMRV9URU1QTEFURSwgYnVuZGxlX25hbWUpCi0JCQkJcHJpbnQgJ0EgdGVtcGxhdGUgYnVuZGxlIGZpbGUgaGFzIGFsc28gYmVlbiBjb3BpZWQgdG8nLCBidW5kbGVfbmFtZQotCQkJCXByaW50ICdZb3UgbWF5IHdhbnQgdG8gYWRhcHQgc2lnbmF0dXJlLCBzaXplIHJlc291cmNlLCBldGMnCisgICAgIyBGaWxsIHRoZSBvdXRwdXQgZm9sZGVyLCBpZiBuZWVkZWQuCisgICAgaWYgb3V0cHV0X2NyZWF0ZWQ6CisgICAgICAgICMgQ3JlYXRlIHRoZSBwcm9qZWN0LCBpZiBuZWVkZWQKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHByb2plY3RfbmFtZSk6CisgICAgICAgICAgICBwcmludCAnQ3JlYXRpbmcgcHJvamVjdCcsIHByb2plY3RfbmFtZQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKFBST0pFQ1RfVEVNUExBVEUpOgorICAgICAgICAgICAgICAgIHByaW50ICcqKiBObyB0ZW1wbGF0ZSBDb2RlV2FycmlvciBwcm9qZWN0IGZvdW5kIGF0JywgUFJPSkVDVF9URU1QTEFURQorICAgICAgICAgICAgICAgIHByaW50ICcgICBUbyBnZW5lcmF0ZSBzdGFuZGFsb25lIFB5dGhvbiBhcHBsaWNhdGlvbnMgZnJvbSBzb3VyY2UgeW91IG5lZWQnCisgICAgICAgICAgICAgICAgcHJpbnQgJyAgIGEgZnVsbCBzb3VyY2UgZGlzdHJpYnV0aW9uLiBDaGVjayBodHRwOi8vd3d3LmN3aS5ubC9+amFjay9tYWNweXRob24uaHRtbCcKKyAgICAgICAgICAgICAgICBwcmludCAnICAgZm9yIGRldGFpbHMuJworICAgICAgICAgICAgICAgIHByb2JsZW1zID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtYWNvc3Rvb2xzLmNvcHkoUFJPSkVDVF9URU1QTEFURSwgcHJvamVjdF9uYW1lKQorICAgICAgICAgICAgICAgIHByaW50ICdBIHRlbXBsYXRlIENvZGVXYXJyaW9yIHByb2plY3QgaGFzIGJlZW4gY29waWVkIHRvJywgcHJvamVjdF9uYW1lCisgICAgICAgICAgICAgICAgcHJpbnQgJ0l0IGlzIHVwIHRvIHlvdSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgY2hhbmdlczonCisgICAgICAgICAgICAgICAgcHJpbnQgJy0gQ2hhbmdlIHRoZSBvdXRwdXQgZmlsZSBuYW1lJworICAgICAgICAgICAgICAgIHByaW50ICctIENoYW5nZSB0aGUgc2VhcmNoIHBhdGgsIHVubGVzcyB0aGUgZm9sZGVyIGlzIGluIHRoZSBweXRob24gaG9tZScKKyAgICAgICAgICAgICAgICBwcmludCAnLSBBZGQgc291cmNlZmlsZXMvbGlicmFyaWVzIGZvciBhbnkgZXh0ZW5zaW9uIG1vZHVsZXMgdXNlZCcKKyAgICAgICAgICAgICAgICBwcmludCAnLSBSZW1vdmUgdW51c2VkIHNvdXJjZXMsIHRvIHNwZWVkIHVwIHRoZSBidWlsZCBwcm9jZXNzJworICAgICAgICAgICAgICAgIHByaW50ICctIFJlbW92ZSB1bnVzZWQgcmVzb3VyY2UgZmlsZXMgKGxpa2UgdGNsL3RrKSBmb3IgYSBzbWFsbGVyIGJpbmFyeScKKyAgICAgICAgICAgICAgICBwcm9ibGVtcyA9IDEKKyAgICAgICAgICAgICAgICBtYWNvc3Rvb2xzLmNvcHkoQlVORExFX1RFTVBMQVRFLCBidW5kbGVfbmFtZSkKKyAgICAgICAgICAgICAgICBwcmludCAnQSB0ZW1wbGF0ZSBidW5kbGUgZmlsZSBoYXMgYWxzbyBiZWVuIGNvcGllZCB0bycsIGJ1bmRsZV9uYW1lCisgICAgICAgICAgICAgICAgcHJpbnQgJ1lvdSBtYXkgd2FudCB0byBhZGFwdCBzaWduYXR1cmUsIHNpemUgcmVzb3VyY2UsIGV0YycKIAotCQotCSMgQ3JlYXRlIHRoZSByZXNvdXJjZSBmaWxlCi0JbWFjZ2VuX3JzcmMuZ2VuZXJhdGUocmVzb3VyY2VfbmFtZSwgbW9kdWxlX2RpY3QsIGRlYnVnPWRlYnVnKQotCQotCSMgQ3JlYXRlIHRoZSBjb25maWcuYyBmaWxlCi0JaWYgbm90IG9zLnBhdGguZXhpc3RzKENPTkZJR19URU1QTEFURSk6Ci0JCXByaW50ICcqKiBObyB0ZW1wbGF0ZSBjb25maWcuYyBmb3VuZCBhdCcsIFBST0pFQ1RfVEVNUExBVEUKLQkJcHJpbnQgJyAgIFRvIGdlbmVyYXRlIHN0YW5kYWxvbmUgUHl0aG9uIGFwcGxpY2F0aW9ucyBmcm9tIHNvdXJjZSB5b3UgbmVlZCcKLQkJcHJpbnQgJyAgIGEgZnVsbCBzb3VyY2UgZGlzdHJpYnV0aW9uLiBDaGVjayBodHRwOi8vd3d3LmN3aS5ubC9+amFjay9tYWNweXRob24uaHRtbCcKLQkJcHJpbnQgJyAgIGZvciBkZXRhaWxzLicKLQkJcHJvYmxlbXMgPSAxCi0JZWxzZToKLQkJIyBGaW5kIGVsZWdpYmxlIG1vZHVsZXMgKGJ1aWx0aW5zIGFuZCBkeW5hbWljYWxseSBsb2FkZWQgbW9kdWxlcykKLQkJY19tb2R1bGVzID0gW10KLQkJZm9yIG1vZHVsZSBpbiBtb2R1bGVfZGljdC5rZXlzKCk6Ci0JCQlpZiBtb2R1bGVfZGljdFttb2R1bGVdLmdldHR5cGUoKSBpbiAoJ2J1aWx0aW4nLCAnZHluYW1pYycpOgotCQkJCSMgaWYgdGhlIG1vZHVsZSBpcyBpbiBhIHBhY2thZ2Ugd2UgaGF2ZSBubyBjaG9pY2UgYnV0Ci0JCQkJIyB0byBwdXQgaXQgYXQgdGhlIHRvcGxldmVsIGluIHRoZSBmcm96ZW4gYXBwbGljYXRpb24uCi0JCQkJaWYgJy4nIGluIG1vZHVsZToKLQkJCQkJbW9kdWxlID0gbW9kdWxlLnNwbGl0KCcuJylbLTFdCi0JCQkJY19tb2R1bGVzLmFwcGVuZChtb2R1bGUpCi0JCWlmcCA9IG9wZW4oQ09ORklHX1RFTVBMQVRFKQotCQlvZnAgPSBvcGVuKGNvbmZpZ19uYW1lLCAndycpCi0JCW1ha2Vjb25maWcubWFrZWNvbmZpZyhpZnAsIG9mcCwgY19tb2R1bGVzLCB3aXRoX2lmZGVmKQotCQlpZnAuY2xvc2UoKQotCQlvZnAuY2xvc2UoKQotCQlNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShjb25maWdfbmFtZSwgJ0NXSUUnLCAnVEVYVCcpCi0JCi0JaWYgd2FybmluZ3MobW9kdWxlX2RpY3QpOgotCQlwcm9ibGVtcyA9IDEKLQlyZXR1cm4gcHJvYmxlbXMKLQkKKworICAgICMgQ3JlYXRlIHRoZSByZXNvdXJjZSBmaWxlCisgICAgbWFjZ2VuX3JzcmMuZ2VuZXJhdGUocmVzb3VyY2VfbmFtZSwgbW9kdWxlX2RpY3QsIGRlYnVnPWRlYnVnKQorCisgICAgIyBDcmVhdGUgdGhlIGNvbmZpZy5jIGZpbGUKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoQ09ORklHX1RFTVBMQVRFKToKKyAgICAgICAgcHJpbnQgJyoqIE5vIHRlbXBsYXRlIGNvbmZpZy5jIGZvdW5kIGF0JywgUFJPSkVDVF9URU1QTEFURQorICAgICAgICBwcmludCAnICAgVG8gZ2VuZXJhdGUgc3RhbmRhbG9uZSBQeXRob24gYXBwbGljYXRpb25zIGZyb20gc291cmNlIHlvdSBuZWVkJworICAgICAgICBwcmludCAnICAgYSBmdWxsIHNvdXJjZSBkaXN0cmlidXRpb24uIENoZWNrIGh0dHA6Ly93d3cuY3dpLm5sL35qYWNrL21hY3B5dGhvbi5odG1sJworICAgICAgICBwcmludCAnICAgZm9yIGRldGFpbHMuJworICAgICAgICBwcm9ibGVtcyA9IDEKKyAgICBlbHNlOgorICAgICAgICAjIEZpbmQgZWxlZ2libGUgbW9kdWxlcyAoYnVpbHRpbnMgYW5kIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGVzKQorICAgICAgICBjX21vZHVsZXMgPSBbXQorICAgICAgICBmb3IgbW9kdWxlIGluIG1vZHVsZV9kaWN0LmtleXMoKToKKyAgICAgICAgICAgIGlmIG1vZHVsZV9kaWN0W21vZHVsZV0uZ2V0dHlwZSgpIGluICgnYnVpbHRpbicsICdkeW5hbWljJyk6CisgICAgICAgICAgICAgICAgIyBpZiB0aGUgbW9kdWxlIGlzIGluIGEgcGFja2FnZSB3ZSBoYXZlIG5vIGNob2ljZSBidXQKKyAgICAgICAgICAgICAgICAjIHRvIHB1dCBpdCBhdCB0aGUgdG9wbGV2ZWwgaW4gdGhlIGZyb3plbiBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICBpZiAnLicgaW4gbW9kdWxlOgorICAgICAgICAgICAgICAgICAgICBtb2R1bGUgPSBtb2R1bGUuc3BsaXQoJy4nKVstMV0KKyAgICAgICAgICAgICAgICBjX21vZHVsZXMuYXBwZW5kKG1vZHVsZSkKKyAgICAgICAgaWZwID0gb3BlbihDT05GSUdfVEVNUExBVEUpCisgICAgICAgIG9mcCA9IG9wZW4oY29uZmlnX25hbWUsICd3JykKKyAgICAgICAgbWFrZWNvbmZpZy5tYWtlY29uZmlnKGlmcCwgb2ZwLCBjX21vZHVsZXMsIHdpdGhfaWZkZWYpCisgICAgICAgIGlmcC5jbG9zZSgpCisgICAgICAgIG9mcC5jbG9zZSgpCisgICAgICAgIE1hY09TLlNldENyZWF0b3JBbmRUeXBlKGNvbmZpZ19uYW1lLCAnQ1dJRScsICdURVhUJykKKworICAgIGlmIHdhcm5pbmdzKG1vZHVsZV9kaWN0KToKKyAgICAgICAgcHJvYmxlbXMgPSAxCisgICAgcmV0dXJuIHByb2JsZW1zCisKIGRlZiB3YXJuaW5ncyhtb2R1bGVfZGljdCk6Ci0JcHJvYmxlbXMgPSAwCi0JZm9yIG5hbWUsIG1vZHVsZSBpbiBtb2R1bGVfZGljdC5pdGVtcygpOgotCQlpZiBtb2R1bGUuZ2V0dHlwZSgpIG5vdCBpbiAoJ2J1aWx0aW4nLCAnbW9kdWxlJywgJ2R5bmFtaWMnLCAncGFja2FnZScpOgotCQkJcHJvYmxlbXMgPSBwcm9ibGVtcyArIDEKLQkJCXByaW50ICdXYXJuaW5nOiAlcyBub3QgaW5jbHVkZWQ6ICVzICVzJyUobmFtZSwgbW9kdWxlLmdldHR5cGUoKSwgbW9kdWxlKQotCXJldHVybiBwcm9ibGVtcworICAgIHByb2JsZW1zID0gMAorICAgIGZvciBuYW1lLCBtb2R1bGUgaW4gbW9kdWxlX2RpY3QuaXRlbXMoKToKKyAgICAgICAgaWYgbW9kdWxlLmdldHR5cGUoKSBub3QgaW4gKCdidWlsdGluJywgJ21vZHVsZScsICdkeW5hbWljJywgJ3BhY2thZ2UnKToKKyAgICAgICAgICAgIHByb2JsZW1zID0gcHJvYmxlbXMgKyAxCisgICAgICAgICAgICBwcmludCAnV2FybmluZzogJXMgbm90IGluY2x1ZGVkOiAlcyAlcyclKG5hbWUsIG1vZHVsZS5nZXR0eXBlKCksIG1vZHVsZSkKKyAgICByZXR1cm4gcHJvYmxlbXMKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuZXJhdGUucHkgYi9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbmVyYXRlLnB5CmluZGV4IGRmYTIwNDcuLjEyMzQzYzMgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuZXJhdGUucHkKKysrIGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5lcmF0ZS5weQpAQCAtMSw4ICsxLDggQEAKICIiIm1hY2dlbmVyYXRlIC0gR2VuZXJhdGUgdGhlIG91dCBmb3IgbWFjZnJlZXplIiIiCiAKIGRlZiBnZW5lcmF0ZShwcm9ncmFtLCBtb2R1bGVfZGljdCk6Ci0JZm9yIG5hbWUgaW4gbW9kdWxlX2RpY3Qua2V5cygpOgotCQlwcmludCAnSW5jbHVkZSAlLTIwc1x0JyVuYW1lLAotCQltb2R1bGUgPSBtb2R1bGVfZGljdFtuYW1lXQotCQlwcmludCBtb2R1bGUuZ2V0dHlwZSgpLCAnXHQnLCByZXByKG1vZHVsZSkKLQlyZXR1cm4gMAorICAgIGZvciBuYW1lIGluIG1vZHVsZV9kaWN0LmtleXMoKToKKyAgICAgICAgcHJpbnQgJ0luY2x1ZGUgJS0yMHNcdCclbmFtZSwKKyAgICAgICAgbW9kdWxlID0gbW9kdWxlX2RpY3RbbmFtZV0KKyAgICAgICAgcHJpbnQgbW9kdWxlLmdldHR5cGUoKSwgJ1x0JywgcmVwcihtb2R1bGUpCisgICAgcmV0dXJuIDAKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjbW9kdWxlZmluZGVyLnB5IGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNtb2R1bGVmaW5kZXIucHkKaW5kZXggMjg1ZjUxZi4uM2Y0ZTBiNyAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNtb2R1bGVmaW5kZXIucHkKKysrIGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNtb2R1bGVmaW5kZXIucHkKQEAgLTcsNDAgKzcsNDAgQEAKIGltcG9ydCBkaXJlY3RpdmVzCiAKIHRyeToKLQkjIFRoaXMgd2lsbCB3b3JrIGlmIHdlIGFyZSBmcm96ZW4gb3Vyc2VsdmVzCi0JaW1wb3J0IG1vZHVsZWZpbmRlcgorICAgICMgVGhpcyB3aWxsIHdvcmsgaWYgd2UgYXJlIGZyb3plbiBvdXJzZWx2ZXMKKyAgICBpbXBvcnQgbW9kdWxlZmluZGVyCiBleGNlcHQgSW1wb3J0RXJyb3I6Ci0JIyBBbmQgdGhpcyB3aWxsIHdvcmsgb3RoZXJ3aXNlCi0JX0ZSRUVaRURJUj1vcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJzpUb29sczpmcmVlemUnKQotCXN5cy5wYXRoLmluc2VydCgwLCBfRlJFRVpFRElSKQotCWltcG9ydCBtb2R1bGVmaW5kZXIKKyAgICAjIEFuZCB0aGlzIHdpbGwgd29yayBvdGhlcndpc2UKKyAgICBfRlJFRVpFRElSPW9zLnBhdGguam9pbihzeXMucHJlZml4LCAnOlRvb2xzOmZyZWV6ZScpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIF9GUkVFWkVESVIpCisgICAgaW1wb3J0IG1vZHVsZWZpbmRlcgogCiAjCiAjIE1vZHVsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLCBhbmQgbW9kdWxlcyB0aGF0IG5lZWQgbm90IGJlIGluY2x1ZGVkCiAjIChidXQgYXJlIGlmIHRoZXkgYXJlIGZvdW5kKQogIwogTUFDX0lOQ0xVREVfTU9EVUxFUz1bJ3NpdGUnXQotTUFDX01BWU1JU1NfTU9EVUxFUz1bJ3Bvc2l4JywgJ29zMicsICdudCcsICdudHBhdGgnLCAnZG9zJywgJ2Rvc3BhdGgnLCAKLQkJJ3dpbjMyYXBpJywgJ2NlJywgJ193aW5yZWcnLAotCQknbnR1cmwycGF0aCcsICdwd2QnLCAnc2l0ZWN1c3RvbWl6ZScsCi0JCSdvcmcucHl0aG9uLmNvcmUnLAotCQkncmlzY29zJywgJ3Jpc2Nvc2Vudmlyb24nLCAncmlzY29zcGF0aCcKLQkJXQorTUFDX01BWU1JU1NfTU9EVUxFUz1bJ3Bvc2l4JywgJ29zMicsICdudCcsICdudHBhdGgnLCAnZG9zJywgJ2Rvc3BhdGgnLAorICAgICAgICAgICAgICAgICd3aW4zMmFwaScsICdjZScsICdfd2lucmVnJywKKyAgICAgICAgICAgICAgICAnbnR1cmwycGF0aCcsICdwd2QnLCAnc2l0ZWN1c3RvbWl6ZScsCisgICAgICAgICAgICAgICAgJ29yZy5weXRob24uY29yZScsCisgICAgICAgICAgICAgICAgJ3Jpc2NvcycsICdyaXNjb3NlbnZpcm9uJywgJ3Jpc2Nvc3BhdGgnCisgICAgICAgICAgICAgICAgXQogCiAjIEFuIGV4Y2VwdGlvbjoKIE1pc3Npbmc9Im1hY21vZHVsZWZpbmRlci5NaXNzaW5nIgogCiBjbGFzcyBNb2R1bGUobW9kdWxlZmluZGVyLk1vZHVsZSk6Ci0JCi0JZGVmIGdldHR5cGUoc2VsZik6Ci0JCSIiIlJldHVybiB0eXBlIG9mIG1vZHVsZSIiIgotCQlpZiBzZWxmLl9fcGF0aF9fOgotCQkJcmV0dXJuICdwYWNrYWdlJwotCQlpZiBzZWxmLl9fY29kZV9fOgotCQkJcmV0dXJuICdtb2R1bGUnCi0JCWlmIHNlbGYuX19maWxlX186Ci0JCQlyZXR1cm4gJ2R5bmFtaWMnCi0JCXJldHVybiAnYnVpbHRpbicKKworICAgIGRlZiBnZXR0eXBlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdHlwZSBvZiBtb2R1bGUiIiIKKyAgICAgICAgaWYgc2VsZi5fX3BhdGhfXzoKKyAgICAgICAgICAgIHJldHVybiAncGFja2FnZScKKyAgICAgICAgaWYgc2VsZi5fX2NvZGVfXzoKKyAgICAgICAgICAgIHJldHVybiAnbW9kdWxlJworICAgICAgICBpZiBzZWxmLl9fZmlsZV9fOgorICAgICAgICAgICAgcmV0dXJuICdkeW5hbWljJworICAgICAgICByZXR1cm4gJ2J1aWx0aW4nCiAKIGNsYXNzIE1vZHVsZUZpbmRlcihtb2R1bGVmaW5kZXIuTW9kdWxlRmluZGVyKToKIApAQCAtNDksNjQgKzQ5LDY0IEBACiAgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2R1bGVzW2ZxbmFtZV0KICAgICAgICAgc2VsZi5tb2R1bGVzW2ZxbmFtZV0gPSBtID0gTW9kdWxlKGZxbmFtZSkKICAgICAgICAgcmV0dXJuIG0KLSAgICAgICAgCisKIGRlZiBwcm9jZXNzKHByb2dyYW0sIG1vZHVsZXM9Tm9uZSwgbW9kdWxlX2ZpbGVzPU5vbmUsIGRlYnVnPTApOgotCWlmIG1vZHVsZXMgaXMgTm9uZToKLQkJbW9kdWxlcyA9IFtdCi0JaWYgbW9kdWxlX2ZpbGVzIGlzIE5vbmU6Ci0JCW1vZHVsZV9maWxlcyA9IFtdCi0JbWlzc2luZyA9IFtdCi0JIwotCSMgQWRkIHRoZSBzdGFuZGFyZCBtb2R1bGVzIG5lZWRlZCBmb3Igc3RhcnR1cAotCSMKLQltb2R1bGVzID0gbW9kdWxlcyArIE1BQ19JTkNMVURFX01PRFVMRVMKLQkjCi0JIyBzZWFyY2ggdGhlIG1haW4gc291cmNlIGZvciBkaXJlY3RpdmVzCi0JIwotCWV4dHJhX21vZHVsZXMsIGV4Y2x1ZGVfbW9kdWxlcywgb3B0aW9uYWxfbW9kdWxlcywgZXh0cmFfcGF0aCA9IFwKLQkJCWRpcmVjdGl2ZXMuZmluZGZyZWV6ZWRpcmVjdGl2ZXMocHJvZ3JhbSkKLQlmb3IgbSBpbiBleHRyYV9tb2R1bGVzOgotCQlpZiBvcy5zZXAgaW4gbToKLQkJCSMgSXQgaXMgYSBmaWxlCi0JCQltb2R1bGVfZmlsZXMuYXBwZW5kKG0pCi0JCWVsc2U6Ci0JCQltb2R1bGVzLmFwcGVuZChtKQorICAgIGlmIG1vZHVsZXMgaXMgTm9uZToKKyAgICAgICAgbW9kdWxlcyA9IFtdCisgICAgaWYgbW9kdWxlX2ZpbGVzIGlzIE5vbmU6CisgICAgICAgIG1vZHVsZV9maWxlcyA9IFtdCisgICAgbWlzc2luZyA9IFtdCisgICAgIworICAgICMgQWRkIHRoZSBzdGFuZGFyZCBtb2R1bGVzIG5lZWRlZCBmb3Igc3RhcnR1cAorICAgICMKKyAgICBtb2R1bGVzID0gbW9kdWxlcyArIE1BQ19JTkNMVURFX01PRFVMRVMKKyAgICAjCisgICAgIyBzZWFyY2ggdGhlIG1haW4gc291cmNlIGZvciBkaXJlY3RpdmVzCisgICAgIworICAgIGV4dHJhX21vZHVsZXMsIGV4Y2x1ZGVfbW9kdWxlcywgb3B0aW9uYWxfbW9kdWxlcywgZXh0cmFfcGF0aCA9IFwKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlcy5maW5kZnJlZXplZGlyZWN0aXZlcyhwcm9ncmFtKQorICAgIGZvciBtIGluIGV4dHJhX21vZHVsZXM6CisgICAgICAgIGlmIG9zLnNlcCBpbiBtOgorICAgICAgICAgICAgIyBJdCBpcyBhIGZpbGUKKyAgICAgICAgICAgIG1vZHVsZV9maWxlcy5hcHBlbmQobSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZHVsZXMuYXBwZW5kKG0pCiAgICAgIyBjb2xsZWN0IGFsbCBtb2R1bGVzIG9mIHRoZSBwcm9ncmFtCi0JcGF0aCA9IHN5cy5wYXRoWzpdCi0JZGlyID0gb3MucGF0aC5kaXJuYW1lKHByb2dyYW0pCi0JcGF0aFswXSA9IGRpcgkjICJjdXJyZW50IGRpciIKLQlwYXRoID0gZXh0cmFfcGF0aCArIHBhdGgKLQkjCi0JIyBDcmVhdGUgdGhlIG1vZHVsZSBmaW5kZXIgYW5kIGxldCBpdCBkbyBpdHMgd29yawotCSMKLQltb2RmaW5kZXIgPSBNb2R1bGVGaW5kZXIocGF0aCwgCi0JCQlleGNsdWRlcz1leGNsdWRlX21vZHVsZXMsIGRlYnVnPWRlYnVnKQotCWZvciBtIGluIG1vZHVsZXM6Ci0JCW1vZGZpbmRlci5pbXBvcnRfaG9vayhtKQotCWZvciBtIGluIG1vZHVsZV9maWxlczoKLQkJbW9kZmluZGVyLmxvYWRfZmlsZShtKQotCW1vZGZpbmRlci5ydW5fc2NyaXB0KHByb2dyYW0pCi0JbW9kdWxlX2RpY3QgPSBtb2RmaW5kZXIubW9kdWxlcwotCSMKLQkjIFRlbGwgdGhlIHVzZXIgYWJvdXQgbWlzc2luZyBtb2R1bGVzCi0JIwotCW1heW1pc3MgPSBleGNsdWRlX21vZHVsZXMgKyBvcHRpb25hbF9tb2R1bGVzICsgTUFDX01BWU1JU1NfTU9EVUxFUwotCWZvciBtIGluIG1vZGZpbmRlci5iYWRtb2R1bGVzLmtleXMoKToKLQkJaWYgbm90IG0gaW4gbWF5bWlzczoKLQkJCWlmIGRlYnVnID4gMDoKLQkJCQlwcmludCAnTWlzc2luZycsIG0KLQkJCW1pc3NpbmcuYXBwZW5kKG0pCi0JIwotCSMgV2FybiB0aGUgdXNlciBhYm91dCB1bnVzZWQgYnVpbHRpbnMKLQkjCi0JZm9yIG0gaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgotCQlpZiBtIGluICgnX19tYWluX18nLCAnX19idWlsdGluX18nKToKLQkJCXBhc3MKLQkJZWxpZiBub3QgbW9kdWxlX2RpY3QuaGFzX2tleShtKToKLQkJCWlmIGRlYnVnID4gMDoKLQkJCQlwcmludCAnVW51c2VkJywgbQotCQllbGlmIG1vZHVsZV9kaWN0W21dLmdldHR5cGUoKSAhPSAnYnVpbHRpbic6Ci0JCQkjIFhYWFggQ2FuIHRoaXMgaGFwcGVuPwotCQkJaWYgZGVidWcgPiAwOgotCQkJCXByaW50ICdDb25mbGljdCcsIG0KLQlyZXR1cm4gbW9kdWxlX2RpY3QsIG1pc3NpbmcKKyAgICBwYXRoID0gc3lzLnBhdGhbOl0KKyAgICBkaXIgPSBvcy5wYXRoLmRpcm5hbWUocHJvZ3JhbSkKKyAgICBwYXRoWzBdID0gZGlyICAgIyAiY3VycmVudCBkaXIiCisgICAgcGF0aCA9IGV4dHJhX3BhdGggKyBwYXRoCisgICAgIworICAgICMgQ3JlYXRlIHRoZSBtb2R1bGUgZmluZGVyIGFuZCBsZXQgaXQgZG8gaXRzIHdvcmsKKyAgICAjCisgICAgbW9kZmluZGVyID0gTW9kdWxlRmluZGVyKHBhdGgsCisgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVzPWV4Y2x1ZGVfbW9kdWxlcywgZGVidWc9ZGVidWcpCisgICAgZm9yIG0gaW4gbW9kdWxlczoKKyAgICAgICAgbW9kZmluZGVyLmltcG9ydF9ob29rKG0pCisgICAgZm9yIG0gaW4gbW9kdWxlX2ZpbGVzOgorICAgICAgICBtb2RmaW5kZXIubG9hZF9maWxlKG0pCisgICAgbW9kZmluZGVyLnJ1bl9zY3JpcHQocHJvZ3JhbSkKKyAgICBtb2R1bGVfZGljdCA9IG1vZGZpbmRlci5tb2R1bGVzCisgICAgIworICAgICMgVGVsbCB0aGUgdXNlciBhYm91dCBtaXNzaW5nIG1vZHVsZXMKKyAgICAjCisgICAgbWF5bWlzcyA9IGV4Y2x1ZGVfbW9kdWxlcyArIG9wdGlvbmFsX21vZHVsZXMgKyBNQUNfTUFZTUlTU19NT0RVTEVTCisgICAgZm9yIG0gaW4gbW9kZmluZGVyLmJhZG1vZHVsZXMua2V5cygpOgorICAgICAgICBpZiBub3QgbSBpbiBtYXltaXNzOgorICAgICAgICAgICAgaWYgZGVidWcgPiAwOgorICAgICAgICAgICAgICAgIHByaW50ICdNaXNzaW5nJywgbQorICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQobSkKKyAgICAjCisgICAgIyBXYXJuIHRoZSB1c2VyIGFib3V0IHVudXNlZCBidWlsdGlucworICAgICMKKyAgICBmb3IgbSBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CisgICAgICAgIGlmIG0gaW4gKCdfX21haW5fXycsICdfX2J1aWx0aW5fXycpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIG5vdCBtb2R1bGVfZGljdC5oYXNfa2V5KG0pOgorICAgICAgICAgICAgaWYgZGVidWcgPiAwOgorICAgICAgICAgICAgICAgIHByaW50ICdVbnVzZWQnLCBtCisgICAgICAgIGVsaWYgbW9kdWxlX2RpY3RbbV0uZ2V0dHlwZSgpICE9ICdidWlsdGluJzoKKyAgICAgICAgICAgICMgWFhYWCBDYW4gdGhpcyBoYXBwZW4/CisgICAgICAgICAgICBpZiBkZWJ1ZyA+IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgJ0NvbmZsaWN0JywgbQorICAgIHJldHVybiBtb2R1bGVfZGljdCwgbWlzc2luZwpkaWZmIC0tZ2l0IGEvTWFjL3NjcmlwdHMvQnVpbGRBcHBsZXQucHkgYi9NYWMvc2NyaXB0cy9CdWlsZEFwcGxldC5weQppbmRleCBlOTU0ODU0Li5jYjJhZWQ4IDEwMDY0NAotLS0gYS9NYWMvc2NyaXB0cy9CdWlsZEFwcGxldC5weQorKysgYi9NYWMvc2NyaXB0cy9CdWlsZEFwcGxldC5weQpAQCAtMTcsMTE3ICsxNywxMTcgQEAKIGltcG9ydCBnZXRvcHQKIAogZGVmIG1haW4oKToKLQl0cnk6Ci0JCWJ1aWxkYXBwbGV0KCkKLQlleGNlcHQgYnVpbGR0b29scy5CdWlsZEVycm9yLCBkZXRhaWw6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoZGV0YWlsKQorICAgIHRyeToKKyAgICAgICAgYnVpbGRhcHBsZXQoKQorICAgIGV4Y2VwdCBidWlsZHRvb2xzLkJ1aWxkRXJyb3IsIGRldGFpbDoKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZShkZXRhaWwpCiAKIAogZGVmIGJ1aWxkYXBwbGV0KCk6Ci0JYnVpbGR0b29scy5ERUJVRz0xCi0JCi0JIyBGaW5kIHRoZSB0ZW1wbGF0ZQotCSMgKHRoZXJlJ3Mgbm8gcG9pbnQgaW4gcHJvY2VlZGluZyBpZiB3ZSBjYW4ndCBmaW5kIGl0KQotCQotCXRlbXBsYXRlID0gYnVpbGR0b29scy5maW5kdGVtcGxhdGUoKQotCQotCSMgQXNrIGZvciBzb3VyY2UgdGV4dCBpZiBub3Qgc3BlY2lmaWVkIGluIHN5cy5hcmd2WzE6XQotCQotCWlmIG5vdCBzeXMuYXJndlsxOl06Ci0JCWZpbGVuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0nU2VsZWN0IFB5dGhvbiBzb3VyY2Ugb3IgYXBwbGV0OicsIAotCQkJdHlwZUxpc3Q9KCdURVhUJywgJ0FQUEwnKSkKLQkJaWYgbm90IGZpbGVuYW1lOgotCQkJcmV0dXJuCi0JCXRwLCB0ZiA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCi0JCWlmIHRmWy0zOl0gPT0gJy5weSc6Ci0JCQl0ZiA9IHRmWzotM10KLQkJZWxzZToKLQkJCXRmID0gdGYgKyAnLmFwcGxldCcKLQkJZHN0ZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFwcGxpY2F0aW9uIGFzOicsIAotCQkJc2F2ZWRGaWxlTmFtZT10ZikKLQkJaWYgbm90IGRzdGZpbGVuYW1lOiByZXR1cm4KLQkJY3IsIHRwID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUoZmlsZW5hbWUpCi0JCWlmIHRwID09ICdBUFBMJzoKLQkJCWJ1aWxkdG9vbHMudXBkYXRlKHRlbXBsYXRlLCBmaWxlbmFtZSwgZHN0ZmlsZW5hbWUpCi0JCWVsc2U6Ci0JCQlidWlsZHRvb2xzLnByb2Nlc3ModGVtcGxhdGUsIGZpbGVuYW1lLCBkc3RmaWxlbmFtZSwgMSkKLQllbHNlOgotCQkKLQkJU0hPUlRPUFRTID0gIm86cjpuZTp2P1AiCi0JCUxPTkdPUFRTPSgib3V0cHV0PSIsICJyZXNvdXJjZT0iLCAibm9hcmd2IiwgImV4dHJhPSIsICJ2ZXJib3NlIiwgImhlbHAiLCAicHl0aG9uPSIpCi0JCXRyeToKLQkJCW9wdGlvbnMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgU0hPUlRPUFRTLCBMT05HT1BUUykKLQkJZXhjZXB0IGdldG9wdC5lcnJvcjoKLQkJCXVzYWdlKCkKLQkJaWYgb3B0aW9ucyBhbmQgbGVuKGFyZ3MpID4gMToKLQkJCXN5cy5zdGRlcnIud3JpdGUoIkNhbm5vdCB1c2Ugb3B0aW9ucyB3aGVuIHNwZWNpZnlpbmcgbXVsdGlwbGUgaW5wdXQgZmlsZXMiKQotCQkJc3lzLmV4aXQoMSkKLQkJZHN0ZmlsZW5hbWUgPSBOb25lCi0JCXJzcmNmaWxlbmFtZSA9IE5vbmUKLQkJcmF3ID0gMAotCQlleHRyYXMgPSBbXQotCQl2ZXJib3NlID0gTm9uZQotCQlmb3Igb3B0LCBhcmcgaW4gb3B0aW9uczoKLQkJCWlmIG9wdCBpbiAoJy1vJywgJy0tb3V0cHV0Jyk6Ci0JCQkJZHN0ZmlsZW5hbWUgPSBhcmcKLQkJCWVsaWYgb3B0IGluICgnLXInLCAnLS1yZXNvdXJjZScpOgotCQkJCXJzcmNmaWxlbmFtZSA9IGFyZwotCQkJZWxpZiBvcHQgaW4gKCctbicsICctLW5vYXJndicpOgotCQkJCXJhdyA9IDEKLQkJCWVsaWYgb3B0IGluICgnLWUnLCAnLS1leHRyYScpOgotCQkJCWlmICc6JyBpbiBhcmc6Ci0JCQkJCWFyZyA9IGFyZy5zcGxpdCgnOicpCi0JCQkJZXh0cmFzLmFwcGVuZChhcmcpCi0JCQllbGlmIG9wdCBpbiAoJy1QJywgJy0tcHl0aG9uJyk6Ci0JCQkJIyBUaGlzIGlzIGEgdmVyeSBkaXJ0eSB0cmljay4gV2Ugc2V0IHN5cy5leGVjdXRhYmxlCi0JCQkJIyBzbyB0aGF0IGJ1bmRsZWJ1aWxkZXIgd2lsbCB1c2UgdGhpcyBpbiB0aGUgIyEgbGluZQotCQkJCSMgZm9yIHRoZSBhcHBsZXQgYm9vdHN0cmFwLgotCQkJCXN5cy5leGVjdXRhYmxlID0gYXJnCi0JCQllbGlmIG9wdCBpbiAoJy12JywgJy0tdmVyYm9zZScpOgotCQkJCXZlcmJvc2UgPSBWZXJib3NlKCkKLQkJCWVsaWYgb3B0IGluICgnLT8nLCAnLS1oZWxwJyk6Ci0JCQkJdXNhZ2UoKQotCQkjIE9uIE9TOSBhbHdheXMgYmUgdmVyYm9zZQotCQlpZiBzeXMucGxhdGZvcm0gPT0gJ21hYycgYW5kIG5vdCB2ZXJib3NlOgotCQkJdmVyYm9zZSA9ICdkZWZhdWx0JwotCQkjIExvb3Agb3ZlciBhbGwgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkCi0JCWZvciBmaWxlbmFtZSBpbiBhcmdzOgotCQkJY3IsIHRwID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUoZmlsZW5hbWUpCi0JCQlpZiB0cCA9PSAnQVBQTCc6Ci0JCQkJYnVpbGR0b29scy51cGRhdGUodGVtcGxhdGUsIGZpbGVuYW1lLCBkc3RmaWxlbmFtZSkKLQkJCWVsc2U6Ci0JCQkJYnVpbGR0b29scy5wcm9jZXNzKHRlbXBsYXRlLCBmaWxlbmFtZSwgZHN0ZmlsZW5hbWUsIDEsCi0JCQkJCXJzcmNuYW1lPXJzcmNmaWxlbmFtZSwgb3RoZXJzPWV4dHJhcywgcmF3PXJhdywgcHJvZ3Jlc3M9dmVyYm9zZSkKKyAgICBidWlsZHRvb2xzLkRFQlVHPTEKKworICAgICMgRmluZCB0aGUgdGVtcGxhdGUKKyAgICAjICh0aGVyZSdzIG5vIHBvaW50IGluIHByb2NlZWRpbmcgaWYgd2UgY2FuJ3QgZmluZCBpdCkKKworICAgIHRlbXBsYXRlID0gYnVpbGR0b29scy5maW5kdGVtcGxhdGUoKQorCisgICAgIyBBc2sgZm9yIHNvdXJjZSB0ZXh0IGlmIG5vdCBzcGVjaWZpZWQgaW4gc3lzLmFyZ3ZbMTpdCisKKyAgICBpZiBub3Qgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9J1NlbGVjdCBQeXRob24gc291cmNlIG9yIGFwcGxldDonLAorICAgICAgICAgICAgICAgIHR5cGVMaXN0PSgnVEVYVCcsICdBUFBMJykpCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cCwgdGYgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQorICAgICAgICBpZiB0ZlstMzpdID09ICcucHknOgorICAgICAgICAgICAgdGYgPSB0Zls6LTNdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZiA9IHRmICsgJy5hcHBsZXQnCisgICAgICAgIGRzdGZpbGVuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSBhcHBsaWNhdGlvbiBhczonLAorICAgICAgICAgICAgICAgIHNhdmVkRmlsZU5hbWU9dGYpCisgICAgICAgIGlmIG5vdCBkc3RmaWxlbmFtZTogcmV0dXJuCisgICAgICAgIGNyLCB0cCA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKGZpbGVuYW1lKQorICAgICAgICBpZiB0cCA9PSAnQVBQTCc6CisgICAgICAgICAgICBidWlsZHRvb2xzLnVwZGF0ZSh0ZW1wbGF0ZSwgZmlsZW5hbWUsIGRzdGZpbGVuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnVpbGR0b29scy5wcm9jZXNzKHRlbXBsYXRlLCBmaWxlbmFtZSwgZHN0ZmlsZW5hbWUsIDEpCisgICAgZWxzZToKKworICAgICAgICBTSE9SVE9QVFMgPSAibzpyOm5lOnY/UCIKKyAgICAgICAgTE9OR09QVFM9KCJvdXRwdXQ9IiwgInJlc291cmNlPSIsICJub2FyZ3YiLCAiZXh0cmE9IiwgInZlcmJvc2UiLCAiaGVscCIsICJweXRob249IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3B0aW9ucywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCBTSE9SVE9QVFMsIExPTkdPUFRTKQorICAgICAgICBleGNlcHQgZ2V0b3B0LmVycm9yOgorICAgICAgICAgICAgdXNhZ2UoKQorICAgICAgICBpZiBvcHRpb25zIGFuZCBsZW4oYXJncykgPiAxOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2Fubm90IHVzZSBvcHRpb25zIHdoZW4gc3BlY2lmeWluZyBtdWx0aXBsZSBpbnB1dCBmaWxlcyIpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBkc3RmaWxlbmFtZSA9IE5vbmUKKyAgICAgICAgcnNyY2ZpbGVuYW1lID0gTm9uZQorICAgICAgICByYXcgPSAwCisgICAgICAgIGV4dHJhcyA9IFtdCisgICAgICAgIHZlcmJvc2UgPSBOb25lCisgICAgICAgIGZvciBvcHQsIGFyZyBpbiBvcHRpb25zOgorICAgICAgICAgICAgaWYgb3B0IGluICgnLW8nLCAnLS1vdXRwdXQnKToKKyAgICAgICAgICAgICAgICBkc3RmaWxlbmFtZSA9IGFyZworICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCctcicsICctLXJlc291cmNlJyk6CisgICAgICAgICAgICAgICAgcnNyY2ZpbGVuYW1lID0gYXJnCisgICAgICAgICAgICBlbGlmIG9wdCBpbiAoJy1uJywgJy0tbm9hcmd2Jyk6CisgICAgICAgICAgICAgICAgcmF3ID0gMQorICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCctZScsICctLWV4dHJhJyk6CisgICAgICAgICAgICAgICAgaWYgJzonIGluIGFyZzoKKyAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnNwbGl0KCc6JykKKyAgICAgICAgICAgICAgICBleHRyYXMuYXBwZW5kKGFyZykKKyAgICAgICAgICAgIGVsaWYgb3B0IGluICgnLVAnLCAnLS1weXRob24nKToKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYSB2ZXJ5IGRpcnR5IHRyaWNrLiBXZSBzZXQgc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgICAgICAgICAjIHNvIHRoYXQgYnVuZGxlYnVpbGRlciB3aWxsIHVzZSB0aGlzIGluIHRoZSAjISBsaW5lCisgICAgICAgICAgICAgICAgIyBmb3IgdGhlIGFwcGxldCBib290c3RyYXAuCisgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUgPSBhcmcKKyAgICAgICAgICAgIGVsaWYgb3B0IGluICgnLXYnLCAnLS12ZXJib3NlJyk6CisgICAgICAgICAgICAgICAgdmVyYm9zZSA9IFZlcmJvc2UoKQorICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCctPycsICctLWhlbHAnKToKKyAgICAgICAgICAgICAgICB1c2FnZSgpCisgICAgICAgICMgT24gT1M5IGFsd2F5cyBiZSB2ZXJib3NlCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnbWFjJyBhbmQgbm90IHZlcmJvc2U6CisgICAgICAgICAgICB2ZXJib3NlID0gJ2RlZmF1bHQnCisgICAgICAgICMgTG9vcCBvdmVyIGFsbCBmaWxlcyB0byBiZSBwcm9jZXNzZWQKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6CisgICAgICAgICAgICBjciwgdHAgPSBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZShmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIHRwID09ICdBUFBMJzoKKyAgICAgICAgICAgICAgICBidWlsZHRvb2xzLnVwZGF0ZSh0ZW1wbGF0ZSwgZmlsZW5hbWUsIGRzdGZpbGVuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBidWlsZHRvb2xzLnByb2Nlc3ModGVtcGxhdGUsIGZpbGVuYW1lLCBkc3RmaWxlbmFtZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJzcmNuYW1lPXJzcmNmaWxlbmFtZSwgb3RoZXJzPWV4dHJhcywgcmF3PXJhdywgcHJvZ3Jlc3M9dmVyYm9zZSkKIAogZGVmIHVzYWdlKCk6Ci0JcHJpbnQgIkJ1aWxkQXBwbGV0IGNyZWF0ZXMgYW4gYXBwbGljYXRpb24gZnJvbSBhIFB5dGhvbiBzb3VyY2UgZmlsZSIKLQlwcmludCAiVXNhZ2U6IgotCXByaW50ICIgIEJ1aWxkQXBwbGV0ICAgICBpbnRlcmFjdGl2ZSwgc2luZ2xlIGZpbGUsIG5vIG9wdGlvbnMiCi0JcHJpbnQgIiAgQnVpbGRBcHBsZXQgc3JjMS5weSBzcmMyLnB5IC4uLiAgIG5vbi1pbnRlcmFjdGl2ZSBtdWx0aXBsZSBmaWxlIgotCXByaW50ICIgIEJ1aWxkQXBwbGV0IFtvcHRpb25zXSBzcmMucHkgICAgbm9uLWludGVyYWN0aXZlIHNpbmdsZSBmaWxlIgotCXByaW50ICJPcHRpb25zOiIKLQlwcmludCAiICAtLW91dHB1dCBvICAgICAgICBPdXRwdXQgZmlsZTsgZGVmYXVsdCBiYXNlZCBvbiBzb3VyY2UgZmlsZW5hbWUsIHNob3J0IC1vIgotCXByaW50ICIgIC0tcmVzb3VyY2UgciAgICAgIFJlc291cmNlIGZpbGU7IGRlZmF1bHQgYmFzZWQgb24gc291cmNlIGZpbGVuYW1lLCBzaG9ydCAtciIKLQlwcmludCAiICAtLW5vYXJndiAgICAgICAgICBCdWlsZCBhcHBsZXQgd2l0aG91dCBkcmFnLWFuZC1kcm9wIHN5cy5hcmd2IGVtdWxhdGlvbiwgc2hvcnQgLW4sIE9TWCBvbmx5IgotCXByaW50ICIgIC0tZXh0cmEgc3JjWzpkc3RdIEV4dHJhIGZpbGUgdG8gcHV0IGluIC5hcHAgYnVuZGxlLCBzaG9ydCAtZSwgT1NYIG9ubHkiCi0JcHJpbnQgIiAgLS12ZXJib3NlICAgICAgICAgVmVyYm9zZSwgc2hvcnQgLXYiCi0JcHJpbnQgIiAgLS1oZWxwICAgICAgICAgICAgVGhpcyBtZXNzYWdlLCBzaG9ydCAtPyIKLQlzeXMuZXhpdCgxKQorICAgIHByaW50ICJCdWlsZEFwcGxldCBjcmVhdGVzIGFuIGFwcGxpY2F0aW9uIGZyb20gYSBQeXRob24gc291cmNlIGZpbGUiCisgICAgcHJpbnQgIlVzYWdlOiIKKyAgICBwcmludCAiICBCdWlsZEFwcGxldCAgICAgaW50ZXJhY3RpdmUsIHNpbmdsZSBmaWxlLCBubyBvcHRpb25zIgorICAgIHByaW50ICIgIEJ1aWxkQXBwbGV0IHNyYzEucHkgc3JjMi5weSAuLi4gICBub24taW50ZXJhY3RpdmUgbXVsdGlwbGUgZmlsZSIKKyAgICBwcmludCAiICBCdWlsZEFwcGxldCBbb3B0aW9uc10gc3JjLnB5ICAgIG5vbi1pbnRlcmFjdGl2ZSBzaW5nbGUgZmlsZSIKKyAgICBwcmludCAiT3B0aW9uczoiCisgICAgcHJpbnQgIiAgLS1vdXRwdXQgbyAgICAgICAgT3V0cHV0IGZpbGU7IGRlZmF1bHQgYmFzZWQgb24gc291cmNlIGZpbGVuYW1lLCBzaG9ydCAtbyIKKyAgICBwcmludCAiICAtLXJlc291cmNlIHIgICAgICBSZXNvdXJjZSBmaWxlOyBkZWZhdWx0IGJhc2VkIG9uIHNvdXJjZSBmaWxlbmFtZSwgc2hvcnQgLXIiCisgICAgcHJpbnQgIiAgLS1ub2FyZ3YgICAgICAgICAgQnVpbGQgYXBwbGV0IHdpdGhvdXQgZHJhZy1hbmQtZHJvcCBzeXMuYXJndiBlbXVsYXRpb24sIHNob3J0IC1uLCBPU1ggb25seSIKKyAgICBwcmludCAiICAtLWV4dHJhIHNyY1s6ZHN0XSBFeHRyYSBmaWxlIHRvIHB1dCBpbiAuYXBwIGJ1bmRsZSwgc2hvcnQgLWUsIE9TWCBvbmx5IgorICAgIHByaW50ICIgIC0tdmVyYm9zZSAgICAgICAgIFZlcmJvc2UsIHNob3J0IC12IgorICAgIHByaW50ICIgIC0taGVscCAgICAgICAgICAgIFRoaXMgbWVzc2FnZSwgc2hvcnQgLT8iCisgICAgc3lzLmV4aXQoMSkKIAogY2xhc3MgVmVyYm9zZToKLQkiIiJUaGlzIGNsYXNzIG1pbWljcyBFYXN5RGlhbG9ncy5Qcm9ncmVzc0JhciBidXQgcHJpbnRzIHRvIHN0ZGVyciIiIgotCWRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0JCWlmIGFyZ3MgYW5kIGFyZ3NbMF06Ci0JCQlzZWxmLmxhYmVsKGFyZ3NbMF0pCi0JCQotCWRlZiBzZXQoc2VsZiwgKmFyZ3MpOgotCQlwYXNzCi0JCQotCWRlZiBpbmMoc2VsZiwgKmFyZ3MpOgotCQlwYXNzCi0JCQotCWRlZiBsYWJlbChzZWxmLCBzdHIpOgotCQlzeXMuc3RkZXJyLndyaXRlKHN0cisnXG4nKQorICAgICIiIlRoaXMgY2xhc3MgbWltaWNzIEVhc3lEaWFsb2dzLlByb2dyZXNzQmFyIGJ1dCBwcmludHMgdG8gc3RkZXJyIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgYXJncyBhbmQgYXJnc1swXToKKyAgICAgICAgICAgIHNlbGYubGFiZWwoYXJnc1swXSkKKworICAgIGRlZiBzZXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaW5jKHNlbGYsICphcmdzKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGxhYmVsKHNlbGYsIHN0cik6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoc3RyKydcbicpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvc2NyaXB0cy9iZ2VuYWxsLnB5IGIvTWFjL3NjcmlwdHMvYmdlbmFsbC5weQppbmRleCA2NDkwMjY1Li4xZmU1ZjM0IDEwMDY0NAotLS0gYS9NYWMvc2NyaXB0cy9iZ2VuYWxsLnB5CisrKyBiL01hYy9zY3JpcHRzL2JnZW5hbGwucHkKQEAgLTUsNTIgKzUsNTIgQEAKIGltcG9ydCBzdHJpbmcKIAogZGVmIGJnZW5vbmUoZGlybmFtZSwgc2hvcnRuYW1lKToKLQlvcy5jaGRpcihkaXJuYW1lKQotCXByaW50ICclczonJXNob3J0bmFtZQotCSMgU2lnaCwgd2UgZG9uJ3Qgd2FudCB0byBsb3NlIENWUyBoaXN0b3J5LCBzbyB0d28KLQkjIG1vZHVsZXMgaGF2ZSBmdW5ueSBuYW1lczoKLQlpZiBzaG9ydG5hbWUgPT0gJ2NhcmJvbmV2dCc6Ci0JCW1vZHVsZW5hbWUgPSAnQ2FyYm9uRXZ0c2NhbicKLQllbGlmIHNob3J0bmFtZSA9PSAnaWJjYXJib24nOgotCQltb2R1bGVuYW1lID0gJ0lCQ2FyYm9uc2NhbicKLQllbHNlOgotCQltb2R1bGVuYW1lID0gc2hvcnRuYW1lICsgJ3NjYW4nCi0JdHJ5OgotCQltID0gX19pbXBvcnRfXyhtb2R1bGVuYW1lKQotCWV4Y2VwdDoKLQkJcHJpbnQgIkVycm9yOiIsIHNob3J0bmFtZSwgc3lzLmV4Y19pbmZvKClbMV0KLQkJcmV0dXJuIDAKLQl0cnk6Ci0JCW0ubWFpbigpCi0JZXhjZXB0OgotCQlwcmludCAiRXJyb3I6Iiwgc2hvcnRuYW1lLCBzeXMuZXhjX2luZm8oKVsxXQotCQlyZXR1cm4gMAotCXJldHVybiAxCi0JCisgICAgb3MuY2hkaXIoZGlybmFtZSkKKyAgICBwcmludCAnJXM6JyVzaG9ydG5hbWUKKyAgICAjIFNpZ2gsIHdlIGRvbid0IHdhbnQgdG8gbG9zZSBDVlMgaGlzdG9yeSwgc28gdHdvCisgICAgIyBtb2R1bGVzIGhhdmUgZnVubnkgbmFtZXM6CisgICAgaWYgc2hvcnRuYW1lID09ICdjYXJib25ldnQnOgorICAgICAgICBtb2R1bGVuYW1lID0gJ0NhcmJvbkV2dHNjYW4nCisgICAgZWxpZiBzaG9ydG5hbWUgPT0gJ2liY2FyYm9uJzoKKyAgICAgICAgbW9kdWxlbmFtZSA9ICdJQkNhcmJvbnNjYW4nCisgICAgZWxzZToKKyAgICAgICAgbW9kdWxlbmFtZSA9IHNob3J0bmFtZSArICdzY2FuJworICAgIHRyeToKKyAgICAgICAgbSA9IF9faW1wb3J0X18obW9kdWxlbmFtZSkKKyAgICBleGNlcHQ6CisgICAgICAgIHByaW50ICJFcnJvcjoiLCBzaG9ydG5hbWUsIHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgIHJldHVybiAwCisgICAgdHJ5OgorICAgICAgICBtLm1haW4oKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcHJpbnQgIkVycm9yOiIsIHNob3J0bmFtZSwgc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgcmV0dXJuIDAKKyAgICByZXR1cm4gMQorCiBkZWYgbWFpbigpOgotCXN1Y2Nlc3MgPSBbXQotCWZhaWx1cmUgPSBbXQotCXN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCi0JaWYgbGVuKHN5cy5hcmd2KSA+IDE6Ci0JCXNyY2RpciA9IHN5cy5hcmd2WzFdCi0JZWxzZToKLQkJc3JjZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnTWFjJyksICdNb2R1bGVzJykKLQlzcmNkaXIgPSBvcy5wYXRoLmFic3BhdGgoc3JjZGlyKQotCWNvbnRlbnRzID0gb3MubGlzdGRpcihzcmNkaXIpCi0JZm9yIG5hbWUgaW4gY29udGVudHM6Ci0JCW1vZHVsZWRpciA9IG9zLnBhdGguam9pbihzcmNkaXIsIG5hbWUpCi0JCXNjYW5tb2R1bGUgPSBvcy5wYXRoLmpvaW4obW9kdWxlZGlyLCBuYW1lICsnc2Nhbi5weScpCi0JCWlmIG9zLnBhdGguZXhpc3RzKHNjYW5tb2R1bGUpOgotCQkJaWYgYmdlbm9uZShtb2R1bGVkaXIsIG5hbWUpOgotCQkJCXN1Y2Nlc3MuYXBwZW5kKG5hbWUpCi0JCQllbHNlOgotCQkJCWZhaWx1cmUuYXBwZW5kKG5hbWUpCi0JcHJpbnQgJ0RvbmU6Jywgc3RyaW5nLmpvaW4oc3VjY2VzcywgJyAnKQotCWlmIGZhaWx1cmU6Ci0JCXByaW50ICdGYWlsZWQ6Jywgc3RyaW5nLmpvaW4oZmFpbHVyZSwgJyAnKQotCQlyZXR1cm4gMAotCXJldHVybiAxCi0JCisgICAgc3VjY2VzcyA9IFtdCisgICAgZmFpbHVyZSA9IFtdCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgc3JjZGlyID0gc3lzLmFyZ3ZbMV0KKyAgICBlbHNlOgorICAgICAgICBzcmNkaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdNYWMnKSwgJ01vZHVsZXMnKQorICAgIHNyY2RpciA9IG9zLnBhdGguYWJzcGF0aChzcmNkaXIpCisgICAgY29udGVudHMgPSBvcy5saXN0ZGlyKHNyY2RpcikKKyAgICBmb3IgbmFtZSBpbiBjb250ZW50czoKKyAgICAgICAgbW9kdWxlZGlyID0gb3MucGF0aC5qb2luKHNyY2RpciwgbmFtZSkKKyAgICAgICAgc2Nhbm1vZHVsZSA9IG9zLnBhdGguam9pbihtb2R1bGVkaXIsIG5hbWUgKydzY2FuLnB5JykKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2Nhbm1vZHVsZSk6CisgICAgICAgICAgICBpZiBiZ2Vub25lKG1vZHVsZWRpciwgbmFtZSk6CisgICAgICAgICAgICAgICAgc3VjY2Vzcy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmFpbHVyZS5hcHBlbmQobmFtZSkKKyAgICBwcmludCAnRG9uZTonLCBzdHJpbmcuam9pbihzdWNjZXNzLCAnICcpCisgICAgaWYgZmFpbHVyZToKKyAgICAgICAgcHJpbnQgJ0ZhaWxlZDonLCBzdHJpbmcuam9pbihmYWlsdXJlLCAnICcpCisgICAgICAgIHJldHVybiAwCisgICAgcmV0dXJuIDEKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQlydiA9IG1haW4oKQotCXN5cy5leGl0KG5vdCBydikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgcnYgPSBtYWluKCkKKyAgICBzeXMuZXhpdChub3QgcnYpCmRpZmYgLS1naXQgYS9NYWMvc2NyaXB0cy9idWlsZHBrZy5weSBiL01hYy9zY3JpcHRzL2J1aWxkcGtnLnB5CmluZGV4IGE5YzcwYzEuLjdmNjM1YTAgMTAwNjQ0Ci0tLSBhL01hYy9zY3JpcHRzL2J1aWxkcGtnLnB5CisrKyBiL01hYy9zY3JpcHRzL2J1aWxkcGtnLnB5CkBAIC0zLDM0ICszLDM0IEBACiAiIiJidWlsZHBrZy5weSAtLSBCdWlsZCBPUyBYIHBhY2thZ2VzIGZvciBBcHBsZSdzIEluc3RhbGxlci5hcHAuCiAKIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGNvbW1hbmQtbGluZSB0b29sIGZvciBidWlsZGluZyBwYWNrYWdlcyB0byBiZQotaW5zdGFsbGVkIHdpdGggdGhlIE1hYyBPUyBYIEluc3RhbGxlci5hcHAgYXBwbGljYXRpb24uIAoraW5zdGFsbGVkIHdpdGggdGhlIE1hYyBPUyBYIEluc3RhbGxlci5hcHAgYXBwbGljYXRpb24uCiAKLUl0IGlzIG11Y2ggaW5zcGlyZWQgYnkgQXBwbGUncyBHVUkgdG9vbCBjYWxsZWQgUGFja2FnZU1ha2VyLmFwcCwgdGhhdCAKLXNlZW1zIHRvIGJlIHBhcnQgb2YgdGhlIE9TIFggZGV2ZWxvcGVyIHRvb2xzIGluc3RhbGxlZCBpbiB0aGUgZm9sZGVyIAotL0RldmVsb3Blci9BcHBsaWNhdGlvbnMuIEJ1dCBhcHBhcmVudGx5IHRoZXJlIGFyZSBvdGhlciBmcmVlIHRvb2xzIHRvIAotZG8gdGhlIHNhbWUgdGhpbmcgd2hpY2ggYXJlIGFsc28gbmFtZWQgUGFja2FnZU1ha2VyIGxpa2UgQnJpYW4gSGlsbCdzIAotb25lOiAKK0l0IGlzIG11Y2ggaW5zcGlyZWQgYnkgQXBwbGUncyBHVUkgdG9vbCBjYWxsZWQgUGFja2FnZU1ha2VyLmFwcCwgdGhhdAorc2VlbXMgdG8gYmUgcGFydCBvZiB0aGUgT1MgWCBkZXZlbG9wZXIgdG9vbHMgaW5zdGFsbGVkIGluIHRoZSBmb2xkZXIKKy9EZXZlbG9wZXIvQXBwbGljYXRpb25zLiBCdXQgYXBwYXJlbnRseSB0aGVyZSBhcmUgb3RoZXIgZnJlZSB0b29scyB0bworZG8gdGhlIHNhbWUgdGhpbmcgd2hpY2ggYXJlIGFsc28gbmFtZWQgUGFja2FnZU1ha2VyIGxpa2UgQnJpYW4gSGlsbCdzCitvbmU6CiAKICAgaHR0cDovL3BlcnNvbmFscGFnZXMudGRzLm5ldC9+YnJpYW5faGlsbC9wYWNrYWdlbWFrZXIuaHRtbAogCi1CZXdhcmUgb2YgdGhlIG11bHRpLXBhY2thZ2UgZmVhdHVyZXMgb2YgSW5zdGFsbGVyLmFwcCAod2hpY2ggYXJlIG5vdCAKLXlldCBzdXBwb3J0ZWQgaGVyZSkgdGhhdCBjYW4gcG90ZW50aWFsbHkgc2NyZXctdXAgeW91ciBpbnN0YWxsYXRpb24gCitCZXdhcmUgb2YgdGhlIG11bHRpLXBhY2thZ2UgZmVhdHVyZXMgb2YgSW5zdGFsbGVyLmFwcCAod2hpY2ggYXJlIG5vdAoreWV0IHN1cHBvcnRlZCBoZXJlKSB0aGF0IGNhbiBwb3RlbnRpYWxseSBzY3Jldy11cCB5b3VyIGluc3RhbGxhdGlvbgogYW5kIGFyZSBkaXNjdXNzZWQgaW4gdGhlc2UgYXJ0aWNsZXMgb24gU3RlcHdpc2U6CiAKICAgaHR0cDovL3d3dy5zdGVwd2lzZS5jb20vQXJ0aWNsZXMvVGVjaG5pY2FsL1BhY2thZ2VzL0luc3RhbGxlcldvZXMuaHRtbAogICBodHRwOi8vd3d3LnN0ZXB3aXNlLmNvbS9BcnRpY2xlcy9UZWNobmljYWwvUGFja2FnZXMvSW5zdGFsbGVyT25YLmh0bWwKIAotQmVzaWRlIHVzaW5nIHRoZSBQYWNrYWdlTWFrZXIgY2xhc3MgZGlyZWN0bHksIGJ5IGltcG9ydGluZyBpdCBpbnNpZGUgCitCZXNpZGUgdXNpbmcgdGhlIFBhY2thZ2VNYWtlciBjbGFzcyBkaXJlY3RseSwgYnkgaW1wb3J0aW5nIGl0IGluc2lkZQogYW5vdGhlciBtb2R1bGUsIHNheSwgdGhlcmUgYXJlIGFkZGl0aW9uYWwgd2F5cyBvZiB1c2luZyB0aGlzIG1vZHVsZToKLXRoZSB0b3AtbGV2ZWwgYnVpbGRQYWNrYWdlKCkgZnVuY3Rpb24gcHJvdmlkZXMgYSBzaG9ydGN1dCB0byB0aGUgc2FtZSAKK3RoZSB0b3AtbGV2ZWwgYnVpbGRQYWNrYWdlKCkgZnVuY3Rpb24gcHJvdmlkZXMgYSBzaG9ydGN1dCB0byB0aGUgc2FtZQogZmVhdHVyZSBhbmQgaXMgYWxzbyBjYWxsZWQgd2hlbiB1c2luZyB0aGlzIG1vZHVsZSBmcm9tIHRoZSBjb21tYW5kLQogbGluZS4KIAogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBOT1RFOiBGb3Igbm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byBydW4gdGhpcyBldmVuIG9uIGEgbm9uLU9TIFggCisgICAgTk9URTogRm9yIG5vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcnVuIHRoaXMgZXZlbiBvbiBhIG5vbi1PUyBYCiAgICAgICAgICAgc3lzdGVtIGFuZCBnZXQgc29tZXRoaW5nIHNpbWlsYXIgdG8gYSBwYWNrYWdlLCBidXQgd2l0aG91dAotICAgICAgICAgIHRoZSByZWFsIGFyY2hpdmUgKG5lZWRzIHBheCkgYW5kIGJvbSBmaWxlcyAobmVlZHMgbWtib20pIAotICAgICAgICAgIGluc2lkZSEgVGhpcyBpcyBvbmx5IGZvciBwcm92aWRpbmcgYSBjaGFuY2UgZm9yIHRlc3RpbmcgdG8gCisgICAgICAgICAgdGhlIHJlYWwgYXJjaGl2ZSAobmVlZHMgcGF4KSBhbmQgYm9tIGZpbGVzIChuZWVkcyBta2JvbSkKKyAgICAgICAgICBpbnNpZGUhIFRoaXMgaXMgb25seSBmb3IgcHJvdmlkaW5nIGEgY2hhbmNlIGZvciB0ZXN0aW5nIHRvCiAgICAgICAgICAgZm9sa3Mgd2l0aG91dCBPUyBYLgogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIApAQCAtMzksNyArMzksNyBAQAogICAtIGhhbmRsZSBtdWx0aS12b2x1bWUgcGFja2FnZXMgKD8pCiAgIC0gaW50ZWdyYXRlIGludG8gZGlzdHV0aWxzICg/KQogCi1EaW51IEMuIEdoZXJtYW4sIAorRGludSBDLiBHaGVybWFuLAogZ2hlcm1hbkBldXJvcGVtYWlsLmNvbQogTm92ZW1iZXIgMjAwMQogCkBAIC0xMjAsMTQgKzEyMCwxNCBAQAogICAgICIiIkEgY2xhc3MgdG8gZ2VuZXJhdGUgcGFja2FnZXMgZm9yIE1hYyBPUyBYLgogCiAgICAgVGhpcyBpcyBpbnRlbmRlZCB0byBjcmVhdGUgT1MgWCBwYWNrYWdlcyAod2l0aCBleHRlbnNpb24gLnBrZykKLSAgICBjb250YWluaW5nIGFyY2hpdmVzIG9mIGFyYml0cmFyeSBmaWxlcyB0aGF0IHRoZSBJbnN0YWxsZXIuYXBwIAorICAgIGNvbnRhaW5pbmcgYXJjaGl2ZXMgb2YgYXJiaXRyYXJ5IGZpbGVzIHRoYXQgdGhlIEluc3RhbGxlci5hcHAKICAgICB3aWxsIGJlIGFibGUgdG8gaGFuZGxlLgogCi0gICAgQXMgb2Ygbm93LCBQYWNrYWdlTWFrZXIgaW5zdGFuY2VzIG5lZWQgdG8gYmUgY3JlYXRlZCB3aXRoIHRoZSAKLSAgICB0aXRsZSwgdmVyc2lvbiBhbmQgZGVzY3JpcHRpb24gb2YgdGhlIHBhY2thZ2UgdG8gYmUgYnVpbHQuIAotICAgIFRoZSBwYWNrYWdlIGlzIGJ1aWx0IGFmdGVyIGNhbGxpbmcgdGhlIGluc3RhbmNlIG1ldGhvZCAKLSAgICBidWlsZChyb290LCAqKm9wdGlvbnMpLiBJdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY29uc3RydWN0b3IncyAKLSAgICB0aXRsZSBhcmd1bWVudCBwbHVzIGEgJy5wa2cnIGV4dGVuc2lvbiBhbmQgaXMgbG9jYXRlZCBpbiB0aGUgc2FtZSAKKyAgICBBcyBvZiBub3csIFBhY2thZ2VNYWtlciBpbnN0YW5jZXMgbmVlZCB0byBiZSBjcmVhdGVkIHdpdGggdGhlCisgICAgdGl0bGUsIHZlcnNpb24gYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGJ1aWx0LgorICAgIFRoZSBwYWNrYWdlIGlzIGJ1aWx0IGFmdGVyIGNhbGxpbmcgdGhlIGluc3RhbmNlIG1ldGhvZAorICAgIGJ1aWxkKHJvb3QsICoqb3B0aW9ucykuIEl0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjb25zdHJ1Y3RvcidzCisgICAgdGl0bGUgYXJndW1lbnQgcGx1cyBhICcucGtnJyBleHRlbnNpb24gYW5kIGlzIGxvY2F0ZWQgaW4gdGhlIHNhbWUKICAgICBwYXJlbnQgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlIHJvb3QgZm9sZGVyLgogCiAgICAgRS5nLiB0aGlzIHdpbGwgY3JlYXRlIGEgcGFja2FnZSBmb2xkZXIgL215L3NwYWNlL2Rpc3R1dGlscy5wa2cvOgpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICAgIGluZm8gPSB7IlRpdGxlIjogdGl0bGUsICJWZXJzaW9uIjogdmVyc2lvbiwgIkRlc2NyaXB0aW9uIjogZGVzY30KICAgICAgICAgc2VsZi5wYWNrYWdlSW5mbyA9IGNvcHkuZGVlcGNvcHkoc2VsZi5wYWNrYWdlSW5mb0RlZmF1bHRzKQogICAgICAgICBzZWxmLnBhY2thZ2VJbmZvLnVwZGF0ZShpbmZvKQotICAgICAgICAKKwogICAgICAgICAjIHZhcmlhYmxlcyBzZXQgbGF0ZXIKICAgICAgICAgc2VsZi5wYWNrYWdlUm9vdEZvbGRlciA9IE5vbmUKICAgICAgICAgc2VsZi5wYWNrYWdlUmVzb3VyY2VGb2xkZXIgPSBOb25lCkBAIC0xNzYsOCArMTc2LDggQEAKICAgICBkZWYgYnVpbGQoc2VsZiwgcm9vdCwgcmVzb3VyY2VzPU5vbmUsICoqb3B0aW9ucyk6CiAgICAgICAgICIiIkNyZWF0ZSBhIHBhY2thZ2UgZm9yIHNvbWUgZ2l2ZW4gcm9vdCBmb2xkZXIuCiAKLSAgICAgICAgV2l0aCBubyAncmVzb3VyY2VzJyBhcmd1bWVudCBzZXQgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSAKLSAgICAgICAgYXMgdGhlIHJvb3QgZGlyZWN0b3J5LiBPcHRpb24gaXRlbXMgcmVwbGFjZSB0aGUgZGVmYXVsdCBvbmVzIAorICAgICAgICBXaXRoIG5vICdyZXNvdXJjZXMnIGFyZ3VtZW50IHNldCBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lCisgICAgICAgIGFzIHRoZSByb290IGRpcmVjdG9yeS4gT3B0aW9uIGl0ZW1zIHJlcGxhY2UgdGhlIGRlZmF1bHQgb25lcwogICAgICAgICBpbiB0aGUgcGFja2FnZSBpbmZvLgogICAgICAgICAiIiIKIApAQCAtMTk1LDEyICsxOTUsMTIgQEAKICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VJbmZvW2tdID0gdgogICAgICAgICAgICAgZWxpZiBub3QgayBpbiBbIk91dHB1dERpciJdOgogICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAiVW5rbm93biBwYWNrYWdlIG9wdGlvbjogJXMiICUgawotICAgICAgICAKKwogICAgICAgICAjIENoZWNrIHdoZXJlIHdlIHNob3VsZCBsZWF2ZSB0aGUgb3V0cHV0LiBEZWZhdWx0IGlzIGN1cnJlbnQgZGlyZWN0b3J5CiAgICAgICAgIG91dHB1dGRpciA9IG9wdGlvbnMuZ2V0KCJPdXRwdXREaXIiLCBvcy5nZXRjd2QoKSkKICAgICAgICAgcGFja2FnZU5hbWUgPSBzZWxmLnBhY2thZ2VJbmZvWyJUaXRsZSJdCiAgICAgICAgIHNlbGYuUGFja2FnZVJvb3RGb2xkZXIgPSBvcy5wYXRoLmpvaW4ob3V0cHV0ZGlyLCBwYWNrYWdlTmFtZSArICIucGtnIikKLSAKKwogICAgICAgICAjIGRvIHdoYXQgbmVlZHMgdG8gYmUgZG9uZQogICAgICAgICBzZWxmLl9tYWtlRm9sZGVycygpCiAgICAgICAgIHNlbGYuX2FkZEluZm8oKQpAQCAtMjE1LDcgKzIxNSw3IEBACiAgICAgICAgICJDcmVhdGUgcGFja2FnZSBmb2xkZXIgc3RydWN0dXJlLiIKIAogICAgICAgICAjIE5vdCBzdXJlIGlmIHRoZSBwYWNrYWdlIG5hbWUgc2hvdWxkIGNvbnRhaW4gdGhlIHZlcnNpb24gb3Igbm90Li4uCi0gICAgICAgICMgcGFja2FnZU5hbWUgPSAiJXMtJXMiICUgKHNlbGYucGFja2FnZUluZm9bIlRpdGxlIl0sIAorICAgICAgICAjIHBhY2thZ2VOYW1lID0gIiVzLSVzIiAlIChzZWxmLnBhY2thZ2VJbmZvWyJUaXRsZSJdLAogICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VJbmZvWyJWZXJzaW9uIl0pICMgPz8KIAogICAgICAgICBjb250Rm9sZGVyID0gam9pbihzZWxmLlBhY2thZ2VSb290Rm9sZGVyLCAiQ29udGVudHMiKQpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgICAgIHNlbGYuYXJjaFBhdGggPSBqb2luKHNlbGYucGFja2FnZVJlc291cmNlRm9sZGVyLCBiYXNlKQogICAgICAgICBjbWQgPSAicGF4IC13IC1mICVzICVzIiAlIChzZWxmLmFyY2hQYXRoLCAiLiIpCiAgICAgICAgIHJlcyA9IG9zLnN5c3RlbShjbWQpCi0gICAgICAgIAorCiAgICAgICAgICMgY29tcHJlc3MgYXJjaGl2ZQogICAgICAgICBjbWQgPSAiZ3ppcCAlcyIgJSBzZWxmLmFyY2hQYXRoCiAgICAgICAgIHJlcyA9IG9zLnN5c3RlbShjbWQpCkBAIC0yNzcsOCArMjc3LDggQEAKICAgICBkZWYgX2FkZFJlc291cmNlcyhzZWxmKToKICAgICAgICAgIkFkZCBXZWxjb21lL1JlYWRNZS9MaWNlbnNlIGZpbGVzLCAubHByb2ogZm9sZGVycyBhbmQgc2NyaXB0cy4iCiAKLSAgICAgICAgIyBDdXJyZW50bHkgd2UganVzdCBjb3B5IGV2ZXJ5dGhpbmcgdGhhdCBtYXRjaGVzIHRoZSBhbGxvd2VkIAotICAgICAgICAjIGZpbGVuYW1lcy4gU28sIGl0J3MgbGVmdCB0byBJbnN0YWxsZXIuYXBwIHRvIGRlYWwgd2l0aCB0aGUgCisgICAgICAgICMgQ3VycmVudGx5IHdlIGp1c3QgY29weSBldmVyeXRoaW5nIHRoYXQgbWF0Y2hlcyB0aGUgYWxsb3dlZAorICAgICAgICAjIGZpbGVuYW1lcy4gU28sIGl0J3MgbGVmdCB0byBJbnN0YWxsZXIuYXBwIHRvIGRlYWwgd2l0aCB0aGUKICAgICAgICAgIyBzYW1lIGZpbGUgYXZhaWxhYmxlIGluIG11bHRpcGxlIGZvcm1hdHMuLi4KIAogICAgICAgICBpZiBub3Qgc2VsZi5yZXNvdXJjZUZvbGRlcjoKQEAgLTMzNyw5ICszMzcsOSBAQAogICAgIGRlZiBfYWRkU2l6ZXMoc2VsZik6CiAgICAgICAgICJXcml0ZSAuc2l6ZXMgZmlsZSB3aXRoIGluZm8gYWJvdXQgbnVtYmVyIGFuZCBzaXplIG9mIGZpbGVzLiIKIAotICAgICAgICAjIE5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCwgYnV0ICdpbnN0YWxsZWRTaXplJyBhbmQgCi0gICAgICAgICMgJ3ppcHBlZFNpemUnIGFyZSBub3cgaW4gQnl0ZXMuIE1heWJlIGJsb2NrcyBhcmUgbmVlZGVkPyAKLSAgICAgICAgIyBXZWxsLCBJbnN0YWxsZXIuYXBwIGRvZXNuJ3Qgc2VlbSB0byBjYXJlIGFueXdheSwgc2F5aW5nIAorICAgICAgICAjIE5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCwgYnV0ICdpbnN0YWxsZWRTaXplJyBhbmQKKyAgICAgICAgIyAnemlwcGVkU2l6ZScgYXJlIG5vdyBpbiBCeXRlcy4gTWF5YmUgYmxvY2tzIGFyZSBuZWVkZWQ/CisgICAgICAgICMgV2VsbCwgSW5zdGFsbGVyLmFwcCBkb2Vzbid0IHNlZW0gdG8gY2FyZSBhbnl3YXksIHNheWluZwogICAgICAgICAjIHRoZSBpbnN0YWxsYXRpb24gbmVlZHMgMTAwKyBNQi4uLgogCiAgICAgICAgIG51bUZpbGVzID0gMApAQCAtMzUzLDcgKzM1Myw3IEBACiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgemlwcGVkU2l6ZSA9IG9zLnN0YXQoc2VsZi5hcmNoUGF0aCsgIi5neiIpWzZdCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yOiAjIGlnbm9yZSBlcnJvciAKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6ICMgaWdub3JlIGVycm9yCiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGJhc2UgPSBzZWxmLnBhY2thZ2VJbmZvWyJUaXRsZSJdICsgIi5zaXplcyIKICAgICAgICAgZiA9IG9wZW4oam9pbihzZWxmLnBhY2thZ2VSZXNvdXJjZUZvbGRlciwgYmFzZSksICJ3IikKQEAgLTM3MCw3ICszNzAsNyBAQAogCiBkZWYgYnVpbGRQYWNrYWdlKCphcmdzLCAqKm9wdGlvbnMpOgogICAgICJBIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBidWlsZGluZyBhIHBhY2thZ2UuIgotICAgIAorCiAgICAgbyA9IG9wdGlvbnMKICAgICB0aXRsZSwgdmVyc2lvbiwgZGVzYyA9IG9bIlRpdGxlIl0sIG9bIlZlcnNpb24iXSwgb1siRGVzY3JpcHRpb24iXQogICAgIHBtID0gUGFja2FnZU1ha2VyKHRpdGxlLCB2ZXJzaW9uLCBkZXNjKQpAQCAtMzkxLDkgKzM5MSw5IEBACiBkZWYgdGVzdDEoKToKICAgICAiVGVzdCBmb3IgdGhlIHJlcG9ydGxhYiBkaXN0cmlidXRpb24gd2l0aCBtb2RpZmllZCBvcHRpb25zLiIKIAotICAgIHBtID0gUGFja2FnZU1ha2VyKCJyZXBvcnRsYWIiLCAiMS4xMCIsIAorICAgIHBtID0gUGFja2FnZU1ha2VyKCJyZXBvcnRsYWIiLCAiMS4xMCIsCiAgICAgICAgICAgICAgICAgICAgICAgIlJlcG9ydExhYidzIE9wZW4gU291cmNlIFBERiB0b29sa2l0LiIpCi0gICAgcG0uYnVpbGQocm9vdD0iL1VzZXJzL2RpbnUvRGVza3RvcC9yZXBvcnRsYWIiLCAKKyAgICBwbS5idWlsZChyb290PSIvVXNlcnMvZGludS9EZXNrdG9wL3JlcG9ydGxhYiIsCiAgICAgICAgICAgICAgRGVmYXVsdExvY2F0aW9uPSIvQXBwbGljYXRpb25zL1JlcG9ydExhYiIsCiAgICAgICAgICAgICAgUmVsb2NhdGFibGU9IllFUyIpCiAKQEAgLTQwMSw5ICs0MDEsOSBAQAogICAgICJTaG9ydGN1dCB0ZXN0IGZvciB0aGUgcmVwb3J0bGFiIGRpc3RyaWJ1dGlvbiB3aXRoIG1vZGlmaWVkIG9wdGlvbnMuIgogCiAgICAgYnVpbGRQYWNrYWdlKAotICAgICAgICAiL1VzZXJzL2RpbnUvRGVza3RvcC9yZXBvcnRsYWIiLCAKLSAgICAgICAgVGl0bGU9InJlcG9ydGxhYiIsIAotICAgICAgICBWZXJzaW9uPSIxLjEwIiwgCisgICAgICAgICIvVXNlcnMvZGludS9EZXNrdG9wL3JlcG9ydGxhYiIsCisgICAgICAgIFRpdGxlPSJyZXBvcnRsYWIiLAorICAgICAgICBWZXJzaW9uPSIxLjEwIiwKICAgICAgICAgRGVzY3JpcHRpb249IlJlcG9ydExhYidzIE9wZW4gU291cmNlIFBERiB0b29sa2l0LiIsCiAgICAgICAgIERlZmF1bHRMb2NhdGlvbj0iL0FwcGxpY2F0aW9ucy9SZXBvcnRMYWIiLAogICAgICAgICBSZWxvY2F0YWJsZT0iWUVTIikKZGlmZiAtLWdpdCBhL01hYy9zY3JpcHRzL2NhY2hlcnNyYy5weSBiL01hYy9zY3JpcHRzL2NhY2hlcnNyYy5weQppbmRleCBlNjUyNGM5Li5lMmVlZDhiIDEwMDY0NAotLS0gYS9NYWMvc2NyaXB0cy9jYWNoZXJzcmMucHkKKysrIGIvTWFjL3NjcmlwdHMvY2FjaGVyc3JjLnB5CkBAIC0xMCwzNiArMTAsMzUgQEAKIGltcG9ydCBnZXRvcHQKIAogY2xhc3MgTm9BcmdzRXJyb3IoRXhjZXB0aW9uKToKLQlwYXNzCi0JCisgICAgcGFzcworCiBkZWYgaGFuZGxlcigodmVyYm9zZSwgZm9yY2UpLCBkaXJuYW1lLCBmbmFtZXMpOgotCWZvciBmbiBpbiBmbmFtZXM6Ci0JCWlmIGZuWy01Ol0gPT0gJy5yc3JjJyBhbmQgZm5bLTEzOl0gIT0gJy5yc3JjLmRmLnJzcmMnOgotCQkJaWYgZm9yY2U6Ci0JCQkJdHJ5OgotCQkJCQlvcy51bmxpbmsob3MucGF0aC5qb2luKGRpcm5hbWUsIGZuICsgJy5kZi5yc3JjJykpCi0JCQkJZXhjZXB0IElPRXJyb3I6Ci0JCQkJCXBhc3MKLQkJCW1hY3Jlc291cmNlLm9wZW5fcGF0aG5hbWUob3MucGF0aC5qb2luKGRpcm5hbWUsIGZuKSwgdmVyYm9zZT12ZXJib3NlKQotCQkJCisgICAgZm9yIGZuIGluIGZuYW1lczoKKyAgICAgICAgaWYgZm5bLTU6XSA9PSAnLnJzcmMnIGFuZCBmblstMTM6XSAhPSAnLnJzcmMuZGYucnNyYyc6CisgICAgICAgICAgICBpZiBmb3JjZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oZGlybmFtZSwgZm4gKyAnLmRmLnJzcmMnKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgbWFjcmVzb3VyY2Uub3Blbl9wYXRobmFtZShvcy5wYXRoLmpvaW4oZGlybmFtZSwgZm4pLCB2ZXJib3NlPXZlcmJvc2UpCisKIGRlZiBtYWluKCk6Ci0JdHJ5OgotCQlvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICd2ZicpCi0JCWlmIG5vdCBhcmdzOgotCQkJcmFpc2UgTm9BcmdzRXJyb3IKLQlleGNlcHQgKGdldG9wdC5HZXRvcHRFcnJvciwgTm9BcmdzRXJyb3IpOgotCQlzeXMuc3RkZXJyLndyaXRlKCdVc2FnZTogY2FjaGVyc3JjLnB5IGRpcm5hbWUgLi4uXG4nKQotCQlzeXMuZXhpdCgxKQotCXZlcmJvc2UgPSAwCi0JZm9yY2UgPSAwCi0JZm9yIG8sIHYgaW4gb3B0czoKLQkJaWYgbyA9PSAnLXYnOgotCQkJdmVyYm9zZSA9IDEKLQkJaWYgbyA9PSAnLWYnOgotCQkJZm9yY2UgPSAxCi0JZm9yIGRpciBpbiBzeXMuYXJndlsxOl06Ci0JCW9zLnBhdGgud2FsayhkaXIsIGhhbmRsZXIsICh2ZXJib3NlLCBmb3JjZSkpCi0JCQorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAndmYnKQorICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgIHJhaXNlIE5vQXJnc0Vycm9yCisgICAgZXhjZXB0IChnZXRvcHQuR2V0b3B0RXJyb3IsIE5vQXJnc0Vycm9yKToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnVXNhZ2U6IGNhY2hlcnNyYy5weSBkaXJuYW1lIC4uLlxuJykKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICB2ZXJib3NlID0gMAorICAgIGZvcmNlID0gMAorICAgIGZvciBvLCB2IGluIG9wdHM6CisgICAgICAgIGlmIG8gPT0gJy12JzoKKyAgICAgICAgICAgIHZlcmJvc2UgPSAxCisgICAgICAgIGlmIG8gPT0gJy1mJzoKKyAgICAgICAgICAgIGZvcmNlID0gMQorICAgIGZvciBkaXIgaW4gc3lzLmFyZ3ZbMTpdOgorICAgICAgICBvcy5wYXRoLndhbGsoZGlyLCBoYW5kbGVyLCAodmVyYm9zZSwgZm9yY2UpKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9zY3JpcHRzL2dlbmFsbHN1aXRlcy5weSBiL01hYy9zY3JpcHRzL2dlbmFsbHN1aXRlcy5weQppbmRleCA4ODRkNGE0Li5hNTU2ODQ3IDEwMDY0NAotLS0gYS9NYWMvc2NyaXB0cy9nZW5hbGxzdWl0ZXMucHkKKysrIGIvTWFjL3NjcmlwdHMvZ2VuYWxsc3VpdGVzLnB5CkBAIC0yMiwzMiArMjIsMzEgQEAKIFRFUk1JTkFMPSIvQXBwbGljYXRpb25zL1V0aWxpdGllcy9UZXJtaW5hbC5hcHAiCiAKIGdlbnN1aXRlbW9kdWxlLnByb2Nlc3NmaWxlX2Zyb21yZXNvdXJjZShBUFBMRVNDUklQVCwKLQlvdXRwdXQ9b3MucGF0aC5qb2luKERTVERJUiwgJ1N0ZFN1aXRlcycpLAotCWJhc2Vwa2duYW1lPSdfYnVpbHRpblN1aXRlcycsCi0JZWRpdF9tb2RuYW1lcz1bXSwgdmVyYm9zZT12ZXJib3NlKQorICAgICAgICBvdXRwdXQ9b3MucGF0aC5qb2luKERTVERJUiwgJ1N0ZFN1aXRlcycpLAorICAgICAgICBiYXNlcGtnbmFtZT0nX2J1aWx0aW5TdWl0ZXMnLAorICAgICAgICBlZGl0X21vZG5hbWVzPVtdLCB2ZXJib3NlPXZlcmJvc2UpCiBnZW5zdWl0ZW1vZHVsZS5wcm9jZXNzZmlsZShTWVNURU1FVkVOVFMsCi0Jb3V0cHV0PW9zLnBhdGguam9pbihEU1RESVIsICdTeXN0ZW1FdmVudHMnKSwKLQliYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKLQllZGl0X21vZG5hbWVzPVsoJ0Rpc2tfMmRfRm9sZGVyXzJkX0ZpbGVfU3VpdGUnLCAnRGlza19Gb2xkZXJfRmlsZV9TdWl0ZScpXSwgCi0JdmVyYm9zZT12ZXJib3NlKQorICAgICAgICBvdXRwdXQ9b3MucGF0aC5qb2luKERTVERJUiwgJ1N5c3RlbUV2ZW50cycpLAorICAgICAgICBiYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKKyAgICAgICAgZWRpdF9tb2RuYW1lcz1bKCdEaXNrXzJkX0ZvbGRlcl8yZF9GaWxlX1N1aXRlJywgJ0Rpc2tfRm9sZGVyX0ZpbGVfU3VpdGUnKV0sCisgICAgICAgIHZlcmJvc2U9dmVyYm9zZSkKIGdlbnN1aXRlbW9kdWxlLnByb2Nlc3NmaWxlKENPREVXQVJSSU9SLAotCW91dHB1dD1vcy5wYXRoLmpvaW4oRFNURElSLCAnQ29kZVdhcnJpb3InKSwKLQliYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKLQllZGl0X21vZG5hbWVzPVtdLCB2ZXJib3NlPXZlcmJvc2UpCisgICAgICAgIG91dHB1dD1vcy5wYXRoLmpvaW4oRFNURElSLCAnQ29kZVdhcnJpb3InKSwKKyAgICAgICAgYmFzZXBrZ25hbWU9J1N0ZFN1aXRlcycsCisgICAgICAgIGVkaXRfbW9kbmFtZXM9W10sIHZlcmJvc2U9dmVyYm9zZSkKIGdlbnN1aXRlbW9kdWxlLnByb2Nlc3NmaWxlKEVYUExPUkVSLAotCW91dHB1dD1vcy5wYXRoLmpvaW4oRFNURElSLCAnRXhwbG9yZXInKSwKLQliYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKLQllZGl0X21vZG5hbWVzPVtdLCB2ZXJib3NlPXZlcmJvc2UpCisgICAgICAgIG91dHB1dD1vcy5wYXRoLmpvaW4oRFNURElSLCAnRXhwbG9yZXInKSwKKyAgICAgICAgYmFzZXBrZ25hbWU9J1N0ZFN1aXRlcycsCisgICAgICAgIGVkaXRfbW9kbmFtZXM9W10sIHZlcmJvc2U9dmVyYm9zZSkKIGdlbnN1aXRlbW9kdWxlLnByb2Nlc3NmaWxlKEZJTkRFUiwKLQlvdXRwdXQ9b3MucGF0aC5qb2luKERTVERJUiwgJ0ZpbmRlcicpLAotCWJhc2Vwa2duYW1lPSdTdGRTdWl0ZXMnLAotCWVkaXRfbW9kbmFtZXM9W10sIHZlcmJvc2U9dmVyYm9zZSkKKyAgICAgICAgb3V0cHV0PW9zLnBhdGguam9pbihEU1RESVIsICdGaW5kZXInKSwKKyAgICAgICAgYmFzZXBrZ25hbWU9J1N0ZFN1aXRlcycsCisgICAgICAgIGVkaXRfbW9kbmFtZXM9W10sIHZlcmJvc2U9dmVyYm9zZSkKIGdlbnN1aXRlbW9kdWxlLnByb2Nlc3NmaWxlKE5FVFNDQVBFLAotCW91dHB1dD1vcy5wYXRoLmpvaW4oRFNURElSLCAnTmV0c2NhcGUnKSwKLQliYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKLQllZGl0X21vZG5hbWVzPVsoJ1dvcmxkV2lkZVdlYl9zdWl0ZV8yY19fYXNfZCcsICdXb3JsZFdpZGVXZWJfc3VpdGUnKV0sIHZlcmJvc2U9dmVyYm9zZSkKKyAgICAgICAgb3V0cHV0PW9zLnBhdGguam9pbihEU1RESVIsICdOZXRzY2FwZScpLAorICAgICAgICBiYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKKyAgICAgICAgZWRpdF9tb2RuYW1lcz1bKCdXb3JsZFdpZGVXZWJfc3VpdGVfMmNfX2FzX2QnLCAnV29ybGRXaWRlV2ViX3N1aXRlJyldLCB2ZXJib3NlPXZlcmJvc2UpCiBnZW5zdWl0ZW1vZHVsZS5wcm9jZXNzZmlsZShURVJNSU5BTCwKLQlvdXRwdXQ9b3MucGF0aC5qb2luKERTVERJUiwgJ1Rlcm1pbmFsJyksCi0JYmFzZXBrZ25hbWU9J1N0ZFN1aXRlcycsCi0JZWRpdF9tb2RuYW1lcz1bXSwgdmVyYm9zZT12ZXJib3NlKQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgICAgb3V0cHV0PW9zLnBhdGguam9pbihEU1RESVIsICdUZXJtaW5hbCcpLAorICAgICAgICBiYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKKyAgICAgICAgZWRpdF9tb2RuYW1lcz1bXSwgdmVyYm9zZT12ZXJib3NlKQpkaWZmIC0tZ2l0IGEvTWFjL3NjcmlwdHMvbWtlc3RycmVzLnB5IGIvTWFjL3NjcmlwdHMvbWtlc3RycmVzLnB5CmluZGV4IGZhYTIwM2IuLjcxNWI4YzYgMTAwNjQ0Ci0tLSBhL01hYy9zY3JpcHRzL21rZXN0cnJlcy5weQorKysgYi9NYWMvc2NyaXB0cy9ta2VzdHJyZXMucHkKQEAgLTEwLDE0OSArMTAsMTQ4IEBACiBzbUFsbFNjcmlwdHMgPSAtMwogCiBFUlJOT19QUk9HPSIjZGVmaW5lWyBcdF0rIiBcCi0JCSAgICIoW0EtWjAtOWEtel9dKykiIFwKLQkJICAgIlsgXHRdKyIgXAotCQkgICAiKFswLTldKykiIFwKLQkJICAgIlsgXHRdKi9cKlsgXHRdKiIgXAotCQkgICAiKC4qKSIgXAotCQkgICAiWyBcdF0qXCovIgotCQkgICAKKyAgICAgICAgICAgICAgICAgICAiKFtBLVowLTlhLXpfXSspIiBcCisgICAgICAgICAgICAgICAgICAgIlsgXHRdKyIgXAorICAgICAgICAgICAgICAgICAgICIoWzAtOV0rKSIgXAorICAgICAgICAgICAgICAgICAgICJbIFx0XSovXCpbIFx0XSoiIFwKKyAgICAgICAgICAgICAgICAgICAiKC4qKSIgXAorICAgICAgICAgICAgICAgICAgICJbIFx0XSpcKi8iCisKIEVSUk9SU19QUk9HPSJbIFx0XSoiIFwKLQkJCSIoW0EtWjAtOWEtel9dKykiIFwKLQkJCSJbIFx0XSo9WyBcdF0qIiBcCi0JCQkiKFstMC05XSspIiBcCi0JCQkiWywgXHRdKi9cKlsgXHRdKiIgXAotCQkJIiguKikiIFwKLQkJCSJbIFx0XSpcKi8iCi0JCSAgIAorICAgICAgICAgICAgICAgICAgICAgICAgIihbQS1aMC05YS16X10rKSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIlsgXHRdKj1bIFx0XSoiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICIoWy0wLTldKykiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJbLCBcdF0qL1wqWyBcdF0qIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiKC4qKSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIlsgXHRdKlwqLyIKKwogRVJST1JTX1BST0dfMj0iWyBcdF0qIiBcCi0JCQkiKFtBLVowLTlhLXpfXSspIiBcCi0JCQkiWyBcdF0qPVsgXHRdKiIgXAotCQkJIihbLTAtOV0rKSIgXAotCQkJIlssIFx0XSoiCisgICAgICAgICAgICAgICAgICAgICAgICAiKFtBLVowLTlhLXpfXSspIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiWyBcdF0qPVsgXHRdKiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIihbLTAtOV0rKSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIlssIFx0XSoiCiAKIGRlZiBQc3RyaW5nKHN0cik6Ci0JaWYgbGVuKHN0cikgPiAyNTU6Ci0JCXJhaXNlIFZhbHVlRXJyb3IsICdTdHJpbmcgdG9vIGxhcmdlJwotCXJldHVybiBjaHIobGVuKHN0cikpK3N0cgotCQorICAgIGlmIGxlbihzdHIpID4gMjU1OgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnU3RyaW5nIHRvbyBsYXJnZScKKyAgICByZXR1cm4gY2hyKGxlbihzdHIpKStzdHIKKwogZGVmIHdyaXRlZXN0cihkc3QsIGVkaWN0KToKLQkiIiJDcmVhdGUgRXN0ciByZXNvdXJjZSBmaWxlIGdpdmVuIGEgZGljdGlvbmFyeSBvZiBlcnJvcnMuIiIiCi0JCi0Jb3MudW5saW5rKGRzdC5hc19wYXRobmFtZSgpKQotCVJlcy5GU3BDcmVhdGVSZXNGaWxlKGRzdCwgJ1JTRUQnLCAncnNyYycsIHNtQWxsU2NyaXB0cykKLQlvdXRwdXQgPSBSZXMuRlNwT3BlblJlc0ZpbGUoZHN0LCBXUklURSkKLQlSZXMuVXNlUmVzRmlsZShvdXRwdXQpCi0JZm9yIG51bSBpbiBlZGljdC5rZXlzKCk6Ci0JCXJlcyA9IFJlcy5SZXNvdXJjZShQc3RyaW5nKGVkaWN0W251bV1bMF0pKQotCQlyZXMuQWRkUmVzb3VyY2UoJ0VzdHInLCBudW0sICcnKQotCQlyZXMuV3JpdGVSZXNvdXJjZSgpCi0JUmVzLkNsb3NlUmVzRmlsZShvdXRwdXQpCi0JCisgICAgIiIiQ3JlYXRlIEVzdHIgcmVzb3VyY2UgZmlsZSBnaXZlbiBhIGRpY3Rpb25hcnkgb2YgZXJyb3JzLiIiIgorCisgICAgb3MudW5saW5rKGRzdC5hc19wYXRobmFtZSgpKQorICAgIFJlcy5GU3BDcmVhdGVSZXNGaWxlKGRzdCwgJ1JTRUQnLCAncnNyYycsIHNtQWxsU2NyaXB0cykKKyAgICBvdXRwdXQgPSBSZXMuRlNwT3BlblJlc0ZpbGUoZHN0LCBXUklURSkKKyAgICBSZXMuVXNlUmVzRmlsZShvdXRwdXQpCisgICAgZm9yIG51bSBpbiBlZGljdC5rZXlzKCk6CisgICAgICAgIHJlcyA9IFJlcy5SZXNvdXJjZShQc3RyaW5nKGVkaWN0W251bV1bMF0pKQorICAgICAgICByZXMuQWRkUmVzb3VyY2UoJ0VzdHInLCBudW0sICcnKQorICAgICAgICByZXMuV3JpdGVSZXNvdXJjZSgpCisgICAgUmVzLkNsb3NlUmVzRmlsZShvdXRwdXQpCisKIGRlZiB3cml0ZXB5dGhvbihmcCwgZGljdCk6Ci0JayA9IGRpY3Qua2V5cygpCi0Jay5zb3J0KCkKLQlmb3IgaSBpbiBrOgotCQlmcC53cml0ZSgiJXNcdD1cdCVkXHQjJXNcbiIlKGRpY3RbaV1bMV0sIGksIGRpY3RbaV1bMF0pKQotCQorICAgIGsgPSBkaWN0LmtleXMoKQorICAgIGsuc29ydCgpCisgICAgZm9yIGkgaW4gazoKKyAgICAgICAgZnAud3JpdGUoIiVzXHQ9XHQlZFx0IyVzXG4iJShkaWN0W2ldWzFdLCBpLCBkaWN0W2ldWzBdKSkKKwogCiBkZWYgcGFyc2VfZXJybm9faChmcCwgZGljdCk6Ci0JZXJybm9fcHJvZyA9IHJlLmNvbXBpbGUoRVJSTk9fUFJPRykKLQlmb3IgbGluZSBpbiBmcC5yZWFkbGluZXMoKToKLQkJbSA9IGVycm5vX3Byb2cubWF0Y2gobGluZSkKLQkJaWYgbToKLQkJCW51bWJlciA9IHN0cmluZy5hdG9pKG0uZ3JvdXAoMikpCi0JCQluYW1lID0gbS5ncm91cCgxKQotCQkJZGVzYyA9IHN0cmluZy5zdHJpcChtLmdyb3VwKDMpKQotCQkJCi0JCQlpZiBub3QgZGljdC5oYXNfa2V5KG51bWJlcik6Ci0JCQkJZGljdFtudW1iZXJdID0gZGVzYywgbmFtZQotCQkJZWxzZToKLQkJCQlwcmludCAnRFVQTElDQVRFJywgbnVtYmVyCi0JCQkJcHJpbnQgJ1x0JywgZGljdFtudW1iZXJdCi0JCQkJcHJpbnQgJ1x0JywgKGRlc2MsIG5hbWUpCi0JCQkJCQkJCQorICAgIGVycm5vX3Byb2cgPSByZS5jb21waWxlKEVSUk5PX1BST0cpCisgICAgZm9yIGxpbmUgaW4gZnAucmVhZGxpbmVzKCk6CisgICAgICAgIG0gPSBlcnJub19wcm9nLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBudW1iZXIgPSBzdHJpbmcuYXRvaShtLmdyb3VwKDIpKQorICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgIGRlc2MgPSBzdHJpbmcuc3RyaXAobS5ncm91cCgzKSkKKworICAgICAgICAgICAgaWYgbm90IGRpY3QuaGFzX2tleShudW1iZXIpOgorICAgICAgICAgICAgICAgIGRpY3RbbnVtYmVyXSA9IGRlc2MsIG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ0RVUExJQ0FURScsIG51bWJlcgorICAgICAgICAgICAgICAgIHByaW50ICdcdCcsIGRpY3RbbnVtYmVyXQorICAgICAgICAgICAgICAgIHByaW50ICdcdCcsIChkZXNjLCBuYW1lKQorCiBkZWYgcGFyc2VfZXJyb3JzX2goZnAsIGRpY3QpOgotCWVycm5vX3Byb2cgPSByZS5jb21waWxlKEVSUk9SU19QUk9HKQotCWVycm5vX3Byb2dfMiA9IHJlLmNvbXBpbGUoRVJST1JTX1BST0dfMikKLQlmb3IgbGluZSBpbiBmcC5yZWFkbGluZXMoKToKLQkJbWF0Y2ggPSAwCi0JCW0gPSBlcnJub19wcm9nLm1hdGNoKGxpbmUpCi0JCW0yID0gZXJybm9fcHJvZ18yLm1hdGNoKGxpbmUpCi0JCWlmIG06Ci0JCQludW1iZXIgPSBzdHJpbmcuYXRvaShtLmdyb3VwKDIpKQotCQkJbmFtZSA9IG0uZ3JvdXAoMSkKLQkJCWRlc2MgPSBzdHJpbmcuc3RyaXAobS5ncm91cCgzKSkKLQkJCW1hdGNoPTEKLQkJZWxpZiBtMjoKLQkJCW51bWJlciA9IHN0cmluZy5hdG9pKG0yLmdyb3VwKDIpKQotCQkJbmFtZSA9IG0yLmdyb3VwKDEpCi0JCQlkZXNjID0gbmFtZQotCQkJbWF0Y2g9MQotCQlpZiBtYXRjaDoKLQkJCWlmIG51bWJlciA+IDA6IGNvbnRpbnVlCi0JCQkKLQkJCWlmIG5vdCBkaWN0Lmhhc19rZXkobnVtYmVyKToKLQkJCQlkaWN0W251bWJlcl0gPSBkZXNjLCBuYW1lCi0JCQllbHNlOgotCQkJCXByaW50ICdEVVBMSUNBVEUnLCBudW1iZXIKLQkJCQlwcmludCAnXHQnLCBkaWN0W251bWJlcl0KLQkJCQlwcmludCAnXHQnLCAoZGVzYywgbmFtZSkKLQkJCQlpZiBsZW4oZGVzYykgPiBsZW4oZGljdFtudW1iZXJdWzBdKToKLQkJCQkJcHJpbnQgJ1BpY2sgc2Vjb25kIG9uZScKLQkJCQkJZGljdFtudW1iZXJdID0gZGVzYywgbmFtZQotCQkJCisgICAgZXJybm9fcHJvZyA9IHJlLmNvbXBpbGUoRVJST1JTX1BST0cpCisgICAgZXJybm9fcHJvZ18yID0gcmUuY29tcGlsZShFUlJPUlNfUFJPR18yKQorICAgIGZvciBsaW5lIGluIGZwLnJlYWRsaW5lcygpOgorICAgICAgICBtYXRjaCA9IDAKKyAgICAgICAgbSA9IGVycm5vX3Byb2cubWF0Y2gobGluZSkKKyAgICAgICAgbTIgPSBlcnJub19wcm9nXzIubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIG51bWJlciA9IHN0cmluZy5hdG9pKG0uZ3JvdXAoMikpCisgICAgICAgICAgICBuYW1lID0gbS5ncm91cCgxKQorICAgICAgICAgICAgZGVzYyA9IHN0cmluZy5zdHJpcChtLmdyb3VwKDMpKQorICAgICAgICAgICAgbWF0Y2g9MQorICAgICAgICBlbGlmIG0yOgorICAgICAgICAgICAgbnVtYmVyID0gc3RyaW5nLmF0b2kobTIuZ3JvdXAoMikpCisgICAgICAgICAgICBuYW1lID0gbTIuZ3JvdXAoMSkKKyAgICAgICAgICAgIGRlc2MgPSBuYW1lCisgICAgICAgICAgICBtYXRjaD0xCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgaWYgbnVtYmVyID4gMDogY29udGludWUKKworICAgICAgICAgICAgaWYgbm90IGRpY3QuaGFzX2tleShudW1iZXIpOgorICAgICAgICAgICAgICAgIGRpY3RbbnVtYmVyXSA9IGRlc2MsIG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ0RVUExJQ0FURScsIG51bWJlcgorICAgICAgICAgICAgICAgIHByaW50ICdcdCcsIGRpY3RbbnVtYmVyXQorICAgICAgICAgICAgICAgIHByaW50ICdcdCcsIChkZXNjLCBuYW1lKQorICAgICAgICAgICAgICAgIGlmIGxlbihkZXNjKSA+IGxlbihkaWN0W251bWJlcl1bMF0pOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnUGljayBzZWNvbmQgb25lJworICAgICAgICAgICAgICAgICAgICBkaWN0W251bWJlcl0gPSBkZXNjLCBuYW1lCisKIGRlZiBtYWluKCk6Ci0JZGljdCA9IHt9Ci0JcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSJXaGVyZSBpcyBHVVNJIHN5cy9lcnJuby5oPyIpCi0JaWYgcGF0aG5hbWU6Ci0JCWZwID0gb3BlbihwYXRobmFtZSkKLQkJcGFyc2VfZXJybm9faChmcCwgZGljdCkKLQkJZnAuY2xvc2UoKQotCQotCXBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iU2VsZWN0IGNlcnJubyAoTVNMKSBvciBjYW5jZWwiKQotCWlmIHBhdGhuYW1lOgotCQlmcCA9IG9wZW4ocGF0aG5hbWUpCi0JCXBhcnNlX2Vycm5vX2goZnAsIGRpY3QpCi0JCWZwLmNsb3NlKCkKLQkKLQlwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9IldoZXJlIGlzIE1hY0Vycm9ycy5oPyIpCi0JaWYgcGF0aG5hbWU6Ci0JCWZwID0gb3BlbihwYXRobmFtZSkKLQkJcGFyc2VfZXJyb3JzX2goZnAsIGRpY3QpCi0JCWZwLmNsb3NlKCkKLQkKLQlwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9IldoZXJlIGlzIG1rZXN0cnJlcy1NYWNFcnJvcnMuaD8iKQotCWlmIHBhdGhuYW1lOgotCQlmcCA9IG9wZW4ocGF0aG5hbWUpCi0JCXBhcnNlX2Vycm9yc19oKGZwLCBkaWN0KQotCQlmcC5jbG9zZSgpCi0JCi0JaWYgbm90IGRpY3Q6Ci0JCXJldHVybgotCQkKLQlwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9IlJlc291cmNlIG91dHB1dCBmaWxlPyIsIHNhdmVkRmlsZU5hbWU9ImVycm9ycy5yc3JjIikKLQlpZiBwYXRobmFtZToKLQkJd3JpdGVlc3RyKGZzcywgZGljdCkKLQkKLQlwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9IlB5dGhvbiBvdXRwdXQgZmlsZT8iLCBzYXZlZEZpbGVOYW1lPSJtYWNlcnJvcnMucHkiKQotCWlmIHBhdGhuYW1lOgotCQlmcCA9IG9wZW4ocGF0aG5hbWUsICJ3IikKLQkJd3JpdGVweXRob24oZnAsIGRpY3QpCi0JCWZwLmNsb3NlKCkKLQkJZnNzLlNldENyZWF0b3JUeXBlKCdQeXRoJywgJ1RFWFQnKQorICAgIGRpY3QgPSB7fQorICAgIHBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iV2hlcmUgaXMgR1VTSSBzeXMvZXJybm8uaD8iKQorICAgIGlmIHBhdGhuYW1lOgorICAgICAgICBmcCA9IG9wZW4ocGF0aG5hbWUpCisgICAgICAgIHBhcnNlX2Vycm5vX2goZnAsIGRpY3QpCisgICAgICAgIGZwLmNsb3NlKCkKIAotCXBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0iVGV4dCBvdXRwdXQgZmlsZT8iLCBzYXZlZEZpbGVOYW1lPSJlcnJvcnMudHh0IikKLQlpZiBwYXRobmFtZToKLQkJZnAgPSBvcGVuKHBhdGhuYW1lLCAidyIpCi0JCQotCQlrID0gZGljdC5rZXlzKCkKLQkJay5zb3J0KCkKLQkJZm9yIGkgaW4gazoKLQkJCWZwLndyaXRlKCIlZFx0JXNcdCVzXG4iJShpLCBkaWN0W2ldWzFdLCBkaWN0W2ldWzBdKSkKLQkJZnAuY2xvc2UoKQorICAgIHBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iU2VsZWN0IGNlcnJubyAoTVNMKSBvciBjYW5jZWwiKQorICAgIGlmIHBhdGhuYW1lOgorICAgICAgICBmcCA9IG9wZW4ocGF0aG5hbWUpCisgICAgICAgIHBhcnNlX2Vycm5vX2goZnAsIGRpY3QpCisgICAgICAgIGZwLmNsb3NlKCkKIAotCQorICAgIHBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iV2hlcmUgaXMgTWFjRXJyb3JzLmg/IikKKyAgICBpZiBwYXRobmFtZToKKyAgICAgICAgZnAgPSBvcGVuKHBhdGhuYW1lKQorICAgICAgICBwYXJzZV9lcnJvcnNfaChmcCwgZGljdCkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSJXaGVyZSBpcyBta2VzdHJyZXMtTWFjRXJyb3JzLmg/IikKKyAgICBpZiBwYXRobmFtZToKKyAgICAgICAgZnAgPSBvcGVuKHBhdGhuYW1lKQorICAgICAgICBwYXJzZV9lcnJvcnNfaChmcCwgZGljdCkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgaWYgbm90IGRpY3Q6CisgICAgICAgIHJldHVybgorCisgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSJSZXNvdXJjZSBvdXRwdXQgZmlsZT8iLCBzYXZlZEZpbGVOYW1lPSJlcnJvcnMucnNyYyIpCisgICAgaWYgcGF0aG5hbWU6CisgICAgICAgIHdyaXRlZXN0cihmc3MsIGRpY3QpCisKKyAgICBwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9IlB5dGhvbiBvdXRwdXQgZmlsZT8iLCBzYXZlZEZpbGVOYW1lPSJtYWNlcnJvcnMucHkiKQorICAgIGlmIHBhdGhuYW1lOgorICAgICAgICBmcCA9IG9wZW4ocGF0aG5hbWUsICJ3IikKKyAgICAgICAgd3JpdGVweXRob24oZnAsIGRpY3QpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZnNzLlNldENyZWF0b3JUeXBlKCdQeXRoJywgJ1RFWFQnKQorCisgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSJUZXh0IG91dHB1dCBmaWxlPyIsIHNhdmVkRmlsZU5hbWU9ImVycm9ycy50eHQiKQorICAgIGlmIHBhdGhuYW1lOgorICAgICAgICBmcCA9IG9wZW4ocGF0aG5hbWUsICJ3IikKKworICAgICAgICBrID0gZGljdC5rZXlzKCkKKyAgICAgICAgay5zb3J0KCkKKyAgICAgICAgZm9yIGkgaW4gazoKKyAgICAgICAgICAgIGZwLndyaXRlKCIlZFx0JXNcdCVzXG4iJShpLCBkaWN0W2ldWzFdLCBkaWN0W2ldWzBdKSkKKyAgICAgICAgZnAuY2xvc2UoKQorCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCi0JCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvc2NyaXB0cy96YXBweWNmaWxlcy5weSBiL01hYy9zY3JpcHRzL3phcHB5Y2ZpbGVzLnB5CmluZGV4IDAzNDkyMjAuLmE4MTkzYzEgMTAwNjQ0Ci0tLSBhL01hYy9zY3JpcHRzL3phcHB5Y2ZpbGVzLnB5CisrKyBiL01hYy9zY3JpcHRzL3phcHB5Y2ZpbGVzLnB5CkBAIC04LDMwICs4LDI5IEBACiBkb2l0ID0gMQogCiBkZWYgbWFpbigpOgotCWlmIG5vdCBzeXMuYXJndlsxOl06Ci0JCWlmIG9zLm5hbWUgPT0gJ21hYyc6Ci0JCQlpbXBvcnQgRWFzeURpYWxvZ3MKLQkJCWRpciA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcihtZXNzYWdlPSdEaXJlY3RvcnkgdG8gemFwIHB5YyBmaWxlcyBpbicpCi0JCQlpZiBub3QgZGlyOgotCQkJCXN5cy5leGl0KDApCi0JCQl6YXBweWMoZGlyKQotCQllbHNlOgotCQkJcHJpbnQgJ1VzYWdlOiB6YXBweWMgZGlyIC4uLicKLQkJCXN5cy5leGl0KDEpCi0JZm9yIGRpciBpbiBzeXMuYXJndlsxOl06Ci0JCXphcHB5YyhkaXIpCisgICAgaWYgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbWFjJzoKKyAgICAgICAgICAgIGltcG9ydCBFYXN5RGlhbG9ncworICAgICAgICAgICAgZGlyID0gRWFzeURpYWxvZ3MuQXNrRm9sZGVyKG1lc3NhZ2U9J0RpcmVjdG9yeSB0byB6YXAgcHljIGZpbGVzIGluJykKKyAgICAgICAgICAgIGlmIG5vdCBkaXI6CisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgICAgIHphcHB5YyhkaXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnVXNhZ2U6IHphcHB5YyBkaXIgLi4uJworICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBmb3IgZGlyIGluIHN5cy5hcmd2WzE6XToKKyAgICAgICAgemFwcHljKGRpcikKIAogZGVmIHphcHB5YyhkaXIpOgotCW9zLnBhdGgud2FsayhkaXIsIHdhbGtlciwgTm9uZSkKLQkKKyAgICBvcy5wYXRoLndhbGsoZGlyLCB3YWxrZXIsIE5vbmUpCisKIGRlZiB3YWxrZXIoZHVtbXksIHRvcCwgbmFtZXMpOgotCWZvciBuYW1lIGluIG5hbWVzOgotCQlpZiBuYW1lWy00Ol0gaW4gKCcucHljJywgJy5weW8nKToKLQkJCXBhdGggPSBvcy5wYXRoLmpvaW4odG9wLCBuYW1lKQotCQkJcHJpbnQgJ1phcHBpbmcnLCBwYXRoCi0JCQlpZiBkb2l0OgotCQkJCW9zLnVubGluayhwYXRoKQotCQkJCQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBpZiBuYW1lWy00Ol0gaW4gKCcucHljJywgJy5weW8nKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4odG9wLCBuYW1lKQorICAgICAgICAgICAgcHJpbnQgJ1phcHBpbmcnLCBwYXRoCisgICAgICAgICAgICBpZiBkb2l0OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhwYXRoKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQotCQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWlzYy9CZU9TLXNldHVwLnB5IGIvTWlzYy9CZU9TLXNldHVwLnB5CmluZGV4IGMxNDM1YjYuLmM1NWQyN2QgMTAwNjQ0Ci0tLSBhL01pc2MvQmVPUy1zZXR1cC5weQorKysgYi9NaXNjL0JlT1Mtc2V0dXAucHkKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmV4dGVuc2lvbnMucmVtb3ZlKGV4dCkKIAogICAgICAgICAjIFBhcnNlIE1vZHVsZXMvU2V0dXAgdG8gZmlndXJlIG91dCB3aGljaCBtb2R1bGVzIGFyZSB0dXJuZWQKLSAgICAgICAgIyBvbiBpbiB0aGUgZmlsZS4gCisgICAgICAgICMgb24gaW4gdGhlIGZpbGUuCiAgICAgICAgIGlucHV0ID0gdGV4dF9maWxlLlRleHRGaWxlKCdNb2R1bGVzL1NldHVwJywgam9pbl9saW5lcz0xKQogICAgICAgICByZW1vdmVfbW9kdWxlcyA9IFtdCiAgICAgICAgIHdoaWxlIDE6CkBAIC0xMDIsMTEgKzEwMiwxMSBAQAogICAgICAgICAgICAgbGluZSA9IGxpbmUuc3BsaXQoKQogICAgICAgICAgICAgcmVtb3ZlX21vZHVsZXMuYXBwZW5kKCBsaW5lWzBdICkKICAgICAgICAgaW5wdXQuY2xvc2UoKQotICAgICAgICAKKwogICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uc1s6XToKICAgICAgICAgICAgIGlmIGV4dC5uYW1lIGluIHJlbW92ZV9tb2R1bGVzOgogICAgICAgICAgICAgICAgIHNlbGYuZXh0ZW5zaW9ucy5yZW1vdmUoZXh0KQotICAgICAgICAKKwogICAgICAgICAjIFdoZW4geW91IHJ1biAibWFrZSBDQz1hbHRjYyIgb3Igc29tZXRoaW5nIHNpbWlsYXIsIHlvdSByZWFsbHkgd2FudAogICAgICAgICAjIHRob3NlIGVudmlyb25tZW50IHZhcmlhYmxlcyBwYXNzZWQgaW50byB0aGUgc2V0dXAucHkgcGhhc2UuICBIZXJlJ3MKICAgICAgICAgIyBhIHNtYWxsIHNldCBvZiB1c2VmdWwgb25lcy4KQEAgLTE0MiwxOCArMTQyLDE4IEBACiAgICAgICAgIHJldHVybiBwbGF0Zm9ybQogCiAgICAgZGVmIGRldGVjdF9tb2R1bGVzKHNlbGYpOgotCXRyeToKLQkJYmVsaWJzID0gb3MuZW52aXJvblsnQkVMSUJSQVJJRVMnXS5zcGxpdCgnOycpCi0JZXhjZXB0IEtleUVycm9yOgotCQliZWxpYnMgPSBbJy9ib290L2Jlb3Mvc3lzdGVtL2xpYiddCi0JYmVsaWJzLmFwcGVuZCgnL2Jvb3QvaG9tZS9jb25maWcvbGliJykKLQlzZWxmLmNvbXBpbGVyLmxpYnJhcnlfZGlycy5hcHBlbmQoJy9ib290L2hvbWUvY29uZmlnL2xpYicpCi0JdHJ5OgotCQliZWluY2wgPSBvcy5lbnZpcm9uWydCRUlOQ0xVREVTJ10uc3BsaXQoJzsnKQotCWV4Y2VwdCBLZXlFcnJvcjoKLQkJYmVpbmNsID0gW10KLQliZWluY2wuYXBwZW5kKCcvYm9vdC9ob21lL2NvbmZpZy9pbmNsdWRlJykKLQlzZWxmLmNvbXBpbGVyLmluY2x1ZGVfZGlycy5hcHBlbmQoJy9ib290L2hvbWUvY29uZmlnL2luY2x1ZGUnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBiZWxpYnMgPSBvcy5lbnZpcm9uWydCRUxJQlJBUklFUyddLnNwbGl0KCc7JykKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgYmVsaWJzID0gWycvYm9vdC9iZW9zL3N5c3RlbS9saWInXQorICAgICAgICBiZWxpYnMuYXBwZW5kKCcvYm9vdC9ob21lL2NvbmZpZy9saWInKQorICAgICAgICBzZWxmLmNvbXBpbGVyLmxpYnJhcnlfZGlycy5hcHBlbmQoJy9ib290L2hvbWUvY29uZmlnL2xpYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJlaW5jbCA9IG9zLmVudmlyb25bJ0JFSU5DTFVERVMnXS5zcGxpdCgnOycpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGJlaW5jbCA9IFtdCisgICAgICAgIGJlaW5jbC5hcHBlbmQoJy9ib290L2hvbWUvY29uZmlnL2luY2x1ZGUnKQorICAgICAgICBzZWxmLmNvbXBpbGVyLmluY2x1ZGVfZGlycy5hcHBlbmQoJy9ib290L2hvbWUvY29uZmlnL2luY2x1ZGUnKQogICAgICAgICAjIGxpYl9kaXJzIGFuZCBpbmNfZGlycyBhcmUgdXNlZCB0byBzZWFyY2ggZm9yIGZpbGVzOwogICAgICAgICAjIGlmIGEgZmlsZSBpcyBmb3VuZCBpbiBvbmUgb2YgdGhvc2UgZGlyZWN0b3JpZXMsIGl0IGNhbgogICAgICAgICAjIGJlIGFzc3VtZWQgdGhhdCBubyBhZGRpdGlvbmFsIC1JLC1MIGRpcmVjdGl2ZXMgYXJlIG5lZWRlZC4KQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgICAgICBleHRzID0gW10KIAogICAgICAgICBwbGF0Zm9ybSA9IHNlbGYuZ2V0X3BsYXRmb3JtKCkKLSAgICAgICAgCisKICAgICAgICAgIyBDaGVjayBmb3IgTWFjT1MgWCwgd2hpY2ggZG9lc24ndCBuZWVkIGxpYm0uYSBhdCBhbGwKICAgICAgICAgbWF0aF9saWJzID0gWydtJ10KICAgICAgICAgaWYgcGxhdGZvcm0gaW4gWydEYXJ3aW4xLjInLCAnYmVvcyddOgpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAgICAgICAgIGRibGliID0gW10KICAgICAgICAgaWYgc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywgJ2RiJyk6CiAgICAgICAgICAgICBkYmxpYiA9IFsnZGInXQotICAgICAgICAKKwogICAgICAgICBkYjE4NV9pbmNzID0gZmluZF9maWxlKCdkYl8xODUuaCcsIGluY19kaXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnL3Vzci9pbmNsdWRlL2RiMycsICcvdXNyL2luY2x1ZGUvZGIyJ10pCiAgICAgICAgIGRiX2luYyA9IGZpbmRfZmlsZSgnZGIuaCcsIGluY19kaXJzLCBbJy91c3IvaW5jbHVkZS9kYjEnXSkKQEAgLTM4OCw3ICszODgsNyBAQAogCiAgICAgICAgICAgICAjIEdlbmVyaWMgZHluYW1pYyBsb2FkaW5nIG1vZHVsZQogICAgICAgICAgICAgI2V4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ2RsJywgWydkbG1vZHVsZS5jJ10pICkKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAjIFN1biB5ZWxsb3cgcGFnZXMuIFNvbWUgc3lzdGVtcyBoYXZlIHRoZSBmdW5jdGlvbnMgaW4gbGliYy4KICAgICAgICAgICAgIGlmIHBsYXRmb3JtIG5vdCBpbiBbJ2N5Z3dpbiddOgogICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLCAnbnNsJykpOgpAQCAtNDk5LDE1ICs0OTksMTUgQEAKIAogICAgIGRlZiBkZXRlY3RfdGtpbnRlcihzZWxmLCBpbmNfZGlycywgbGliX2RpcnMpOgogICAgICAgICAjIFRoZSBfdGtpbnRlciBtb2R1bGUuCi0gICAgICAgIAorCiAgICAgICAgICMgQXNzdW1lIHdlIGhhdmVuJ3QgZm91bmQgYW55IG9mIHRoZSBsaWJyYXJpZXMgb3IgaW5jbHVkZSBmaWxlcwogICAgICAgICB0Y2xsaWIgPSB0a2xpYiA9IHRjbF9pbmNsdWRlcyA9IHRrX2luY2x1ZGVzID0gTm9uZQogICAgICAgICBmb3IgdmVyc2lvbiBpbiBbJzguNCcsICc4LjMnLCAnOC4yJywgJzguMScsICc4LjAnXToKLSAgICAgICAgICAgICB0a2xpYiA9IHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aycgKyB2ZXJzaW9uICkKLSAgICAgICAgICAgICB0Y2xsaWIgPSBzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RjbCcgKyB2ZXJzaW9uICkKLSAgICAgICAgICAgICBpZiB0a2xpYiBhbmQgdGNsbGliOgorICAgICAgICAgICAgdGtsaWIgPSBzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aycgKyB2ZXJzaW9uICkKKyAgICAgICAgICAgIHRjbGxpYiA9IHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0Y2wnICsgdmVyc2lvbiApCisgICAgICAgICAgICBpZiB0a2xpYiBhbmQgdGNsbGliOgogICAgICAgICAgICAgICAgICMgRXhpdCB0aGUgbG9vcCB3aGVuIHdlJ3ZlIGZvdW5kIHRoZSBUY2wvVGsgbGlicmFyaWVzCiAgICAgICAgICAgICAgICAgYnJlYWsKIApkaWZmIC0tZ2l0IGEvTWlzYy9maW5kX3JlY3Vyc2lvbmxpbWl0LnB5IGIvTWlzYy9maW5kX3JlY3Vyc2lvbmxpbWl0LnB5CmluZGV4IGYxNmMyOWYuLmU2NDU0YzljMyAxMDA2NDQKLS0tIGEvTWlzYy9maW5kX3JlY3Vyc2lvbmxpbWl0LnB5CisrKyBiL01pc2MvZmluZF9yZWN1cnNpb25saW1pdC5weQpAQCAtNTcsNyArNTcsNyBAQAogCiBkZWYgdGVzdF9nZXRpdGVtKCk6CiAgICAgcmV0dXJuIFJlY3Vyc2l2ZUJsb3d1cDYoKVs1XQotICAgIAorCiBkZWYgdGVzdF9yZWN1cnNlKCk6CiAgICAgcmV0dXJuIHRlc3RfcmVjdXJzZSgpCiAKQEAgLTg1LDQgKzg1LDMgQEAKICAgICBjaGVja19saW1pdChsaW1pdCwgInRlc3RfZ2V0aXRlbSIpCiAgICAgcHJpbnQgIkxpbWl0IG9mICVkIGlzIGZpbmUiICUgbGltaXQKICAgICBsaW1pdCA9IGxpbWl0ICsgMTAwCi0gICAgCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NnZW4ucHkgYi9Nb2R1bGVzL2NnZW4ucHkKaW5kZXggZjQ3ZTQxZi4uZjA3ZDk4NCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jZ2VuLnB5CisrKyBiL01vZHVsZXMvY2dlbi5weQpAQCAtMyw3ICszLDcgQEAKICMgQ29weXJpZ2h0IChjKSAxOTk1LTIwMDAsIENvcnBvcmF0aW9uIGZvciBOYXRpb25hbCBSZXNlYXJjaCBJbml0aWF0aXZlcy4KICMgQ29weXJpZ2h0IChjKSAxOTkwLTE5OTUsIFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bS4KICMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgCisjCiAjIFNlZSB0aGUgZmlsZSAiTWlzYy9DT1BZUklHSFQiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQKICMgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTIsOCArMTIsOCBAQAogIyB1c2FnZTogcHl0aG9uIGNnZW4ucHkgPGNzdHVicyA+Z2xtb2R1bGUuYwogIwogIyBOT1RFOiBZb3UgIG11c3QgZmlyc3QgbWFrZSBhIHB5dGhvbiBiaW5hcnkgd2l0aG91dCB0aGUgIkdMIiBvcHRpb24KLSMJYmVmb3JlIHlvdSBjYW4gcnVuIHRoaXMsIHdoZW4gYnVpbGRpbmcgUHl0aG9uIGZvciB0aGUgZmlyc3QgdGltZS4KLSMJU2VlIGNvbW1lbnRzIGluIHRoZSBNYWtlZmlsZS4KKyMgICAgICAgYmVmb3JlIHlvdSBjYW4gcnVuIHRoaXMsIHdoZW4gYnVpbGRpbmcgUHl0aG9uIGZvciB0aGUgZmlyc3QgdGltZS4KKyMgICAgICAgU2VlIGNvbW1lbnRzIGluIHRoZSBNYWtlZmlsZS4KICMKICMgWFhYIEJVRyByZXR1cm4gYXJyYXlzIGdlbmVyYXRlIHdyb25nIGNvZGUKICMgWFhYIG5lZWQgdG8gY2hhbmdlIGVycm9yIHJldHVybnMgaW50byBnb3RvcyB0byBmcmVlIG1hbGxvY2tlZCBhcnJheXMKQEAgLTI2LDE0ICsyNiwxNCBAQAogIyBGdW5jdGlvbiB0byBwcmludCB0byBzdGRlcnIKICMKIGRlZiBlcnIoKmFyZ3MpOgotCXNhdmVzdGRvdXQgPSBzeXMuc3Rkb3V0Ci0JdHJ5OgotCQlzeXMuc3Rkb3V0ID0gc3lzLnN0ZGVycgotCQlmb3IgaSBpbiBhcmdzOgotCQkJcHJpbnQgaSwKLQkJcHJpbnQKLQlmaW5hbGx5OgotCQlzeXMuc3Rkb3V0ID0gc2F2ZXN0ZG91dAorICAgIHNhdmVzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgdHJ5OgorICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLnN0ZGVycgorICAgICAgICBmb3IgaSBpbiBhcmdzOgorICAgICAgICAgICAgcHJpbnQgaSwKKyAgICAgICAgcHJpbnQKKyAgICBmaW5hbGx5OgorICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZXN0ZG91dAogCiAKICMgVGhlIHNldCBvZiBkaWdpdHMgdGhhdCBmb3JtIGEgbnVtYmVyCkBAIC00NiwyMCArNDYsMjAgQEAKICMgSWYgbm8gbnVtYmVyIGlzIGZvdW5kLCByZXR1cm5zICcnIGFuZCB0aGUgb3JpZ2luYWwgc3RyaW5nLgogIwogZGVmIGdldG51bShzKToKLQluID0gJycKLQl3aGlsZSBzIGFuZCBzWzBdIGluIGRpZ2l0czoKLQkJbiA9IG4gKyBzWzBdCi0JCXMgPSBzWzE6XQotCXJldHVybiBuLCBzCisgICAgbiA9ICcnCisgICAgd2hpbGUgcyBhbmQgc1swXSBpbiBkaWdpdHM6CisgICAgICAgIG4gPSBuICsgc1swXQorICAgICAgICBzID0gc1sxOl0KKyAgICByZXR1cm4gbiwgcwogCiAKICMgRnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBzdHJpbmcgaXMgYSBudW1iZXIKICMKIGRlZiBpc251bShzKToKLQlpZiBub3QgczogcmV0dXJuIEZhbHNlCi0JZm9yIGMgaW4gczoKLQkJaWYgbm90IGMgaW4gZGlnaXRzOiByZXR1cm4gRmFsc2UKLQlyZXR1cm4gVHJ1ZQorICAgIGlmIG5vdCBzOiByZXR1cm4gRmFsc2UKKyAgICBmb3IgYyBpbiBzOgorICAgICAgICBpZiBub3QgYyBpbiBkaWdpdHM6IHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCiAKIAogIyBBbGxvd2VkIGZ1bmN0aW9uIHJldHVybiB0eXBlcwpAQCAtNzMsMjYgKzczLDI2IEBACiAKIAogIyBOZWVkIHRvIGNsYXNzaWZ5IGFyZ3VtZW50cyBhcyBmb2xsb3dzCi0jCXNpbXBsZSBpbnB1dCB2YXJpYWJsZQotIwlzaW1wbGUgb3V0cHV0IHZhcmlhYmxlCi0jCWlucHV0IGFycmF5Ci0jCW91dHB1dCBhcnJheQotIwlpbnB1dCBnaXZpbmcgc2l6ZSBvZiBzb21lIGFycmF5CisjICAgICAgIHNpbXBsZSBpbnB1dCB2YXJpYWJsZQorIyAgICAgICBzaW1wbGUgb3V0cHV0IHZhcmlhYmxlCisjICAgICAgIGlucHV0IGFycmF5CisjICAgICAgIG91dHB1dCBhcnJheQorIyAgICAgICBpbnB1dCBnaXZpbmcgc2l6ZSBvZiBzb21lIGFycmF5CiAjCiAjIEFycmF5IGRpbWVuc2lvbnMgY2FuIGJlIHNwZWNpZmllZCBhcyBmb2xsb3dzCi0jCWNvbnN0YW50Ci0jCWFyZ04KLSMJY29uc3RhbnQgKiBhcmdOCi0jCXJldHZhbAotIwljb25zdGFudCAqIHJldHZhbAorIyAgICAgICBjb25zdGFudAorIyAgICAgICBhcmdOCisjICAgICAgIGNvbnN0YW50ICogYXJnTgorIyAgICAgICByZXR2YWwKKyMgICAgICAgY29uc3RhbnQgKiByZXR2YWwKICMKICMgVGhlIGRpbWVuc2lvbnMgZ2l2ZW4gYXMgY29uc3RhbnRzICogc29tZXRoaW5nIGFyZSByZWFsbHkKICMgYXJyYXlzIG9mIHBvaW50cyB3aGVyZSBwb2ludHMgYXJlIDItIDMtIG9yIDQtdHVwbGVzCiAjCiAjIFdlIGhhdmUgdG8gY29uc2lkZXIgdGhyZWUgbGlzdHM6Ci0jCXB5dGhvbiBpbnB1dCBhcmd1bWVudHMKLSMJQyBzdHViIGFyZ3VtZW50cyAoaW4gJiBvdXQpCi0jCXB5dGhvbiBvdXRwdXQgYXJndW1lbnRzIChyZWFsbHkgcmV0dXJuIHZhbHVlcykKKyMgICAgICAgcHl0aG9uIGlucHV0IGFyZ3VtZW50cworIyAgICAgICBDIHN0dWIgYXJndW1lbnRzIChpbiAmIG91dCkKKyMgICAgICAgcHl0aG9uIG91dHB1dCBhcmd1bWVudHMgKHJlYWxseSByZXR1cm4gdmFsdWVzKQogIwogIyBUaGVyZSBpcyBhIG1hcHBpbmcgZnJvbSBweXRob24gaW5wdXQgYXJndW1lbnRzIHRvIHRoZSBpbnB1dCBhcmd1bWVudHMKICMgb2YgdGhlIEMgc3R1YiwgYW5kIGEgZnVydGhlciBtYXBwaW5nIGZyb20gQyBzdHViIGFyZ3VtZW50cyB0byB0aGUKQEAgLTExMCw2OSArMTEwLDY5IEBACiAjIFJldHVybiB0eXBlLCBtb2RlLCBmYWN0b3IsIHJlc3Qgb2Ygc3Vic2NyaXB0OyBmYWN0b3IgYW5kIHJlc3QgbWF5IGJlIGVtcHR5LgogIwogZGVmIGNoZWNrYXJnKHR5cGUsIGFyZyk6Ci0JIwotCSMgVHVybiAiY2hhciAqeCIgaW50byAic3RyaW5nIHgiLgotCSMKLQlpZiB0eXBlID09ICdjaGFyJyBhbmQgYXJnWzBdID09ICcqJzoKLQkJdHlwZSA9ICdzdHJpbmcnCi0JCWFyZyA9IGFyZ1sxOl0KLQkjCi0JIyBDaGVjayB0aGF0IHRoZSB0eXBlIGlzIHN1cHBvcnRlZC4KLQkjCi0JaWYgdHlwZSBub3QgaW4gYXJnX3R5cGVzOgotCQlyYWlzZSBhcmdfZXJyb3IsICgnYmFkIHR5cGUnLCB0eXBlKQotCWlmIHR5cGVbOjJdID09ICd1Xyc6Ci0JCXR5cGUgPSAndW5zaWduZWQgJyArIHR5cGVbMjpdCi0JIwotCSMgU3BsaXQgaXQgaW4gdGhlIG1vZGUgKGZpcnN0IGNoYXJhY3RlcikgYW5kIHRoZSByZXN0LgotCSMKLQltb2RlLCByZXN0ID0gYXJnWzoxXSwgYXJnWzE6XQotCSMKLQkjIFRoZSBtb2RlIG11c3QgYmUgJ3MnIGZvciBzZW5kICg9IGlucHV0KSBvciAncicgZm9yIHJldHVybiBhcmd1bWVudC4KLQkjCi0JaWYgbW9kZSBub3QgaW4gKCdyJywgJ3MnKToKLQkJcmFpc2UgYXJnX2Vycm9yLCAoJ2JhZCBhcmcgbW9kZScsIG1vZGUpCi0JIwotCSMgSXMgaXQgYSBzaW1wbGUgYXJndW1lbnQ6IGlmIHNvLCB3ZSBhcmUgZG9uZS4KLQkjCi0JaWYgbm90IHJlc3Q6Ci0JCXJldHVybiB0eXBlLCBtb2RlLCAnJywgJycKLQkjCQotCSMgTm90IGEgc2ltcGxlIGFyZ3VtZW50OyBtdXN0IGJlIGFuIGFycmF5LgotCSMgVGhlICdyZXN0JyBtdXN0IGJlIGEgc3Vic2NyaXB0IGVuY2xvc2VkIGluIFsgYW5kIF0uCi0JIyBUaGUgc3Vic2NyaXB0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXMsCi0JIyBvdGhlcndpc2Ugd2UgZG9uJ3QgaGFuZGxlIGl0ICh3aGVyZSBOIGlzIGEgbnVtYmVyKToKLQkjCU4KLQkjCWFyZ04KLQkjCXJldHZhbAotCSMJTiphcmdOCi0JIwlOKnJldHZhbAotCSMKLQlpZiByZXN0WzoxXSA8PiAnWycgb3IgcmVzdFstMTpdIDw+ICddJzoKLQkJcmFpc2UgYXJnX2Vycm9yLCAoJ3N1YnNjcmlwdCBleHBlY3RlZCcsIHJlc3QpCi0Jc3ViID0gcmVzdFsxOi0xXQotCSMKLQkjIElzIHRoZXJlIGEgbGVhZGluZyBudW1iZXI/Ci0JIwotCW51bSwgc3ViID0gZ2V0bnVtKHN1YikKLQlpZiBudW06Ci0JCSMgVGhlcmUgaXMgYSBsZWFkaW5nIG51bWJlcgotCQlpZiBub3Qgc3ViOgotCQkJIyBUaGUgc3Vic2NyaXB0IGlzIGp1c3QgYSBudW1iZXIKLQkJCXJldHVybiB0eXBlLCBtb2RlLCBudW0sICcnCi0JCWlmIHN1Yls6MV0gPT0gJyonOgotCQkJIyBUaGVyZSBpcyBhIGZhY3RvciBwcmVmaXgKLQkJCXN1YiA9IHN1YlsxOl0KLQkJZWxzZToKLQkJCXJhaXNlIGFyZ19lcnJvciwgKCdcJypcJyBleHBlY3RlZCcsIHN1YikKLQlpZiBzdWIgPT0gJ3JldHZhbCc6Ci0JCSMgc2l6ZSBpcyByZXR2YWwgLS0gbXVzdCBiZSBhIHJlcGx5IGFyZ3VtZW50Ci0JCWlmIG1vZGUgPD4gJ3InOgotCQkJcmFpc2UgYXJnX2Vycm9yLCAoJ25vbi1yIG1vZGUgd2l0aCBbcmV0dmFsXScsIG1vZGUpCi0JZWxpZiBub3QgaXNudW0oc3ViKSBhbmQgKHN1Yls6M10gPD4gJ2FyZycgb3Igbm90IGlzbnVtKHN1YlszOl0pKToKLQkJcmFpc2UgYXJnX2Vycm9yLCAoJ2JhZCBzdWJzY3JpcHQnLCBzdWIpCi0JIwotCXJldHVybiB0eXBlLCBtb2RlLCBudW0sIHN1YgorICAgICMKKyAgICAjIFR1cm4gImNoYXIgKngiIGludG8gInN0cmluZyB4Ii4KKyAgICAjCisgICAgaWYgdHlwZSA9PSAnY2hhcicgYW5kIGFyZ1swXSA9PSAnKic6CisgICAgICAgIHR5cGUgPSAnc3RyaW5nJworICAgICAgICBhcmcgPSBhcmdbMTpdCisgICAgIworICAgICMgQ2hlY2sgdGhhdCB0aGUgdHlwZSBpcyBzdXBwb3J0ZWQuCisgICAgIworICAgIGlmIHR5cGUgbm90IGluIGFyZ190eXBlczoKKyAgICAgICAgcmFpc2UgYXJnX2Vycm9yLCAoJ2JhZCB0eXBlJywgdHlwZSkKKyAgICBpZiB0eXBlWzoyXSA9PSAndV8nOgorICAgICAgICB0eXBlID0gJ3Vuc2lnbmVkICcgKyB0eXBlWzI6XQorICAgICMKKyAgICAjIFNwbGl0IGl0IGluIHRoZSBtb2RlIChmaXJzdCBjaGFyYWN0ZXIpIGFuZCB0aGUgcmVzdC4KKyAgICAjCisgICAgbW9kZSwgcmVzdCA9IGFyZ1s6MV0sIGFyZ1sxOl0KKyAgICAjCisgICAgIyBUaGUgbW9kZSBtdXN0IGJlICdzJyBmb3Igc2VuZCAoPSBpbnB1dCkgb3IgJ3InIGZvciByZXR1cm4gYXJndW1lbnQuCisgICAgIworICAgIGlmIG1vZGUgbm90IGluICgncicsICdzJyk6CisgICAgICAgIHJhaXNlIGFyZ19lcnJvciwgKCdiYWQgYXJnIG1vZGUnLCBtb2RlKQorICAgICMKKyAgICAjIElzIGl0IGEgc2ltcGxlIGFyZ3VtZW50OiBpZiBzbywgd2UgYXJlIGRvbmUuCisgICAgIworICAgIGlmIG5vdCByZXN0OgorICAgICAgICByZXR1cm4gdHlwZSwgbW9kZSwgJycsICcnCisgICAgIworICAgICMgTm90IGEgc2ltcGxlIGFyZ3VtZW50OyBtdXN0IGJlIGFuIGFycmF5LgorICAgICMgVGhlICdyZXN0JyBtdXN0IGJlIGEgc3Vic2NyaXB0IGVuY2xvc2VkIGluIFsgYW5kIF0uCisgICAgIyBUaGUgc3Vic2NyaXB0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXMsCisgICAgIyBvdGhlcndpc2Ugd2UgZG9uJ3QgaGFuZGxlIGl0ICh3aGVyZSBOIGlzIGEgbnVtYmVyKToKKyAgICAjICAgICAgIE4KKyAgICAjICAgICAgIGFyZ04KKyAgICAjICAgICAgIHJldHZhbAorICAgICMgICAgICAgTiphcmdOCisgICAgIyAgICAgICBOKnJldHZhbAorICAgICMKKyAgICBpZiByZXN0WzoxXSA8PiAnWycgb3IgcmVzdFstMTpdIDw+ICddJzoKKyAgICAgICAgcmFpc2UgYXJnX2Vycm9yLCAoJ3N1YnNjcmlwdCBleHBlY3RlZCcsIHJlc3QpCisgICAgc3ViID0gcmVzdFsxOi0xXQorICAgICMKKyAgICAjIElzIHRoZXJlIGEgbGVhZGluZyBudW1iZXI/CisgICAgIworICAgIG51bSwgc3ViID0gZ2V0bnVtKHN1YikKKyAgICBpZiBudW06CisgICAgICAgICMgVGhlcmUgaXMgYSBsZWFkaW5nIG51bWJlcgorICAgICAgICBpZiBub3Qgc3ViOgorICAgICAgICAgICAgIyBUaGUgc3Vic2NyaXB0IGlzIGp1c3QgYSBudW1iZXIKKyAgICAgICAgICAgIHJldHVybiB0eXBlLCBtb2RlLCBudW0sICcnCisgICAgICAgIGlmIHN1Yls6MV0gPT0gJyonOgorICAgICAgICAgICAgIyBUaGVyZSBpcyBhIGZhY3RvciBwcmVmaXgKKyAgICAgICAgICAgIHN1YiA9IHN1YlsxOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIGFyZ19lcnJvciwgKCdcJypcJyBleHBlY3RlZCcsIHN1YikKKyAgICBpZiBzdWIgPT0gJ3JldHZhbCc6CisgICAgICAgICMgc2l6ZSBpcyByZXR2YWwgLS0gbXVzdCBiZSBhIHJlcGx5IGFyZ3VtZW50CisgICAgICAgIGlmIG1vZGUgPD4gJ3InOgorICAgICAgICAgICAgcmFpc2UgYXJnX2Vycm9yLCAoJ25vbi1yIG1vZGUgd2l0aCBbcmV0dmFsXScsIG1vZGUpCisgICAgZWxpZiBub3QgaXNudW0oc3ViKSBhbmQgKHN1Yls6M10gPD4gJ2FyZycgb3Igbm90IGlzbnVtKHN1YlszOl0pKToKKyAgICAgICAgcmFpc2UgYXJnX2Vycm9yLCAoJ2JhZCBzdWJzY3JpcHQnLCBzdWIpCisgICAgIworICAgIHJldHVybiB0eXBlLCBtb2RlLCBudW0sIHN1YgogCiAKICMgTGlzdCBvZiBmdW5jdGlvbnMgZm9yIHdoaWNoIHdlIGhhdmUgZ2VuZXJhdGVkIHN0dWJzCkBAIC0xODQsMjQzICsxODQsMjQzIEBACiAjIGluZm9ybWF0aW9uIGJ1aWxkIGJ5IHN1Y2Nlc3NpdmUgY2FsbHMgdG8gY2hlY2thcmcoKQogIwogZGVmIGdlbmVyYXRlKHR5cGUsIGZ1bmMsIGRhdGFiYXNlKToKLQkjCi0JIyBDaGVjayB0aGF0IHdlIGNhbiBoYW5kbGUgdGhpcyBjYXNlOgotCSMgbm8gdmFyaWFibGUgc2l6ZSByZXBseSBhcnJheXMgeWV0Ci0JIwotCW5faW5fYXJncyA9IDAKLQluX291dF9hcmdzID0gMAotCSMKLQlmb3IgYV90eXBlLCBhX21vZGUsIGFfZmFjdG9yLCBhX3N1YiBpbiBkYXRhYmFzZToKLQkJaWYgYV9tb2RlID09ICdzJzoKLQkJCW5faW5fYXJncyA9IG5faW5fYXJncyArIDEKLQkJZWxpZiBhX21vZGUgPT0gJ3InOgotCQkJbl9vdXRfYXJncyA9IG5fb3V0X2FyZ3MgKyAxCi0JCWVsc2U6Ci0JCQkjIENhbid0IGhhcHBlbgotCQkJcmFpc2UgYXJnX2Vycm9yLCAoJ2JhZCBhX21vZGUnLCBhX21vZGUpCi0JCWlmIChhX21vZGUgPT0gJ3InIGFuZCBhX3N1Yikgb3IgYV9zdWIgPT0gJ3JldHZhbCc6Ci0JCQllcnIoJ0Z1bmN0aW9uJywgZnVuYywgJ3RvbyBjb21wbGljYXRlZDonLAotCQkJICAgIGFfdHlwZSwgYV9tb2RlLCBhX2ZhY3RvciwgYV9zdWIpCi0JCQlwcmludCAnLyogWFhYIFRvbyBjb21wbGljYXRlZCB0byBnZW5lcmF0ZSBjb2RlIGZvciAqLycKLQkJCXJldHVybgotCSMKLQlmdW5jdGlvbnMuYXBwZW5kKGZ1bmMpCi0JIwotCSMgU3R1YiBoZWFkZXIKLQkjCi0JcHJpbnQKLQlwcmludCAnc3RhdGljIFB5T2JqZWN0IConCi0JcHJpbnQgJ2dsXycgKyBmdW5jICsgJyhzZWxmLCBhcmdzKScKLQlwcmludCAnXHRQeU9iamVjdCAqc2VsZjsnCi0JcHJpbnQgJ1x0UHlPYmplY3QgKmFyZ3M7JwotCXByaW50ICd7JwotCSMKLQkjIERlY2xhcmUgcmV0dXJuIHZhbHVlIGlmIGFueQotCSMKLQlpZiB0eXBlIDw+ICd2b2lkJzoKLQkJcHJpbnQgJ1x0JyArIHR5cGUsICdyZXR2YWw7JwotCSMKLQkjIERlY2xhcmUgYXJndW1lbnRzCi0JIwotCWZvciBpIGluIHJhbmdlKGxlbihkYXRhYmFzZSkpOgotCQlhX3R5cGUsIGFfbW9kZSwgYV9mYWN0b3IsIGFfc3ViID0gZGF0YWJhc2VbaV0KLQkJcHJpbnQgJ1x0JyArIGFfdHlwZSwKLQkJYnJhYyA9IGtldCA9ICcnCi0JCWlmIGFfc3ViIGFuZCBub3QgaXNudW0oYV9zdWIpOgotCQkJaWYgYV9mYWN0b3I6Ci0JCQkJYnJhYyA9ICcoJwotCQkJCWtldCA9ICcpJwotCQkJcHJpbnQgYnJhYyArICcqJywKLQkJcHJpbnQgJ2FyZycgKyByZXByKGkrMSkgKyBrZXQsCi0JCWlmIGFfc3ViIGFuZCBpc251bShhX3N1Yik6Ci0JCQlwcmludCAnWycsIGFfc3ViLCAnXScsCi0JCWlmIGFfZmFjdG9yOgotCQkJcHJpbnQgJ1snLCBhX2ZhY3RvciwgJ10nLAotCQlwcmludCAnOycKLQkjCi0JIyBGaW5kIGlucHV0IGFyZ3VtZW50cyBkZXJpdmVkIGZyb20gYXJyYXkgc2l6ZXMKLQkjCi0JZm9yIGkgaW4gcmFuZ2UobGVuKGRhdGFiYXNlKSk6Ci0JCWFfdHlwZSwgYV9tb2RlLCBhX2ZhY3RvciwgYV9zdWIgPSBkYXRhYmFzZVtpXQotCQlpZiBhX21vZGUgPT0gJ3MnIGFuZCBhX3N1Yls6M10gPT0gJ2FyZycgYW5kIGlzbnVtKGFfc3ViWzM6XSk6Ci0JCQkjIFNlbmRpbmcgYSB2YXJpYWJsZS1sZW5ndGggYXJyYXkKLQkJCW4gPSBldmFsKGFfc3ViWzM6XSkKLQkJCWlmIDEgPD0gbiA8PSBsZW4oZGF0YWJhc2UpOgotCQkJICAgIGJfdHlwZSwgYl9tb2RlLCBiX2ZhY3RvciwgYl9zdWIgPSBkYXRhYmFzZVtuLTFdCi0JCQkgICAgaWYgYl9tb2RlID09ICdzJzoKLQkJCSAgICAgICAgZGF0YWJhc2Vbbi0xXSA9IGJfdHlwZSwgJ2knLCBhX2ZhY3RvciwgcmVwcihpKQotCQkJICAgICAgICBuX2luX2FyZ3MgPSBuX2luX2FyZ3MgLSAxCi0JIwotCSMgQXNzaWduIGFyZ3VtZW50IHBvc2l0aW9ucyBpbiB0aGUgUHl0aG9uIGFyZ3VtZW50IGxpc3QKLQkjCi0JaW5fcG9zID0gW10KLQlpX2luID0gMAotCWZvciBpIGluIHJhbmdlKGxlbihkYXRhYmFzZSkpOgotCQlhX3R5cGUsIGFfbW9kZSwgYV9mYWN0b3IsIGFfc3ViID0gZGF0YWJhc2VbaV0KLQkJaWYgYV9tb2RlID09ICdzJzoKLQkJCWluX3Bvcy5hcHBlbmQoaV9pbikKLQkJCWlfaW4gPSBpX2luICsgMQotCQllbHNlOgotCQkJaW5fcG9zLmFwcGVuZCgtMSkKLQkjCi0JIyBHZXQgaW5wdXQgYXJndW1lbnRzCi0JIwotCWZvciBpIGluIHJhbmdlKGxlbihkYXRhYmFzZSkpOgotCQlhX3R5cGUsIGFfbW9kZSwgYV9mYWN0b3IsIGFfc3ViID0gZGF0YWJhc2VbaV0KLQkJaWYgYV90eXBlWzo5XSA9PSAndW5zaWduZWQgJzoKLQkJCXh0eXBlID0gYV90eXBlWzk6XQotCQllbHNlOgotCQkJeHR5cGUgPSBhX3R5cGUKLQkJaWYgYV9tb2RlID09ICdpJzoKLQkJCSMKLQkJCSMgSW1wbGljaXQgYXJndW1lbnQ7Ci0JCQkjIGFfZmFjdG9yIGlzIGRpdmlzb3IgaWYgcHJlc2VudCwKLQkJCSMgYV9zdWIgaW5kaWNhdGVzIHdoaWNoIGFyZyAoYGRhdGFiYXNlIGluZGV4YCkKLQkJCSMKLQkJCWogPSBldmFsKGFfc3ViKQotCQkJcHJpbnQgJ1x0aWYnLAotCQkJcHJpbnQgJyghZ2V0aScgKyB4dHlwZSArICdhcnJheXNpemUoYXJncywnLAotCQkJcHJpbnQgcmVwcihuX2luX2FyZ3MpICsgJywnLAotCQkJcHJpbnQgcmVwcihpbl9wb3Nbal0pICsgJywnLAotCQkJaWYgeHR5cGUgPD4gYV90eXBlOgotCQkJCXByaW50ICcoJyt4dHlwZSsnICopJywKLQkJCXByaW50ICcmYXJnJyArIHJlcHIoaSsxKSArICcpKScKLQkJCXByaW50ICdcdFx0cmV0dXJuIE5VTEw7JwotCQkJaWYgYV9mYWN0b3I6Ci0JCQkJcHJpbnQgJ1x0YXJnJyArIHJlcHIoaSsxKSwKLQkJCQlwcmludCAnPSBhcmcnICsgcmVwcihpKzEpLAotCQkJCXByaW50ICcvJywgYV9mYWN0b3IgKyAnOycKLQkJZWxpZiBhX21vZGUgPT0gJ3MnOgotCQkJaWYgYV9zdWIgYW5kIG5vdCBpc251bShhX3N1Yik6Ci0JCQkJIyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHZhcnNpemUgYXJyYXkKLQkJCQlwcmludCAnXHRpZiAoKGFyZycgKyByZXByKGkrMSksICc9JywKLQkJCQlpZiBhX2ZhY3RvcjoKLQkJCQkJcHJpbnQgJygnK2FfdHlwZSsnKCopWycrYV9mYWN0b3IrJ10pJywKLQkJCQlwcmludCAnUHlNZW1fTkVXKCcgKyBhX3R5cGUsICcsJywKLQkJCQlpZiBhX2ZhY3RvcjoKLQkJCQkJcHJpbnQgYV9mYWN0b3IsICcqJywKLQkJCQlwcmludCBhX3N1YiwgJykpID09IE5VTEwpJwotCQkJCXByaW50ICdcdFx0cmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7JwotCQkJcHJpbnQgJ1x0aWYnLAotCQkJaWYgYV9mYWN0b3Igb3IgYV9zdWI6ICMgR2V0IGEgZml4ZWQtc2l6ZSBhcnJheSBhcnJheQotCQkJCXByaW50ICcoIWdldGknICsgeHR5cGUgKyAnYXJyYXkoYXJncywnLAotCQkJCXByaW50IHJlcHIobl9pbl9hcmdzKSArICcsJywKLQkJCQlwcmludCByZXByKGluX3Bvc1tpXSkgKyAnLCcsCi0JCQkJaWYgYV9mYWN0b3I6IHByaW50IGFfZmFjdG9yLAotCQkJCWlmIGFfZmFjdG9yIGFuZCBhX3N1YjogcHJpbnQgJyonLAotCQkJCWlmIGFfc3ViOiBwcmludCBhX3N1YiwKLQkJCQlwcmludCAnLCcsCi0JCQkJaWYgKGFfc3ViIGFuZCBhX2ZhY3Rvcikgb3IgeHR5cGUgPD4gYV90eXBlOgotCQkJCQlwcmludCAnKCcreHR5cGUrJyAqKScsCi0JCQkJcHJpbnQgJ2FyZycgKyByZXByKGkrMSkgKyAnKSknCi0JCQllbHNlOiAjIEdldCBhIHNpbXBsZSB2YXJpYWJsZQotCQkJCXByaW50ICcoIWdldGknICsgeHR5cGUgKyAnYXJnKGFyZ3MsJywKLQkJCQlwcmludCByZXByKG5faW5fYXJncykgKyAnLCcsCi0JCQkJcHJpbnQgcmVwcihpbl9wb3NbaV0pICsgJywnLAotCQkJCWlmIHh0eXBlIDw+IGFfdHlwZToKLQkJCQkJcHJpbnQgJygnK3h0eXBlKycgKiknLAotCQkJCXByaW50ICcmYXJnJyArIHJlcHIoaSsxKSArICcpKScKLQkJCXByaW50ICdcdFx0cmV0dXJuIE5VTEw7JwotCSMKLQkjIEJlZ2luIG9mIGZ1bmN0aW9uIGNhbGwKLQkjCi0JaWYgdHlwZSA8PiAndm9pZCc6Ci0JCXByaW50ICdcdHJldHZhbCA9JywgZnVuYyArICcoJywKLQllbHNlOgotCQlwcmludCAnXHQnICsgZnVuYyArICcoJywKLQkjCi0JIyBBcmd1bWVudCBsaXN0Ci0JIwotCWZvciBpIGluIHJhbmdlKGxlbihkYXRhYmFzZSkpOgotCQlpZiBpID4gMDogcHJpbnQgJywnLAotCQlhX3R5cGUsIGFfbW9kZSwgYV9mYWN0b3IsIGFfc3ViID0gZGF0YWJhc2VbaV0KLQkJaWYgYV9tb2RlID09ICdyJyBhbmQgbm90IGFfZmFjdG9yOgotCQkJcHJpbnQgJyYnLAotCQlwcmludCAnYXJnJyArIHJlcHIoaSsxKSwKLQkjCi0JIyBFbmQgb2YgZnVuY3Rpb24gY2FsbAotCSMKLQlwcmludCAnKTsnCi0JIwotCSMgRnJlZSB2YXJzaXplIGFycmF5cwotCSMKLQlmb3IgaSBpbiByYW5nZShsZW4oZGF0YWJhc2UpKToKLQkJYV90eXBlLCBhX21vZGUsIGFfZmFjdG9yLCBhX3N1YiA9IGRhdGFiYXNlW2ldCi0JCWlmIGFfbW9kZSA9PSAncycgYW5kIGFfc3ViIGFuZCBub3QgaXNudW0oYV9zdWIpOgotCQkJcHJpbnQgJ1x0UHlNZW1fREVMKGFyZycgKyByZXByKGkrMSkgKyAnKTsnCi0JIwotCSMgUmV0dXJuCi0JIwotCWlmIG5fb3V0X2FyZ3M6Ci0JCSMKLQkJIyBNdWx0aXBsZSByZXR1cm4gdmFsdWVzIC0tIGNvbnN0cnVjdCBhIHR1cGxlCi0JCSMKLQkJaWYgdHlwZSA8PiAndm9pZCc6Ci0JCQluX291dF9hcmdzID0gbl9vdXRfYXJncyArIDEKLQkJaWYgbl9vdXRfYXJncyA9PSAxOgotCQkJZm9yIGkgaW4gcmFuZ2UobGVuKGRhdGFiYXNlKSk6Ci0JCQkJYV90eXBlLCBhX21vZGUsIGFfZmFjdG9yLCBhX3N1YiA9IGRhdGFiYXNlW2ldCi0JCQkJaWYgYV9tb2RlID09ICdyJzoKLQkJCQkJYnJlYWsKLQkJCWVsc2U6Ci0JCQkJcmFpc2UgYXJnX2Vycm9yLCAnZXhwZWN0ZWQgciBhcmcgbm90IGZvdW5kJwotCQkJcHJpbnQgJ1x0cmV0dXJuJywKLQkJCXByaW50IG1rb2JqZWN0KGFfdHlwZSwgJ2FyZycgKyByZXByKGkrMSkpICsgJzsnCi0JCWVsc2U6Ci0JCQlwcmludCAnXHR7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoJywKLQkJCXByaW50IG5fb3V0X2FyZ3MsICcpOycKLQkJCXByaW50ICdcdCAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7JwotCQkJaV9vdXQgPSAwCi0JCQlpZiB0eXBlIDw+ICd2b2lkJzoKLQkJCQlwcmludCAnXHQgIFB5VHVwbGVfU2V0SXRlbSh2LCcsCi0JCQkJcHJpbnQgcmVwcihpX291dCkgKyAnLCcsCi0JCQkJcHJpbnQgbWtvYmplY3QodHlwZSwgJ3JldHZhbCcpICsgJyk7JwotCQkJCWlfb3V0ID0gaV9vdXQgKyAxCi0JCQlmb3IgaSBpbiByYW5nZShsZW4oZGF0YWJhc2UpKToKLQkJCQlhX3R5cGUsIGFfbW9kZSwgYV9mYWN0b3IsIGFfc3ViID0gZGF0YWJhc2VbaV0KLQkJCQlpZiBhX21vZGUgPT0gJ3InOgotCQkJCQlwcmludCAnXHQgIFB5VHVwbGVfU2V0SXRlbSh2LCcsCi0JCQkJCXByaW50IHJlcHIoaV9vdXQpICsgJywnLAotCQkJCQlzID0gbWtvYmplY3QoYV90eXBlLCAnYXJnJyArIHJlcHIoaSsxKSkKLQkJCQkJcHJpbnQgcyArICcpOycKLQkJCQkJaV9vdXQgPSBpX291dCArIDEKLQkJCXByaW50ICdcdCAgcmV0dXJuIHY7JwotCQkJcHJpbnQgJ1x0fScKLQllbHNlOgotCQkjCi0JCSMgU2ltcGxlIGZ1bmN0aW9uIHJldHVybgotCQkjIFJldHVybiBOb25lIG9yIHJldHVybiB2YWx1ZQotCQkjCi0JCWlmIHR5cGUgPT0gJ3ZvaWQnOgotCQkJcHJpbnQgJ1x0UHlfSU5DUkVGKFB5X05vbmUpOycKLQkJCXByaW50ICdcdHJldHVybiBQeV9Ob25lOycKLQkJZWxzZToKLQkJCXByaW50ICdcdHJldHVybicsIG1rb2JqZWN0KHR5cGUsICdyZXR2YWwnKSArICc7JwotCSMKLQkjIFN0dWIgYm9keSBjbG9zaW5nIGJyYWNlCi0JIwotCXByaW50ICd9JworICAgICMKKyAgICAjIENoZWNrIHRoYXQgd2UgY2FuIGhhbmRsZSB0aGlzIGNhc2U6CisgICAgIyBubyB2YXJpYWJsZSBzaXplIHJlcGx5IGFycmF5cyB5ZXQKKyAgICAjCisgICAgbl9pbl9hcmdzID0gMAorICAgIG5fb3V0X2FyZ3MgPSAwCisgICAgIworICAgIGZvciBhX3R5cGUsIGFfbW9kZSwgYV9mYWN0b3IsIGFfc3ViIGluIGRhdGFiYXNlOgorICAgICAgICBpZiBhX21vZGUgPT0gJ3MnOgorICAgICAgICAgICAgbl9pbl9hcmdzID0gbl9pbl9hcmdzICsgMQorICAgICAgICBlbGlmIGFfbW9kZSA9PSAncic6CisgICAgICAgICAgICBuX291dF9hcmdzID0gbl9vdXRfYXJncyArIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQ2FuJ3QgaGFwcGVuCisgICAgICAgICAgICByYWlzZSBhcmdfZXJyb3IsICgnYmFkIGFfbW9kZScsIGFfbW9kZSkKKyAgICAgICAgaWYgKGFfbW9kZSA9PSAncicgYW5kIGFfc3ViKSBvciBhX3N1YiA9PSAncmV0dmFsJzoKKyAgICAgICAgICAgIGVycignRnVuY3Rpb24nLCBmdW5jLCAndG9vIGNvbXBsaWNhdGVkOicsCisgICAgICAgICAgICAgICAgYV90eXBlLCBhX21vZGUsIGFfZmFjdG9yLCBhX3N1YikKKyAgICAgICAgICAgIHByaW50ICcvKiBYWFggVG9vIGNvbXBsaWNhdGVkIHRvIGdlbmVyYXRlIGNvZGUgZm9yICovJworICAgICAgICAgICAgcmV0dXJuCisgICAgIworICAgIGZ1bmN0aW9ucy5hcHBlbmQoZnVuYykKKyAgICAjCisgICAgIyBTdHViIGhlYWRlcgorICAgICMKKyAgICBwcmludAorICAgIHByaW50ICdzdGF0aWMgUHlPYmplY3QgKicKKyAgICBwcmludCAnZ2xfJyArIGZ1bmMgKyAnKHNlbGYsIGFyZ3MpJworICAgIHByaW50ICdcdFB5T2JqZWN0ICpzZWxmOycKKyAgICBwcmludCAnXHRQeU9iamVjdCAqYXJnczsnCisgICAgcHJpbnQgJ3snCisgICAgIworICAgICMgRGVjbGFyZSByZXR1cm4gdmFsdWUgaWYgYW55CisgICAgIworICAgIGlmIHR5cGUgPD4gJ3ZvaWQnOgorICAgICAgICBwcmludCAnXHQnICsgdHlwZSwgJ3JldHZhbDsnCisgICAgIworICAgICMgRGVjbGFyZSBhcmd1bWVudHMKKyAgICAjCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGRhdGFiYXNlKSk6CisgICAgICAgIGFfdHlwZSwgYV9tb2RlLCBhX2ZhY3RvciwgYV9zdWIgPSBkYXRhYmFzZVtpXQorICAgICAgICBwcmludCAnXHQnICsgYV90eXBlLAorICAgICAgICBicmFjID0ga2V0ID0gJycKKyAgICAgICAgaWYgYV9zdWIgYW5kIG5vdCBpc251bShhX3N1Yik6CisgICAgICAgICAgICBpZiBhX2ZhY3RvcjoKKyAgICAgICAgICAgICAgICBicmFjID0gJygnCisgICAgICAgICAgICAgICAga2V0ID0gJyknCisgICAgICAgICAgICBwcmludCBicmFjICsgJyonLAorICAgICAgICBwcmludCAnYXJnJyArIHJlcHIoaSsxKSArIGtldCwKKyAgICAgICAgaWYgYV9zdWIgYW5kIGlzbnVtKGFfc3ViKToKKyAgICAgICAgICAgIHByaW50ICdbJywgYV9zdWIsICddJywKKyAgICAgICAgaWYgYV9mYWN0b3I6CisgICAgICAgICAgICBwcmludCAnWycsIGFfZmFjdG9yLCAnXScsCisgICAgICAgIHByaW50ICc7JworICAgICMKKyAgICAjIEZpbmQgaW5wdXQgYXJndW1lbnRzIGRlcml2ZWQgZnJvbSBhcnJheSBzaXplcworICAgICMKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oZGF0YWJhc2UpKToKKyAgICAgICAgYV90eXBlLCBhX21vZGUsIGFfZmFjdG9yLCBhX3N1YiA9IGRhdGFiYXNlW2ldCisgICAgICAgIGlmIGFfbW9kZSA9PSAncycgYW5kIGFfc3ViWzozXSA9PSAnYXJnJyBhbmQgaXNudW0oYV9zdWJbMzpdKToKKyAgICAgICAgICAgICMgU2VuZGluZyBhIHZhcmlhYmxlLWxlbmd0aCBhcnJheQorICAgICAgICAgICAgbiA9IGV2YWwoYV9zdWJbMzpdKQorICAgICAgICAgICAgaWYgMSA8PSBuIDw9IGxlbihkYXRhYmFzZSk6CisgICAgICAgICAgICAgICAgYl90eXBlLCBiX21vZGUsIGJfZmFjdG9yLCBiX3N1YiA9IGRhdGFiYXNlW24tMV0KKyAgICAgICAgICAgICAgICBpZiBiX21vZGUgPT0gJ3MnOgorICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZVtuLTFdID0gYl90eXBlLCAnaScsIGFfZmFjdG9yLCByZXByKGkpCisgICAgICAgICAgICAgICAgICAgIG5faW5fYXJncyA9IG5faW5fYXJncyAtIDEKKyAgICAjCisgICAgIyBBc3NpZ24gYXJndW1lbnQgcG9zaXRpb25zIGluIHRoZSBQeXRob24gYXJndW1lbnQgbGlzdAorICAgICMKKyAgICBpbl9wb3MgPSBbXQorICAgIGlfaW4gPSAwCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGRhdGFiYXNlKSk6CisgICAgICAgIGFfdHlwZSwgYV9tb2RlLCBhX2ZhY3RvciwgYV9zdWIgPSBkYXRhYmFzZVtpXQorICAgICAgICBpZiBhX21vZGUgPT0gJ3MnOgorICAgICAgICAgICAgaW5fcG9zLmFwcGVuZChpX2luKQorICAgICAgICAgICAgaV9pbiA9IGlfaW4gKyAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbl9wb3MuYXBwZW5kKC0xKQorICAgICMKKyAgICAjIEdldCBpbnB1dCBhcmd1bWVudHMKKyAgICAjCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGRhdGFiYXNlKSk6CisgICAgICAgIGFfdHlwZSwgYV9tb2RlLCBhX2ZhY3RvciwgYV9zdWIgPSBkYXRhYmFzZVtpXQorICAgICAgICBpZiBhX3R5cGVbOjldID09ICd1bnNpZ25lZCAnOgorICAgICAgICAgICAgeHR5cGUgPSBhX3R5cGVbOTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4dHlwZSA9IGFfdHlwZQorICAgICAgICBpZiBhX21vZGUgPT0gJ2knOgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBJbXBsaWNpdCBhcmd1bWVudDsKKyAgICAgICAgICAgICMgYV9mYWN0b3IgaXMgZGl2aXNvciBpZiBwcmVzZW50LAorICAgICAgICAgICAgIyBhX3N1YiBpbmRpY2F0ZXMgd2hpY2ggYXJnIChgZGF0YWJhc2UgaW5kZXhgKQorICAgICAgICAgICAgIworICAgICAgICAgICAgaiA9IGV2YWwoYV9zdWIpCisgICAgICAgICAgICBwcmludCAnXHRpZicsCisgICAgICAgICAgICBwcmludCAnKCFnZXRpJyArIHh0eXBlICsgJ2FycmF5c2l6ZShhcmdzLCcsCisgICAgICAgICAgICBwcmludCByZXByKG5faW5fYXJncykgKyAnLCcsCisgICAgICAgICAgICBwcmludCByZXByKGluX3Bvc1tqXSkgKyAnLCcsCisgICAgICAgICAgICBpZiB4dHlwZSA8PiBhX3R5cGU6CisgICAgICAgICAgICAgICAgcHJpbnQgJygnK3h0eXBlKycgKiknLAorICAgICAgICAgICAgcHJpbnQgJyZhcmcnICsgcmVwcihpKzEpICsgJykpJworICAgICAgICAgICAgcHJpbnQgJ1x0XHRyZXR1cm4gTlVMTDsnCisgICAgICAgICAgICBpZiBhX2ZhY3RvcjoKKyAgICAgICAgICAgICAgICBwcmludCAnXHRhcmcnICsgcmVwcihpKzEpLAorICAgICAgICAgICAgICAgIHByaW50ICc9IGFyZycgKyByZXByKGkrMSksCisgICAgICAgICAgICAgICAgcHJpbnQgJy8nLCBhX2ZhY3RvciArICc7JworICAgICAgICBlbGlmIGFfbW9kZSA9PSAncyc6CisgICAgICAgICAgICBpZiBhX3N1YiBhbmQgbm90IGlzbnVtKGFfc3ViKToKKyAgICAgICAgICAgICAgICAjIEFsbG9jYXRlIG1lbW9yeSBmb3IgdmFyc2l6ZSBhcnJheQorICAgICAgICAgICAgICAgIHByaW50ICdcdGlmICgoYXJnJyArIHJlcHIoaSsxKSwgJz0nLAorICAgICAgICAgICAgICAgIGlmIGFfZmFjdG9yOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnKCcrYV90eXBlKycoKilbJythX2ZhY3RvcisnXSknLAorICAgICAgICAgICAgICAgIHByaW50ICdQeU1lbV9ORVcoJyArIGFfdHlwZSwgJywnLAorICAgICAgICAgICAgICAgIGlmIGFfZmFjdG9yOgorICAgICAgICAgICAgICAgICAgICBwcmludCBhX2ZhY3RvciwgJyonLAorICAgICAgICAgICAgICAgIHByaW50IGFfc3ViLCAnKSkgPT0gTlVMTCknCisgICAgICAgICAgICAgICAgcHJpbnQgJ1x0XHRyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsnCisgICAgICAgICAgICBwcmludCAnXHRpZicsCisgICAgICAgICAgICBpZiBhX2ZhY3RvciBvciBhX3N1YjogIyBHZXQgYSBmaXhlZC1zaXplIGFycmF5IGFycmF5CisgICAgICAgICAgICAgICAgcHJpbnQgJyghZ2V0aScgKyB4dHlwZSArICdhcnJheShhcmdzLCcsCisgICAgICAgICAgICAgICAgcHJpbnQgcmVwcihuX2luX2FyZ3MpICsgJywnLAorICAgICAgICAgICAgICAgIHByaW50IHJlcHIoaW5fcG9zW2ldKSArICcsJywKKyAgICAgICAgICAgICAgICBpZiBhX2ZhY3RvcjogcHJpbnQgYV9mYWN0b3IsCisgICAgICAgICAgICAgICAgaWYgYV9mYWN0b3IgYW5kIGFfc3ViOiBwcmludCAnKicsCisgICAgICAgICAgICAgICAgaWYgYV9zdWI6IHByaW50IGFfc3ViLAorICAgICAgICAgICAgICAgIHByaW50ICcsJywKKyAgICAgICAgICAgICAgICBpZiAoYV9zdWIgYW5kIGFfZmFjdG9yKSBvciB4dHlwZSA8PiBhX3R5cGU6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICcoJyt4dHlwZSsnICopJywKKyAgICAgICAgICAgICAgICBwcmludCAnYXJnJyArIHJlcHIoaSsxKSArICcpKScKKyAgICAgICAgICAgIGVsc2U6ICMgR2V0IGEgc2ltcGxlIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgcHJpbnQgJyghZ2V0aScgKyB4dHlwZSArICdhcmcoYXJncywnLAorICAgICAgICAgICAgICAgIHByaW50IHJlcHIobl9pbl9hcmdzKSArICcsJywKKyAgICAgICAgICAgICAgICBwcmludCByZXByKGluX3Bvc1tpXSkgKyAnLCcsCisgICAgICAgICAgICAgICAgaWYgeHR5cGUgPD4gYV90eXBlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnKCcreHR5cGUrJyAqKScsCisgICAgICAgICAgICAgICAgcHJpbnQgJyZhcmcnICsgcmVwcihpKzEpICsgJykpJworICAgICAgICAgICAgcHJpbnQgJ1x0XHRyZXR1cm4gTlVMTDsnCisgICAgIworICAgICMgQmVnaW4gb2YgZnVuY3Rpb24gY2FsbAorICAgICMKKyAgICBpZiB0eXBlIDw+ICd2b2lkJzoKKyAgICAgICAgcHJpbnQgJ1x0cmV0dmFsID0nLCBmdW5jICsgJygnLAorICAgIGVsc2U6CisgICAgICAgIHByaW50ICdcdCcgKyBmdW5jICsgJygnLAorICAgICMKKyAgICAjIEFyZ3VtZW50IGxpc3QKKyAgICAjCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGRhdGFiYXNlKSk6CisgICAgICAgIGlmIGkgPiAwOiBwcmludCAnLCcsCisgICAgICAgIGFfdHlwZSwgYV9tb2RlLCBhX2ZhY3RvciwgYV9zdWIgPSBkYXRhYmFzZVtpXQorICAgICAgICBpZiBhX21vZGUgPT0gJ3InIGFuZCBub3QgYV9mYWN0b3I6CisgICAgICAgICAgICBwcmludCAnJicsCisgICAgICAgIHByaW50ICdhcmcnICsgcmVwcihpKzEpLAorICAgICMKKyAgICAjIEVuZCBvZiBmdW5jdGlvbiBjYWxsCisgICAgIworICAgIHByaW50ICcpOycKKyAgICAjCisgICAgIyBGcmVlIHZhcnNpemUgYXJyYXlzCisgICAgIworICAgIGZvciBpIGluIHJhbmdlKGxlbihkYXRhYmFzZSkpOgorICAgICAgICBhX3R5cGUsIGFfbW9kZSwgYV9mYWN0b3IsIGFfc3ViID0gZGF0YWJhc2VbaV0KKyAgICAgICAgaWYgYV9tb2RlID09ICdzJyBhbmQgYV9zdWIgYW5kIG5vdCBpc251bShhX3N1Yik6CisgICAgICAgICAgICBwcmludCAnXHRQeU1lbV9ERUwoYXJnJyArIHJlcHIoaSsxKSArICcpOycKKyAgICAjCisgICAgIyBSZXR1cm4KKyAgICAjCisgICAgaWYgbl9vdXRfYXJnczoKKyAgICAgICAgIworICAgICAgICAjIE11bHRpcGxlIHJldHVybiB2YWx1ZXMgLS0gY29uc3RydWN0IGEgdHVwbGUKKyAgICAgICAgIworICAgICAgICBpZiB0eXBlIDw+ICd2b2lkJzoKKyAgICAgICAgICAgIG5fb3V0X2FyZ3MgPSBuX291dF9hcmdzICsgMQorICAgICAgICBpZiBuX291dF9hcmdzID09IDE6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZGF0YWJhc2UpKToKKyAgICAgICAgICAgICAgICBhX3R5cGUsIGFfbW9kZSwgYV9mYWN0b3IsIGFfc3ViID0gZGF0YWJhc2VbaV0KKyAgICAgICAgICAgICAgICBpZiBhX21vZGUgPT0gJ3InOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBhcmdfZXJyb3IsICdleHBlY3RlZCByIGFyZyBub3QgZm91bmQnCisgICAgICAgICAgICBwcmludCAnXHRyZXR1cm4nLAorICAgICAgICAgICAgcHJpbnQgbWtvYmplY3QoYV90eXBlLCAnYXJnJyArIHJlcHIoaSsxKSkgKyAnOycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdcdHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldygnLAorICAgICAgICAgICAgcHJpbnQgbl9vdXRfYXJncywgJyk7JworICAgICAgICAgICAgcHJpbnQgJ1x0ICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsnCisgICAgICAgICAgICBpX291dCA9IDAKKyAgICAgICAgICAgIGlmIHR5cGUgPD4gJ3ZvaWQnOgorICAgICAgICAgICAgICAgIHByaW50ICdcdCAgUHlUdXBsZV9TZXRJdGVtKHYsJywKKyAgICAgICAgICAgICAgICBwcmludCByZXByKGlfb3V0KSArICcsJywKKyAgICAgICAgICAgICAgICBwcmludCBta29iamVjdCh0eXBlLCAncmV0dmFsJykgKyAnKTsnCisgICAgICAgICAgICAgICAgaV9vdXQgPSBpX291dCArIDEKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihkYXRhYmFzZSkpOgorICAgICAgICAgICAgICAgIGFfdHlwZSwgYV9tb2RlLCBhX2ZhY3RvciwgYV9zdWIgPSBkYXRhYmFzZVtpXQorICAgICAgICAgICAgICAgIGlmIGFfbW9kZSA9PSAncic6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdcdCAgUHlUdXBsZV9TZXRJdGVtKHYsJywKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgcmVwcihpX291dCkgKyAnLCcsCisgICAgICAgICAgICAgICAgICAgIHMgPSBta29iamVjdChhX3R5cGUsICdhcmcnICsgcmVwcihpKzEpKQorICAgICAgICAgICAgICAgICAgICBwcmludCBzICsgJyk7JworICAgICAgICAgICAgICAgICAgICBpX291dCA9IGlfb3V0ICsgMQorICAgICAgICAgICAgcHJpbnQgJ1x0ICByZXR1cm4gdjsnCisgICAgICAgICAgICBwcmludCAnXHR9JworICAgIGVsc2U6CisgICAgICAgICMKKyAgICAgICAgIyBTaW1wbGUgZnVuY3Rpb24gcmV0dXJuCisgICAgICAgICMgUmV0dXJuIE5vbmUgb3IgcmV0dXJuIHZhbHVlCisgICAgICAgICMKKyAgICAgICAgaWYgdHlwZSA9PSAndm9pZCc6CisgICAgICAgICAgICBwcmludCAnXHRQeV9JTkNSRUYoUHlfTm9uZSk7JworICAgICAgICAgICAgcHJpbnQgJ1x0cmV0dXJuIFB5X05vbmU7JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgJ1x0cmV0dXJuJywgbWtvYmplY3QodHlwZSwgJ3JldHZhbCcpICsgJzsnCisgICAgIworICAgICMgU3R1YiBib2R5IGNsb3NpbmcgYnJhY2UKKyAgICAjCisgICAgcHJpbnQgJ30nCiAKIAogIyBTdWJyb3V0aW5lIHRvIHJldHVybiBhIGZ1bmN0aW9uIGNhbGwgdG8gbWtuZXc8dHlwZT5vYmplY3QoPGFyZz4pCiAjCiBkZWYgbWtvYmplY3QodHlwZSwgYXJnKToKLQlpZiB0eXBlWzo5XSA9PSAndW5zaWduZWQgJzoKLQkJdHlwZSA9IHR5cGVbOTpdCi0JCXJldHVybiAnbWtuZXcnICsgdHlwZSArICdvYmplY3QoKCcgKyB0eXBlICsgJykgJyArIGFyZyArICcpJwotCXJldHVybiAnbWtuZXcnICsgdHlwZSArICdvYmplY3QoJyArIGFyZyArICcpJworICAgIGlmIHR5cGVbOjldID09ICd1bnNpZ25lZCAnOgorICAgICAgICB0eXBlID0gdHlwZVs5Ol0KKyAgICAgICAgcmV0dXJuICdta25ldycgKyB0eXBlICsgJ29iamVjdCgoJyArIHR5cGUgKyAnKSAnICsgYXJnICsgJyknCisgICAgcmV0dXJuICdta25ldycgKyB0eXBlICsgJ29iamVjdCgnICsgYXJnICsgJyknCiAKIAogZGVmaW5lZF9hcmNocyA9IFtdCiAKICMgdXNhZ2U6IGNnZW4gWyAtRG1hY2ggLi4uIF0gWyBmaWxlIF0KIGZvciBhcmcgaW4gc3lzLmFyZ3ZbMTpdOgotCWlmIGFyZ1s6Ml0gPT0gJy1EJzoKLQkJZGVmaW5lZF9hcmNocy5hcHBlbmQoYXJnWzI6XSkKLQllbHNlOgotCQkjIE9wZW4gb3B0aW9uYWwgZmlsZSBhcmd1bWVudAotCQlzeXMuc3RkaW4gPSBvcGVuKGFyZywgJ3InKQorICAgIGlmIGFyZ1s6Ml0gPT0gJy1EJzoKKyAgICAgICAgZGVmaW5lZF9hcmNocy5hcHBlbmQoYXJnWzI6XSkKKyAgICBlbHNlOgorICAgICAgICAjIE9wZW4gb3B0aW9uYWwgZmlsZSBhcmd1bWVudAorICAgICAgICBzeXMuc3RkaW4gPSBvcGVuKGFyZywgJ3InKQogCiAKICMgSW5wdXQgbGluZSBudW1iZXIKQEAgLTQyOCw4ICs0MjgsOCBAQAogCiAKICMgSW5wdXQgaXMgZGl2aWRlZCBpbiB0d28gcGFydHMsIHNlcGFyYXRlZCBieSBhIGxpbmUgY29udGFpbmluZyAnJSUnLgotIwk8cGFydDE+CQktLSBsaXRlcmFsbHkgY29waWVkIHRvIHN0ZG91dAotIwk8cGFydDI+CQktLSBzdHViIGRlZmluaXRpb25zCisjICAgICAgIDxwYXJ0MT4gICAgICAgICAtLSBsaXRlcmFsbHkgY29waWVkIHRvIHN0ZG91dAorIyAgICAgICA8cGFydDI+ICAgICAgICAgLS0gc3R1YiBkZWZpbml0aW9ucwogCiAjIFZhcmlhYmxlIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgaW5wdXQgcGFydC4KICMKQEAgLTQzOCw3OCArNDM4LDc4IEBACiAjIE1haW4gbG9vcCBvdmVyIHRoZSBpbnB1dAogIwogd2hpbGUgMToKLQl0cnk6Ci0JCWxpbmUgPSByYXdfaW5wdXQoKQotCWV4Y2VwdCBFT0ZFcnJvcjoKLQkJYnJlYWsKLQkjCi0JbG5vID0gbG5vKzEKLQl3b3JkcyA9IHN0cmluZy5zcGxpdChsaW5lKQotCSMKLQlpZiBwYXJ0ID09IDE6Ci0JCSMKLQkJIyBJbiBwYXJ0IDEsIGNvcHkgZXZlcnl0aGluZyBsaXRlcmFsbHkKLQkJIyBleGNlcHQgbG9vayBmb3IgYSBsaW5lIG9mIGp1c3QgJyUlJwotCQkjCi0JCWlmIHdvcmRzID09IFsnJSUnXToKLQkJCXBhcnQgPSBwYXJ0ICsgMQotCQllbHNlOgotCQkJIwotCQkJIyBMb29rIGZvciBuYW1lcyBvZiBtYW51YWxseSB3cml0dGVuCi0JCQkjIHN0dWJzOiBhIHNpbmdsZSBwZXJjZW50IGZvbGxvd2VkIGJ5IHRoZSBuYW1lCi0JCQkjIG9mIHRoZSBmdW5jdGlvbiBpbiBQeXRob24uCi0JCQkjIFRoZSBzdHViIG5hbWUgaXMgZGVyaXZlZCBieSBwcmVmaXhpbmcgJ2dsXycuCi0JCQkjCi0JCQlpZiB3b3JkcyBhbmQgd29yZHNbMF1bMF0gPT0gJyUnOgotCQkJCWZ1bmMgPSB3b3Jkc1swXVsxOl0KLQkJCQlpZiAobm90IGZ1bmMpIGFuZCB3b3Jkc1sxOl06Ci0JCQkJCWZ1bmMgPSB3b3Jkc1sxXQotCQkJCWlmIGZ1bmM6Ci0JCQkJCWZ1bmN0aW9ucy5hcHBlbmQoZnVuYykKLQkJCWVsc2U6Ci0JCQkJcHJpbnQgbGluZQotCQljb250aW51ZQotCWlmIG5vdCB3b3JkczoKLQkJY29udGludWUJCSMgc2tpcCBlbXB0eSBsaW5lCi0JZWxpZiB3b3Jkc1swXSA9PSAnaWYnOgotCQkjIGlmIFhYWCByZXN0Ci0JCSMgaWYgIVhYWCByZXN0Ci0JCWlmIHdvcmRzWzFdWzBdID09ICchJzoKLQkJCWlmIHdvcmRzWzFdWzE6XSBpbiBkZWZpbmVkX2FyY2hzOgotCQkJCWNvbnRpbnVlCi0JCWVsaWYgd29yZHNbMV0gbm90IGluIGRlZmluZWRfYXJjaHM6Ci0JCQljb250aW51ZQotCQl3b3JkcyA9IHdvcmRzWzI6XQotCWlmIHdvcmRzWzBdID09ICcjaW5jbHVkZSc6Ci0JCXByaW50IGxpbmUKLQllbGlmIHdvcmRzWzBdWzoxXSA9PSAnIyc6Ci0JCXBhc3MJCQkjIGlnbm9yZSBjb21tZW50Ci0JZWxpZiB3b3Jkc1swXSBub3QgaW4gcmV0dXJuX3R5cGVzOgotCQllcnIoJ0xpbmUnLCBsbm8sICc6IGJhZCByZXR1cm4gdHlwZSA6Jywgd29yZHNbMF0pCi0JZWxpZiBsZW4od29yZHMpIDwgMjoKLQkJZXJyKCdMaW5lJywgbG5vLCAnOiBubyBmdW5jbmFtZSA6JywgbGluZSkKLQllbHNlOgotCQlpZiBsZW4od29yZHMpICUgMiA8PiAwOgotCQkJZXJyKCdMaW5lJywgbG5vLCAnOiBvZGQgYXJndW1lbnQgbGlzdCA6Jywgd29yZHNbMjpdKQotCQllbHNlOgotCQkJZGF0YWJhc2UgPSBbXQotCQkJdHJ5OgotCQkJCWZvciBpIGluIHJhbmdlKDIsIGxlbih3b3JkcyksIDIpOgotCQkJCQl4ID0gY2hlY2thcmcod29yZHNbaV0sIHdvcmRzW2krMV0pCi0JCQkJCWRhdGFiYXNlLmFwcGVuZCh4KQotCQkJCXByaW50Ci0JCQkJcHJpbnQgJy8qJywKLQkJCQlmb3IgdyBpbiB3b3JkczogcHJpbnQgdywKLQkJCQlwcmludCAnKi8nCi0JCQkJZ2VuZXJhdGUod29yZHNbMF0sIHdvcmRzWzFdLCBkYXRhYmFzZSkKLQkJCWV4Y2VwdCBhcmdfZXJyb3IsIG1zZzoKLQkJCQllcnIoJ0xpbmUnLCBsbm8sICc6JywgbXNnKQorICAgIHRyeToKKyAgICAgICAgbGluZSA9IHJhd19pbnB1dCgpCisgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICBicmVhaworICAgICMKKyAgICBsbm8gPSBsbm8rMQorICAgIHdvcmRzID0gc3RyaW5nLnNwbGl0KGxpbmUpCisgICAgIworICAgIGlmIHBhcnQgPT0gMToKKyAgICAgICAgIworICAgICAgICAjIEluIHBhcnQgMSwgY29weSBldmVyeXRoaW5nIGxpdGVyYWxseQorICAgICAgICAjIGV4Y2VwdCBsb29rIGZvciBhIGxpbmUgb2YganVzdCAnJSUnCisgICAgICAgICMKKyAgICAgICAgaWYgd29yZHMgPT0gWyclJSddOgorICAgICAgICAgICAgcGFydCA9IHBhcnQgKyAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIExvb2sgZm9yIG5hbWVzIG9mIG1hbnVhbGx5IHdyaXR0ZW4KKyAgICAgICAgICAgICMgc3R1YnM6IGEgc2luZ2xlIHBlcmNlbnQgZm9sbG93ZWQgYnkgdGhlIG5hbWUKKyAgICAgICAgICAgICMgb2YgdGhlIGZ1bmN0aW9uIGluIFB5dGhvbi4KKyAgICAgICAgICAgICMgVGhlIHN0dWIgbmFtZSBpcyBkZXJpdmVkIGJ5IHByZWZpeGluZyAnZ2xfJy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIGlmIHdvcmRzIGFuZCB3b3Jkc1swXVswXSA9PSAnJSc6CisgICAgICAgICAgICAgICAgZnVuYyA9IHdvcmRzWzBdWzE6XQorICAgICAgICAgICAgICAgIGlmIChub3QgZnVuYykgYW5kIHdvcmRzWzE6XToKKyAgICAgICAgICAgICAgICAgICAgZnVuYyA9IHdvcmRzWzFdCisgICAgICAgICAgICAgICAgaWYgZnVuYzoKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLmFwcGVuZChmdW5jKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCBsaW5lCisgICAgICAgIGNvbnRpbnVlCisgICAgaWYgbm90IHdvcmRzOgorICAgICAgICBjb250aW51ZSAgICAgICAgICAgICAgICAjIHNraXAgZW1wdHkgbGluZQorICAgIGVsaWYgd29yZHNbMF0gPT0gJ2lmJzoKKyAgICAgICAgIyBpZiBYWFggcmVzdAorICAgICAgICAjIGlmICFYWFggcmVzdAorICAgICAgICBpZiB3b3Jkc1sxXVswXSA9PSAnISc6CisgICAgICAgICAgICBpZiB3b3Jkc1sxXVsxOl0gaW4gZGVmaW5lZF9hcmNoczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbGlmIHdvcmRzWzFdIG5vdCBpbiBkZWZpbmVkX2FyY2hzOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgd29yZHMgPSB3b3Jkc1syOl0KKyAgICBpZiB3b3Jkc1swXSA9PSAnI2luY2x1ZGUnOgorICAgICAgICBwcmludCBsaW5lCisgICAgZWxpZiB3b3Jkc1swXVs6MV0gPT0gJyMnOgorICAgICAgICBwYXNzICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBjb21tZW50CisgICAgZWxpZiB3b3Jkc1swXSBub3QgaW4gcmV0dXJuX3R5cGVzOgorICAgICAgICBlcnIoJ0xpbmUnLCBsbm8sICc6IGJhZCByZXR1cm4gdHlwZSA6Jywgd29yZHNbMF0pCisgICAgZWxpZiBsZW4od29yZHMpIDwgMjoKKyAgICAgICAgZXJyKCdMaW5lJywgbG5vLCAnOiBubyBmdW5jbmFtZSA6JywgbGluZSkKKyAgICBlbHNlOgorICAgICAgICBpZiBsZW4od29yZHMpICUgMiA8PiAwOgorICAgICAgICAgICAgZXJyKCdMaW5lJywgbG5vLCAnOiBvZGQgYXJndW1lbnQgbGlzdCA6Jywgd29yZHNbMjpdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YWJhc2UgPSBbXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDIsIGxlbih3b3JkcyksIDIpOgorICAgICAgICAgICAgICAgICAgICB4ID0gY2hlY2thcmcod29yZHNbaV0sIHdvcmRzW2krMV0pCisgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlLmFwcGVuZCh4KQorICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICAgICAgcHJpbnQgJy8qJywKKyAgICAgICAgICAgICAgICBmb3IgdyBpbiB3b3JkczogcHJpbnQgdywKKyAgICAgICAgICAgICAgICBwcmludCAnKi8nCisgICAgICAgICAgICAgICAgZ2VuZXJhdGUod29yZHNbMF0sIHdvcmRzWzFdLCBkYXRhYmFzZSkKKyAgICAgICAgICAgIGV4Y2VwdCBhcmdfZXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBlcnIoJ0xpbmUnLCBsbm8sICc6JywgbXNnKQogCiAKIHByaW50CiBwcmludCAnc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBnbF9tZXRob2RzW10gPSB7JwogZm9yIGZ1bmMgaW4gZnVuY3Rpb25zOgotCXByaW50ICdcdHsiJyArIGZ1bmMgKyAnIiwgZ2xfJyArIGZ1bmMgKyAnfSwnCisgICAgcHJpbnQgJ1x0eyInICsgZnVuYyArICciLCBnbF8nICsgZnVuYyArICd9LCcKIHByaW50ICdcdHtOVUxMLCBOVUxMfSAvKiBTZW50aW5lbCAqLycKIHByaW50ICd9OycKIHByaW50CmRpZmYgLS1naXQgYS9Ub29scy9iZ2VuL2JnZW4vYmdlbkJ1ZmZlci5weSBiL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuQnVmZmVyLnB5CmluZGV4IDRiODg4ZDcuLmNhN2UwMjYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuQnVmZmVyLnB5CisrKyBiL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuQnVmZmVyLnB5CkBAIC0yNyw3ICsyNyw3IEBACiAKIAogY2xhc3MgRml4ZWRJbnB1dE91dHB1dEJ1ZmZlclR5cGUoSW5wdXRPbmx5VHlwZSk6Ci0gICAgCisKICAgICAiIiJGaXhlZCBidWZmZXIgLS0gcGFzc2VkIGFzIChpbmJ1ZmZlciwgb3V0YnVmZmVyKS4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplLCBkYXRhdHlwZSA9ICdjaGFyJywgc2l6ZXR5cGUgPSAnaW50Jywgc2l6ZWZvcm1hdCA9IE5vbmUpOgpAQCAtNDEsMTQgKzQxLDE0IEBACiAgICAgZGVmIGRlY2xhcmUoc2VsZiwgbmFtZSk6CiAgICAgICAgIHNlbGYuZGVjbGFyZUJ1ZmZlcihuYW1lKQogICAgICAgICBzZWxmLmRlY2xhcmVTaXplKG5hbWUpCi0gICAgCisKICAgICBkZWYgZGVjbGFyZUJ1ZmZlcihzZWxmLCBuYW1lKToKICAgICAgICAgc2VsZi5kZWNsYXJlSW5wdXRCdWZmZXIobmFtZSkKICAgICAgICAgc2VsZi5kZWNsYXJlT3V0cHV0QnVmZmVyKG5hbWUpCi0gICAgCisKICAgICBkZWYgZGVjbGFyZUlucHV0QnVmZmVyKHNlbGYsIG5hbWUpOgogICAgICAgICBPdXRwdXQoIiVzIColc19faW5fXzsiLCBzZWxmLmRhdGF0eXBlLCBuYW1lKQotICAgIAorCiAgICAgZGVmIGRlY2xhcmVPdXRwdXRCdWZmZXIoc2VsZiwgbmFtZSk6CiAgICAgICAgIE91dHB1dCgiJXMgJXNfX291dF9fWyVzXTsiLCBzZWxmLmRhdGF0eXBlLCBuYW1lLCBzZWxmLnNpemUpCiAKQEAgLTYxLDcgKzYxLDcgQEAKIAogICAgIGRlZiBnZXRhcmdzQXJncyhzZWxmLCBuYW1lKToKICAgICAgICAgcmV0dXJuICImJXNfX2luX18sICYlc19faW5fbGVuX18iICUgKG5hbWUsIG5hbWUpCi0gICAgCisKICAgICBkZWYgZ2V0YXJnc0NoZWNrKHNlbGYsIG5hbWUpOgogICAgICAgICBPdXRwdXQoImlmICglc19faW5fbGVuX18gIT0gJXMpIiwgbmFtZSwgc2VsZi5zaXplKQogICAgICAgICBPdXRMYnJhY2UoKQpAQCAtNzEsMTkgKzcxLDE5IEBACiAgICAgICAgIHNlbGYubGFiZWxfbmVlZGVkID0gMQogICAgICAgICBPdXRSYnJhY2UoKQogICAgICAgICBzZWxmLnRyYW5zZmVyU2l6ZShuYW1lKQotICAgIAorCiAgICAgZGVmIHRyYW5zZmVyU2l6ZShzZWxmLCBuYW1lKToKICAgICAgICAgT3V0cHV0KCIlc19fbGVuX18gPSAlc19faW5fbGVuX187IiwgbmFtZSwgbmFtZSkKIAogICAgIGRlZiBwYXNzT3V0cHV0KHNlbGYsIG5hbWUpOgogICAgICAgICByZXR1cm4gIiVzX19pbl9fLCAlc19fb3V0X18iICUgKG5hbWUsIG5hbWUpCi0gICAgCisKICAgICBkZWYgbWt2YWx1ZUZvcm1hdChzZWxmKToKICAgICAgICAgcmV0dXJuICJzIyIKIAogICAgIGRlZiBta3ZhbHVlQXJncyhzZWxmLCBuYW1lKToKICAgICAgICAgcmV0dXJuICIlc19fb3V0X18sIChpbnQpJXMiICUgKG5hbWUsIHNlbGYuc2l6ZSkKLSAgICAKKwogICAgIGRlZiBjbGVhbnVwKHNlbGYsIG5hbWUpOgogICAgICAgICBpZiBzZWxmLmxhYmVsX25lZWRlZDoKICAgICAgICAgICAgIERlZGVudExldmVsKCkKQEAgLTkyLDkgKzkyLDkgQEAKIAogCiBjbGFzcyBGaXhlZENvbWJpbmVkSW5wdXRPdXRwdXRCdWZmZXJUeXBlKEZpeGVkSW5wdXRPdXRwdXRCdWZmZXJUeXBlKToKLSAgICAKKwogICAgICIiIkxpa2UgZml4ZWQgYnVmZmVyIC0tIGJ1dCBzYW1lIHBhcmFtZXRlciBpcyBpbnB1dCBhbmQgb3V0cHV0LiIiIgotICAgIAorCiAgICAgZGVmIHBhc3NPdXRwdXQoc2VsZiwgbmFtZSk6CiAgICAgICAgIHJldHVybiAiKCVzICopbWVtY3B5KCVzX19vdXRfXywgJXNfX2luX18sICVzKSIgJSBcCiAgICAgICAgICAgICAoc2VsZi5kYXRhdHlwZSwgbmFtZSwgICBuYW1lLCAgICAgc2VsZi5zaXplKQpAQCAtMTEyLDEwICsxMTIsMTAgQEAKICAgICAgICAgcGFzcwogCiBjbGFzcyBPcHRpb25hbElucHV0QnVmZmVyTWl4SW46Ci0gICAgCisKICAgICAiIiJBZGQgdG8gaW5wdXQgYnVmZmVycyBpZiB0aGUgYnVmZmVyIG1heSBiZSBvbWl0dGVkOiBwYXNzIE5vbmUgaW4gUHl0aG9uCiAgICAgYW5kIHRoZSBDIGNvZGUgd2lsbCBnZXQgYSBOVUxMIHBvaW50ZXIgYW5kIHplcm8gc2l6ZSIiIgotICAgIAorCiAgICAgZGVmIGdldGFyZ3NGb3JtYXQoc2VsZik6CiAgICAgICAgIHJldHVybiAieiMiCiAKQEAgLTE0Nyw2MyArMTQ3LDYzIEBACiBjbGFzcyBWYXJJbnB1dEJ1ZmZlclR5cGUoRml4ZWRJbnB1dEJ1ZmZlclR5cGUpOgogCiAgICAgIiIiVmFyaWFibGUgc2l6ZSBpbnB1dCBidWZmZXIgLS0gcGFzc2VkIGFzIChidWZmZXIsIHNpemUpLgotICAgIAorCiAgICAgSW5zdGFudGlhdGUgd2l0aG91dCBzaXplIHBhcmFtZXRlci4KICAgICAiIiIKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhdHlwZSA9ICdjaGFyJywgc2l6ZXR5cGUgPSAnaW50Jywgc2l6ZWZvcm1hdCA9IE5vbmUpOgogICAgICAgICBGaXhlZElucHV0QnVmZmVyVHlwZS5fX2luaXRfXyhzZWxmLCAiMCIsIGRhdGF0eXBlLCBzaXpldHlwZSwgc2l6ZWZvcm1hdCkKLSAgICAKKwogICAgIGRlZiBnZXRhcmdzQ2hlY2soc2VsZiwgbmFtZSk6CiAgICAgICAgIE91dHB1dCgiJXNfX2xlbl9fID0gJXNfX2luX2xlbl9fOyIsIG5hbWUsIG5hbWUpCi0gICAgCisKICAgICBkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgogICAgICAgICByZXR1cm4gIiVzX19pbl9fLCAlc19fbGVuX18iICUgKG5hbWUsIG5hbWUpCi0gICAgICAgIAorCiBjbGFzcyBSZXZlcnNlSW5wdXRCdWZmZXJNaXhpbjoKICAgICAiIiIgTWl4aW4gZm9yIGlucHV0IGJ1ZmZlcnMgdGhhdCBhcmUgcGFzc2VkIGFzIChzaXplLCBidWZmZXIpICIiIgotICAgIAorCiAgICAgZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKICAgICAgICAgcmV0dXJuICIlc19fbGVuX18sICVzX19pbl9fIiAlIChuYW1lLCBuYW1lKQotICAgICAgICAKKwogY2xhc3MgT3B0aW9uYWxWYXJJbnB1dEJ1ZmZlclR5cGUoT3B0aW9uYWxJbnB1dEJ1ZmZlck1peEluLCBWYXJJbnB1dEJ1ZmZlclR5cGUpOgogICAgIHBhc3MKLSAgICAKKwogIyAtLS0tLSBQQVJUIDI6IFN0cnVjdHVyZSBidWZmZXJzIC0tLS0tCiAKIAogY2xhc3MgU3RydWN0SW5wdXRPdXRwdXRCdWZmZXJUeXBlKEZpeGVkSW5wdXRPdXRwdXRCdWZmZXJUeXBlKToKLSAgICAKKwogICAgICIiIlN0cnVjdHVyZSBidWZmZXIgLS0gcGFzc2VkIGFzIGEgc3RydWN0dXJlIHBvaW50ZXIuCiAKICAgICBJbnN0YW50aWF0ZSB3aXRoIHRoZSBzdHJ1Y3QgdHlwZSBhcyBwYXJhbWV0ZXIuCiAgICAgIiIiCi0gICAgCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZSk6CiAgICAgICAgIEZpeGVkSW5wdXRPdXRwdXRCdWZmZXJUeXBlLl9faW5pdF9fKHNlbGYsICJzaXplb2YoJXMpIiAlIHR5cGUpCiAgICAgICAgIHNlbGYudHlwZU5hbWUgPSBzZWxmLnR5cGUgPSB0eXBlCi0gICAgCisKICAgICBkZWYgZGVjbGFyZUlucHV0QnVmZmVyKHNlbGYsIG5hbWUpOgogICAgICAgICBPdXRwdXQoIiVzIColc19faW5fXzsiLCBzZWxmLnR5cGUsIG5hbWUpCi0gICAgCisKICAgICBkZWYgZGVjbGFyZVNpemUoc2VsZiwgbmFtZSk6CiAgICAgICAgIE91dHB1dCgiaW50ICVzX19pbl9sZW5fXzsiLCBuYW1lKQotICAgIAorCiAgICAgZGVmIGRlY2xhcmVPdXRwdXRCdWZmZXIoc2VsZiwgbmFtZSk6CiAgICAgICAgIE91dHB1dCgiJXMgJXNfX291dF9fOyIsIHNlbGYudHlwZSwgbmFtZSkKLSAgICAKKwogICAgIGRlZiBnZXRhcmdzQXJncyhzZWxmLCBuYW1lKToKICAgICAgICAgcmV0dXJuICIoY2hhciAqKikmJXNfX2luX18sICYlc19faW5fbGVuX18iICUgKG5hbWUsIG5hbWUpCi0gICAgCisKICAgICBkZWYgdHJhbnNmZXJTaXplKHNlbGYsIG5hbWUpOgogICAgICAgICBwYXNzCi0gICAgCisKICAgICBkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgogICAgICAgICByZXR1cm4gIiVzX19pbl9fIiAlIG5hbWUKLSAgICAKKwogICAgIGRlZiBwYXNzT3V0cHV0KHNlbGYsIG5hbWUpOgogICAgICAgICByZXR1cm4gIiVzX19pbl9fLCAmJXNfX291dF9fIiAlIChuYW1lLCBuYW1lKQotICAgIAorCiAgICAgZGVmIG1rdmFsdWVBcmdzKHNlbGYsIG5hbWUpOgogICAgICAgICByZXR1cm4gIihjaGFyICopJiVzX19vdXRfXywgKGludCklcyIgJSAobmFtZSwgc2VsZi5zaXplKQogCkBAIC0yMTEsNyArMjExLDcgQEAKIGNsYXNzIFN0cnVjdENvbWJpbmVkSW5wdXRPdXRwdXRCdWZmZXJUeXBlKFN0cnVjdElucHV0T3V0cHV0QnVmZmVyVHlwZSk6CiAKICAgICAiIiJMaWtlIHN0cnVjdHVyZSBidWZmZXIgLS0gYnV0IHNhbWUgcGFyYW1ldGVyIGlzIGlucHV0IGFuZCBvdXRwdXQuIiIiCi0gICAgCisKICAgICBkZWYgcGFzc091dHB1dChzZWxmLCBuYW1lKToKICAgICAgICAgcmV0dXJuICIoJXMgKiltZW1jcHkoKGNoYXIgKiklc19fb3V0X18sIChjaGFyICopJXNfX2luX18sICVzKSIgJSBcCiAgICAgICAgICAgICAoc2VsZi50eXBlLCAgICAgICAgICBuYW1lLCAgICAgICAgICAgICAgbmFtZSwgICAgIHNlbGYuc2l6ZSkKQEAgLTI0Miw3ICsyNDIsNyBAQAogCiAgICAgSW5zdGFudGlhdGUgd2l0aCB0aGUgc3RydWN0IHR5cGUgYXMgcGFyYW1ldGVyLgogICAgICIiIgotICAgIAorCiAgICAgZGVmIGRlY2xhcmVTaXplKHNlbGYsIG5hbWUpOgogICAgICAgICBwYXNzCiAKQEAgLTI1Niw3ICsyNTYsNyBAQAogCiAgICAgSW5zdGFudGlhdGUgd2l0aCB0aGUgc3RydWN0IHR5cGUgYXMgcGFyYW1ldGVyLgogICAgICIiIgotICAgIAorCiAgICAgZGVmIGRlY2xhcmVTaXplKHNlbGYsIG5hbWUpOgogICAgICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuR2VuZXJhdG9yLnB5IGIvVG9vbHMvYmdlbi9iZ2VuL2JnZW5HZW5lcmF0b3IucHkKaW5kZXggZjNjZGZjZS4uZTFmMjQwYyAxMDA2NDQKLS0tIGEvVG9vbHMvYmdlbi9iZ2VuL2JnZW5HZW5lcmF0b3IucHkKKysrIGIvVG9vbHMvYmdlbi9iZ2VuL2JnZW5HZW5lcmF0b3IucHkKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgICAgZG9jc3RyaW5nID0gc2VsZi5kb2NzdHJpbmcoKQogICAgICAgICBpZiBzZWxmLmNvbmRpdGlvbjoKICAgICAgICAgICAgIE91dHB1dCgpCi0gICAgICAgICAgICBPdXRwdXQoc2VsZi5jb25kaXRpb24pICAgICAgCisgICAgICAgICAgICBPdXRwdXQoc2VsZi5jb25kaXRpb24pCiAgICAgICAgIE91dHB1dCgie1wiJXNcIiwgKFB5Q0Z1bmN0aW9uKSVzXyVzLCAxLCIsIG5hbWUsIHNlbGYucHJlZml4LCBzZWxmLm5hbWUpCiAgICAgICAgIE91dHB1dCgiIFB5RG9jX1NUUiglcyl9LCIsIHN0cmluZ2lmeShkb2NzdHJpbmcpKQogICAgICAgICBpZiBzZWxmLmNvbmRpdGlvbjoKQEAgLTkxLDcgKzkxLDcgQEAKIAogICAgIGRlZiBmdW5jdGlvbmJvZHkoc2VsZik6CiAgICAgICAgIE91dHB1dCgiJXMiLCBzZWxmLmJvZHkpCi0gICAgICAgIAorCiAgICAgZGVmIHNldHNlbGZ0eXBlKHNlbGYsIHNlbGZ0eXBlLCBpdHNlbGZ0eXBlKToKICAgICAgICAgc2VsZi5vYmplY3R0eXBlID0gc2VsZnR5cGUKICAgICAgICAgc2VsZi5pdHNlbGZ0eXBlID0gaXRzZWxmdHlwZQpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgICAgICBzZWxmLmFyZ3VtZW50TGlzdC5hcHBlbmQoc2VsZi5ydikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYucnYgPSBOb25lCi0gICAgCisKICAgICBkZWYgbWFrZXJldHVybnZhcihzZWxmKToKICAgICAgICAgcmV0dXJuIFZhcmlhYmxlKHNlbGYucmV0dXJudHlwZSwgIl9ydiIsIE91dE1vZGUpCiAKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lOiBuYW1lID0gIl9hcmclZCIgJSBpYXJnCiAgICAgICAgICAgICBhcmcgPSBWYXJpYWJsZSh0eXBlLCBuYW1lLCBtb2RlKQogICAgICAgICAgICAgc2VsZi5hcmd1bWVudExpc3QuYXBwZW5kKGFyZykKLSAgICAKKwogICAgIGRlZiBkb2NzdHJpbmcoc2VsZik6CiAgICAgICAgIGlucHV0ID0gW10KICAgICAgICAgb3V0cHV0ID0gW10KQEAgLTE0Niw3ICsxNDYsNyBAQAogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gIj8iCiAgICAgICAgICAgICAgICAgICAgIHByaW50ICJOYW1lbGVzcyB0eXBlIiwgYXJnLnR5cGUKLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICBzdHIgPSB0eXBlTmFtZSArICcgJyArIGFyZy5uYW1lCiAgICAgICAgICAgICBpZiBhcmcubW9kZSBpbiAoSW5Nb2RlLCBJbk91dE1vZGUpOgogICAgICAgICAgICAgICAgIGlucHV0LmFwcGVuZChzdHIpCkBAIC0xNjEsNyArMTYxLDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG91dHN0ciA9ICIoJXMpIiAlICIsICIuam9pbihvdXRwdXQpCiAgICAgICAgIHJldHVybiBpbnN0ciArICIgLT4gIiArIG91dHN0cgotICAgIAorCiAgICAgZGVmIGZ1bmN0aW9uYm9keShzZWxmKToKICAgICAgICAgc2VsZi5kZWNsYXJhdGlvbnMoKQogICAgICAgICBzZWxmLnByZWNoZWNrKCkKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICBpZiBhcmcubW9kZSBpbiAoSW5Nb2RlLCBJbk91dE1vZGUpOgogICAgICAgICAgICAgICAgIGFyZy5nZXRhcmdzQ2hlY2soKQotICAgIAorCiAgICAgZGVmIHByZWNoZWNrKHNlbGYpOgogICAgICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuSGVhcEJ1ZmZlci5weSBiL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuSGVhcEJ1ZmZlci5weQppbmRleCA5YmZjNWExLi42NGNmMmE0IDEwMDY0NAotLS0gYS9Ub29scy9iZ2VuL2JnZW4vYmdlbkhlYXBCdWZmZXIucHkKKysrIGIvVG9vbHMvYmdlbi9iZ2VuL2JnZW5IZWFwQnVmZmVyLnB5CkBAIC00Myw3ICs0Myw3IEBACiBjbGFzcyBWYXJIZWFwSW5wdXRPdXRwdXRCdWZmZXJUeXBlKEhlYXBJbnB1dE91dHB1dEJ1ZmZlclR5cGUpOgogCiAgICAgIiIic2FtZSBhcyBiYXNlIGNsYXNzLCBidXQgcGFzc2VkIGFzIChpbmJ1ZmZlciwgb3V0YnVmZmVyLCAmc2l6ZSkiIiIKLSAgICAKKwogICAgIGRlZiBwYXNzT3V0cHV0KHNlbGYsIG5hbWUpOgogICAgICAgICByZXR1cm4gIiVzX19pbl9fLCAlc19fb3V0X18sICYlc19fbGVuX18iICUgKG5hbWUsIG5hbWUsIG5hbWUpCiAKQEAgLTUxLDcgKzUxLDcgQEAKIGNsYXNzIEhlYXBDb21iaW5lZElucHV0T3V0cHV0QnVmZmVyVHlwZShIZWFwSW5wdXRPdXRwdXRCdWZmZXJUeXBlKToKIAogICAgICIiInNhbWUgYXMgYmFzZSBjbGFzcywgYnV0IHBhc3NlZCBhcyAoaW5vdXRidWZmZXIsIHNpemUpIiIiCi0gICAgCisKICAgICBkZWYgcGFzc091dHB1dChzZWxmLCBuYW1lKToKICAgICAgICAgcmV0dXJuICIoJXMgKiltZW1jcHkoJXNfX291dF9fLCAlc19faW5fXywgJXNfX2xlbl9fKSIgJSBcCiAgICAgICAgICAgICAoc2VsZi5kYXRhdHlwZSwgbmFtZSwgICBuYW1lLCAgICAgbmFtZSkKQEAgLTYwLDcgKzYwLDcgQEAKIGNsYXNzIFZhckhlYXBDb21iaW5lZElucHV0T3V0cHV0QnVmZmVyVHlwZShIZWFwSW5wdXRPdXRwdXRCdWZmZXJUeXBlKToKIAogICAgICIiInNhbWUgYXMgYmFzZSBjbGFzcywgYnV0IHBhc3NlZCBhcyAoaW5vdXRidWZmZXIsICZzaXplKSIiIgotICAgIAorCiAgICAgZGVmIHBhc3NPdXRwdXQoc2VsZiwgbmFtZSk6CiAgICAgICAgIHJldHVybiAiKCVzICopbWVtY3B5KCVzX19vdXRfXywgJXNfX2luX18sICYlc19fbGVuX18pIiAlIFwKICAgICAgICAgICAgIChzZWxmLmRhdGF0eXBlLCBuYW1lLCAgIG5hbWUsICAgICAgbmFtZSkKQEAgLTczLDE2ICs3MywxNiBAQAogICAgIEluc3RhbnRpYXRlIHdpdGhvdXQgcGFyYW1ldGVycy4KICAgICBDYWxsIGZyb20gUHl0aG9uIHdpdGggYnVmZmVyIHNpemUuCiAgICAgIiIiCi0gICAgCisKICAgICBkZWYgZGVjbGFyZUlucHV0QnVmZmVyKHNlbGYsIG5hbWUpOgogICAgICAgICBwYXNzCi0gICAgCisKICAgICBkZWYgZ2V0YXJnc0Zvcm1hdChzZWxmKToKICAgICAgICAgcmV0dXJuICJpIgotICAgIAorCiAgICAgZGVmIGdldGFyZ3NBcmdzKHNlbGYsIG5hbWUpOgogICAgICAgICByZXR1cm4gIiYlc19faW5fbGVuX18iICUgbmFtZQotICAgIAorCiAgICAgZGVmIHBhc3NPdXRwdXQoc2VsZiwgbmFtZSk6CiAgICAgICAgIHJldHVybiAiJXNfX291dF9fLCAlc19fbGVuX18iICUgKG5hbWUsIG5hbWUpCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuTW9kdWxlLnB5IGIvVG9vbHMvYmdlbi9iZ2VuL2JnZW5Nb2R1bGUucHkKaW5kZXggM2UyNmIxNi4uZDQxYWEwNSAxMDA2NDQKLS0tIGEvVG9vbHMvYmdlbi9iZ2VuL2JnZW5Nb2R1bGUucHkKKysrIGIvVG9vbHMvYmdlbi9iZ2VuL2JnZW5Nb2R1bGUucHkKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgc2VsZi5kZWNsYXJlTW9kdWxlVmFyaWFibGVzKCkKIAogICAgICAgICBHZW5lcmF0b3JHcm91cC5nZW5lcmF0ZShzZWxmKQotICAgICAgICAKKwogICAgICAgICBpZiBzZWxmLmZpbmFsc3R1ZmY6CiAgICAgICAgICAgICBPdXRwdXQoKQogICAgICAgICAgICAgT3V0cHV0KCIlcyIsIHNlbGYuZmluYWxzdHVmZikKZGlmZiAtLWdpdCBhL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuT2JqZWN0RGVmaW5pdGlvbi5weSBiL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuT2JqZWN0RGVmaW5pdGlvbi5weQppbmRleCA5YzIwNWUzLi43MmUyNjc4IDEwMDY0NAotLS0gYS9Ub29scy9iZ2VuL2JnZW4vYmdlbk9iamVjdERlZmluaXRpb24ucHkKKysrIGIvVG9vbHMvYmdlbi9iZ2VuL2JnZW5PYmplY3REZWZpbml0aW9uLnB5CkBAIC05LDE0ICs5LDE0IEBACiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKToKICAgICAgICAgIiIiT2JqZWN0RGVmaW5pdGlvbiBjb25zdHJ1Y3Rvci4gIE1heSBiZSBleHRlbmRlZCwgYnV0IGRvIG5vdCBvdmVycmlkZS4KLSAgICAgICAgCisKICAgICAgICAgLSBuYW1lOiB0aGUgb2JqZWN0J3Mgb2ZmaWNpYWwgbmFtZSwgZS5nLiAnU25kQ2hhbm5lbCcuCiAgICAgICAgIC0gcHJlZml4OiB0aGUgcHJlZml4IHVzZWQgZm9yIHRoZSBvYmplY3QncyBmdW5jdGlvbnMgYW5kIGRhdGEsIGUuZy4gJ1NuZENoJy4KICAgICAgICAgLSBpdHNlbGZ0eXBlOiB0aGUgQyB0eXBlIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0LCBlLmcuICdTbmRDaGFubmVsUHRyJy4KLSAgICAgICAgCisKICAgICAgICAgWFhYIEZvciBvZmZpY2lhbCBQeXRob24gZGF0YSB0eXBlcywgcnVsZXMgZm9yIHRoZSAnUHknIHByZWZpeCBhcmUgYSBwcm9ibGVtLgogICAgICAgICAiIiIKLSAgICAgICAgCisKICAgICAgICAgR2VuZXJhdG9yR3JvdXAuX19pbml0X18oc2VsZiwgcHJlZml4IG9yIG5hbWUpCiAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICAgc2VsZi5pdHNlbGZ0eXBlID0gaXRzZWxmdHlwZQpAQCAtMzUsNyArMzUsNyBAQAogICAgIGRlZiByZWZlcmVuY2Uoc2VsZik6CiAgICAgICAgICMgSW4gY2FzZSB3ZSBhcmUgcmVmZXJlbmNlZCBmcm9tIGEgbW9kdWxlCiAgICAgICAgIHBhc3MKLSAgICAgICAgCisKICAgICBkZWYgc2V0bW9kdWxlbmFtZShzZWxmLCBuYW1lKToKICAgICAgICAgc2VsZi5tb2R1bGVuYW1lID0gbmFtZQogCkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgIE91dHB1dCgifSAlczsiLCBzZWxmLm9iamVjdHR5cGUpCiAKICAgICAgICAgc2VsZi5vdXRwdXROZXcoKQotICAgICAgICAKKwogICAgICAgICBzZWxmLm91dHB1dENvbnZlcnQoKQogCiAgICAgICAgIHNlbGYub3V0cHV0RGVhbGxvYygpCkBAIC03MSwxOSArNzEsMTkgQEAKICAgICAgICAgc2VsZi5vdXRwdXRHZXRhdHRyKCkKIAogICAgICAgICBzZWxmLm91dHB1dFNldGF0dHIoKQotICAgICAgICAKKwogICAgICAgICBzZWxmLm91dHB1dENvbXBhcmUoKQotICAgICAgICAKKwogICAgICAgICBzZWxmLm91dHB1dFJlcHIoKQotICAgICAgICAKKwogICAgICAgICBzZWxmLm91dHB1dEhhc2goKQotICAgICAgICAKKwogICAgICAgICBzZWxmLm91dHB1dFBFUDI1M0hvb2tzKCkKLSAgICAgICAgCisKICAgICAgICAgc2VsZi5vdXRwdXRUeXBlT2JqZWN0KCkKIAogICAgICAgICBPdXRIZWFkZXIyKCJFbmQgb2JqZWN0IHR5cGUgIiArIHNlbGYubmFtZSkKLSAgICAgICAgCisKICAgICBkZWYgb3V0cHV0TWV0aG9kQ2hhaW4oc2VsZik6CiAgICAgICAgIE91dHB1dCgiJXNQeU1ldGhvZENoYWluICVzX2NoYWluID0geyAlc19tZXRob2RzLCAlcyB9OyIsCiAgICAgICAgICAgICAgICAgc2VsZi5zdGF0aWMsICAgIHNlbGYucHJlZml4LCBzZWxmLnByZWZpeCwgc2VsZi5iYXNlY2hhaW4pCkBAIC0xMDgsMTAgKzEwOCwxMCBAQAogCiAgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgogICAgICAgICBPdXRwdXQoIml0LT5vYl9pdHNlbGYgPSAlc2l0c2VsZjsiLCBzZWxmLmFyZ3JlZikKLSAgICAKKwogICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLSAgICAgICAgICAgICJPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhcHBseSBhZGRpdGlvbmFsIGNoZWNrcy9jb252ZXJzaW9ucyIKLSAgICAKKyAgICAgICAgIk92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFwcGx5IGFkZGl0aW9uYWwgY2hlY2tzL2NvbnZlcnNpb25zIgorCiAgICAgZGVmIG91dHB1dENvbnZlcnQoc2VsZik6CiAgICAgICAgIE91dHB1dCgiJXNpbnQgJXNfQ29udmVydChQeU9iamVjdCAqdiwgJXMgKnBfaXRzZWxmKSIsIHNlbGYuc3RhdGljLCBzZWxmLnByZWZpeCwKICAgICAgICAgICAgICAgICBzZWxmLml0c2VsZnR5cGUpCkBAIC0yMDYsNyArMjA2LDcgQEAKICAgICAgICAgT3V0cHV0KCIoaGFzaGZ1bmMpICVzX2hhc2gsIC8qdHBfaGFzaCovIiwgc2VsZi5wcmVmaXgpCiAgICAgICAgIERlZGVudExldmVsKCkKICAgICAgICAgT3V0cHV0KCJ9OyIpCi0gICAgICAgIAorCiAgICAgZGVmIG91dHB1dFR5cGVPYmplY3RJbml0aWFsaXplcihzZWxmKToKICAgICAgICAgT3V0cHV0KCIiIiVzLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7IiIiLCBzZWxmLnR5cGVuYW1lKQogICAgICAgICBpZiBzZWxmLmJhc2V0eXBlOgpAQCAtMjIwLDEwICsyMjAsMTAgQEAKIAogICAgIGRlZiBvdXRwdXRQRVAyNTNIb29rcyhzZWxmKToKICAgICAgICAgcGFzcwotICAgICAgICAKKwogY2xhc3MgUEVQMjUyTWl4aW46CiAgICAgZ2V0c2V0bGlzdCA9IFtdCi0gICAgCisKICAgICBkZWYgYXNzZXJ0aW9ucyhzZWxmKToKICAgICAgICAgIyBDaGVjayB0aGF0IHZhcmlvdXMgdGhpbmdzIGFyZW4ndCBvdmVycmlkZGVuLiBJZiB0aGV5IGFyZSBpdCBjb3VsZAogICAgICAgICAjIHNpZ25pZnkgYSBiZ2VuLWNsaWVudCB0aGF0IGhhcyBiZWVuIHBhcnRpYWxseSBjb252ZXJ0ZWQgdG8gUEVQMjUyLgpAQCAtMjMyLDIxICsyMzIsMjEgQEAKICAgICAgICAgYXNzZXJ0IHNlbGYub3V0cHV0R2V0YXR0ckJvZHkgPT0gTm9uZQogICAgICAgICBhc3NlcnQgc2VsZi5vdXRwdXRHZXRhdHRySG9vayA9PSBOb25lCiAgICAgICAgIGFzc2VydCBzZWxmLmJhc2VjaGFpbiA9PSAiTlVMTCIKLSAgICAgICAgCisKICAgICBkZWYgb3V0cHV0R2V0YXR0cihzZWxmKToKICAgICAgICAgcGFzcwotICAgICAgICAKKwogICAgIG91dHB1dEdldGF0dHJCb2R5ID0gTm9uZQogCiAgICAgb3V0cHV0R2V0YXR0ckhvb2sgPSBOb25lCiAKICAgICBkZWYgb3V0cHV0U2V0YXR0cihzZWxmKToKICAgICAgICAgcGFzcwotICAgIAorCiAgICAgZGVmIG91dHB1dE1ldGhvZENoYWluKHNlbGYpOgogICAgICAgICAjIFRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIG91dHB1dCB0aGUgZ2V0dGVycyBhbmQgc2V0dGVycwogICAgICAgICBzZWxmLm91dHB1dEdldFNldExpc3QoKQotICAgIAorCiAgICAgZGVmIG91dHB1dEhvb2soc2VsZiwgbmFtZSk6CiAgICAgICAgIG1ldGhvZG5hbWUgPSAib3V0cHV0SG9va18iICsgbmFtZQogICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIG1ldGhvZG5hbWUpOgpAQCAtMjU0LDcgKzI1NCw3IEBACiAgICAgICAgICAgICBmdW5jKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIE91dHB1dCgiMCwgLyolcyovIiwgbmFtZSkKLSAgICAKKwogICAgIGRlZiBvdXRwdXRUeXBlT2JqZWN0KHNlbGYpOgogICAgICAgICBzZiA9IHNlbGYuc3RhdGljIGFuZCAic3RhdGljICIKICAgICAgICAgT3V0cHV0KCkKQEAgLTI2OCw3ICsyNjgsNyBAQAogICAgICAgICAgICAgT3V0cHV0KCJcIiVzXCIsIC8qdHBfbmFtZSovIiwgc2VsZi5uYW1lKQogICAgICAgICBPdXRwdXQoInNpemVvZiglcyksIC8qdHBfYmFzaWNzaXplKi8iLCBzZWxmLm9iamVjdHR5cGUpCiAgICAgICAgIE91dHB1dCgiMCwgLyp0cF9pdGVtc2l6ZSovIikKLSAgICAgICAgCisKICAgICAgICAgT3V0cHV0KCIvKiBtZXRob2RzICovIikKICAgICAgICAgT3V0cHV0KCIoZGVzdHJ1Y3RvcikgJXNfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8iLCBzZWxmLnByZWZpeCkKICAgICAgICAgT3V0cHV0KCIwLCAvKnRwX3ByaW50Ki8iKQpAQCAtMjc2LDE3ICsyNzYsMTcgQEAKICAgICAgICAgT3V0cHV0KCIoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8iKQogICAgICAgICBPdXRwdXQoIihjbXBmdW5jKSAlc19jb21wYXJlLCAvKnRwX2NvbXBhcmUqLyIsIHNlbGYucHJlZml4KQogICAgICAgICBPdXRwdXQoIihyZXByZnVuYykgJXNfcmVwciwgLyp0cF9yZXByKi8iLCBzZWxmLnByZWZpeCkKLSAgICAgICAgCisKICAgICAgICAgT3V0cHV0KCIoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovIikKICAgICAgICAgT3V0cHV0KCIoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLyIpCiAgICAgICAgIE91dHB1dCgiKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovIikKLSAgICAgICAgCisKICAgICAgICAgT3V0cHV0KCIoaGFzaGZ1bmMpICVzX2hhc2gsIC8qdHBfaGFzaCovIiwgc2VsZi5wcmVmaXgpCiAgICAgICAgIHNlbGYub3V0cHV0SG9vaygidHBfY2FsbCIpCiAgICAgICAgIE91dHB1dCgiMCwgLyp0cF9zdHIqLyIpCiAgICAgICAgIE91dHB1dCgiUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLyIpCiAgICAgICAgIE91dHB1dCgiUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8iKQotICAgICAgICAKKwogICAgICAgICBzZWxmLm91dHB1dEhvb2soInRwX2FzX2J1ZmZlciIpCiAgICAgICAgIE91dHB1dCgiJXMsIC8qIHRwX2ZsYWdzICovIiwgc2VsZi50cF9mbGFncykKICAgICAgICAgc2VsZi5vdXRwdXRIb29rKCJ0cF9kb2MiKQpAQCAtMzEwLDcgKzMxMCw3IEBACiAgICAgICAgIHNlbGYub3V0cHV0SG9vaygidHBfZnJlZSIpCiAgICAgICAgIERlZGVudExldmVsKCkKICAgICAgICAgT3V0cHV0KCJ9OyIpCi0gICAgICAgIAorCiAgICAgZGVmIG91dHB1dEdldFNldExpc3Qoc2VsZik6CiAgICAgICAgIGlmIHNlbGYuZ2V0c2V0bGlzdDoKICAgICAgICAgICAgIGZvciBuYW1lLCBnZXQsIHNldCwgZG9jIGluIHNlbGYuZ2V0c2V0bGlzdDoKQEAgLTMyNCw3ICszMjQsNyBAQAogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIE91dHB1dCgiI2RlZmluZSAlc19zZXRfJXMgTlVMTCIsIHNlbGYucHJlZml4LCBuYW1lKQogICAgICAgICAgICAgICAgICAgICBPdXRwdXQoKQotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlHZXRTZXREZWYgJXNfZ2V0c2V0bGlzdFtdID0geyIsIHNlbGYucHJlZml4KQogICAgICAgICAgICAgSW5kZW50TGV2ZWwoKQogICAgICAgICAgICAgZm9yIG5hbWUsIGdldCwgc2V0LCBkb2MgaW4gc2VsZi5nZXRzZXRsaXN0OgpAQCAtMzMyLDcgKzMzMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGRvYyA9ICciJyArIGRvYyArICciJwogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIGRvYyA9ICJOVUxMIgotICAgICAgICAgICAgICAgIE91dHB1dCgie1wiJXNcIiwgKGdldHRlciklc19nZXRfJXMsIChzZXR0ZXIpJXNfc2V0XyVzLCAlc30sIiwgCisgICAgICAgICAgICAgICAgT3V0cHV0KCJ7XCIlc1wiLCAoZ2V0dGVyKSVzX2dldF8lcywgKHNldHRlciklc19zZXRfJXMsICVzfSwiLAogICAgICAgICAgICAgICAgICAgICBuYW1lLCBzZWxmLnByZWZpeCwgbmFtZSwgc2VsZi5wcmVmaXgsIG5hbWUsIGRvYykKICAgICAgICAgICAgIE91dHB1dCgie05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LCIpCiAgICAgICAgICAgICBEZWRlbnRMZXZlbCgpCkBAIC0zNDAsNyArMzQwLDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIE91dHB1dCgiI2RlZmluZSAlc19nZXRzZXRsaXN0IE5VTEwiLCBzZWxmLnByZWZpeCkKICAgICAgICAgT3V0cHV0KCkKLSAgICAgICAgICAgIAorCiAgICAgZGVmIG91dHB1dEdldHRlcihzZWxmLCBuYW1lLCBjb2RlKToKICAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiVzX2dldF8lcyglcyAqc2VsZiwgdm9pZCAqY2xvc3VyZSkiLAogICAgICAgICAgICAgc2VsZi5wcmVmaXgsIG5hbWUsIHNlbGYub2JqZWN0dHlwZSkKQEAgLTM0OCw3ICszNDgsNyBAQAogICAgICAgICBPdXRwdXQoY29kZSkKICAgICAgICAgT3V0UmJyYWNlKCkKICAgICAgICAgT3V0cHV0KCkKLSAgICAgICAgCisKICAgICBkZWYgb3V0cHV0U2V0dGVyKHNlbGYsIG5hbWUsIGNvZGUpOgogICAgICAgICBPdXRwdXQoInN0YXRpYyBpbnQgJXNfc2V0XyVzKCVzICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkiLAogICAgICAgICAgICAgc2VsZi5wcmVmaXgsIG5hbWUsIHNlbGYub2JqZWN0dHlwZSkKQEAgLTM1NywyNCArMzU3LDI0IEBACiAgICAgICAgIE91dHB1dCgicmV0dXJuIDA7IikKICAgICAgICAgT3V0UmJyYWNlKCkKICAgICAgICAgT3V0cHV0KCkKLSAgICAgICAgCisKIGNsYXNzIFBFUDI1M01peGluKFBFUDI1Mk1peGluKToKICAgICB0cF9mbGFncyA9ICJQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSIKLSAgICAKKwogICAgIGRlZiBvdXRwdXRIb29rX3RwX2luaXQoc2VsZik6CiAgICAgICAgIE91dHB1dCgiJXNfdHBfaW5pdCwgLyogdHBfaW5pdCAqLyIsIHNlbGYucHJlZml4KQotICAgICAgICAKKwogICAgIGRlZiBvdXRwdXRIb29rX3RwX2FsbG9jKHNlbGYpOgogICAgICAgICBPdXRwdXQoIiVzX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLyIsIHNlbGYucHJlZml4KQotICAgIAorCiAgICAgZGVmIG91dHB1dEhvb2tfdHBfbmV3KHNlbGYpOgogICAgICAgICBPdXRwdXQoIiVzX3RwX25ldywgLyogdHBfbmV3ICovIiwgc2VsZi5wcmVmaXgpCi0gICAgICAgIAorCiAgICAgZGVmIG91dHB1dEhvb2tfdHBfZnJlZShzZWxmKToKICAgICAgICAgT3V0cHV0KCIlc190cF9mcmVlLCAvKiB0cF9mcmVlICovIiwgc2VsZi5wcmVmaXgpCi0gICAgICAgIAorCiAgICAgb3V0cHV0X3RwX2luaXRCb2R5ID0gTm9uZQotICAgIAorCiAgICAgZGVmIG91dHB1dF90cF9pbml0KHNlbGYpOgogICAgICAgICBpZiBzZWxmLm91dHB1dF90cF9pbml0Qm9keToKICAgICAgICAgICAgIE91dHB1dCgic3RhdGljIGludCAlc190cF9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpIiwgc2VsZi5wcmVmaXgpCkBAIC0zODQsOSArMzg0LDkgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIE91dHB1dCgiI2RlZmluZSAlc190cF9pbml0IDAiLCBzZWxmLnByZWZpeCkKICAgICAgICAgT3V0cHV0KCkKLSAgICAgICAgCisKICAgICBvdXRwdXRfdHBfYWxsb2NCb2R5ID0gTm9uZQotICAgIAorCiAgICAgZGVmIG91dHB1dF90cF9hbGxvYyhzZWxmKToKICAgICAgICAgaWYgc2VsZi5vdXRwdXRfdHBfYWxsb2NCb2R5OgogICAgICAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiVzX3RwX2FsbG9jKFB5VHlwZU9iamVjdCAqdHlwZSwgaW50IG5pdGVtcykiLApAQCAtMzk3LDcgKzM5Nyw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBPdXRwdXQoIiNkZWZpbmUgJXNfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYyIsIHNlbGYucHJlZml4KQogICAgICAgICBPdXRwdXQoKQotICAgICAgICAKKwogICAgIGRlZiBvdXRwdXRfdHBfbmV3Qm9keShzZWxmKToKICAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqc2VsZjsiKTsKICAgICAgICAgT3V0cHV0KCIlcyBpdHNlbGY7Iiwgc2VsZi5pdHNlbGZ0eXBlKTsKQEAgLTQwOCw3ICs0MDgsNyBAQAogICAgICAgICBPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQogICAgICAgICBPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOyIsIHNlbGYub2JqZWN0dHlwZSkKICAgICAgICAgT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQotICAgIAorCiAgICAgZGVmIG91dHB1dF90cF9uZXcoc2VsZik6CiAgICAgICAgIGlmIHNlbGYub3V0cHV0X3RwX25ld0JvZHk6CiAgICAgICAgICAgICBPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqJXNfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKSIsIHNlbGYucHJlZml4KQpAQCAtNDE4LDkgKzQxOCw5IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBPdXRwdXQoIiNkZWZpbmUgJXNfdHBfbmV3IFB5VHlwZV9HZW5lcmljTmV3Iiwgc2VsZi5wcmVmaXgpCiAgICAgICAgIE91dHB1dCgpCi0gICAgCisKICAgICBvdXRwdXRfdHBfZnJlZUJvZHkgPSBOb25lCi0gICAgCisKICAgICBkZWYgb3V0cHV0X3RwX2ZyZWUoc2VsZik6CiAgICAgICAgIGlmIHNlbGYub3V0cHV0X3RwX2ZyZWVCb2R5OgogICAgICAgICAgICAgT3V0cHV0KCJzdGF0aWMgdm9pZCAlc190cF9mcmVlKFB5T2JqZWN0ICpzZWxmKSIsIHNlbGYucHJlZml4KQpAQCAtNDMwLDcgKzQzMCw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBPdXRwdXQoIiNkZWZpbmUgJXNfdHBfZnJlZSBQeU9iamVjdF9EZWwiLCBzZWxmLnByZWZpeCkKICAgICAgICAgT3V0cHV0KCkKLSAgICAgICAgCisKICAgICBkZWYgb3V0cHV0UEVQMjUzSG9va3Moc2VsZik6CiAgICAgICAgIHNlbGYub3V0cHV0X3RwX2luaXQoKQogICAgICAgICBzZWxmLm91dHB1dF90cF9hbGxvYygpCkBAIC00MzksNyArNDM5LDcgQEAKIAogY2xhc3MgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbihPYmplY3REZWZpbml0aW9uKToKICAgICAiIiJMaWtlIE9iamVjdERlZmluaXRpb24gYnV0IGV4cG9ydHMgc29tZSBwYXJ0cy4KLSAgICAKKwogICAgIFhYWCBTaG91bGQgYWxzbyBzb21laG93IGdlbmVyYXRlIGEgLmggZmlsZSBmb3IgdGhlbS4KICAgICAiIiIKIApAQCAtNDUzLDcgKzQ1Myw3IEBACiAgICAgYmUgcmV0dXJuZWQgYnkgbGlicmFyeSBjYWxscyBhbmQgaXQgaXMgZGlmZmljdWx0IChvciBpbXBvc3NpYmxlKSB0byBmaW5kCiAgICAgdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIG9iamVjdHMuIFdpdGggdGhpcyB5b3UgY2FuIGNyZWF0ZSBQeXRob24gb2JqZWN0CiAgICAgd3JhcHBlcnMgb24gdGhlIGZseSIiIgotICAgIAorCiAgICAgZGVmIG91dHB1dENvbXBhcmUoc2VsZik6CiAgICAgICAgIE91dHB1dCgpCiAgICAgICAgIE91dHB1dCgic3RhdGljIGludCAlc19jb21wYXJlKCVzICpzZWxmLCAlcyAqb3RoZXIpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSwKQEAgLTQ3NSwxMiArNDc1LDEwIEBACiAgICAgICAgIE91dHB1dCgiaWYoIHYgPiB3ICkgcmV0dXJuIDE7IikKICAgICAgICAgT3V0cHV0KCJyZXR1cm4gMDsiKQogICAgICAgICBPdXRSYnJhY2UoKQotICAgICAgICAKKwogICAgIGRlZiBvdXRwdXRIYXNoKHNlbGYpOgogICAgICAgICBPdXRwdXQoKQogICAgICAgICBPdXRwdXQoInN0YXRpYyBsb25nICVzX2hhc2goJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKICAgICAgICAgT3V0TGJyYWNlKCkKICAgICAgICAgT3V0cHV0KCJyZXR1cm4gKGxvbmcpc2VsZi0+b2JfaXRzZWxmOyIpCiAgICAgICAgIE91dFJicmFjZSgpCi0gICAgICAgIAotCmRpZmYgLS1naXQgYS9Ub29scy9iZ2VuL2JnZW4vYmdlbk91dHB1dC5weSBiL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuT3V0cHV0LnB5CmluZGV4IDMwNGE1MmQuLjUzZDRmNTUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuT3V0cHV0LnB5CisrKyBiL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuT3V0cHV0LnB5CkBAIC0zMCw3ICszMCw3IEBACiAKIGRlZiBTZXRPdXRwdXRGaWxlTmFtZShmaWxlbmFtZSA9IE5vbmUpOgogICAgICIiIkNhbGwgdGhpcyB3aXRoIGEgZmlsZW5hbWUgdG8gbWFrZSBpdCB0aGUgb3V0cHV0IGZpbGUuCi0gICAgCisKICAgICBDYWxsIGl0IHdpdGhvdXQgYXJndW1lbnRzIHRvIGNsb3NlIHRoZSBjdXJyZW50IGZpbGUgKGlmIG5lY2Vzc2FyeSkKICAgICBhbmQgcmVzZXQgaXQgdG8gc3lzLnN0ZG91dC4KICAgICAiIiIKQEAgLTk1LDcgKzk1LDcgQEAKIAogZGVmIE91dEluZGVudChmb3JtYXQgPSAiIiwgKmFyZ3MpOgogICAgICIiIkNvbWJpbmUgT3V0cHV0KCkgZm9sbG93ZWQgYnkgSW5kZW50TGV2ZWwoKS4KLSAgICAKKwogICAgIElmIG5vIHRleHQgaXMgZ2l2ZW4sIGFjdHMgbGlrZSBsb25lIEluZGVudExldmVsKCkuCiAgICAgIiIiCiAgICAgaWYgZm9ybWF0OiBWYU91dHB1dChmb3JtYXQsIGFyZ3MpCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogZGVmIE91dERlZGVudChmb3JtYXQgPSAiIiwgKmFyZ3MpOgogICAgICIiIkNvbWJpbmUgT3V0cHV0KCkgZm9sbG93ZWQgYnkgRGVkZW50TGV2ZWwoKS4KLSAgICAKKwogICAgIElmIG5vIHRleHQgaXMgZ2l2ZW4sIGFjdHMgbGlrZSBsb25lRGVkZW50TGV2ZWwoKS4KICAgICAiIiIKICAgICBpZiBmb3JtYXQ6IFZhT3V0cHV0KGZvcm1hdCwgYXJncykKQEAgLTExMSw3ICsxMTEsNyBAQAogCiBkZWYgT3V0TGJyYWNlKGZvcm1hdCA9ICIiLCAqYXJncyk6CiAgICAgIiIiTGlrZSBPdXRwdXQsIGJ1dCBhZGQgYSAneycgYW5kIGluY3JlYXNlIHRoZSBpbmRlbnRhdGlvbiBsZXZlbC4KLSAgICAKKwogICAgIElmIG5vIHRleHQgaXMgZ2l2ZW4gYSBsb25lICd7JyBpcyBvdXRwdXQuCiAgICAgIiIiCiAgICAgaWYgZm9ybWF0OgpAQCAtMTQzLDEzICsxNDMsMTMgQEAKIAogZGVmIE91dCh0ZXh0KToKICAgICAiIiJPdXRwdXQgbXVsdGlsaW5lIHRleHQgdGhhdCdzIGludGVybmFsbHkgaW5kZW50ZWQuCi0gICAgCisKICAgICBQYXNzIHRoaXMgYSBtdWx0aWxpbmUgY2hhcmFjdGVyIHN0cmluZy4gIFRoZSB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUKICAgICBmaXJzdCBub25ibGFuayBsaW5lIG9mIHRoZSBzdHJpbmcgd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gYWxsIGxpbmVzLgogICAgIFRoZSBsaW5lcyBhcmUgdGhlbiBvdXRwdXQgdXNpbmcgT3V0cHV0KCksIGJ1dCB3aXRob3V0IGludGVycHJldGF0aW9uCiAgICAgb2YgZm9ybWF0dGluZyAoaWYgeW91IG5lZWQgZm9ybWF0dGluZyB5b3UgY2FuIGRvIGl0IGJlZm9yZSB0aGUgY2FsbCkuCiAgICAgUmVjb21tZW5kZWQgdXNlOgotICAgIAorCiAgICAgICAgIE91dCgnJycKICAgICAgICAgICAgIGludCBtYWluKGFyZ2MsIGFyZ3YpCiAgICAgICAgICAgICAgICAgaW50IGFyZ2M7CkBAIC0xNTksMTQgKzE1OSwxNCBAQAogICAgICAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICcnJykKLSAgICAKKwogICAgIENhdmVhdDogdGhlIGluZGVudGF0aW9uIG11c3QgYmUgY29uc2lzdGVudCAtLSBpZiB5b3UgdXNlIHRocmVlIHRhYnMKICAgICBpbiB0aGUgZmlyc3QgbGluZSwgKHVwIHRvKSB0aHJlZSB0YWJzIGFyZSByZW1vdmVkIGZyb20gZm9sbG93aW5nIGxpbmVzLAogICAgIGJ1dCBhIGxpbmUgYmVnaW5uaW5nIHdpdGggMjQgc3BhY2VzIGlzIG5vdCB0cmltbWVkIGF0IGFsbC4gIERvbid0IHVzZQogICAgIHRoaXMgYXMgYSBmZWF0dXJlLgogICAgICIiIgogICAgICMgKERvbid0IHlvdSBsb3ZlIHVzaW5nIHRyaXBsZSBxdW90ZXMgKmluc2lkZSogdHJpcGxlIHF1b3Rlcz8gOi0pCi0gICAgCisKICAgICBsaW5lcyA9IHRleHQuc3BsaXQoJ1xuJykKICAgICBpbmRlbnQgPSAiIgogICAgIGZvciBsaW5lIGluIGxpbmVzOgpAQCAtMTkzLDcgKzE5Myw3IEBACiAgICAgT3V0KCIiIgogICAgICAgICAjaW5jbHVkZSA8UHl0aG9uLmg+CiAgICAgICAgICNpbmNsdWRlIDxzdGRpby5oPgotICAgIAorCiAgICAgICAgIG1haW4oYXJnYywgYXJndikKICAgICAgICAgICAgIGludCBhcmdjOwogICAgICAgICAgICAgY2hhciAqKmFyZ3Y7CmRpZmYgLS1naXQgYS9Ub29scy9iZ2VuL2JnZW4vYmdlblN0cmluZ0J1ZmZlci5weSBiL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuU3RyaW5nQnVmZmVyLnB5CmluZGV4IDM5YzhjZjkuLjY4M2JjMGYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuU3RyaW5nQnVmZmVyLnB5CisrKyBiL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuU3RyaW5nQnVmZmVyLnB5CkBAIC0yMiwxMyArMjIsMTMgQEAKICAgICBwb2ludGVyIGlzIHJldHVybmVkLiAgVGhlc2UgYXJlIGFjdHVhbGx5IGVhc2llciAobm8gYWxsb2NhdGlvbikgYnV0IGZhcgogICAgIGxlc3MgY29tbW9uLiAgSSdsbCB3cml0ZSB0aGUgY2xhc3NlcyB3aGVuIHRoZXJlIGlzIGRlbWFuZC4pCiAgICAgIiIiCi0gICAgCisKICAgICBkZWYgZGVjbGFyZVNpemUoc2VsZiwgbmFtZSk6CiAgICAgICAgIHBhc3MKLSAgICAKKwogICAgIGRlZiBnZXRhcmdzRm9ybWF0KHNlbGYpOgogICAgICAgICByZXR1cm4gInMiCi0gICAgCisKICAgICBkZWYgZ2V0YXJnc0FyZ3Moc2VsZiwgbmFtZSk6CiAgICAgICAgIHJldHVybiAiJiVzX19pbl9fIiAlIG5hbWUKIApkaWZmIC0tZ2l0IGEvVG9vbHMvYmdlbi9iZ2VuL2JnZW5UeXBlLnB5IGIvVG9vbHMvYmdlbi9iZ2VuL2JnZW5UeXBlLnB5CmluZGV4IGFhODdhZWUuLjRmMzAyNmEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuVHlwZS5weQorKysgYi9Ub29scy9iZ2VuL2JnZW4vYmdlblR5cGUucHkKQEAgLTIwNCw4ICsyMDQsOCBAQAogICAgICAgICAgICAgc2VsZi5jb252ZXJ0ID0gYXJnICsgJ19Db252ZXJ0JwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBUaHJlZSBhcmd1bWVudHMgKG5hbWUsIG5ldywgY29udmVydCkKLSAgICAgICAgICAgIHNlbGYubmV3ID0gYXJnIAotICAgICAgICAgICAgc2VsZi5jb252ZXJ0ID0gZXh0cmEgCisgICAgICAgICAgICBzZWxmLm5ldyA9IGFyZworICAgICAgICAgICAgc2VsZi5jb252ZXJ0ID0gZXh0cmEKIAogICAgIGRlZiBnZXRhcmdzRm9ybWF0KHNlbGYpOgogICAgICAgICByZXR1cm4gIk8mIgpAQCAtMjM2LDcgKzIzNiw3IEBACiAKICAgICBkZWYgbWt2YWx1ZUFyZ3Moc2VsZiwgbmFtZSk6CiAgICAgICAgIHJldHVybiAiJXMsICVzIiAlIChzZWxmLm5ldywgbmFtZSkKLSAgICAgICAgCisKIGNsYXNzIE9wYXF1ZUJ5VmFsdWVTdHJ1Y3RUeXBlKE9wYXF1ZUJ5VmFsdWVUeXBlKToKICAgICAiIiJTaW1pbGFyIHRvIE9wYXF1ZUJ5VmFsdWVUeXBlLCBidXQgd2UgYWxzbyBwYXNzIHRoaXMgdG8gbWt2YWx1ZSBieQogICAgIGFkZHJlc3MsIGluIHN0ZWFkIG9mIGJ5IHZhbHVlLgpkaWZmIC0tZ2l0IGEvVG9vbHMvYmdlbi9iZ2VuL21hY3N1cHBvcnQucHkgYi9Ub29scy9iZ2VuL2JnZW4vbWFjc3VwcG9ydC5weQppbmRleCBlZWY2ZGI4Li43Y2QyYjgxIDEwMDY0NAotLS0gYS9Ub29scy9iZ2VuL2JnZW4vbWFjc3VwcG9ydC5weQorKysgYi9Ub29scy9iZ2VuL2JnZW4vbWFjc3VwcG9ydC5weQpAQCAtMTI5LDEwICsxMjksMTAgQEAKIAogICAgIGRlZiBnZXRhcmdzRm9ybWF0KHNlbGYpOgogICAgICAgICByZXR1cm4gInUjIgotICAgICAgICAKKwogY2xhc3MgVmFyVW5pY29kZVJldmVyc2VJbnB1dEJ1ZmZlclR5cGUoUmV2ZXJzZUlucHV0QnVmZmVyTWl4aW4sIFZhclVuaWNvZGVJbnB1dEJ1ZmZlclR5cGUpOgogICAgIHBhc3MKLSAgICAKKwogVW5pY29kZUluQnVmZmVyID0gVmFyVW5pY29kZUlucHV0QnVmZmVyVHlwZSgnVW5pQ2hhcicsICdVbmlDaGFyQ291bnQnLCAnbCcpCiBVbmljb2RlUmV2ZXJzZUluQnVmZmVyID0gVmFyVW5pY29kZVJldmVyc2VJbnB1dEJ1ZmZlclR5cGUoJ1VuaUNoYXInLCAnVW5pQ2hhckNvdW50JywgJ2wnKQogVW5pQ2hhcl9wdHIgPSBJbnB1dE9ubHlUeXBlKCJVbmlDaGFyUHRyIiwgInUiKQpAQCAtMTgwLDcgKzE4MCw3IEBACiAKIGNsYXNzIFdlYWtMaW5rTWl4SW46CiAgICAgIk1peC1pbiB0byB0ZXN0IHRoZSBmdW5jdGlvbiBhY3R1YWxseSBleGlzdHMgKCE9IE5VTEwpIGJlZm9yZSBjYWxsaW5nIgotICAgIAorCiAgICAgZGVmIHByZWNoZWNrKHNlbGYpOgogICAgICAgICBPdXRwdXQoJyNpZm5kZWYgJXMnLCBzZWxmLm5hbWUpCiAgICAgICAgIE91dHB1dCgnUHlNYWNfUFJFQ0hFQ0soJXMpOycsIHNlbGYubmFtZSkKZGlmZiAtLWdpdCBhL1Rvb2xzL2JnZW4vYmdlbi9zY2FudG9vbHMucHkgYi9Ub29scy9iZ2VuL2JnZW4vc2NhbnRvb2xzLnB5CmluZGV4IDRhZmQ3YzguLmRmN2RkZmIgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2JnZW4vYmdlbi9zY2FudG9vbHMucHkKKysrIGIvVG9vbHMvYmdlbi9iZ2VuL3NjYW50b29scy5weQpAQCAtNTEsMTUgKzUxLDE1IEBACiAgICAgICAgICAgICBzZWxmLnNldG91dHB1dChvdXRwdXQsIGRlZnNvdXRwdXQpCiAgICAgICAgIGlmIGlucHV0OgogICAgICAgICAgICAgc2VsZi5zZXRpbnB1dChpbnB1dCkKLSAgICAKKwogICAgIGRlZiBpbml0dXNlZHR5cGVzKHNlbGYpOgogICAgICAgICBzZWxmLnVzZWR0eXBlcyA9IHt9Ci0gICAgCisKICAgICBkZWYgdHlwZXVzZWQoc2VsZiwgdHlwZSwgbW9kZSk6CiAgICAgICAgIGlmIG5vdCBzZWxmLnVzZWR0eXBlcy5oYXNfa2V5KHR5cGUpOgogICAgICAgICAgICAgc2VsZi51c2VkdHlwZXNbdHlwZV0gPSB7fQogICAgICAgICBzZWxmLnVzZWR0eXBlc1t0eXBlXVttb2RlXSA9IE5vbmUKLSAgICAKKwogICAgIGRlZiByZXBvcnR1c2VkdHlwZXMoc2VsZik6CiAgICAgICAgIHR5cGVzID0gc2VsZi51c2VkdHlwZXMua2V5cygpCiAgICAgICAgIHR5cGVzLnNvcnQoKQpAQCAtMTAwLDEyICsxMDAsMTIgQEAKIAogICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgogICAgICAgICBwYXNzCi0gICAgICAgIAorCiAgICAgZGVmIGluaXRibGFja2xpc3RzKHNlbGYpOgogICAgICAgICBzZWxmLmJsYWNrbGlzdG5hbWVzID0gc2VsZi5tYWtlYmxhY2tsaXN0bmFtZXMoKQogICAgICAgICBzZWxmLmJsYWNrbGlzdHR5cGVzID0gWyJ1bmtub3duIiwgIi0iXSArIHNlbGYubWFrZWJsYWNrbGlzdHR5cGVzKCkKICAgICAgICAgc2VsZi5ncmV5ZGljdG5hbWVzID0gc2VsZi5ncmV5bGlzdDJkaWN0KHNlbGYubWFrZWdyZXlsaXN0KCkpCi0gICAgICAgIAorCiAgICAgZGVmIGdyZXlsaXN0MmRpY3Qoc2VsZiwgbGlzdCk6CiAgICAgICAgIHJ2ID0ge30KICAgICAgICAgZm9yIGRlZmluZSwgbmFtZWxpc3QgaW4gbGlzdDoKQEAgLTExOCw3ICsxMTgsNyBAQAogCiAgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKICAgICAgICAgcmV0dXJuIFtdCi0gICAgICAgIAorCiAgICAgZGVmIG1ha2VncmV5bGlzdChzZWxmKToKICAgICAgICAgcmV0dXJuIFtdCiAKQEAgLTEyOCw3ICsxMjgsNyBAQAogCiAgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CiAgICAgICAgICIiIlBhcnNlIHRoZSByZXBhaXIgZmlsZSBpbnRvIHJlcGFpciBpbnN0cnVjdGlvbnMuCi0gICAgICAgIAorCiAgICAgICAgIFRoZSBmaWxlIGZvcm1hdCBpcyBzaW1wbGU6CiAgICAgICAgIDEpIHVzZSBcIHRvIHNwbGl0IGEgbG9uZyBsb2dpY2FsIGxpbmUgaW4gbXVsdGlwbGUgcGh5c2ljYWwgbGluZXMKICAgICAgICAgMikgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgIyBvbiBhIGxpbmUgaXMgaWdub3JlZCAoYXMgY29tbWVudCkKQEAgLTIxNiwxMCArMjE2LDEwIEBACiAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzLmFwcGVuZChyZXBsYWNlbWVudCkKICAgICAgICAgICAgIGxpc3QuYXBwZW5kKChmcGF0LCBwYXR0ZXJucywgcmVwbGFjZW1lbnRzKSkKICAgICAgICAgcmV0dXJuIGxpc3QKLSAgICAgICAgCisKICAgICBkZWYgbWFrZWluaGVyZW50cG9pbnRlcnR5cGVzKHNlbGYpOgogICAgICAgICByZXR1cm4gW10KLSAgICAKKwogICAgIGRlZiBvcGVucmVwYWlyZmlsZShzZWxmLCBmaWxlbmFtZSA9ICJSRVBBSVIiKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmV0dXJuIG9wZW4oZmlsZW5hbWUsICJyVSIpCkBAIC0zMzcsNyArMzM3LDcgQEAKICAgICAgICAgICAgIHNjYW4gPSBbc2Nhbl0KICAgICAgICAgc2VsZi5hbGxzY2FuaW5wdXRzID0gc2NhbgogICAgICAgICBzZWxmLl9uZXh0aW5wdXQoKQotICAgICAgICAKKwogICAgIGRlZiBfbmV4dGlucHV0KHNlbGYpOgogICAgICAgICBpZiBub3Qgc2VsZi5hbGxzY2FuaW5wdXRzOgogICAgICAgICAgICAgcmV0dXJuIDAKQEAgLTUyNiw3ICs1MjYsNyBAQAogICAgICAgICB0eXBlID0gdHlwZS5zdHJpcCgpCiAgICAgICAgIHR5cGUgPSByZS5zdWIoIlsgXHRdKyIsICJfIiwgdHlwZSkKICAgICAgICAgcmV0dXJuIHNlbGYubW9kaWZ5YXJnKHR5cGUsIG5hbWUsIG1vZGUpCi0gICAgCisKICAgICBkZWYgbW9kaWZ5YXJnKHNlbGYsIHR5cGUsIG5hbWUsIG1vZGUpOgogICAgICAgICBpZiB0eXBlWzo2XSA9PSAiY29uc3RfIjoKICAgICAgICAgICAgIHR5cGUgPSB0eXBlWzY6XQpAQCAtNTY3LDcgKzU2Nyw3IEBACiAgICAgICAgICAgICBlbHNlOiAjIE5vIHBhdHRlcm5zIG1hdGNoCiAgICAgICAgICAgICAgICAgaSA9IGkrMQogICAgICAgICByZXR1cm4gYXJnbGlzdAotICAgIAorCiAgICAgZGVmIG1hdGNoYXJnKHNlbGYsIHBhdGFyZywgYXJnKToKICAgICAgICAgcmV0dXJuIGxlbihmaWx0ZXIoTm9uZSwgbWFwKGZubWF0Y2guZm5tYXRjaGNhc2UsIGFyZywgcGF0YXJnKSkpID09IDMKIApAQCAtNjY2LDQgKzY2NiwzIEBACiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdCgpCi0KZGlmZiAtLWdpdCBhL1Rvb2xzL2NvbXBpbGVyL2FzdGdlbi5weSBiL1Rvb2xzL2NvbXBpbGVyL2FzdGdlbi5weQppbmRleCA5MDIwMWQzLi4wOGQ1MDFiIDEwMDY0NAotLS0gYS9Ub29scy9jb21waWxlci9hc3RnZW4ucHkKKysrIGIvVG9vbHMvY29tcGlsZXIvYXN0Z2VuLnB5CkBAIC04OCw3ICs4OCw3IEBACiAgICAgICAgICAgICBzZWxmLmFyZ3MgPSBzZWxmLmFyZ3MucmVwbGFjZSgnKicsICcnKQogICAgICAgICAgICAgc2VsZi5hcmdzID0gc2VsZi5hcmdzLnJlcGxhY2UoJyEnLCAnJykKICAgICAgICAgICAgIHNlbGYuYXJncyA9IHNlbGYuYXJncy5yZXBsYWNlKCcmJywgJycpCi0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBkCiAKICAgICBkZWYgZ2VuX3NvdXJjZShzZWxmKToKQEAgLTE1OCw3ICsxNTgsNyBAQAogICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gIiAgICAgICAgbm9kZXMuJXMoJXNzZWxmLiVzJXMpIgogICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuYXJnbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYXJncHJvcHNbbmFtZV0gPT0gUF9OT05FOgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKCIgICAgICAgIGlmIHNlbGYuJXMgaXMgbm90IE5vbmU6IiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICgiICAgICAgICBpZiBzZWxmLiVzIGlzIG5vdCBOb25lOiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbm9kZXMuYXBwZW5kKHNlbGYuJXMpIikKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ID4+IGJ1ZiwgdG1wICUgKG5hbWUsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5hcmdwcm9wc1tuYW1lXSA9PSBQX05FU1RFRDoKZGlmZiAtLWdpdCBhL1Rvb2xzL2NvbXBpbGVyL2NvbXBpbGUucHkgYi9Ub29scy9jb21waWxlci9jb21waWxlLnB5CmluZGV4IGMxNDgzYzUuLjlkNTA0MjUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2NvbXBpbGVyL2NvbXBpbGUucHkKKysrIGIvVG9vbHMvY29tcGlsZXIvY29tcGlsZS5weQpAQCAtMzksNyArMzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSArICIucHJvZiIpCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgY29tcGlsZUZpbGUoZmlsZW5hbWUsIERJU1BMQVkpCi0gICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IsIGVycjoKICAgICAgICAgICAgICAgICBwcmludCBlcnIKICAgICAgICAgICAgICAgICBpZiBlcnIubGluZW5vIGlzIG5vdCBOb25lOgpkaWZmIC0tZ2l0IGEvVG9vbHMvY29tcGlsZXIvZGVtby5weSBiL1Rvb2xzL2NvbXBpbGVyL2RlbW8ucHkKaW5kZXggZTlhZGE1YS4uNjFjNTRlZSAxMDA3NTUKLS0tIGEvVG9vbHMvY29tcGlsZXIvZGVtby5weQorKysgYi9Ub29scy9jb21waWxlci9kZW1vLnB5CkBAIC0xNCw3ICsxNCw3IEBACiAgICAgRWFjaCB2aXNpdCBtZXRob2QgdGFrZXMgdHdvIGFyZ3VtZW50cywgdGhlIG5vZGUgYW5kIGl0cyBjdXJyZW50CiAgICAgc2NvcGUuICBUaGUgc2NvcGUgaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgY2xhc3Mgb3IgTm9uZS4KICAgICAiIiIKLSAgICAKKwogICAgIGRlZiB2aXNpdENsYXNzKHNlbGYsIG5vZGUsIHNjb3BlPU5vbmUpOgogICAgICAgICBzZWxmLnZpc2l0KG5vZGUuY29kZSwgbm9kZS5uYW1lKQogCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgICAgIGlmIHNjb3BlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgcHJpbnQgIiVzLiVzIiAlIChzY29wZSwgbm9kZS5uYW1lKQogICAgICAgICBzZWxmLnZpc2l0KG5vZGUuY29kZSwgTm9uZSkKLSAgICAgICAgICAgIAorCiBkZWYgbWFpbihmaWxlcyk6CiAgICAgbWYgPSBNZXRob2RGaW5kZXIoKQogICAgIGZvciBmaWxlIGluIGZpbGVzOgpAQCAtMzQsNSArMzQsNSBAQAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIGltcG9ydCBzeXMKLSAgICAKKwogICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvVG9vbHMvZmFxd2l6L2ZhcWNvbmYucHkgYi9Ub29scy9mYXF3aXovZmFxY29uZi5weQppbmRleCBlZjAxYWEwLi4wMDU3YTkzIDEwMDY0NAotLS0gYS9Ub29scy9mYXF3aXovZmFxY29uZi5weQorKysgYi9Ub29scy9mYXF3aXovZmFxY29uZi5weQpAQCAtMzAsMTEgKzMwLDExIEBACiBDT09LSUVfTElGRVRJTUUgPSAyOCoyNCozNjAwICAgICAgICAgICAgIyBDb29raWUgZXhwaXJhdGlvbiBpbiBzZWNvbmRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoMjgqMjQqMzYwMCA9IDI4IGRheXMgPSA0IHdlZWtzKQogUFJPQ0VTU19QUkVGT1JNQVQgPSAxICAgICAgICAgICAgICAgICAgICMgdG9nZ2xlIHdoZXRoZXIgcHJlZm9ybWF0dGVkIHRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdpbGwgcmVwbGFjZSB1cmxzIGFuZCBlbWFpbHMgd2l0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdpbGwgcmVwbGFjZSB1cmxzIGFuZCBlbWFpbHMgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSFRNTCBsaW5rcwogCiAjIE1hcmtlcnMgYXBwZW5kZWQgdG8gdGl0bGUgdG8gaW5kaWNhdGUgcmVjZW50bHkgY2hhbmdlCi0jIChtYXkgY29udGFpbiBIVE1MLCBlLmcuIDxJTUc+KTsgYW5kIGNvcnJlc3BvbmRpbmcgCisjIChtYXkgY29udGFpbiBIVE1MLCBlLmcuIDxJTUc+KTsgYW5kIGNvcnJlc3BvbmRpbmcKIAogTUFSS19WRVJZX1JFQ0VOVCA9ICIgKioiICAgICAgICAgICAgICAgICMgQ2hhbmdlZCB2ZXJ5IHJlY2VudGx5CiBNQVJLX1JFQ0VOVCA9ICIgKiIgICAgICAgICAgICAgICAgICAgICAgIyBDaGFuZ2VkIHJlY2VudGx5CmRpZmYgLS1naXQgYS9Ub29scy9mYXF3aXovZmFxd2l6LnB5IGIvVG9vbHMvZmFxd2l6L2ZhcXdpei5weQppbmRleCBhNDRkYTEyLi4wMGNjNjVjIDEwMDY0NAotLS0gYS9Ub29scy9mYXF3aXovZmFxd2l6LnB5CisrKyBiL1Rvb2xzL2ZhcXdpei9mYXF3aXoucHkKQEAgLTU4Myw3ICs1ODMsNyBAQAogICAgIGRlZiBkb19yb3VsZXR0ZShzZWxmKToKICAgICAgICAgaW1wb3J0IHJhbmRvbQogICAgICAgICBmaWxlcyA9IHNlbGYuZGlyLmxpc3QoKQotICAgICAgICBpZiBub3QgZmlsZXM6IAorICAgICAgICBpZiBub3QgZmlsZXM6CiAgICAgICAgICAgICBzZWxmLmVycm9yKCJObyBlbnRyaWVzLiIpCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgZmlsZSA9IHJhbmRvbS5jaG9pY2UoZmlsZXMpCkBAIC03MzIsNyArNzMyLDcgQEAKICAgICAgICAgICAgIGVtaXQoVkVSU0lPTkNPTkZMSUNULCBlbnRyeSwgc2VsZi51aSkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBjb21taXRfb2sgPSAoKG5vdCBQQVNTV09SRAotICAgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYudWkucGFzc3dvcmQgPT0gUEFTU1dPUkQpIAorICAgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYudWkucGFzc3dvcmQgPT0gUEFTU1dPUkQpCiAgICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi51aS5hdXRob3IKICAgICAgICAgICAgICAgICAgICAgIGFuZCAnQCcgaW4gc2VsZi51aS5lbWFpbAogICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYudWkubG9nKQpAQCAtODIwLDcgKzgyMCw3IEBACiAgICAgICAgIGxvZygib3V0cHV0OiAiICsgb3V0cHV0KQogICAgICAgICBsb2coImRvbmU6ICIgKyBzdHIoc3RzKSkKICAgICAgICAgbG9nKCJUZW1wRmlsZTpcbiIgKyB0Zi5yZWFkKCkgKyAiZW5kIikKLSAgICAgICAgCisKICAgICAgICAgaWYgbm90IHN0czoKICAgICAgICAgICAgIHNlbGYucHJvbG9ndWUoVF9DT01NSVRURUQpCiAgICAgICAgICAgICBlbWl0KENPTU1JVFRFRCkKZGlmZiAtLWdpdCBhL1Rvb2xzL2ZyYW1lci9leGFtcGxlLnB5IGIvVG9vbHMvZnJhbWVyL2V4YW1wbGUucHkKaW5kZXggYjc3ZjQ3NS4uOTZmNjI3OCAxMDA2NDQKLS0tIGEvVG9vbHMvZnJhbWVyL2V4YW1wbGUucHkKKysrIGIvVG9vbHMvZnJhbWVyL2V4YW1wbGUucHkKQEAgLTExLDcgKzExLDcgQEAKICAgICBnZW5lcmFsaXR5IG9mIFN0cmluZ0lPLCBidXQgaXQgcHJvdmlkZXMgZW5vdWdoIGZvciBtb3N0CiAgICAgYXBwbGljYXRpb25zIGFuZCBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQogICAgIHBpY2tsZSBtb2R1bGUuCi0gICAgCisKICAgICBVc2FnZToKIAogICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwpAQCAtMjAsNyArMjAsNyBAQAogICAgIGFuX291dHB1dF9zdHJlYW0ud3JpdGUoc29tZV9zdHVmZikKICAgICAuLi4KICAgICB2YWx1ZSA9IGFuX291dHB1dF9zdHJlYW0uZ2V0dmFsdWUoKQotICAgIAorCiAgICAgYW5faW5wdXRfc3RyZWFtID0gU3RyaW5nSU8oYV9zdHJpbmcpCiAgICAgc3BhbSA9IGFuX2lucHV0X3N0cmVhbS5yZWFkbGluZSgpCiAgICAgc3BhbSA9IGFuX2lucHV0X3N0cmVhbS5yZWFkKDUpCkBAIC0zNiw3ICszNiw3IEBACiAKICAgICBjbGFzcyBJbnB1dFR5cGUoVHlwZSk6CiAgICAgICAgICJTaW1wbGUgdHlwZSBmb3IgdHJlYXRpbmcgc3RyaW5ncyBhcyBpbnB1dCBmaWxlIHN0cmVhbXMiCi0gICAgICAgIAorCiAgICAgICAgIGFiYnJldiA9ICJpbnB1dCIKIAogICAgICAgICBzdHJ1Y3QgPSAiIiJcCkBAIC0xMjEsNyArMTIxLDYgQEAKIAogICAgICAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaW5lcyk6CiAgICAgICAgICAgICAiIiJXcml0ZSBlYWNoIHN0cmluZyBpbiBsaW5lcy4iIiIKLSAgICAgICAgCisKIAogY1N0cmluZ0lPLmdlbigpCi0KZGlmZiAtLWdpdCBhL1Rvb2xzL2ZyYW1lci9mcmFtZXIvX19pbml0X18ucHkgYi9Ub29scy9mcmFtZXIvZnJhbWVyL19faW5pdF9fLnB5CmluZGV4IGFiNzNhMzAuLmQ4ZjkwNTggMTAwNjQ0Ci0tLSBhL1Rvb2xzL2ZyYW1lci9mcmFtZXIvX19pbml0X18ucHkKKysrIGIvVG9vbHMvZnJhbWVyL2ZyYW1lci9fX2luaXRfXy5weQpAQCAtNCw1ICs0LDMgQEAKIHVzaW5nIG1hbnkgb2YgdGhlIG5ldyBmZWF0dXJlcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAyLjIuICBJdCBhbHNvCiB0YWtlcyBhIG1vcmUgZGVjbGFyYXRpdmUgYXBwcm9hY2ggdG8gZ2VuZXJhdGluZyBjb2RlLgogIiIiCi0KLQpkaWZmIC0tZ2l0IGEvVG9vbHMvZnJhbWVyL2ZyYW1lci9iYXNlcy5weSBiL1Rvb2xzL2ZyYW1lci9mcmFtZXIvYmFzZXMucHkKaW5kZXggNjEwNTJhYi4uZmIzY2IwMyAxMDA2NDQKLS0tIGEvVG9vbHMvZnJhbWVyL2ZyYW1lci9iYXNlcy5weQorKysgYi9Ub29scy9mcmFtZXIvZnJhbWVyL2Jhc2VzLnB5CkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fX3R5cGVzW25hbWVdID0gb2JqCiAgICAgICAgICAgICAgICAgaWYgb2JqLmhhc19tZW1iZXJzKCk6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19tZW1iZXJzID0gVHJ1ZQotICAgICAgICAgICAgICAgICAgICAKKwogICAgIGRlZiBpbml0dmFycyhzZWxmKToKICAgICAgICAgdiA9IHNlbGYuX192YXJzID0ge30KICAgICAgICAgZmlsZW5hbWUgPSBnZXRhdHRyKHNlbGYsICJfX2ZpbGVfXyIsIE5vbmUpCkBAIC04Myw3ICs4Myw3IEBACiAgICAgICAgIGlmIHNlbGYuX19tZW1iZXJzOgogICAgICAgICAgICAgcCh0ZW1wbGF0ZS5tZW1iZXJfaW5jbHVkZSkKICAgICAgICAgcHJpbnQgPj4gZgotICAgICAgICAKKwogICAgICAgICBpZiBzZWxmLl9fZG9jX186CiAgICAgICAgICAgICBwKHRlbXBsYXRlLm1vZHVsZV9kb2MpCiAKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgcCh0ZW1wbGF0ZS5tb2R1bGVfaW5pdF9zdGFydCkKICAgICAgICAgZm9yIG5hbWUsIHR5cGUgaW4gc29ydGl0ZW1zKHNlbGYuX190eXBlcyk6CiAgICAgICAgICAgICB0eXBlLmR1bXBfaW5pdChmKQotICAgICAgICAgICAgCisKICAgICAgICAgcCgifSIpCiAKIGNsYXNzIE1vZHVsZToKQEAgLTEyMSw3ICsxMjEsNyBAQAogCiAgICAgICAgIGZvciBuYW1lLCBmdW5jIGluIHNvcnRpdGVtcyhzZWxmLl9fbWV0aG9kcyk6CiAgICAgICAgICAgICBmdW5jLmR1bXAoZikKLSAgICAgICAgICAgIAorCiAgICAgICAgIHNlbGYuZHVtcF9tZXRob2RkZWYoZiwgc2VsZi5fX21ldGhvZHMsIHNlbGYuX192YXJzKQogICAgICAgICBzZWxmLmR1bXBfbWVtYmVyZGVmKGYpCiAgICAgICAgIHNlbGYuZHVtcF9zbG90cyhmKQpAQCAtMTk5LDcgKzE5OSw3IEBACiAgICAgICAgICAgICBwcmludCA+PiBmLCB0ZW1wbCAlIHZhcnMKIAogICAgICAgICBpZiBzZWxmLnN0cnVjdDoKLSAgICAgICAgICAgcCh0ZW1wbGF0ZS5kZWFsbG9jX2Z1bmMsIHsibmFtZSIgOiBzZWxmLl9fc2xvdHNbVFBfREVBTExPQ119KQorICAgICAgICAgICAgcCh0ZW1wbGF0ZS5kZWFsbG9jX2Z1bmMsIHsibmFtZSIgOiBzZWxmLl9fc2xvdHNbVFBfREVBTExPQ119KQogCiAgICAgICAgIHAodGVtcGxhdGUudHlwZV9zdHJ1Y3Rfc3RhcnQpCiAgICAgICAgIGZvciBzIGluIFNsb3RzWzotNV06ICMgWFhYCkBAIC0yMTgsNCArMjE4LDMgQEAKIAogY2xhc3MgVHlwZToKICAgICBfX21ldGFjbGFzc19fID0gVHlwZU1ldGFjbGFzcwotCmRpZmYgLS1naXQgYS9Ub29scy9mcmFtZXIvZnJhbWVyL2Z1bmN0aW9uLnB5IGIvVG9vbHMvZnJhbWVyL2ZyYW1lci9mdW5jdGlvbi5weQppbmRleCA1OTVjYzhkLi4zMDZmN2U5IDEwMDY0NAotLS0gYS9Ub29scy9mcmFtZXIvZnJhbWVyL2Z1bmN0aW9uLnB5CisrKyBiL1Rvb2xzL2ZyYW1lci9mcmFtZXIvZnVuY3Rpb24ucHkKQEAgLTU1LDcgKzU1LDcgQEAKIAogICAgIGRlZiBkdW1wX2RlY2xzKHNlbGYsIGYpOgogICAgICAgICBwYXNzCi0gICAgICAgIAorCiBjbGFzcyBOb0FyZ3MoX0FyZ3VtZW50TGlzdCk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgYXJncyk6CkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICAgIHJldHVybiAiUHlPYmplY3QgKnNlbGYiCiAKIGNsYXNzIE9uZUFyZyhfQXJndW1lbnRMaXN0KToKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmdzKToKICAgICAgICAgYXNzZXJ0IGxlbihhcmdzKSA9PSAxCiAgICAgICAgIHN1cGVyKE9uZUFyZywgc2VsZikuX19pbml0X18oYXJncykKQEAgLTEzOSw3ICsxMzksNyBAQAogCiAgICAgICAgIGlmIHNlbGYuX19kb2NfXzoKICAgICAgICAgICAgIHAodGVtcGxhdGUuZG9jc3RyaW5nKQotICAgICAgICAgICAgCisKICAgICAgICAgZCA9IHsibmFtZSIgOiBzZWxmLnZhcnNbIkNOYW1lIl0sCiAgICAgICAgICAgICAgImFyZ3MiIDogc2VsZi5hcmdzLmNfYXJncygpLAogICAgICAgICAgICAgIH0KQEAgLTE0OSwxMyArMTQ5LDEzIEBACiAKICAgICAgICAgaWYgc2VsZi5hcmdzLm1sX21ldGggPT0gTUVUSF9WQVJBUkdTOgogICAgICAgICAgICAgcCh0ZW1wbGF0ZS52YXJhcmdzKQotICAgICAgICAKKwogICAgICAgICBwKHRlbXBsYXRlLmZ1bmNkZWZfZW5kKQogCiAgICAgZGVmIGFuYWx5emUoc2VsZik6CiAgICAgICAgIHNlbGYuX19kb2NfXyA9IHNlbGYuX2Z1bmMuX19kb2NfXwogICAgICAgICBzZWxmLmFyZ3MgPSBBcmd1bWVudExpc3Qoc2VsZi5fZnVuYywgc2VsZi5tZXRob2QpCi0gICAgICAgIAorCiAgICAgZGVmIGluaXR2YXJzKHNlbGYpOgogICAgICAgICB2ID0gc2VsZi52YXJzID0ge30KICAgICAgICAgdlsiUHl0aG9uTmFtZSJdID0gc2VsZi5fZnVuYy5fX25hbWVfXwpkaWZmIC0tZ2l0IGEvVG9vbHMvZnJhbWVyL2ZyYW1lci9zdHJ1Y3QucHkgYi9Ub29scy9mcmFtZXIvZnJhbWVyL3N0cnVjdC5weQppbmRleCAzOTQ4NzQwLi4xMmVhOGQ3IDEwMDY0NAotLS0gYS9Ub29scy9mcmFtZXIvZnJhbWVyL3N0cnVjdC5weQorKysgYi9Ub29scy9mcmFtZXIvZnJhbWVyL3N0cnVjdC5weQpAQCAtMzUsNyArMzUsNyBAQAogICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgifSIpOgogICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgCisKICAgICAgICAgYXNzZXJ0IGxpbmUuZW5kc3dpdGgoIjsiKQogICAgICAgICBsaW5lID0gbGluZVs6LTFdCiAgICAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCmRpZmYgLS1naXQgYS9Ub29scy9mcmFtZXIvZnJhbWVyL3N0cnVjdHBhcnNlLnB5IGIvVG9vbHMvZnJhbWVyL2ZyYW1lci9zdHJ1Y3RwYXJzZS5weQppbmRleCA0MTkyMjhhLi5mMjRjMGRhIDEwMDY0NAotLS0gYS9Ub29scy9mcmFtZXIvZnJhbWVyL3N0cnVjdHBhcnNlLnB5CisrKyBiL1Rvb2xzL2ZyYW1lci9mcmFtZXIvc3RydWN0cGFyc2UucHkKQEAgLTI5LDcgKzI5LDcgQEAKICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIn0iKToKICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIAorCiAgICAgICAgIGFzc2VydCBsaW5lLmVuZHN3aXRoKCI7IikKICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQogICAgICAgICB3b3JkcyA9IGxpbmUuc3BsaXQoKQpkaWZmIC0tZ2l0IGEvVG9vbHMvZnJhbWVyL2ZyYW1lci90ZW1wbGF0ZS5weSBiL1Rvb2xzL2ZyYW1lci9mcmFtZXIvdGVtcGxhdGUucHkKaW5kZXggOGQxNjIwNC4uNDFmOTUzNyAxMDA2NDQKLS0tIGEvVG9vbHMvZnJhbWVyL2ZyYW1lci90ZW1wbGF0ZS5weQorKysgYi9Ub29scy9mcmFtZXIvZnJhbWVyL3RlbXBsYXRlLnB5CkBAIC0yMCwxMSArMjAsMTEgQEAKIAogbWV0aG9kZGVmX2RlZiA9ICIiIlwKICAgICAgICAgeyIlKFB5dGhvbk5hbWUpcyIsIChQeUNGdW5jdGlvbiklKENOYW1lKXMsICUoTWV0aFR5cGUpc30sIiIiCi0gICAgICAgIAorCiBtZXRob2RkZWZfZGVmX2RvYyA9ICIiIlwKICAgICAgICAgeyIlKFB5dGhvbk5hbWUpcyIsIChQeUNGdW5jdGlvbiklKENOYW1lKXMsICUoTWV0aFR5cGUpcywKICAgICAgICAgICUoRG9jc3RyaW5nVmFyKXN9LCIiIgotICAgICAgICAKKwogbWV0aG9kZGVmX2VuZCA9ICIiIlwKICAgICAgICAge05VTEwsIE5VTEx9CiB9OwpAQCAtOTYsNyArOTYsNyBAQAogdHlwZV9zdHJ1Y3Rfc3RhcnQgPSAiIiJcCiBzdGF0aWMgUHlUeXBlT2JqZWN0ICUoQ1R5cGVOYW1lKXMgPSB7CiAgICAgICAgIFB5T2JqZWN0X0hFQURfSU5JVCgwKSIiIgotICAgICAgICAKKwogdHlwZV9zdHJ1Y3RfZW5kID0gIiIiXAogfTsKICIiIgpkaWZmIC0tZ2l0IGEvVG9vbHMvZnJlZXplL2JrZmlsZS5weSBiL1Rvb2xzL2ZyZWV6ZS9ia2ZpbGUucHkKaW5kZXggZDI5NzE2YS4uNTRhZjJmYSAxMDA2NDQKLS0tIGEvVG9vbHMvZnJlZXplL2JrZmlsZS5weQorKysgYi9Ub29scy9mcmVlemUvYmtmaWxlLnB5CkBAIC0xLDQ3ICsxLDQ3IEBACiBfb3JpZ19vcGVuID0gb3BlbgogCiBjbGFzcyBfQmtGaWxlOgotCWRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlLCBidWZzaXplKToKLQkJaW1wb3J0IG9zCi0JCXNlbGYuX19maWxlbmFtZSA9IGZpbGUKLQkJc2VsZi5fX2JhY2t1cCA9IGZpbGUgKyAnficKLQkJdHJ5OgotCQkJb3MudW5saW5rKHNlbGYuX19iYWNrdXApCi0JCWV4Y2VwdCBvcy5lcnJvcjoKLQkJCXBhc3MKLQkJdHJ5OgotCQkJb3MucmVuYW1lKGZpbGUsIHNlbGYuX19iYWNrdXApCi0JCWV4Y2VwdCBvcy5lcnJvcjoKLQkJCXNlbGYuX19iYWNrdXAgPSBOb25lCi0JCXNlbGYuX19maWxlID0gX29yaWdfb3BlbihmaWxlLCBtb2RlLCBidWZzaXplKQotCQlzZWxmLmNsb3NlZCA9IHNlbGYuX19maWxlLmNsb3NlZAotCQlzZWxmLmZpbGVubyA9IHNlbGYuX19maWxlLmZpbGVubwotCQlzZWxmLmZsdXNoID0gc2VsZi5fX2ZpbGUuZmx1c2gKLQkJc2VsZi5pc2F0dHkgPSBzZWxmLl9fZmlsZS5pc2F0dHkKLQkJc2VsZi5tb2RlID0gc2VsZi5fX2ZpbGUubW9kZQotCQlzZWxmLm5hbWUgPSBzZWxmLl9fZmlsZS5uYW1lCi0JCXNlbGYucmVhZCA9IHNlbGYuX19maWxlLnJlYWQKLQkJc2VsZi5yZWFkaW50byA9IHNlbGYuX19maWxlLnJlYWRpbnRvCi0JCXNlbGYucmVhZGxpbmUgPSBzZWxmLl9fZmlsZS5yZWFkbGluZQotCQlzZWxmLnJlYWRsaW5lcyA9IHNlbGYuX19maWxlLnJlYWRsaW5lcwotCQlzZWxmLnNlZWsgPSBzZWxmLl9fZmlsZS5zZWVrCi0JCXNlbGYuc29mdHNwYWNlID0gc2VsZi5fX2ZpbGUuc29mdHNwYWNlCi0JCXNlbGYudGVsbCA9IHNlbGYuX19maWxlLnRlbGwKLQkJc2VsZi50cnVuY2F0ZSA9IHNlbGYuX19maWxlLnRydW5jYXRlCi0JCXNlbGYud3JpdGUgPSBzZWxmLl9fZmlsZS53cml0ZQotCQlzZWxmLndyaXRlbGluZXMgPSBzZWxmLl9fZmlsZS53cml0ZWxpbmVzCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIG1vZGUsIGJ1ZnNpemUpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgc2VsZi5fX2ZpbGVuYW1lID0gZmlsZQorICAgICAgICBzZWxmLl9fYmFja3VwID0gZmlsZSArICd+JworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5fX2JhY2t1cCkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW5hbWUoZmlsZSwgc2VsZi5fX2JhY2t1cCkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgc2VsZi5fX2JhY2t1cCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2ZpbGUgPSBfb3JpZ19vcGVuKGZpbGUsIG1vZGUsIGJ1ZnNpemUpCisgICAgICAgIHNlbGYuY2xvc2VkID0gc2VsZi5fX2ZpbGUuY2xvc2VkCisgICAgICAgIHNlbGYuZmlsZW5vID0gc2VsZi5fX2ZpbGUuZmlsZW5vCisgICAgICAgIHNlbGYuZmx1c2ggPSBzZWxmLl9fZmlsZS5mbHVzaAorICAgICAgICBzZWxmLmlzYXR0eSA9IHNlbGYuX19maWxlLmlzYXR0eQorICAgICAgICBzZWxmLm1vZGUgPSBzZWxmLl9fZmlsZS5tb2RlCisgICAgICAgIHNlbGYubmFtZSA9IHNlbGYuX19maWxlLm5hbWUKKyAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5fX2ZpbGUucmVhZAorICAgICAgICBzZWxmLnJlYWRpbnRvID0gc2VsZi5fX2ZpbGUucmVhZGludG8KKyAgICAgICAgc2VsZi5yZWFkbGluZSA9IHNlbGYuX19maWxlLnJlYWRsaW5lCisgICAgICAgIHNlbGYucmVhZGxpbmVzID0gc2VsZi5fX2ZpbGUucmVhZGxpbmVzCisgICAgICAgIHNlbGYuc2VlayA9IHNlbGYuX19maWxlLnNlZWsKKyAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSBzZWxmLl9fZmlsZS5zb2Z0c3BhY2UKKyAgICAgICAgc2VsZi50ZWxsID0gc2VsZi5fX2ZpbGUudGVsbAorICAgICAgICBzZWxmLnRydW5jYXRlID0gc2VsZi5fX2ZpbGUudHJ1bmNhdGUKKyAgICAgICAgc2VsZi53cml0ZSA9IHNlbGYuX19maWxlLndyaXRlCisgICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IHNlbGYuX19maWxlLndyaXRlbGluZXMKIAotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5fX2ZpbGUuY2xvc2UoKQotCQlpZiBzZWxmLl9fYmFja3VwIGlzIE5vbmU6Ci0JCQlyZXR1cm4KLQkJaW1wb3J0IGZpbGVjbXAKLQkJaWYgZmlsZWNtcC5jbXAoc2VsZi5fX2JhY2t1cCwgc2VsZi5fX2ZpbGVuYW1lLCBzaGFsbG93ID0gMCk6Ci0JCQlpbXBvcnQgb3MKLQkJCW9zLnVubGluayhzZWxmLl9fZmlsZW5hbWUpCi0JCQlvcy5yZW5hbWUoc2VsZi5fX2JhY2t1cCwgc2VsZi5fX2ZpbGVuYW1lKQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fX2ZpbGUuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLl9fYmFja3VwIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW1wb3J0IGZpbGVjbXAKKyAgICAgICAgaWYgZmlsZWNtcC5jbXAoc2VsZi5fX2JhY2t1cCwgc2VsZi5fX2ZpbGVuYW1lLCBzaGFsbG93ID0gMCk6CisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIG9zLnVubGluayhzZWxmLl9fZmlsZW5hbWUpCisgICAgICAgICAgICBvcy5yZW5hbWUoc2VsZi5fX2JhY2t1cCwgc2VsZi5fX2ZpbGVuYW1lKQogCiBkZWYgb3BlbihmaWxlLCBtb2RlID0gJ3InLCBidWZzaXplID0gLTEpOgotCWlmICd3JyBub3QgaW4gbW9kZToKLQkJcmV0dXJuIF9vcmlnX29wZW4oZmlsZSwgbW9kZSwgYnVmc2l6ZSkKLQlyZXR1cm4gX0JrRmlsZShmaWxlLCBtb2RlLCBidWZzaXplKQorICAgIGlmICd3JyBub3QgaW4gbW9kZToKKyAgICAgICAgcmV0dXJuIF9vcmlnX29wZW4oZmlsZSwgbW9kZSwgYnVmc2l6ZSkKKyAgICByZXR1cm4gX0JrRmlsZShmaWxlLCBtb2RlLCBidWZzaXplKQpkaWZmIC0tZ2l0IGEvVG9vbHMvZnJlZXplL2NoZWNrZXh0ZW5zaW9ucy5weSBiL1Rvb2xzL2ZyZWV6ZS9jaGVja2V4dGVuc2lvbnMucHkKaW5kZXggNTg0ZjhhNi4uMzM0NTIxZiAxMDA2NDQKLS0tIGEvVG9vbHMvZnJlZXplL2NoZWNrZXh0ZW5zaW9ucy5weQorKysgYi9Ub29scy9mcmVlemUvY2hlY2tleHRlbnNpb25zLnB5CkBAIC02LDg1ICs2LDg1IEBACiBpbXBvcnQgcGFyc2VzZXR1cAogCiBkZWYgY2hlY2tleHRlbnNpb25zKHVua25vd24sIGV4dGVuc2lvbnMpOgotCWZpbGVzID0gW10KLQltb2R1bGVzID0gW10KLQllZGljdCA9IHt9Ci0JZm9yIGUgaW4gZXh0ZW5zaW9uczoKLQkJc2V0dXAgPSBvcy5wYXRoLmpvaW4oZSwgJ1NldHVwJykKLQkJbGliYSA9IG9zLnBhdGguam9pbihlLCAnbGliLmEnKQotCQlpZiBub3Qgb3MucGF0aC5pc2ZpbGUobGliYSk6Ci0JCQlsaWJhID0gTm9uZQotCQllZGljdFtlXSA9IHBhcnNlc2V0dXAuZ2V0c2V0dXBpbmZvKHNldHVwKSwgbGliYQotCWZvciBtb2QgaW4gdW5rbm93bjoKLQkJZm9yIGUgaW4gZXh0ZW5zaW9uczoKLQkJCShtb2RzLCB2YXJzKSwgbGliYSA9IGVkaWN0W2VdCi0JCQlpZiBub3QgbW9kcy5oYXNfa2V5KG1vZCk6Ci0JCQkJY29udGludWUKLQkJCW1vZHVsZXMuYXBwZW5kKG1vZCkKLQkJCWlmIGxpYmE6Ci0JCQkJIyBJZiB3ZSBmaW5kIGEgbGliLmEsIHVzZSBpdCwgaWdub3JlIHRoZQotCQkJCSMgLm8gZmlsZXMsIGFuZCB1c2UgKmFsbCogbGlicmFyaWVzIGZvcgotCQkJCSMgKmFsbCogbW9kdWxlcyBpbiB0aGUgU2V0dXAgZmlsZQotCQkJCWlmIGxpYmEgaW4gZmlsZXM6Ci0JCQkJCWJyZWFrCi0JCQkJZmlsZXMuYXBwZW5kKGxpYmEpCi0JCQkJZm9yIG0gaW4gbW9kcy5rZXlzKCk6Ci0JCQkJCWZpbGVzID0gZmlsZXMgKyBzZWxlY3QoZSwgbW9kcywgdmFycywKLQkJCQkJCQkgICAgICAgbSwgMSkKLQkJCQlicmVhawotCQkJZmlsZXMgPSBmaWxlcyArIHNlbGVjdChlLCBtb2RzLCB2YXJzLCBtb2QsIDApCi0JCQlicmVhawotCXJldHVybiBmaWxlcywgbW9kdWxlcworICAgIGZpbGVzID0gW10KKyAgICBtb2R1bGVzID0gW10KKyAgICBlZGljdCA9IHt9CisgICAgZm9yIGUgaW4gZXh0ZW5zaW9uczoKKyAgICAgICAgc2V0dXAgPSBvcy5wYXRoLmpvaW4oZSwgJ1NldHVwJykKKyAgICAgICAgbGliYSA9IG9zLnBhdGguam9pbihlLCAnbGliLmEnKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUobGliYSk6CisgICAgICAgICAgICBsaWJhID0gTm9uZQorICAgICAgICBlZGljdFtlXSA9IHBhcnNlc2V0dXAuZ2V0c2V0dXBpbmZvKHNldHVwKSwgbGliYQorICAgIGZvciBtb2QgaW4gdW5rbm93bjoKKyAgICAgICAgZm9yIGUgaW4gZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIChtb2RzLCB2YXJzKSwgbGliYSA9IGVkaWN0W2VdCisgICAgICAgICAgICBpZiBub3QgbW9kcy5oYXNfa2V5KG1vZCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG1vZHVsZXMuYXBwZW5kKG1vZCkKKyAgICAgICAgICAgIGlmIGxpYmE6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSBmaW5kIGEgbGliLmEsIHVzZSBpdCwgaWdub3JlIHRoZQorICAgICAgICAgICAgICAgICMgLm8gZmlsZXMsIGFuZCB1c2UgKmFsbCogbGlicmFyaWVzIGZvcgorICAgICAgICAgICAgICAgICMgKmFsbCogbW9kdWxlcyBpbiB0aGUgU2V0dXAgZmlsZQorICAgICAgICAgICAgICAgIGlmIGxpYmEgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKGxpYmEpCisgICAgICAgICAgICAgICAgZm9yIG0gaW4gbW9kcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGZpbGVzID0gZmlsZXMgKyBzZWxlY3QoZSwgbW9kcywgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLCAxKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaWxlcyA9IGZpbGVzICsgc2VsZWN0KGUsIG1vZHMsIHZhcnMsIG1vZCwgMCkKKyAgICAgICAgICAgIGJyZWFrCisgICAgcmV0dXJuIGZpbGVzLCBtb2R1bGVzCiAKIGRlZiBzZWxlY3QoZSwgbW9kcywgdmFycywgbW9kLCBza2lwb2ZpbGVzKToKLQlmaWxlcyA9IFtdCi0JZm9yIHcgaW4gbW9kc1ttb2RdOgotCQl3ID0gdHJlYXR3b3JkKHcpCi0JCWlmIG5vdCB3OgotCQkJY29udGludWUKLQkJdyA9IGV4cGFuZHZhcnModywgdmFycykKLQkJZm9yIHcgaW4gdy5zcGxpdCgpOgotCQkJaWYgc2tpcG9maWxlcyBhbmQgd1stMjpdID09ICcubyc6Ci0JCQkJY29udGludWUKLQkJCSMgQXNzdW1lICR2YXIgZXhwYW5kcyB0byBhYnNvbHV0ZSBwYXRobmFtZQotCQkJaWYgd1swXSBub3QgaW4gKCctJywgJyQnKSBhbmQgd1stMjpdIGluICgnLm8nLCAnLmEnKToKLQkJCQl3ID0gb3MucGF0aC5qb2luKGUsIHcpCi0JCQlpZiB3WzoyXSBpbiAoJy1MJywgJy1SJykgYW5kIHdbMjozXSAhPSAnJCc6Ci0JCQkJdyA9IHdbOjJdICsgb3MucGF0aC5qb2luKGUsIHdbMjpdKQotCQkJZmlsZXMuYXBwZW5kKHcpCi0JcmV0dXJuIGZpbGVzCisgICAgZmlsZXMgPSBbXQorICAgIGZvciB3IGluIG1vZHNbbW9kXToKKyAgICAgICAgdyA9IHRyZWF0d29yZCh3KQorICAgICAgICBpZiBub3QgdzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHcgPSBleHBhbmR2YXJzKHcsIHZhcnMpCisgICAgICAgIGZvciB3IGluIHcuc3BsaXQoKToKKyAgICAgICAgICAgIGlmIHNraXBvZmlsZXMgYW5kIHdbLTI6XSA9PSAnLm8nOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIEFzc3VtZSAkdmFyIGV4cGFuZHMgdG8gYWJzb2x1dGUgcGF0aG5hbWUKKyAgICAgICAgICAgIGlmIHdbMF0gbm90IGluICgnLScsICckJykgYW5kIHdbLTI6XSBpbiAoJy5vJywgJy5hJyk6CisgICAgICAgICAgICAgICAgdyA9IG9zLnBhdGguam9pbihlLCB3KQorICAgICAgICAgICAgaWYgd1s6Ml0gaW4gKCctTCcsICctUicpIGFuZCB3WzI6M10gIT0gJyQnOgorICAgICAgICAgICAgICAgIHcgPSB3WzoyXSArIG9zLnBhdGguam9pbihlLCB3WzI6XSkKKyAgICAgICAgICAgIGZpbGVzLmFwcGVuZCh3KQorICAgIHJldHVybiBmaWxlcwogCiBjY19mbGFncyA9IFsnLUknLCAnLUQnLCAnLVUnXQogY2NfZXh0cyA9IFsnLmMnLCAnLkMnLCAnLmNjJywgJy5jKysnXQogCiBkZWYgdHJlYXR3b3JkKHcpOgotCWlmIHdbOjJdIGluIGNjX2ZsYWdzOgotCQlyZXR1cm4gTm9uZQotCWlmIHdbOjFdID09ICctJzoKLQkJcmV0dXJuIHcgIyBBc3N1bWUgbG9hZGVyIGZsYWcKLQloZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdCh3KQotCWJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQodGFpbCkKLQlpZiBleHQgaW4gY2NfZXh0czoKLQkJdGFpbCA9IGJhc2UgKyAnLm8nCi0JCXcgPSBvcy5wYXRoLmpvaW4oaGVhZCwgdGFpbCkKLQlyZXR1cm4gdworICAgIGlmIHdbOjJdIGluIGNjX2ZsYWdzOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIHdbOjFdID09ICctJzoKKyAgICAgICAgcmV0dXJuIHcgIyBBc3N1bWUgbG9hZGVyIGZsYWcKKyAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdCh3KQorICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQodGFpbCkKKyAgICBpZiBleHQgaW4gY2NfZXh0czoKKyAgICAgICAgdGFpbCA9IGJhc2UgKyAnLm8nCisgICAgICAgIHcgPSBvcy5wYXRoLmpvaW4oaGVhZCwgdGFpbCkKKyAgICByZXR1cm4gdwogCiBkZWYgZXhwYW5kdmFycyhzdHIsIHZhcnMpOgotCWkgPSAwCi0Jd2hpbGUgaSA8IGxlbihzdHIpOgotCQlpID0gayA9IHN0ci5maW5kKCckJywgaSkKLQkJaWYgaSA8IDA6Ci0JCQlicmVhawotCQlpID0gaSsxCi0JCXZhciA9IHN0cltpOmkrMV0KLQkJaSA9IGkrMQotCQlpZiB2YXIgPT0gJygnOgotCQkJaiA9IHN0ci5maW5kKCcpJywgaSkKLQkJCWlmIGogPCAwOgotCQkJCWJyZWFrCi0JCQl2YXIgPSBzdHJbaTpqXQotCQkJaSA9IGorMQotCQlpZiB2YXJzLmhhc19rZXkodmFyKToKLQkJCXN0ciA9IHN0cls6a10gKyB2YXJzW3Zhcl0gKyBzdHJbaTpdCi0JCQlpID0gawotCXJldHVybiBzdHIKKyAgICBpID0gMAorICAgIHdoaWxlIGkgPCBsZW4oc3RyKToKKyAgICAgICAgaSA9IGsgPSBzdHIuZmluZCgnJCcsIGkpCisgICAgICAgIGlmIGkgPCAwOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaSA9IGkrMQorICAgICAgICB2YXIgPSBzdHJbaTppKzFdCisgICAgICAgIGkgPSBpKzEKKyAgICAgICAgaWYgdmFyID09ICcoJzoKKyAgICAgICAgICAgIGogPSBzdHIuZmluZCgnKScsIGkpCisgICAgICAgICAgICBpZiBqIDwgMDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdmFyID0gc3RyW2k6al0KKyAgICAgICAgICAgIGkgPSBqKzEKKyAgICAgICAgaWYgdmFycy5oYXNfa2V5KHZhcik6CisgICAgICAgICAgICBzdHIgPSBzdHJbOmtdICsgdmFyc1t2YXJdICsgc3RyW2k6XQorICAgICAgICAgICAgaSA9IGsKKyAgICByZXR1cm4gc3RyCmRpZmYgLS1naXQgYS9Ub29scy9mcmVlemUvY2hlY2tleHRlbnNpb25zX3dpbjMyLnB5IGIvVG9vbHMvZnJlZXplL2NoZWNrZXh0ZW5zaW9uc193aW4zMi5weQppbmRleCA5YTdhNmRjLi5hMTk4ZWNmIDEwMDY0NAotLS0gYS9Ub29scy9mcmVlemUvY2hlY2tleHRlbnNpb25zX3dpbjMyLnB5CisrKyBiL1Rvb2xzL2ZyZWV6ZS9jaGVja2V4dGVuc2lvbnNfd2luMzIucHkKQEAgLTI0LDE0MiArMjQsMTQyIEBACiAKIGltcG9ydCBvcywgc3lzCiB0cnk6Ci0JaW1wb3J0IHdpbjMyYXBpCisgICAgaW1wb3J0IHdpbjMyYXBpCiBleGNlcHQgSW1wb3J0RXJyb3I6Ci0Jd2luMzJhcGkgPSBOb25lICMgVXNlciBoYXMgYWxyZWFkeSBiZWVuIHdhcm5lZAorICAgIHdpbjMyYXBpID0gTm9uZSAjIFVzZXIgaGFzIGFscmVhZHkgYmVlbiB3YXJuZWQKIAogY2xhc3MgQ0V4dGVuc2lvbjoKLQkiIiJBbiBhYnN0cmFjdGlvbiBvZiBhbiBleHRlbnNpb24gaW1wbGVtZW50ZWQgaW4gQy9DKysKLQkiIiIKLQlkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgc291cmNlRmlsZXMpOgotCQlzZWxmLm5hbWUgPSBuYW1lCi0JCSMgQSBsaXN0IG9mIHN0cmluZ3MgZGVmaW5pbmcgYWRkaXRpb25hbCBjb21waWxlciBvcHRpb25zLgotCQlzZWxmLnNvdXJjZUZpbGVzID0gc291cmNlRmlsZXMKLQkJIyBBIGxpc3Qgb2Ygc3BlY2lhbCBjb21waWxlciBvcHRpb25zIHRvIGJlIGFwcGxpZWQgdG8KLQkJIyBhbGwgc291cmNlIG1vZHVsZXMgaW4gdGhpcyBleHRlbnNpb24uCi0JCXNlbGYuY29tcGlsZXJPcHRpb25zID0gW10KLQkJIyBBIGxpc3Qgb2YgLmxpYiBmaWxlcyB0aGUgZmluYWwgLkVYRSB3aWxsIG5lZWQuCi0JCXNlbGYubGlua2VyTGlicyA9IFtdCisgICAgIiIiQW4gYWJzdHJhY3Rpb24gb2YgYW4gZXh0ZW5zaW9uIGltcGxlbWVudGVkIGluIEMvQysrCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHNvdXJjZUZpbGVzKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICAjIEEgbGlzdCBvZiBzdHJpbmdzIGRlZmluaW5nIGFkZGl0aW9uYWwgY29tcGlsZXIgb3B0aW9ucy4KKyAgICAgICAgc2VsZi5zb3VyY2VGaWxlcyA9IHNvdXJjZUZpbGVzCisgICAgICAgICMgQSBsaXN0IG9mIHNwZWNpYWwgY29tcGlsZXIgb3B0aW9ucyB0byBiZSBhcHBsaWVkIHRvCisgICAgICAgICMgYWxsIHNvdXJjZSBtb2R1bGVzIGluIHRoaXMgZXh0ZW5zaW9uLgorICAgICAgICBzZWxmLmNvbXBpbGVyT3B0aW9ucyA9IFtdCisgICAgICAgICMgQSBsaXN0IG9mIC5saWIgZmlsZXMgdGhlIGZpbmFsIC5FWEUgd2lsbCBuZWVkLgorICAgICAgICBzZWxmLmxpbmtlckxpYnMgPSBbXQogCi0JZGVmIEdldFNvdXJjZUZpbGVzKHNlbGYpOgotCQlyZXR1cm4gc2VsZi5zb3VyY2VGaWxlcworICAgIGRlZiBHZXRTb3VyY2VGaWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlRmlsZXMKIAotCWRlZiBBZGRDb21waWxlck9wdGlvbihzZWxmLCBvcHRpb24pOgotCQlzZWxmLmNvbXBpbGVyT3B0aW9ucy5hcHBlbmQob3B0aW9uKQotCWRlZiBHZXRDb21waWxlck9wdGlvbnMoc2VsZik6Ci0JCXJldHVybiBzZWxmLmNvbXBpbGVyT3B0aW9ucworICAgIGRlZiBBZGRDb21waWxlck9wdGlvbihzZWxmLCBvcHRpb24pOgorICAgICAgICBzZWxmLmNvbXBpbGVyT3B0aW9ucy5hcHBlbmQob3B0aW9uKQorICAgIGRlZiBHZXRDb21waWxlck9wdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNvbXBpbGVyT3B0aW9ucwogCi0JZGVmIEFkZExpbmtlckxpYihzZWxmLCBsaWIpOgotCQlzZWxmLmxpbmtlckxpYnMuYXBwZW5kKGxpYikKLQlkZWYgR2V0TGlua2VyTGlicyhzZWxmKToKLQkJcmV0dXJuIHNlbGYubGlua2VyTGlicworICAgIGRlZiBBZGRMaW5rZXJMaWIoc2VsZiwgbGliKToKKyAgICAgICAgc2VsZi5saW5rZXJMaWJzLmFwcGVuZChsaWIpCisgICAgZGVmIEdldExpbmtlckxpYnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxpbmtlckxpYnMKIAogZGVmIGNoZWNrZXh0ZW5zaW9ucyh1bmtub3duLCBleHRyYV9pbmlzLCBwcmVmaXgpOgotICAgICAgICAjIENyZWF0ZSBhIHRhYmxlIG9mIGZyb3plbiBleHRlbnNpb25zCisgICAgIyBDcmVhdGUgYSB0YWJsZSBvZiBmcm96ZW4gZXh0ZW5zaW9ucwogCi0JZGVmYXVsdE1hcE5hbWUgPSBvcy5wYXRoLmpvaW4oIG9zLnBhdGguc3BsaXQoc3lzLmFyZ3ZbMF0pWzBdLCAiZXh0ZW5zaW9uc193aW4zMi5pbmkiKQotCWlmIG5vdCBvcy5wYXRoLmlzZmlsZShkZWZhdWx0TWFwTmFtZSk6Ci0JCXN5cy5zdGRlcnIud3JpdGUoIldBUk5JTkc6ICVzIGNhbiBub3QgYmUgZm91bmQgLSBzdGFuZGFyZCBleHRlbnNpb25zIG1heSBub3QgYmUgZm91bmRcbiIgJSBkZWZhdWx0TWFwTmFtZSkKLQllbHNlOgotCQkjIG11c3QgZ28gb24gZW5kLCBzbyBvdGhlciBpbmlzIGNhbiBvdmVycmlkZS4KLQkJZXh0cmFfaW5pcy5hcHBlbmQoZGVmYXVsdE1hcE5hbWUpCisgICAgZGVmYXVsdE1hcE5hbWUgPSBvcy5wYXRoLmpvaW4oIG9zLnBhdGguc3BsaXQoc3lzLmFyZ3ZbMF0pWzBdLCAiZXh0ZW5zaW9uc193aW4zMi5pbmkiKQorICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShkZWZhdWx0TWFwTmFtZSk6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldBUk5JTkc6ICVzIGNhbiBub3QgYmUgZm91bmQgLSBzdGFuZGFyZCBleHRlbnNpb25zIG1heSBub3QgYmUgZm91bmRcbiIgJSBkZWZhdWx0TWFwTmFtZSkKKyAgICBlbHNlOgorICAgICAgICAjIG11c3QgZ28gb24gZW5kLCBzbyBvdGhlciBpbmlzIGNhbiBvdmVycmlkZS4KKyAgICAgICAgZXh0cmFfaW5pcy5hcHBlbmQoZGVmYXVsdE1hcE5hbWUpCiAKLQlyZXQgPSBbXQotCWZvciBtb2QgaW4gdW5rbm93bjoKLQkJZm9yIGluaSBpbiBleHRyYV9pbmlzOgotIwkJCXByaW50ICJMb29raW5nIGZvciIsIG1vZCwgImluIiwgd2luMzJhcGkuR2V0RnVsbFBhdGhOYW1lKGluaSksIi4uLiIsCi0JCQlkZWZuID0gZ2V0X2V4dGVuc2lvbl9kZWZuKCBtb2QsIGluaSwgcHJlZml4ICkKLQkJCWlmIGRlZm4gaXMgbm90IE5vbmU6Ci0jCQkJCXByaW50ICJZYXkgLSBmb3VuZCBpdCEiCi0JCQkJcmV0LmFwcGVuZCggZGVmbiApCi0JCQkJYnJlYWsKLSMJCQlwcmludCAiTm9wZSEiCi0JCWVsc2U6ICMgRm9yIG5vdCBicm9rZW4hCi0JCQlzeXMuc3RkZXJyLndyaXRlKCJObyBkZWZpbml0aW9uIG9mIG1vZHVsZSAlcyBpbiBhbnkgc3BlY2lmaWVkIG1hcCBmaWxlLlxuIiAlIChtb2QpKQotCQkKLQlyZXR1cm4gcmV0CisgICAgcmV0ID0gW10KKyAgICBmb3IgbW9kIGluIHVua25vd246CisgICAgICAgIGZvciBpbmkgaW4gZXh0cmFfaW5pczoKKyMgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJMb29raW5nIGZvciIsIG1vZCwgImluIiwgd2luMzJhcGkuR2V0RnVsbFBhdGhOYW1lKGluaSksIi4uLiIsCisgICAgICAgICAgICBkZWZuID0gZ2V0X2V4dGVuc2lvbl9kZWZuKCBtb2QsIGluaSwgcHJlZml4ICkKKyAgICAgICAgICAgIGlmIGRlZm4gaXMgbm90IE5vbmU6CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJZYXkgLSBmb3VuZCBpdCEiCisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCggZGVmbiApCisgICAgICAgICAgICAgICAgYnJlYWsKKyMgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJOb3BlISIKKyAgICAgICAgZWxzZTogIyBGb3Igbm90IGJyb2tlbiEKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIk5vIGRlZmluaXRpb24gb2YgbW9kdWxlICVzIGluIGFueSBzcGVjaWZpZWQgbWFwIGZpbGUuXG4iICUgKG1vZCkpCisKKyAgICByZXR1cm4gcmV0CiAKIGRlZiBnZXRfZXh0ZW5zaW9uX2RlZm4obW9kdWxlTmFtZSwgbWFwRmlsZU5hbWUsIHByZWZpeCk6Ci0JaWYgd2luMzJhcGkgaXMgTm9uZTogcmV0dXJuIE5vbmUKLQlvcy5lbnZpcm9uWydQWVRIT05QUkVGSVgnXSA9IHByZWZpeAotCWRzcCA9IHdpbjMyYXBpLkdldFByb2ZpbGVWYWwobW9kdWxlTmFtZSwgImRzcCIsICIiLCBtYXBGaWxlTmFtZSkKLQlpZiBkc3A9PSIiOgotCQlyZXR1cm4gTm9uZQorICAgIGlmIHdpbjMyYXBpIGlzIE5vbmU6IHJldHVybiBOb25lCisgICAgb3MuZW52aXJvblsnUFlUSE9OUFJFRklYJ10gPSBwcmVmaXgKKyAgICBkc3AgPSB3aW4zMmFwaS5HZXRQcm9maWxlVmFsKG1vZHVsZU5hbWUsICJkc3AiLCAiIiwgbWFwRmlsZU5hbWUpCisgICAgaWYgZHNwPT0iIjoKKyAgICAgICAgcmV0dXJuIE5vbmUKIAotCSMgV2UgYWxsb3cgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIHRoZSBmaWxlIG5hbWUKLQlkc3AgPSB3aW4zMmFwaS5FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MoZHNwKQotCSMgSWYgdGhlIHBhdGggdG8gdGhlIC5EU1AgZmlsZSBpcyBub3QgYWJzb2x1dGUsIGFzc3VtZSBpdCBpcyByZWxhdGl2ZQotCSMgdG8gdGhlIGRlc2NyaXB0aW9uIGZpbGUuCi0JaWYgbm90IG9zLnBhdGguaXNhYnMoZHNwKToKLQkJZHNwID0gb3MucGF0aC5qb2luKCBvcy5wYXRoLnNwbGl0KG1hcEZpbGVOYW1lKVswXSwgZHNwKQotCSMgUGFyc2UgaXQgdG8gZXh0cmFjdCB0aGUgc291cmNlIGZpbGVzLgotCXNvdXJjZUZpbGVzID0gcGFyc2VfZHNwKGRzcCkKLQlpZiBzb3VyY2VGaWxlcyBpcyBOb25lOgotCQlyZXR1cm4gTm9uZQorICAgICMgV2UgYWxsb3cgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIHRoZSBmaWxlIG5hbWUKKyAgICBkc3AgPSB3aW4zMmFwaS5FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MoZHNwKQorICAgICMgSWYgdGhlIHBhdGggdG8gdGhlIC5EU1AgZmlsZSBpcyBub3QgYWJzb2x1dGUsIGFzc3VtZSBpdCBpcyByZWxhdGl2ZQorICAgICMgdG8gdGhlIGRlc2NyaXB0aW9uIGZpbGUuCisgICAgaWYgbm90IG9zLnBhdGguaXNhYnMoZHNwKToKKyAgICAgICAgZHNwID0gb3MucGF0aC5qb2luKCBvcy5wYXRoLnNwbGl0KG1hcEZpbGVOYW1lKVswXSwgZHNwKQorICAgICMgUGFyc2UgaXQgdG8gZXh0cmFjdCB0aGUgc291cmNlIGZpbGVzLgorICAgIHNvdXJjZUZpbGVzID0gcGFyc2VfZHNwKGRzcCkKKyAgICBpZiBzb3VyY2VGaWxlcyBpcyBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQogCi0JbW9kdWxlID0gQ0V4dGVuc2lvbihtb2R1bGVOYW1lLCBzb3VyY2VGaWxlcykKLQkjIFB1dCB0aGUgcGF0aCB0byB0aGUgRFNQIGludG8gdGhlIGVudmlyb25tZW50IHNvIGVudHJpZXMgY2FuIHJlZmVyZW5jZSBpdC4KLQlvcy5lbnZpcm9uWydkc3BfcGF0aCddID0gb3MucGF0aC5zcGxpdChkc3ApWzBdCi0Jb3MuZW52aXJvblsnaW5pX3BhdGgnXSA9IG9zLnBhdGguc3BsaXQobWFwRmlsZU5hbWUpWzBdCisgICAgbW9kdWxlID0gQ0V4dGVuc2lvbihtb2R1bGVOYW1lLCBzb3VyY2VGaWxlcykKKyAgICAjIFB1dCB0aGUgcGF0aCB0byB0aGUgRFNQIGludG8gdGhlIGVudmlyb25tZW50IHNvIGVudHJpZXMgY2FuIHJlZmVyZW5jZSBpdC4KKyAgICBvcy5lbnZpcm9uWydkc3BfcGF0aCddID0gb3MucGF0aC5zcGxpdChkc3ApWzBdCisgICAgb3MuZW52aXJvblsnaW5pX3BhdGgnXSA9IG9zLnBhdGguc3BsaXQobWFwRmlsZU5hbWUpWzBdCiAKLQljbF9vcHRpb25zID0gd2luMzJhcGkuR2V0UHJvZmlsZVZhbChtb2R1bGVOYW1lLCAiY2wiLCAiIiwgbWFwRmlsZU5hbWUpCi0JaWYgY2xfb3B0aW9uczoKLQkJbW9kdWxlLkFkZENvbXBpbGVyT3B0aW9uKHdpbjMyYXBpLkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyhjbF9vcHRpb25zKSkKKyAgICBjbF9vcHRpb25zID0gd2luMzJhcGkuR2V0UHJvZmlsZVZhbChtb2R1bGVOYW1lLCAiY2wiLCAiIiwgbWFwRmlsZU5hbWUpCisgICAgaWYgY2xfb3B0aW9uczoKKyAgICAgICAgbW9kdWxlLkFkZENvbXBpbGVyT3B0aW9uKHdpbjMyYXBpLkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyhjbF9vcHRpb25zKSkKIAotCWV4Y2x1ZGUgPSB3aW4zMmFwaS5HZXRQcm9maWxlVmFsKG1vZHVsZU5hbWUsICJleGNsdWRlIiwgIiIsIG1hcEZpbGVOYW1lKQotCWV4Y2x1ZGUgPSBleGNsdWRlLnNwbGl0KCkKKyAgICBleGNsdWRlID0gd2luMzJhcGkuR2V0UHJvZmlsZVZhbChtb2R1bGVOYW1lLCAiZXhjbHVkZSIsICIiLCBtYXBGaWxlTmFtZSkKKyAgICBleGNsdWRlID0gZXhjbHVkZS5zcGxpdCgpCiAKLQlpZiB3aW4zMmFwaS5HZXRQcm9maWxlVmFsKG1vZHVsZU5hbWUsICJVbmljb2RlIiwgMCwgbWFwRmlsZU5hbWUpOgotCQltb2R1bGUuQWRkQ29tcGlsZXJPcHRpb24oJy9EIFVOSUNPREUgL0QgX1VOSUNPREUnKQorICAgIGlmIHdpbjMyYXBpLkdldFByb2ZpbGVWYWwobW9kdWxlTmFtZSwgIlVuaWNvZGUiLCAwLCBtYXBGaWxlTmFtZSk6CisgICAgICAgIG1vZHVsZS5BZGRDb21waWxlck9wdGlvbignL0QgVU5JQ09ERSAvRCBfVU5JQ09ERScpCiAKLQlsaWJzID0gd2luMzJhcGkuR2V0UHJvZmlsZVZhbChtb2R1bGVOYW1lLCAibGlicyIsICIiLCBtYXBGaWxlTmFtZSkuc3BsaXQoKQotCWZvciBsaWIgaW4gbGliczoKLQkJbW9kdWxlLkFkZExpbmtlckxpYih3aW4zMmFwaS5FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MobGliKSkKKyAgICBsaWJzID0gd2luMzJhcGkuR2V0UHJvZmlsZVZhbChtb2R1bGVOYW1lLCAibGlicyIsICIiLCBtYXBGaWxlTmFtZSkuc3BsaXQoKQorICAgIGZvciBsaWIgaW4gbGliczoKKyAgICAgICAgbW9kdWxlLkFkZExpbmtlckxpYih3aW4zMmFwaS5FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MobGliKSkKIAotCWZvciBleGMgaW4gZXhjbHVkZToKLQkJaWYgZXhjIGluIG1vZHVsZS5zb3VyY2VGaWxlczoKLQkJCW1vZHVsZXMuc291cmNlRmlsZXMucmVtb3ZlKGV4YykKKyAgICBmb3IgZXhjIGluIGV4Y2x1ZGU6CisgICAgICAgIGlmIGV4YyBpbiBtb2R1bGUuc291cmNlRmlsZXM6CisgICAgICAgICAgICBtb2R1bGVzLnNvdXJjZUZpbGVzLnJlbW92ZShleGMpCiAKLQlyZXR1cm4gbW9kdWxlCQorICAgIHJldHVybiBtb2R1bGUKIAogIyBHaXZlbiBhbiBNU1ZDIERTUCBmaWxlLCBsb2NhdGUgQyBzb3VyY2UgZmlsZXMgaXQgdXNlcwogIyByZXR1cm5zIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMuCiBkZWYgcGFyc2VfZHNwKGRzcCk6Ci0jCXByaW50ICJQcm9jZXNzaW5nIiwgZHNwCi0JIyBGb3Igbm93LCBvbmx5IHN1cHBvcnQgCi0JcmV0ID0gW10KLQlkc3BfcGF0aCwgZHNwX25hbWUgPSBvcy5wYXRoLnNwbGl0KGRzcCkKLQl0cnk6Ci0JCWxpbmVzID0gb3Blbihkc3AsICJyIikucmVhZGxpbmVzKCkKLQlleGNlcHQgSU9FcnJvciwgbXNnOgotCQlzeXMuc3RkZXJyLndyaXRlKCIlczogJXNcbiIgJSAoZHNwLCBtc2cpKQotCQlyZXR1cm4gTm9uZQotCWZvciBsaW5lIGluIGxpbmVzOgotCQlmaWVsZHMgPSBsaW5lLnN0cmlwKCkuc3BsaXQoIj0iLCAyKQotCQlpZiBmaWVsZHNbMF09PSJTT1VSQ0UiOgotCQkJaWYgb3MucGF0aC5zcGxpdGV4dChmaWVsZHNbMV0pWzFdLmxvd2VyKCkgaW4gWycuY3BwJywgJy5jJ106Ci0JCQkJcmV0LmFwcGVuZCggd2luMzJhcGkuR2V0RnVsbFBhdGhOYW1lKG9zLnBhdGguam9pbihkc3BfcGF0aCwgZmllbGRzWzFdICkgKSApCi0JcmV0dXJuIHJldAorIyAgICAgICBwcmludCAiUHJvY2Vzc2luZyIsIGRzcAorICAgICMgRm9yIG5vdywgb25seSBzdXBwb3J0CisgICAgcmV0ID0gW10KKyAgICBkc3BfcGF0aCwgZHNwX25hbWUgPSBvcy5wYXRoLnNwbGl0KGRzcCkKKyAgICB0cnk6CisgICAgICAgIGxpbmVzID0gb3Blbihkc3AsICJyIikucmVhZGxpbmVzKCkKKyAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlczogJXNcbiIgJSAoZHNwLCBtc2cpKQorICAgICAgICByZXR1cm4gTm9uZQorICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICBmaWVsZHMgPSBsaW5lLnN0cmlwKCkuc3BsaXQoIj0iLCAyKQorICAgICAgICBpZiBmaWVsZHNbMF09PSJTT1VSQ0UiOgorICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChmaWVsZHNbMV0pWzFdLmxvd2VyKCkgaW4gWycuY3BwJywgJy5jJ106CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCggd2luMzJhcGkuR2V0RnVsbFBhdGhOYW1lKG9zLnBhdGguam9pbihkc3BfcGF0aCwgZmllbGRzWzFdICkgKSApCisgICAgcmV0dXJuIHJldAogCiBkZWYgd3JpdGVfZXh0ZW5zaW9uX3RhYmxlKGZuYW1lLCBtb2R1bGVzKToKLQlmcCA9IG9wZW4oZm5hbWUsICJ3IikKLQl0cnk6Ci0JCWZwLndyaXRlIChleHRfc3JjX2hlYWRlcikKLQkJIyBXcml0ZSBmbiBwcm90b3MKLQkJZm9yIG1vZHVsZSBpbiBtb2R1bGVzOgotCQkJIyBiaXQgb2YgYSBoYWNrIGZvciAucHlkJ3MgYXMgcGFydCBvZiBwYWNrYWdlcy4KLQkJCW5hbWUgPSBtb2R1bGUubmFtZS5zcGxpdCgnLicpWy0xXQotCQkJZnAud3JpdGUoJ2V4dGVybiB2b2lkIGluaXQlcyh2b2lkKTtcbicgJSAobmFtZSkgKQotCQkjIFdyaXRlIHRoZSB0YWJsZQotCQlmcC53cml0ZSAoZXh0X3RhYl9oZWFkZXIpCi0JCWZvciBtb2R1bGUgaW4gbW9kdWxlczoKLQkJCW5hbWUgPSBtb2R1bGUubmFtZS5zcGxpdCgnLicpWy0xXQotCQkJZnAud3JpdGUoJ1x0eyIlcyIsIGluaXQlc30sXG4nICUgKG5hbWUsIG5hbWUpICkKKyAgICBmcCA9IG9wZW4oZm5hbWUsICJ3IikKKyAgICB0cnk6CisgICAgICAgIGZwLndyaXRlIChleHRfc3JjX2hlYWRlcikKKyAgICAgICAgIyBXcml0ZSBmbiBwcm90b3MKKyAgICAgICAgZm9yIG1vZHVsZSBpbiBtb2R1bGVzOgorICAgICAgICAgICAgIyBiaXQgb2YgYSBoYWNrIGZvciAucHlkJ3MgYXMgcGFydCBvZiBwYWNrYWdlcy4KKyAgICAgICAgICAgIG5hbWUgPSBtb2R1bGUubmFtZS5zcGxpdCgnLicpWy0xXQorICAgICAgICAgICAgZnAud3JpdGUoJ2V4dGVybiB2b2lkIGluaXQlcyh2b2lkKTtcbicgJSAobmFtZSkgKQorICAgICAgICAjIFdyaXRlIHRoZSB0YWJsZQorICAgICAgICBmcC53cml0ZSAoZXh0X3RhYl9oZWFkZXIpCisgICAgICAgIGZvciBtb2R1bGUgaW4gbW9kdWxlczoKKyAgICAgICAgICAgIG5hbWUgPSBtb2R1bGUubmFtZS5zcGxpdCgnLicpWy0xXQorICAgICAgICAgICAgZnAud3JpdGUoJ1x0eyIlcyIsIGluaXQlc30sXG4nICUgKG5hbWUsIG5hbWUpICkKIAotCQlmcC53cml0ZSAoZXh0X3RhYl9mb290ZXIpCi0JCWZwLndyaXRlKGV4dF9zcmNfZm9vdGVyKQotCWZpbmFsbHk6Ci0JCWZwLmNsb3NlKCkKKyAgICAgICAgZnAud3JpdGUgKGV4dF90YWJfZm9vdGVyKQorICAgICAgICBmcC53cml0ZShleHRfc3JjX2Zvb3RlcikKKyAgICBmaW5hbGx5OgorICAgICAgICBmcC5jbG9zZSgpCiAKIAogZXh0X3NyY19oZWFkZXIgPSAiIiJcCkBAIC0xODIsOSArMTgyLDcgQEAKIAogaW50IFB5SW5pdEZyb3plbkV4dGVuc2lvbnMoKQogewotCXJldHVybiBQeUltcG9ydF9FeHRlbmRJbml0dGFiKGV4dGVuc2lvbnMpOworICAgICAgICByZXR1cm4gUHlJbXBvcnRfRXh0ZW5kSW5pdHRhYihleHRlbnNpb25zKTsKIH0KIAogIiIiCi0KLQpkaWZmIC0tZ2l0IGEvVG9vbHMvZnJlZXplL2ZyZWV6ZS5weSBiL1Rvb2xzL2ZyZWV6ZS9mcmVlemUucHkKaW5kZXggYzJjM2MyZS4uODM2ZjUzMiAxMDA3NTUKLS0tIGEvVG9vbHMvZnJlZXplL2ZyZWV6ZS5weQorKysgYi9Ub29scy9mcmVlemUvZnJlZXplLnB5CkBAIC01NywxNSArNTcsMTUgQEAKICAgICAgICAgICAgICAgYXJlIHJlYWQgYW5kIHRoZSAtaSBvcHRpb24gcmVwbGFjZWQgd2l0aCB0aGUgcGFyc2VkCiAgICAgICAgICAgICAgIHBhcmFtcyAobm90ZSAtIHF1b3RpbmcgYXJncyBpbiB0aGlzIGZpbGUgaXMgTk9UIHN1cHBvcnRlZCkKIAotLXMgc3Vic3lzdGVtOiBTcGVjaWZ5IHRoZSBzdWJzeXN0ZW0gKEZvciBXaW5kb3dzIG9ubHkuKTsgCistcyBzdWJzeXN0ZW06IFNwZWNpZnkgdGhlIHN1YnN5c3RlbSAoRm9yIFdpbmRvd3Mgb25seS4pOwogICAgICAgICAgICAgICAnY29uc29sZScgKGRlZmF1bHQpLCAnd2luZG93cycsICdzZXJ2aWNlJyBvciAnY29tX2RsbCcKLSAgICAgICAgICAgICAgCisKIC13OiAgICAgICAgICAgVG9nZ2xlIFdpbmRvd3MgKE5UIG9yIDk1KSBiZWhhdmlvci4KICAgICAgICAgICAgICAgKEZvciBkZWJ1Z2dpbmcgb25seSAtLSBvbiBhIHdpbjMyIHBsYXRmb3JtLCB3aW4zMiBiZWhhdmlvcgogICAgICAgICAgICAgICBpcyBhdXRvbWF0aWMuKQogCiAtciBwcmVmaXg9ZjogIFJlcGxhY2UgcGF0aCBwcmVmaXguCi0gICAgICAgICAgICAgIFJlcGxhY2UgcHJlZml4IHdpdGggZiBpbiB0aGUgc291cmNlIHBhdGggcmVmZXJlbmNlcyAKKyAgICAgICAgICAgICAgUmVwbGFjZSBwcmVmaXggd2l0aCBmIGluIHRoZSBzb3VyY2UgcGF0aCByZWZlcmVuY2VzCiAgICAgICAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KIAogQXJndW1lbnRzOgpAQCAtMzM1LDcgKzMzNSw3IEBACiAgICAgICAgICAgICAgICAgd2lubWFrZW1ha2VmaWxlLmdldF9jdXN0b21fZW50cnlfcG9pbnQoc3Vic3lzdGVtKQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgd2h5OgogICAgICAgICAgICAgdXNhZ2Uod2h5KQotICAgICAgICAgICAgCisKIAogICAgICMgQWN0dWFsIHdvcmsgc3RhcnRzIGhlcmUuLi4KIApAQCAtMzQzLDcgKzM0Myw3IEBACiAgICAgZGlyID0gb3MucGF0aC5kaXJuYW1lKHNjcmlwdGZpbGUpCiAgICAgcGF0aFswXSA9IGRpcgogICAgIG1mID0gbW9kdWxlZmluZGVyLk1vZHVsZUZpbmRlcihwYXRoLCBkZWJ1ZywgZXhjbHVkZSwgcmVwbGFjZV9wYXRocykKLSAgICAKKwogICAgIGlmIHdpbiBhbmQgc3Vic3lzdGVtPT0nc2VydmljZSc6CiAgICAgICAgICMgSWYgYSBXaW5kb3dzIHNlcnZpY2UsIHRoZW4gYWRkIHRoZSAiYnVpbHQtaW4iIG1vZHVsZS4KICAgICAgICAgbW9kID0gbWYuYWRkX21vZHVsZSgic2VydmljZW1hbmFnZXIiKQpAQCAtNDExLDcgKzQxMSw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAjIERvIHRoZSB3aW5kb3dzIHRoYW5nLi4uCiAgICAgICAgICAgICBpbXBvcnQgY2hlY2tleHRlbnNpb25zX3dpbjMyCi0gICAgICAgICAgICAjIEdldCBhIGxpc3Qgb2YgQ0V4dGVuc2lvbiBpbnN0YW5jZXMsIGVhY2ggZGVzY3JpYmluZyBhIG1vZHVsZSAKKyAgICAgICAgICAgICMgR2V0IGEgbGlzdCBvZiBDRXh0ZW5zaW9uIGluc3RhbmNlcywgZWFjaCBkZXNjcmliaW5nIGEgbW9kdWxlCiAgICAgICAgICAgICAjIChpbmNsdWRpbmcgaXRzIHNvdXJjZSBmaWxlcykKICAgICAgICAgICAgIGZyb3plbl9leHRlbnNpb25zID0gY2hlY2tleHRlbnNpb25zX3dpbjMyLmNoZWNrZXh0ZW5zaW9ucygKICAgICAgICAgICAgICAgICB1bmtub3duLCBleHRlbnNpb25zLCBwcmVmaXgpCmRpZmYgLS1naXQgYS9Ub29scy9mcmVlemUvbWFrZWNvbmZpZy5weSBiL1Rvb2xzL2ZyZWV6ZS9tYWtlY29uZmlnLnB5CmluZGV4IDJmMDRhYzcuLjdjZDliNzggMTAwNjQ0Ci0tLSBhL1Rvb2xzL2ZyZWV6ZS9tYWtlY29uZmlnLnB5CisrKyBiL1Rvb2xzL2ZyZWV6ZS9tYWtlY29uZmlnLnB5CkBAIC02LDU2ICs2LDU2IEBACiBuZXZlciA9IFsnbWFyc2hhbCcsICdfX21haW5fXycsICdfX2J1aWx0aW5fXycsICdzeXMnLCAnZXhjZXB0aW9ucyddCiAKIGRlZiBtYWtlY29uZmlnKGluZnAsIG91dGZwLCBtb2R1bGVzLCB3aXRoX2lmZGVmPTApOgotCW0xID0gcmUuY29tcGlsZSgnLS0gQURETU9EVUxFIE1BUktFUiAxIC0tJykKLQltMiA9IHJlLmNvbXBpbGUoJy0tIEFERE1PRFVMRSBNQVJLRVIgMiAtLScpCi0Jd2hpbGUgMToKLQkJbGluZSA9IGluZnAucmVhZGxpbmUoKQotCQlpZiBub3QgbGluZTogYnJlYWsKLQkJb3V0ZnAud3JpdGUobGluZSkKLQkJaWYgbTEgYW5kIG0xLnNlYXJjaChsaW5lKToKLQkJCW0xID0gTm9uZQotCQkJZm9yIG1vZCBpbiBtb2R1bGVzOgotCQkJCWlmIG1vZCBpbiBuZXZlcjoKLQkJCQkJY29udGludWUKLQkJCQlpZiB3aXRoX2lmZGVmOgotCQkJCQlvdXRmcC53cml0ZSgiI2lmbmRlZiBpbml0JXNcbiIlbW9kKQotCQkJCW91dGZwLndyaXRlKCdleHRlcm4gdm9pZCBpbml0JXModm9pZCk7XG4nICUgbW9kKQotCQkJCWlmIHdpdGhfaWZkZWY6Ci0JCQkJCW91dGZwLndyaXRlKCIjZW5kaWZcbiIpCi0JCWVsaWYgbTIgYW5kIG0yLnNlYXJjaChsaW5lKToKLQkJCW0yID0gTm9uZQotCQkJZm9yIG1vZCBpbiBtb2R1bGVzOgotCQkJCWlmIG1vZCBpbiBuZXZlcjoKLQkJCQkJY29udGludWUKLQkJCQlvdXRmcC53cml0ZSgnXHR7IiVzIiwgaW5pdCVzfSxcbicgJQotCQkJCQkgICAgKG1vZCwgbW9kKSkKLQlpZiBtMToKLQkJc3lzLnN0ZGVyci53cml0ZSgnTUFSS0VSIDEgbmV2ZXIgZm91bmRcbicpCi0JZWxpZiBtMjoKLQkJc3lzLnN0ZGVyci53cml0ZSgnTUFSS0VSIDIgbmV2ZXIgZm91bmRcbicpCisgICAgbTEgPSByZS5jb21waWxlKCctLSBBRERNT0RVTEUgTUFSS0VSIDEgLS0nKQorICAgIG0yID0gcmUuY29tcGlsZSgnLS0gQURETU9EVUxFIE1BUktFUiAyIC0tJykKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gaW5mcC5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICBvdXRmcC53cml0ZShsaW5lKQorICAgICAgICBpZiBtMSBhbmQgbTEuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgbTEgPSBOb25lCisgICAgICAgICAgICBmb3IgbW9kIGluIG1vZHVsZXM6CisgICAgICAgICAgICAgICAgaWYgbW9kIGluIG5ldmVyOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHdpdGhfaWZkZWY6CisgICAgICAgICAgICAgICAgICAgIG91dGZwLndyaXRlKCIjaWZuZGVmIGluaXQlc1xuIiVtb2QpCisgICAgICAgICAgICAgICAgb3V0ZnAud3JpdGUoJ2V4dGVybiB2b2lkIGluaXQlcyh2b2lkKTtcbicgJSBtb2QpCisgICAgICAgICAgICAgICAgaWYgd2l0aF9pZmRlZjoKKyAgICAgICAgICAgICAgICAgICAgb3V0ZnAud3JpdGUoIiNlbmRpZlxuIikKKyAgICAgICAgZWxpZiBtMiBhbmQgbTIuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgbTIgPSBOb25lCisgICAgICAgICAgICBmb3IgbW9kIGluIG1vZHVsZXM6CisgICAgICAgICAgICAgICAgaWYgbW9kIGluIG5ldmVyOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIG91dGZwLndyaXRlKCdcdHsiJXMiLCBpbml0JXN9LFxuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZCwgbW9kKSkKKyAgICBpZiBtMToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnTUFSS0VSIDEgbmV2ZXIgZm91bmRcbicpCisgICAgZWxpZiBtMjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnTUFSS0VSIDIgbmV2ZXIgZm91bmRcbicpCiAKIAogIyBUZXN0IHByb2dyYW0uCiAKIGRlZiB0ZXN0KCk6Ci0JaW1wb3J0IHN5cwotCWlmIG5vdCBzeXMuYXJndlszOl06Ci0JCXByaW50ICd1c2FnZTogcHl0aG9uIG1ha2Vjb25maWcucHkgY29uZmlnLmMuaW4gb3V0cHV0ZmlsZScsCi0JCXByaW50ICdtb2R1bGVuYW1lIC4uLicKLQkJc3lzLmV4aXQoMikKLQlpZiBzeXMuYXJndlsxXSA9PSAnLSc6Ci0JCWluZnAgPSBzeXMuc3RkaW4KLQllbHNlOgotCQlpbmZwID0gb3BlbihzeXMuYXJndlsxXSkKLQlpZiBzeXMuYXJndlsyXSA9PSAnLSc6Ci0JCW91dGZwID0gc3lzLnN0ZG91dAotCWVsc2U6Ci0JCW91dGZwID0gb3BlbihzeXMuYXJndlsyXSwgJ3cnKQotCW1ha2Vjb25maWcoaW5mcCwgb3V0ZnAsIHN5cy5hcmd2WzM6XSkKLQlpZiBvdXRmcCAhPSBzeXMuc3Rkb3V0OgotCQlvdXRmcC5jbG9zZSgpCi0JaWYgaW5mcCAhPSBzeXMuc3RkaW46Ci0JCWluZnAuY2xvc2UoKQorICAgIGltcG9ydCBzeXMKKyAgICBpZiBub3Qgc3lzLmFyZ3ZbMzpdOgorICAgICAgICBwcmludCAndXNhZ2U6IHB5dGhvbiBtYWtlY29uZmlnLnB5IGNvbmZpZy5jLmluIG91dHB1dGZpbGUnLAorICAgICAgICBwcmludCAnbW9kdWxlbmFtZSAuLi4nCisgICAgICAgIHN5cy5leGl0KDIpCisgICAgaWYgc3lzLmFyZ3ZbMV0gPT0gJy0nOgorICAgICAgICBpbmZwID0gc3lzLnN0ZGluCisgICAgZWxzZToKKyAgICAgICAgaW5mcCA9IG9wZW4oc3lzLmFyZ3ZbMV0pCisgICAgaWYgc3lzLmFyZ3ZbMl0gPT0gJy0nOgorICAgICAgICBvdXRmcCA9IHN5cy5zdGRvdXQKKyAgICBlbHNlOgorICAgICAgICBvdXRmcCA9IG9wZW4oc3lzLmFyZ3ZbMl0sICd3JykKKyAgICBtYWtlY29uZmlnKGluZnAsIG91dGZwLCBzeXMuYXJndlszOl0pCisgICAgaWYgb3V0ZnAgIT0gc3lzLnN0ZG91dDoKKyAgICAgICAgb3V0ZnAuY2xvc2UoKQorICAgIGlmIGluZnAgIT0gc3lzLnN0ZGluOgorICAgICAgICBpbmZwLmNsb3NlKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQl0ZXN0KCkKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL1Rvb2xzL2ZyZWV6ZS9tYWtlZnJlZXplLnB5IGIvVG9vbHMvZnJlZXplL21ha2VmcmVlemUucHkKaW5kZXggOWZmMzQ4Yy4uMTIwOGI2NyAxMDA2NDQKLS0tIGEvVG9vbHMvZnJlZXplL21ha2VmcmVlemUucHkKKysrIGIvVG9vbHMvZnJlZXplL21ha2VmcmVlemUucHkKQEAgLTE5LDcgKzE5LDcgQEAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JZXh0ZXJuIGludCBQeV9Gcm96ZW5NYWluKGludCwgY2hhciAqKik7CisgICAgICAgIGV4dGVybiBpbnQgUHlfRnJvemVuTWFpbihpbnQsIGNoYXIgKiopOwogIiIiICsgKChub3QgX19kZWJ1Z19fIGFuZCAiIiIKICAgICAgICAgUHlfT3B0aW1pemVGbGFnKys7CiAiIiIpIG9yICIiKSAgKyAiIiIKZGlmZiAtLWdpdCBhL1Rvb2xzL2ZyZWV6ZS9tYWtlbWFrZWZpbGUucHkgYi9Ub29scy9mcmVlemUvbWFrZW1ha2VmaWxlLnB5CmluZGV4IGI4Yjk5YjguLmZmOGIxNWEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2ZyZWV6ZS9tYWtlbWFrZWZpbGUucHkKKysrIGIvVG9vbHMvZnJlZXplL21ha2VtYWtlZmlsZS5weQpAQCAtMjMsNyArMjMsNyBAQAogICAgICAgICAgICAgZGVwcy5hcHBlbmQoZGVzdCkKIAogICAgIG91dGZwLndyaXRlKCJcbiVzOiAlc1xuIiAlICh0YXJnZXQsICcgJy5qb2luKGRlcHMpKSkKLSAgICBvdXRmcC53cml0ZSgiXHQkKExJTktDQykgJChMREZMQUdTKSAkKExJTktGT1JTSEFSRUQpICVzIC1vICVzICQoTERMQVNUKVxuIiAlIAorICAgIG91dGZwLndyaXRlKCJcdCQoTElOS0NDKSAkKExERkxBR1MpICQoTElOS0ZPUlNIQVJFRCkgJXMgLW8gJXMgJChMRExBU1QpXG4iICUKICAgICAgICAgICAgICAgICAoJyAnLmpvaW4oZmlsZXMpLCB0YXJnZXQpKQogCiAgICAgb3V0ZnAud3JpdGUoIlxuY2xlYW46XG5cdC1ybSAtZiAqLm8gJXNcbiIgJSB0YXJnZXQpCmRpZmYgLS1naXQgYS9Ub29scy9mcmVlemUvcGFyc2VzZXR1cC5weSBiL1Rvb2xzL2ZyZWV6ZS9wYXJzZXNldHVwLnB5CmluZGV4IDJiOTEyM2UuLjg1NjIzNGQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2ZyZWV6ZS9wYXJzZXNldHVwLnB5CisrKyBiL1Rvb2xzL2ZyZWV6ZS9wYXJzZXNldHVwLnB5CkBAIC0xMCwzMiArMTAsMzIgQEAKIG1ha2V2YXJkZWYgPSByZS5jb21waWxlKCdeKFthLXpBLVowLTlfXSspWyBcdF0qPSguKiknKQogCiBkZWYgZ2V0bWFrZXZhcnMoZmlsZW5hbWUpOgotCXZhcmlhYmxlcyA9IHt9Ci0JZnAgPSBvcGVuKGZpbGVuYW1lKQotCXBlbmRpbmdsaW5lID0gIiIKLQl0cnk6Ci0JCXdoaWxlIDE6Ci0JCQlsaW5lID0gZnAucmVhZGxpbmUoKQotCQkJaWYgcGVuZGluZ2xpbmU6Ci0JCQkJbGluZSA9IHBlbmRpbmdsaW5lICsgbGluZQotCQkJCXBlbmRpbmdsaW5lID0gIiIKLQkJCWlmIG5vdCBsaW5lOgotCQkJCWJyZWFrCi0JCQlpZiBsaW5lLmVuZHN3aXRoKCdcXFxuJyk6Ci0JCQkJcGVuZGluZ2xpbmUgPSBsaW5lWzotMl0KLQkJCW1hdGNob2JqID0gbWFrZXZhcmRlZi5tYXRjaChsaW5lKQotCQkJaWYgbm90IG1hdGNob2JqOgotCQkJCWNvbnRpbnVlCi0JCQkobmFtZSwgdmFsdWUpID0gbWF0Y2hvYmouZ3JvdXAoMSwgMikKLQkJCSMgU3RyaXAgdHJhaWxpbmcgY29tbWVudAotCQkJaSA9IHZhbHVlLmZpbmQoJyMnKQotCQkJaWYgaSA+PSAwOgotCQkJCXZhbHVlID0gdmFsdWVbOmldCi0JCQl2YWx1ZSA9IHZhbHVlLnN0cmlwKCkKLQkJCXZhcmlhYmxlc1tuYW1lXSA9IHZhbHVlCi0JZmluYWxseToKLQkJZnAuY2xvc2UoKQotCXJldHVybiB2YXJpYWJsZXMKKyAgICB2YXJpYWJsZXMgPSB7fQorICAgIGZwID0gb3BlbihmaWxlbmFtZSkKKyAgICBwZW5kaW5nbGluZSA9ICIiCisgICAgdHJ5OgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIHBlbmRpbmdsaW5lOgorICAgICAgICAgICAgICAgIGxpbmUgPSBwZW5kaW5nbGluZSArIGxpbmUKKyAgICAgICAgICAgICAgICBwZW5kaW5nbGluZSA9ICIiCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgnXFxcbicpOgorICAgICAgICAgICAgICAgIHBlbmRpbmdsaW5lID0gbGluZVs6LTJdCisgICAgICAgICAgICBtYXRjaG9iaiA9IG1ha2V2YXJkZWYubWF0Y2gobGluZSkKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaG9iajoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgKG5hbWUsIHZhbHVlKSA9IG1hdGNob2JqLmdyb3VwKDEsIDIpCisgICAgICAgICAgICAjIFN0cmlwIHRyYWlsaW5nIGNvbW1lbnQKKyAgICAgICAgICAgIGkgPSB2YWx1ZS5maW5kKCcjJykKKyAgICAgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzppXQorICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdHJpcCgpCisgICAgICAgICAgICB2YXJpYWJsZXNbbmFtZV0gPSB2YWx1ZQorICAgIGZpbmFsbHk6CisgICAgICAgIGZwLmNsb3NlKCkKKyAgICByZXR1cm4gdmFyaWFibGVzCiAKIAogIyBQYXJzZSBhIFB5dGhvbiBTZXR1cCguaW4pIGZpbGUuCkBAIC00Niw2NyArNDYsNjcgQEAKIHNldHVwdmFyZGVmID0gcmUuY29tcGlsZSgnXihbYS16QS1aMC05X10rKT0oLiopJykKIAogZGVmIGdldHNldHVwaW5mbyhmaWxlbmFtZSk6Ci0JbW9kdWxlcyA9IHt9Ci0JdmFyaWFibGVzID0ge30KLQlmcCA9IG9wZW4oZmlsZW5hbWUpCi0JcGVuZGluZ2xpbmUgPSAiIgotCXRyeToKLQkJd2hpbGUgMToKLQkJCWxpbmUgPSBmcC5yZWFkbGluZSgpCi0JCQlpZiBwZW5kaW5nbGluZToKLQkJCQlsaW5lID0gcGVuZGluZ2xpbmUgKyBsaW5lCi0JCQkJcGVuZGluZ2xpbmUgPSAiIgotCQkJaWYgbm90IGxpbmU6Ci0JCQkJYnJlYWsKLQkJCSMgU3RyaXAgY29tbWVudHMKLQkJCWkgPSBsaW5lLmZpbmQoJyMnKQotCQkJaWYgaSA+PSAwOgotCQkJCWxpbmUgPSBsaW5lWzppXQotCQkJaWYgbGluZS5lbmRzd2l0aCgnXFxcbicpOgotCQkJCXBlbmRpbmdsaW5lID0gbGluZVs6LTJdCi0JCQkJY29udGludWUKLQkJCW1hdGNob2JqID0gc2V0dXB2YXJkZWYubWF0Y2gobGluZSkKLQkJCWlmIG1hdGNob2JqOgotCQkJCShuYW1lLCB2YWx1ZSkgPSBtYXRjaG9iai5ncm91cCgxLCAyKQotCQkJCXZhcmlhYmxlc1tuYW1lXSA9IHZhbHVlLnN0cmlwKCkKLQkJCWVsc2U6Ci0JCQkJd29yZHMgPSBsaW5lLnNwbGl0KCkKLQkJCQlpZiB3b3JkczoKLQkJCQkJbW9kdWxlc1t3b3Jkc1swXV0gPSB3b3Jkc1sxOl0KLQlmaW5hbGx5OgotCQlmcC5jbG9zZSgpCi0JcmV0dXJuIG1vZHVsZXMsIHZhcmlhYmxlcworICAgIG1vZHVsZXMgPSB7fQorICAgIHZhcmlhYmxlcyA9IHt9CisgICAgZnAgPSBvcGVuKGZpbGVuYW1lKQorICAgIHBlbmRpbmdsaW5lID0gIiIKKyAgICB0cnk6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgcGVuZGluZ2xpbmU6CisgICAgICAgICAgICAgICAgbGluZSA9IHBlbmRpbmdsaW5lICsgbGluZQorICAgICAgICAgICAgICAgIHBlbmRpbmdsaW5lID0gIiIKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIFN0cmlwIGNvbW1lbnRzCisgICAgICAgICAgICBpID0gbGluZS5maW5kKCcjJykKKyAgICAgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6aV0KKyAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoJ1xcXG4nKToKKyAgICAgICAgICAgICAgICBwZW5kaW5nbGluZSA9IGxpbmVbOi0yXQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtYXRjaG9iaiA9IHNldHVwdmFyZGVmLm1hdGNoKGxpbmUpCisgICAgICAgICAgICBpZiBtYXRjaG9iajoKKyAgICAgICAgICAgICAgICAobmFtZSwgdmFsdWUpID0gbWF0Y2hvYmouZ3JvdXAoMSwgMikKKyAgICAgICAgICAgICAgICB2YXJpYWJsZXNbbmFtZV0gPSB2YWx1ZS5zdHJpcCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCisgICAgICAgICAgICAgICAgaWYgd29yZHM6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbd29yZHNbMF1dID0gd29yZHNbMTpdCisgICAgZmluYWxseToKKyAgICAgICAgZnAuY2xvc2UoKQorICAgIHJldHVybiBtb2R1bGVzLCB2YXJpYWJsZXMKIAogCiAjIFRlc3QgdGhlIGFib3ZlIGZ1bmN0aW9ucy4KIAogZGVmIHRlc3QoKToKLQlpbXBvcnQgc3lzCi0JaW1wb3J0IG9zCi0JaWYgbm90IHN5cy5hcmd2WzE6XToKLQkJcHJpbnQgJ3VzYWdlOiBweXRob24gcGFyc2VzZXR1cC5weSBNYWtlZmlsZSp8U2V0dXAqIC4uLicKLQkJc3lzLmV4aXQoMikKLQlmb3IgYXJnIGluIHN5cy5hcmd2WzE6XToKLQkJYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUoYXJnKQotCQlpZiBiYXNlWzo4XSA9PSAnTWFrZWZpbGUnOgotCQkJcHJpbnQgJ01ha2Ugc3R5bGUgcGFyc2luZzonLCBhcmcKLQkJCXYgPSBnZXRtYWtldmFycyhhcmcpCi0JCQlwcmRpY3QodikKLQkJZWxpZiBiYXNlWzo1XSA9PSAnU2V0dXAnOgotCQkJcHJpbnQgJ1NldHVwIHN0eWxlIHBhcnNpbmc6JywgYXJnCi0JCQltLCB2ID0gZ2V0c2V0dXBpbmZvKGFyZykKLQkJCXByZGljdChtKQotCQkJcHJkaWN0KHYpCi0JCWVsc2U6Ci0JCQlwcmludCBhcmcsICdpcyBuZWl0aGVyIGEgTWFrZWZpbGUgbm9yIGEgU2V0dXAgZmlsZScKLQkJCXByaW50ICcobmFtZSBtdXN0IGJlZ2luIHdpdGggIk1ha2VmaWxlIiBvciAiU2V0dXAiKScKKyAgICBpbXBvcnQgc3lzCisgICAgaW1wb3J0IG9zCisgICAgaWYgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgcHJpbnQgJ3VzYWdlOiBweXRob24gcGFyc2VzZXR1cC5weSBNYWtlZmlsZSp8U2V0dXAqIC4uLicKKyAgICAgICAgc3lzLmV4aXQoMikKKyAgICBmb3IgYXJnIGluIHN5cy5hcmd2WzE6XToKKyAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUoYXJnKQorICAgICAgICBpZiBiYXNlWzo4XSA9PSAnTWFrZWZpbGUnOgorICAgICAgICAgICAgcHJpbnQgJ01ha2Ugc3R5bGUgcGFyc2luZzonLCBhcmcKKyAgICAgICAgICAgIHYgPSBnZXRtYWtldmFycyhhcmcpCisgICAgICAgICAgICBwcmRpY3QodikKKyAgICAgICAgZWxpZiBiYXNlWzo1XSA9PSAnU2V0dXAnOgorICAgICAgICAgICAgcHJpbnQgJ1NldHVwIHN0eWxlIHBhcnNpbmc6JywgYXJnCisgICAgICAgICAgICBtLCB2ID0gZ2V0c2V0dXBpbmZvKGFyZykKKyAgICAgICAgICAgIHByZGljdChtKQorICAgICAgICAgICAgcHJkaWN0KHYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCBhcmcsICdpcyBuZWl0aGVyIGEgTWFrZWZpbGUgbm9yIGEgU2V0dXAgZmlsZScKKyAgICAgICAgICAgIHByaW50ICcobmFtZSBtdXN0IGJlZ2luIHdpdGggIk1ha2VmaWxlIiBvciAiU2V0dXAiKScKIAogZGVmIHByZGljdChkKToKLQlrZXlzID0gZC5rZXlzKCkKLQlrZXlzLnNvcnQoKQotCWZvciBrZXkgaW4ga2V5czoKLQkJdmFsdWUgPSBkW2tleV0KLQkJcHJpbnQgIiUtMTVzIiAlIGtleSwgc3RyKHZhbHVlKQorICAgIGtleXMgPSBkLmtleXMoKQorICAgIGtleXMuc29ydCgpCisgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICB2YWx1ZSA9IGRba2V5XQorICAgICAgICBwcmludCAiJS0xNXMiICUga2V5LCBzdHIodmFsdWUpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JdGVzdCgpCisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9Ub29scy9pMThuL21zZ2ZtdC5weSBiL1Rvb2xzL2kxOG4vbXNnZm10LnB5CmluZGV4IDhhMmQ0ZTYuLmI0YWUzZTkgMTAwNzU1Ci0tLSBhL1Rvb2xzL2kxOG4vbXNnZm10LnB5CisrKyBiL1Rvb2xzL2kxOG4vbXNnZm10LnB5CkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICBleGNlcHQgSU9FcnJvciwgbXNnOgogICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtc2cKICAgICAgICAgc3lzLmV4aXQoMSkKLSAgICAKKwogICAgIHNlY3Rpb24gPSBOb25lCiAgICAgZnV6enkgPSAwCiAKQEAgLTE2OSw3ICsxNjksNyBAQAogICAgICAgICBvcGVuKG91dGZpbGUsIndiIikud3JpdGUob3V0cHV0KQogICAgIGV4Y2VwdCBJT0Vycm9yLG1zZzoKICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCi0gICAgICAgICAgICAgICAgICAgICAgCisKIAogDAogZGVmIG1haW4oKToKZGlmZiAtLWdpdCBhL1Rvb2xzL21vZHVsYXRvci9Ua2V4dHJhLnB5IGIvVG9vbHMvbW9kdWxhdG9yL1RrZXh0cmEucHkKaW5kZXggMDBlZDVlYi4uOGY1NTcyOCAxMDA3NTUKLS0tIGEvVG9vbHMvbW9kdWxhdG9yL1RrZXh0cmEucHkKKysrIGIvVG9vbHMvbW9kdWxhdG9yL1RrZXh0cmEucHkKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICAgICAgICAgICAgeyd3aWR0aCc6ICczaScsCiAgICAgICAgICAgICAgICAgICAgJ3RleHQnOiB0ZXh0LAogICAgICAgICAgICAgICAgICAgICdmb250JzogJy1BZG9iZS1UaW1lcy1NZWRpdW0tUi1Ob3JtYWwtKi0xODAtKicsCi0gICAgICAgICAgICAgICAgICAgUGFjazogeydzaWRlJzogJ2xlZnQnLCAKKyAgICAgICAgICAgICAgICAgICBQYWNrOiB7J3NpZGUnOiAnbGVmdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxsJzogJ2JvdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkeCc6ICczbScsICdwYWR5JzogJzNtJ319KQogCkBAIC0xODcsNyArMTg3LDcgQEAKIGRlZiBhc2tmaWxlKHN0cik6ICAgICAgICMgWFhYWCBGb3Igbm93Li4uCiAgICAgaSA9IHN0cmRpYWxvZyhtYWluV2lkZ2V0LCAnUXVlc3Rpb24nLCBzdHIsICcnLCAwKQogICAgIHJldHVybiBpCi0gICAgCisKICMgVGhlIHJlc3QgaXMgdGhlIHRlc3QgcHJvZ3JhbS4KIAogZGVmIF9nbygpOgpkaWZmIC0tZ2l0IGEvVG9vbHMvbW9kdWxhdG9yL2dlbm1vZHVsZS5weSBiL1Rvb2xzL21vZHVsYXRvci9nZW5tb2R1bGUucHkKaW5kZXggNTc4OGI5NS4uZGEzMDY4NCAxMDA3NTUKLS0tIGEvVG9vbHMvbW9kdWxhdG9yL2dlbm1vZHVsZS5weQorKysgYi9Ub29scy9tb2R1bGF0b3IvZ2VubW9kdWxlLnB5CkBAIC02NSw3ICs2NSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW4oZm4sICdyJykKICAgICAgICAgcmFpc2UgZXJyb3IsICdUZW1wbGF0ZSAnK25hbWUrJyBub3QgZm91bmQgZm9yICcrc2VsZi5fdHlwZSsnICcrIFwKICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZQotICAgICAgICAKKwogY2xhc3MgbW9kdWxlKHdyaXRlcik6CiAgICAgX3R5cGUgPSAnbW9kdWxlJwogCkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICAgICAgIyBBZGQgZ2V0YXR0ciBpZiB3ZSBoYXZlIG1ldGhvZHMKICAgICAgICAgaWYgc2VsZi5tZXRob2RsaXN0IGFuZCBub3QgJ3RwX2dldGF0dHInIGluIHNlbGYuZnVuY2xpc3Q6CiAgICAgICAgICAgICBzZWxmLmZ1bmNsaXN0Lmluc2VydCgwLCAndHBfZ2V0YXR0cicpCi0gICAgICAgICAgICAKKwogICAgICAgICBmb3IgZm4gaW4gRlVOQ0xJU1Q6CiAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGZuLCAnMCcpCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL21vZHVsYXRvci9tb2R1bGF0b3IucHkgYi9Ub29scy9tb2R1bGF0b3IvbW9kdWxhdG9yLnB5CmluZGV4IDQ4Mjg3NDMuLjNlMDZiYzIgMTAwNzU1Ci0tLSBhL1Rvb2xzL21vZHVsYXRvci9tb2R1bGF0b3IucHkKKysrIGIvVG9vbHMvbW9kdWxhdG9yL21vZHVsYXRvci5weQpAQCAtNDksNyArNDksNyBAQAogICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICBydi5hcHBlbmQobGlzdC5nZXQoaSkpCiAgICAgcmV0dXJuIHJ2Ci0gICAgCisKIGNsYXNzIFVJOgogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi5tYWluID0gRnJhbWUoKQpAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICAgICAgICAgIG8uc3luY2hyb25pemUoKQogICAgICAgICBleGNlcHQgb29wczoKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgCisKICAgICBkZWYgY2Jfc2F2ZShzZWxmLCAqYXJncyk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHB5Y29kZSA9IHNlbGYubW9kdWxlLmdlbmNvZGUoJ20nLCBzZWxmLm9iamVjdHMpCkBAIC0xNzcsMTIgKzE3NywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21tYW5kJzpzZWxmLmNiX25ld29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrOnsnc2lkZSc6J2xlZnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWR4JzonMC41bSd9fSkKLSAgICAgICAgCisKICAgICBkZWYgY2JfZGVsbWV0aG9kKHNlbGYsICphcmdzKToKICAgICAgICAgbGlzdCA9IHNlbGYubWV0aG9kX2xpc3QuY3Vyc2VsZWN0aW9uKCkKICAgICAgICAgZm9yIGkgaW4gbGlzdDoKICAgICAgICAgICAgIHNlbGYubWV0aG9kX2xpc3QuZGVsZXRlKGkpCi0gICAgICAgIAorCiAgICAgZGVmIGNiX25ld29iaihzZWxmLCAqYXJnKToKICAgICAgICAgc2VsZi5wYXJlbnQub2JqZWN0cy5hcHBlbmQoVUlfb2JqZWN0KHNlbGYucGFyZW50KSkKIApAQCAtMjA4LDcgKzIwOCw3IEBACiAgICAgICAgICAgICBpZiBub3QgY2hlY2tpZChuKToKICAgICAgICAgICAgICAgICBtZXNzYWdlKCdNZXRob2QgbmFtZSBub3QgYW4gaWRlbnRpZmllcjpcbicrbikKICAgICAgICAgICAgICAgICByYWlzZSBvb3BzCi0gICAgICAgICAgICAKKwogICAgIGRlZiBnZW5jb2RlKHNlbGYsIG5hbWUsIG9iamVjdHMpOgogICAgICAgICBydiA9ICcnCiAgICAgICAgIHNlbGYuc3luY2hyb25pemUoKQpAQCAtMjI2LDcgKzIyNiw3IEBACiAgICAgICAgIHJ2ID0gcnYgKyAnJXMub2JqZWN0cyA9IFslc11cbicgJSAobmFtZSwgJywnLmpvaW4ob25hbWVzKSkKICAgICAgICAgcnYgPSBydiArICdcbicKICAgICAgICAgcmV0dXJuIHJ2Ci0gICAgICAgIAorCiBvYmplY3RfbnVtYmVyID0gMAogCiBjbGFzcyBVSV9vYmplY3Q6CkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsbCc6J3gnfX0pCiAgICAgICAgIHNlbGYuZjQgPSBGcmFtZShzZWxmLmZyYW1lLCB7UGFjazp7J3NpZGUnOid0b3AnLCAncGFkeSc6JzAuNW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxsJzoneCd9fSkKLSAgICAgICAgCisKIAogICAgICAgICBzZWxmLmwxID0gTGFiZWwoc2VsZi5mMSwgeyd0ZXh0JzonT2JqZWN0OicsIFBhY2s6eydzaWRlJzonbGVmdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWR4JzonMC41bSd9fSkKQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrOnsnc2lkZSc6J3RvcCcsICdwYWR5JzonMC41bScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3InOid3J319KQogICAgICAgICAgICAgc2VsZi50eXBlc1tpXSA9IGIKLSAgICAgICAgCisKICAgICBkZWYgY2JfbWV0aG9kKHNlbGYsICphcmcpOgogICAgICAgICBuYW1lID0gc2VsZi5tZXRob2RfZW50cnkuZ2V0KCkKICAgICAgICAgaWYgbm90IG5hbWU6CkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICAgICAgbGlzdCA9IHNlbGYubWV0aG9kX2xpc3QuY3Vyc2VsZWN0aW9uKCkKICAgICAgICAgZm9yIGkgaW4gbGlzdDoKICAgICAgICAgICAgIHNlbGYubWV0aG9kX2xpc3QuZGVsZXRlKGkpCi0gICAgICAgIAorCiAgICAgZGVmIHN5bmNocm9uaXplKHNlbGYpOgogICAgICAgICBuID0gc2VsZi5uYW1lX2VudHJ5LmdldCgpCiAgICAgICAgIGlmIG5vdCBuOgpAQCAtMzM3LDcgKzMzNyw3IEBACiAgICAgICAgIGlmIG06CiAgICAgICAgICAgICBzZWxmLmY1LnNldHZhcihzZWxmLnZwcmVmKyd0cF9nZXRhdHRyJywgMSkKICAgICAgICAgcGFzcwotICAgICAgICAKKwogICAgIGRlZiBnZW5jb2RlKHNlbGYsIG5hbWUpOgogICAgICAgICBydiA9ICcnCiAgICAgICAgIHJ2ID0gcnYgKyAnJXMgPSBnZW5tb2R1bGUub2JqZWN0KClcbicgJSAobmFtZSwpCkBAIC0zNTYsMTIgKzM1NiwxMiBAQAogICAgICAgICAgICAgdm5hbWUgPSBzZWxmLnZwcmVmICsgZm4KICAgICAgICAgICAgIGlmIHNlbGYuZjUuZ2V0dmFyKHZuYW1lKSA9PSAnMSc6CiAgICAgICAgICAgICAgICAgZmwuYXBwZW5kKGZuKQotICAgICAgICAgICAgICAgIAorCiAgICAgICAgIHJ2ID0gcnYgKyAnJXMudHlwZWxpc3QgPSAlclxuJyAlIChuYW1lLCBmbCkKIAogICAgICAgICBydiA9IHJ2ICsgJ1xuJwogICAgICAgICByZXR1cm4gcnYKLSAgICAgICAgCisKIAogZGVmIG1haW4oKToKICAgICBpZiBsZW4oc3lzLmFyZ3YpIDwgMjoKQEAgLTM3OSw1ICszNzksNSBAQAogICAgIGVsc2U6CiAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1VzYWdlOiBtb2R1bGF0b3IgW2ZpbGVdXG4nKQogICAgICAgICBzeXMuZXhpdCgxKQotICAgICAgICAKKwogbWFpbigpCmRpZmYgLS1naXQgYS9Ub29scy9tb2R1bGF0b3IvdmFyc3Vic3QucHkgYi9Ub29scy9tb2R1bGF0b3IvdmFyc3Vic3QucHkKaW5kZXggNTUxNmJlMi4uM2IzMzk1MCAxMDA2NDQKLS0tIGEvVG9vbHMvbW9kdWxhdG9yL3ZhcnN1YnN0LnB5CisrKyBiL1Rvb2xzL21vZHVsYXRvci92YXJzdWJzdC5weQpAQCAtMTMsNyArMTMsNyBAQAogCiAgICAgZGVmIHVzZWluZGVudChzZWxmLCBvbm9mZik6CiAgICAgICAgIHNlbGYuZG9fdXNlaW5kZW50ID0gb25vZmYKLSAgICAgICAgCisKICAgICBkZWYgc3Vic3Qoc2VsZiwgcyk6CiAgICAgICAgIHJ2ID0gJycKICAgICAgICAgd2hpbGUgMToKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5bmNoZS9DaGlwVmlld2VyLnB5IGIvVG9vbHMvcHluY2hlL0NoaXBWaWV3ZXIucHkKaW5kZXggZmFhNjk0OC4uMDU0MTJjZSAxMDA2NDQKLS0tIGEvVG9vbHMvcHluY2hlL0NoaXBWaWV3ZXIucHkKKysrIGIvVG9vbHMvcHluY2hlL0NoaXBWaWV3ZXIucHkKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICAjIHNob3dzIHRoZSBuYW1lIG9mIHRoZSBuZWFyZXN0IGNvbG9yIGluIHRoZSBkYXRhYmFzZS4gIEJBVzogc2hvdWxkCiAgICAgICAgICMgYW4gZXhhY3QgbWF0Y2ggYmUgaW5kaWNhdGVkIGluIHNvbWUgd2F5PwogICAgICAgICAjCi0gICAgICAgICMgQWx3YXlzIHVzZSB0aGUgI3JyZ2diYiBzdHlsZSB0byBhY3R1YWxseSBzZXQgdGhlIGNvbG9yLCBzaW5jZSB3ZSBtYXkgCisgICAgICAgICMgQWx3YXlzIHVzZSB0aGUgI3JyZ2diYiBzdHlsZSB0byBhY3R1YWxseSBzZXQgdGhlIGNvbG9yLCBzaW5jZSB3ZSBtYXkKICAgICAgICAgIyBub3QgYmUgdXNpbmcgWCBjb2xvciBuYW1lcyAoZS5nLiAid2ViLXNhZmUiIG5hbWVzKQogICAgICAgICBjb2xvcmRiID0gc2VsZi5fX3NiLmNvbG9yZGIoKQogICAgICAgICByZ2J0dXBsZSA9IChyZWQsIGdyZWVuLCBibHVlKQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHluY2hlL0RldGFpbHNWaWV3ZXIucHkgYi9Ub29scy9weW5jaGUvRGV0YWlsc1ZpZXdlci5weQppbmRleCAwN2Y1YWNkLi4xMWE5OWE2IDEwMDY0NAotLS0gYS9Ub29scy9weW5jaGUvRGV0YWlsc1ZpZXdlci5weQorKysgYi9Ub29scy9weW5jaGUvRGV0YWlsc1ZpZXdlci5weQpAQCAtMiwxMyArMiwxMyBAQAogCiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBwdXJlIGlucHV0IHdpbmRvdyB3aGljaCBhbGxvd3MgeW91IHRvIG1ldGljdWxvdXNseQogZWRpdCB0aGUgY3VycmVudCBjb2xvci4gIFlvdSBoYXZlIGJvdGggbW91c2UgY29udHJvbCBvZiB0aGUgY29sb3IgKHZpYSB0aGUKLWJ1dHRvbnMgYWxvbmcgdGhlIGJvdHRvbSByb3cpLCBhbmQgdGhlcmUgYXJlIGtleWJvYXJkIGJpbmRpbmdzIGZvciBlYWNoIG9mIHRoZSAKK2J1dHRvbnMgYWxvbmcgdGhlIGJvdHRvbSByb3cpLCBhbmQgdGhlcmUgYXJlIGtleWJvYXJkIGJpbmRpbmdzIGZvciBlYWNoIG9mIHRoZQogaW5jcmVtZW50L2RlY3JlbWVudCBidXR0b25zLgogCiBUaGUgdG9wIHRocmVlIGNoZWNrIGJ1dHRvbnMgYWxsb3cgeW91IHRvIHNwZWNpZnkgd2hpY2ggb2YgdGhlIHRocmVlIGNvbG9yCiB2YXJpYXRpb25zIGFyZSB0aWVkIHRvZ2V0aGVyIHdoZW4gaW5jcmVtZW50aW5nIGFuZCBkZWNyZW1lbnRpbmcuICBSZWQsIGdyZWVuLAogYW5kIGJsdWUgYXJlIHNlbGYgZXZpZGVudC4gIEJ5IHR5aW5nIHRvZ2V0aGVyIHJlZCBhbmQgZ3JlZW4sIHlvdSBjYW4gbW9kaWZ5Ci10aGUgeWVsbG93IGxldmVsIG9mIHRoZSBjb2xvci4gIEJ5IHR5aW5nIHRvZ2V0aGVyIHJlZCBhbmQgYmx1ZSwgeW91IGNhbiBtb2RpZnkgCit0aGUgeWVsbG93IGxldmVsIG9mIHRoZSBjb2xvci4gIEJ5IHR5aW5nIHRvZ2V0aGVyIHJlZCBhbmQgYmx1ZSwgeW91IGNhbiBtb2RpZnkKIHRoZSBtYWdlbnRhIGxldmVsIG9mIHRoZSBjb2xvci4gIEJ5IHR5aW5nIHRvZ2V0aGVyIGdyZWVuIGFuZCBibHVlLCB5b3UgY2FuCiBtb2RpZnkgdGhlIGN5YW4gbGV2ZWwsIGFuZCBieSB0eWluZyBhbGwgdGhyZWUgdG9nZXRoZXIsIHlvdSBjYW4gbW9kaWZ5IHRoZQogZ3JleSBsZXZlbC4KZGlmZiAtLWdpdCBhL1Rvb2xzL3B5bmNoZS9TdHJpcFZpZXdlci5weSBiL1Rvb2xzL3B5bmNoZS9TdHJpcFZpZXdlci5weQppbmRleCA0MjljYzc4Li5mN2RhNDc5IDEwMDY0NAotLS0gYS9Ub29scy9weW5jaGUvU3RyaXBWaWV3ZXIucHkKKysrIGIvVG9vbHMvcHluY2hlL1N0cmlwVmlld2VyLnB5CkBAIC0xLDYgKzEsNiBAQAogIiIiU3RyaXAgdmlld2VyIGFuZCByZWxhdGVkIHdpZGdldHMuCiAKLVRoZSBjbGFzc2VzIGluIHRoaXMgZmlsZSBpbXBsZW1lbnQgdGhlIFN0cmlwVmlld2VyIHNob3duIGluIHRoZSB0b3AgdHdvIHRoaXJkcyAKK1RoZSBjbGFzc2VzIGluIHRoaXMgZmlsZSBpbXBsZW1lbnQgdGhlIFN0cmlwVmlld2VyIHNob3duIGluIHRoZSB0b3AgdHdvIHRoaXJkcwogb2YgdGhlIG1haW4gUHluY2hlIHdpbmRvdy4gIEl0IGNvbnNpc3RzIG9mIHRocmVlIFN0cmlwV2lkZ2V0cyB3aGljaCBkaXNwbGF5CiB0aGUgdmFyaWF0aW9ucyBpbiByZWQsIGdyZWVuLCBhbmQgYmx1ZSByZXNwZWN0aXZlbHkgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAogci9nL2IgY29sb3IgdmFsdWUuCkBAIC0xODIsNyArMTgyLDcgQEAKICAgICAgICAgIyB0aGUgbGFzdCBjaGlwIHNlbGVjdGVkCiAgICAgICAgIHNlbGYuX19sYXN0Y2hpcCA9IE5vbmUKICAgICAgICAgc2VsZi5fX3NiID0gc3dpdGNoYm9hcmQKLSAgICAgICAgCisKICAgICAgICAgY2FudmFzd2lkdGggPSBudW1jaGlwcyAqIChjaGlwd2lkdGggKyAxKQogICAgICAgICBjYW52YXNoZWlnaHQgPSBjaGlwaGVpZ2h0ICsgNDMgICAgICAgICAgICAjIEJBVzogS2x1ZGdlCiAKQEAgLTM3Miw3ICszNzIsNyBAQAogICAgICAgICBoZXhidG4uZ3JpZChyb3c9MSwgY29sdW1uPTEsIHN0aWNreT1XKQogCiAgICAgICAgICMgWFhYOiBpZ25vcmUgdGhpcyBmZWF0dXJlIGZvciBub3c7IGl0IGRvZXNuJ3Qgd29yayBxdWl0ZSByaWdodCB5ZXQKLSAgICAgICAgCisKICMjICAgICAgICBnZW50eXBldmFyID0gc2VsZi5fX2dlbnR5cGV2YXIgPSBJbnRWYXIoKQogIyMgICAgICAgIHNlbGYuX192YXJpYXRpb25zID0gUmFkaW9idXR0b24oZnJhbWUsCiAjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdWYXJpYXRpb25zJywKZGlmZiAtLWdpdCBhL1Rvb2xzL3VuaWNvZGUvbWtzdHJpbmdwcmVwLnB5IGIvVG9vbHMvdW5pY29kZS9ta3N0cmluZ3ByZXAucHkKaW5kZXggYzYyMTk2Ny4uMjUyNWY5ZSAxMDA2NDQKLS0tIGEvVG9vbHMvdW5pY29kZS9ta3N0cmluZ3ByZXAucHkKKysrIGIvVG9vbHMvdW5pY29kZS9ta3N0cmluZ3ByZXAucHkKQEAgLTQyOSw0ICs0MjksMyBAQAogZGVmIGluX3RhYmxlX2QyKGNvZGUpOgogICAgIHJldHVybiB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKGNvZGUpID09ICJMIgogIiIiCi0KZGlmZiAtLWdpdCBhL1Rvb2xzL3ZlcnNpb25jaGVjay9jaGVja3ZlcnNpb25zLnB5IGIvVG9vbHMvdmVyc2lvbmNoZWNrL2NoZWNrdmVyc2lvbnMucHkKaW5kZXggOTU2ZjU1My4uZmQxMjhiNiAxMDA2NDQKLS0tIGEvVG9vbHMvdmVyc2lvbmNoZWNrL2NoZWNrdmVyc2lvbnMucHkKKysrIGIvVG9vbHMvdmVyc2lvbmNoZWNrL2NoZWNrdmVyc2lvbnMucHkKQEAgLTEsNCArMSw0IEBACi0iIiJDaGVja3ZlcnNpb25zIC0gcmVjdXJzaXZlbHkgc2VhcmNoIGEgZGlyZWN0b3J5IChkZWZhdWx0OiBzeXMucHJlZml4KSAKKyIiIkNoZWNrdmVyc2lvbnMgLSByZWN1cnNpdmVseSBzZWFyY2ggYSBkaXJlY3RvcnkgKGRlZmF1bHQ6IHN5cy5wcmVmaXgpCiBmb3IgX2NoZWNrdmVyc2lvbi5weSBmaWxlcywgYW5kIHJ1biBlYWNoIG9mIHRoZW0uIFRoaXMgd2lsbCB0ZWxsIHlvdSBvZgogbmV3IHZlcnNpb25zIGF2YWlsYWJsZSBmb3IgYW55IHBhY2thZ2VzIHlvdSBoYXZlIGluc3RhbGxlZC4iIiIKIApAQCAtMjksNyArMjksNyBAQAogICAgICAgICAgICAgZXhlY2ZpbGUoZnVsbG5hbWUpCiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHByaW50ICcqKiBFeGNlcHRpb24gaW4nLCBmdWxsbmFtZQotICAgICAgICAgICAgCisKIGRlZiB3YWxrMXRyZWUodHJlZSk6CiAgICAgb3MucGF0aC53YWxrKHRyZWUsIGNoZWNrMWRpciwgTm9uZSkKIApAQCAtNTAsNSArNTAsMyBAQAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIG1haW4oKQotCi0KZGlmZiAtLWdpdCBhL1Rvb2xzL3ZlcnNpb25jaGVjay9weXZlcnNpb25jaGVjay5weSBiL1Rvb2xzL3ZlcnNpb25jaGVjay9weXZlcnNpb25jaGVjay5weQppbmRleCA2YWMzNGM4Li4xNDQ2NjUzIDEwMDY0NAotLS0gYS9Ub29scy92ZXJzaW9uY2hlY2svcHl2ZXJzaW9uY2hlY2sucHkKKysrIGIvVG9vbHMvdmVyc2lvbmNoZWNrL3B5dmVyc2lvbmNoZWNrLnB5CkBAIC05Niw0ICs5NiwzIEBACiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgX3Rlc3QoKQotCmRpZmYgLS1naXQgYS9Ub29scy93ZWJjaGVja2VyL3djZ3VpLnB5IGIvVG9vbHMvd2ViY2hlY2tlci93Y2d1aS5weQppbmRleCBlNDY3ZDkyLi45NmFlZDBhIDEwMDc1NQotLS0gYS9Ub29scy93ZWJjaGVja2VyL3djZ3VpLnB5CisrKyBiL1Rvb2xzL3dlYmNoZWNrZXIvd2NndWkucHkKQEAgLTEwLDE3ICsxMCwxNyBAQAogCiBVc2VyIGludGVyZmFjZToKIAotRW50ZXIgYSByb290IHRvIGNoZWNrIGluIHRoZSB0ZXh0IGVudHJ5IGJveC4gIFRvIGVudGVyIG1vcmUgdGhhbiBvbmUgcm9vdCwgCitFbnRlciBhIHJvb3QgdG8gY2hlY2sgaW4gdGhlIHRleHQgZW50cnkgYm94LiAgVG8gZW50ZXIgbW9yZSB0aGFuIG9uZSByb290LAogZW50ZXIgdGhlbSBvbmUgYXQgYSB0aW1lIGFuZCBwcmVzcyA8UmV0dXJuPiBmb3IgZWFjaCBvbmUuCiAKLUNvbW1hbmQgYnV0dG9ucyBTdGFydCwgU3RvcCBhbmQgIkNoZWNrIG9uZSIgZ292ZXJuIHRoZSBjaGVja2luZyBwcm9jZXNzIGluIAotdGhlIG9idmlvdXMgd2F5LiAgU3RhcnQgYW5kICJDaGVjayBvbmUiIGFsc28gZW50ZXIgdGhlIHJvb3QgZnJvbSB0aGUgdGV4dCAKK0NvbW1hbmQgYnV0dG9ucyBTdGFydCwgU3RvcCBhbmQgIkNoZWNrIG9uZSIgZ292ZXJuIHRoZSBjaGVja2luZyBwcm9jZXNzIGluCit0aGUgb2J2aW91cyB3YXkuICBTdGFydCBhbmQgIkNoZWNrIG9uZSIgYWxzbyBlbnRlciB0aGUgcm9vdCBmcm9tIHRoZSB0ZXh0CiBlbnRyeSBib3ggaWYgb25lIGlzIHByZXNlbnQuICBUaGVyZSdzIGFsc28gYSBjaGVjayBib3ggKGVuYWJsZWQgYnkgZGVmYXVsdCkKIHRvIGRlY2lkZSB3aGV0aGVyIGFjdHVhbGx5IHRvIGZvbGxvdyBleHRlcm5hbCBsaW5rcyAoc2luY2UgdGhpcyBjYW4gc2xvdwogdGhlIGNoZWNraW5nIGRvd24gY29uc2lkZXJhYmx5KS4gIEZpbmFsbHkgdGhlcmUncyBhIFF1aXQgYnV0dG9uLgogCi1BIHNlcmllcyBvZiBjaGVja2J1dHRvbnMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBwYW5lbCAKLWlzIHNob3duLiAgTGlzdCBwYW5lbHMgYXJlIGFsc28gYXV0b21hdGljYWxseSBzaG93biBvciBoaWRkZW4gd2hlbiB0aGVpciAKK0Egc2VyaWVzIG9mIGNoZWNrYnV0dG9ucyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHBhbmVsCitpcyBzaG93bi4gIExpc3QgcGFuZWxzIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgc2hvd24gb3IgaGlkZGVuIHdoZW4gdGhlaXIKIHN0YXR1cyBjaGFuZ2VzIGJldHdlZW4gZW1wdHkgdG8gbm9uLWVtcHR5LiAgVGhlcmUgYXJlIHNpeCBwYW5lbHM6CiAKIExvZyAgICAgICAgLS0gcmF3IG91dHB1dCBmcm9tIHRoZSBjaGVja2VyICgtdiwgLXEgYWZmZWN0IHRoaXMpCmRpZmYgLS1naXQgYS9Ub29scy93ZWJjaGVja2VyL3dlYmNoZWNrZXIucHkgYi9Ub29scy93ZWJjaGVja2VyL3dlYmNoZWNrZXIucHkKaW5kZXggOTExM2M0Yi4uZDkxOGEwYyAxMDA3NTUKLS0tIGEvVG9vbHMvd2ViY2hlY2tlci93ZWJjaGVja2VyLnB5CisrKyBiL1Rvb2xzL3dlYmNoZWNrZXIvd2ViY2hlY2tlci5weQpAQCAtMjk3LDcgKzI5Nyw3IEBACiAgICAgZGVmIG1lc3NhZ2Uoc2VsZiwgZm9ybWF0LCAqYXJncyk6CiAgICAgICAgIGlmIGFyZ3M6CiAgICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQlYXJncwotICAgICAgICBwcmludCBmb3JtYXQgCisgICAgICAgIHByaW50IGZvcm1hdAogCiAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIChzZWxmLnJvb3RzLCBzZWxmLnRvZG8sIHNlbGYuZG9uZSwgc2VsZi5iYWQsIHNlbGYucm91bmQpCkBAIC0zODAsNyArMzgwLDcgQEAKICAgICAgICAgICAgICMgdHJpcGxlcyBpcyBub3cgYSAoVVJMLCBmcmFnbWVudCkgcGFpci4gVGhlIHZhbHVlCiAgICAgICAgICAgICAjIG9mIHRoZSAic291cmNlIiB2YXJpYWJsZSBjb21lcyBmcm9tIHRoZSBsaXN0IG9mCiAgICAgICAgICAgICAjIG9yaWdpbnMsIGFuZCBpcyBhIFVSTCwgbm90IGEgcGFpci4KLSAgICAgICAgICAgIGZvciB1cmwsIHJhd2xpbmssIG1zZyBpbiB0cmlwbGVzOiAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgdXJsLCByYXdsaW5rLCBtc2cgaW4gdHJpcGxlczoKICAgICAgICAgICAgICAgICBpZiByYXdsaW5rICE9IHNlbGYuZm9ybWF0X3VybCh1cmwpOiBzID0gIiAoJXMpIiAlIHJhd2xpbmsKICAgICAgICAgICAgICAgICBlbHNlOiBzID0gIiIKICAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIiAgSFJFRiAlcyVzXG4gICAgbXNnICVzIiwKQEAgLTQ2Miw3ICs0NjIsNyBAQAogICAgICAgICAgICAgc2VsZi50b2RvW3VybF0gPSBbb3JpZ2luXQogICAgICAgICAgICAgc2VsZi5ub3RlKDMsICIgIE5ldyB0b2RvIGxpbmsgJXMiLCBzZWxmLmZvcm1hdF91cmwodXJsKSkKIAotICAgIGRlZiBmb3JtYXRfdXJsKHNlbGYsIHVybCk6ICAKKyAgICBkZWYgZm9ybWF0X3VybChzZWxmLCB1cmwpOgogICAgICAgICBsaW5rLCBmcmFnbWVudCA9IHVybAogICAgICAgICBpZiBmcmFnbWVudDogcmV0dXJuIGxpbmsgKyAiIyIgKyBmcmFnbWVudAogICAgICAgICBlbHNlOiByZXR1cm4gbGluawpAQCAtNzE2LDcgKzcxNiw3IEBACiAgICAgICAgICAgICB0ID0gdFs6LTFdICsgKCcnLCkKICAgICAgICAgICAgIHJhd2xpbmsgPSB1cmxwYXJzZS51cmx1bnBhcnNlKHQpCiAgICAgICAgICAgICBsaW5rID0gdXJscGFyc2UudXJsam9pbihiYXNlLCByYXdsaW5rKQotICAgICAgICAgICAgaW5mb3MuYXBwZW5kKChsaW5rLCByYXdsaW5rLCBmcmFnbWVudCkpICAgICAKKyAgICAgICAgICAgIGluZm9zLmFwcGVuZCgobGluaywgcmF3bGluaywgZnJhZ21lbnQpKQogCiAgICAgICAgIHJldHVybiBpbmZvcwogCg==