ZGlmZiAtLWdpdCBhL01hYy9MaWIvdG9vbGJveC9TdGFuZGFyZF9VUkxfc3VpdGUucHkgYi9NYWMvTGliL3Rvb2xib3gvU3RhbmRhcmRfVVJMX3N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YmFjMGMKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvTGliL3Rvb2xib3gvU3RhbmRhcmRfVVJMX3N1aXRlLnB5CkBAIC0wLDAgKzEsNTIgQEAKKyIiIlN1aXRlIFN0YW5kYXJkIFVSTCBzdWl0ZTogTWFjIFVSTCBzdGFuZGFyZCwgc3VwcG9ydGVkIGJ5IG1hbnkgYXBwcworCisKKworTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIGZsYXA6UHJvZ3JhbW1hJ3M6TmV0c2NhcGUgMi4wYjUgRm9sZGVyOk5ldHNjYXBlIDIuMGI1CitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFkZHBhY2sKK2FkZHBhY2suYWRkcGFjaygnVG9vbHMnKQorYWRkcGFjay5hZGRwYWNrKCdiZ2VuJykKK2FkZHBhY2suYWRkcGFjaygnYWUnKQorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ0dVUkwnCisKK2NsYXNzIFN0YW5kYXJkX1VSTF9zdWl0ZToKKworCV9hcmdtYXBfR2V0VVJMID0geworCQkndG8nIDogJ2Rlc3QnLAorCQknaW5zaWRlJyA6ICdIV0lOJywKKwkJJ19mcm9tJyA6ICdyZWZlJywKKwl9CisKKwlkZWYgR2V0VVJMKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorCQkiIiJHZXRVUkw6IExvYWRzIHRoZSBVUkwgKG9wdGlvbmFseSB0byBkaXNrKQorCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBUaGUgdXJsIAorCQlLZXl3b3JkIGFyZ3VtZW50IHRvOiBmaWxlIHRoZSBVUkwgc2hvdWxkIGJlIGxvYWRlZCBpbnRvICAKKwkJS2V5d29yZCBhcmd1bWVudCBpbnNpZGU6IFdpbmRvdyB0aGUgVVJMIHNob3VsZCBiZSBsb2FkZWQgdG8KKwkJS2V5d29yZCBhcmd1bWVudCBfZnJvbTogUmVmZXJlcmVyLCB0byBiZSBzZW50IHdpdGggdGhlIEhUVFAgcmVxdWVzdAorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCSIiIgorCQlfY29kZSA9ICdHVVJMJworCQlfc3ViY29kZSA9ICdHVVJMJworCisJCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX0dldFVSTCkKKwkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKwkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKwpkaWZmIC0tZ2l0IGEvTWFjL0xpYi90b29sYm94L1dXV19TdWl0ZS5weSBiL01hYy9MaWIvdG9vbGJveC9XV1dfU3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3MjQzYwotLS0gL2Rldi9udWxsCisrKyBiL01hYy9MaWIvdG9vbGJveC9XV1dfU3VpdGUucHkKQEAgLTAsMCArMSw0MTYgQEAKKyIiIlN1aXRlIFdvcmxkV2lkZVdlYiBzdWl0ZSwgYXMgZGVmaW5lZCBpbiBTcHlnbGFzcyBzcGVjLjogCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gZmxhcDpQcm9ncmFtbWEnczpOZXRzY2FwZSAyLjBiNSBGb2xkZXI6TmV0c2NhcGUgMi4wYjUKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWRkcGFjaworYWRkcGFjay5hZGRwYWNrKCdUb29scycpCithZGRwYWNrLmFkZHBhY2soJ2JnZW4nKQorYWRkcGFjay5hZGRwYWNrKCdhZScpCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnV1dXIScKKworY2xhc3MgV1dXX1N1aXRlOgorCisJX2FyZ21hcF9PcGVuVVJMID0geworCQkndG8nIDogJ0lOVE8nLAorCQkndG9XaW5kb3cnIDogJ1dJTkQnLAorCQknZmxhZ3MnIDogJ0ZMR1MnLAorCQkncG9zdF9kYXRhJyA6ICdQT1NUJywKKwkJJ3Bvc3RfdHlwZScgOiAnTUlNRScsCisJCSdwcm9ncmVzc0FwcCcgOiAnUFJPRycsCisJfQorCisJZGVmIE9wZW5VUkwoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisJCSIiIk9wZW5VUkw6IE9wZW5zIGEgVVJMLiBBbGxvd3MgZm9yIG1vcmUgb3B0aW9ucyB0aGFuIEdldFVSTCBldmVudAorCQlSZXF1aXJlZCBhcmd1bWVudDogVVJMCisJCUtleXdvcmQgYXJndW1lbnQgdG86IGZpbGUgZGVzdGluYXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCB0b1dpbmRvdzogd2luZG93IGlECisJCUtleXdvcmQgYXJndW1lbnQgZmxhZ3M6IEJpbmFyeTogYW55IGNvbWJpbmF0aW9uIG9mIDEsIDIgYW5kIDQgaXMgYWxsb3dlZDogMSBhbmQgMiBtZWFuIGZvcmNlIHJlbG9hZCB0aGUgZG9jdW1lbnQuIDQgaXMgaWdub3JlZAorCQlLZXl3b3JkIGFyZ3VtZW50IHBvc3RfZGF0YTogRm9ybSBwb3N0aW5nIGRhdGEKKwkJS2V5d29yZCBhcmd1bWVudCBwb3N0X3R5cGU6IE1JTUUgdHlwZSBvZiB0aGUgcG9zdGluZyBkYXRhLiBEZWZhdWx0cyB0byBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKKwkJS2V5d29yZCBhcmd1bWVudCBwcm9ncmVzc0FwcDogQXBwbGljYXRpb24gdGhhdCB3aWxsIGRpc3BsYXkgcHJvZ3Jlc3MKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBJRCBvZiB0aGUgbG9hZGluZyB3aW5kb3cKKwkJIiIiCisJCV9jb2RlID0gJ1dXVyEnCisJCV9zdWJjb2RlID0gJ09VUkwnCisKKwkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfT3BlblVSTCkKKwkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKwkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCV9hcmdtYXBfU2hvd0ZpbGUgPSB7CisJCSdNSU1FX3R5cGUnIDogJ01JTUUnLAorCQknV2luZG93X0lEJyA6ICdXSU5EJywKKwkJJ1VSTCcgOiAnVVJMICcsCisJfQorCisJZGVmIFNob3dGaWxlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorCQkiIiJTaG93RmlsZTogU2ltaWxhciB0byBPcGVuRG9jdW1lbnRzLCBleGNlcHQgdGhhdCBpdCBzcGVjaWZpZXMgdGhlIHBhcmVudCBVUkwsIGFuZCBNSU1FIHR5cGUgb2YgdGhlIGZpbGUKKwkJUmVxdWlyZWQgYXJndW1lbnQ6IEZpbGUgdG8gb3BlbgorCQlLZXl3b3JkIGFyZ3VtZW50IE1JTUVfdHlwZTogTUlNRSB0eXBlCisJCUtleXdvcmQgYXJndW1lbnQgV2luZG93X0lEOiBXaW5kb3cgdG8gb3BlbiB0aGUgZmlsZSBpbgorCQlLZXl3b3JkIGFyZ3VtZW50IFVSTDogVXNlIHRoaXMgYXMgYSBiYXNlIFVSTAorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IFdpbmRvdyBJRCBvZiB0aGUgbG9hZGVkIHdpbmRvdy4gMCBtZWFucyBTaG93RmlsZSBmYWlsZWQsIEZGRkZGRkYgbWVhbnMgdGhhdCBkYXRhIHdhcyBub3QgYXBwcm9wcmlhdGUgdHlwZSB0byBkaXNwbGF5IGluIHRoZSBicm93c2VyLgorCQkiIiIKKwkJX2NvZGUgPSAnV1dXIScKKwkJX3N1YmNvZGUgPSAnU0hXRicKKworCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9TaG93RmlsZSkKKwkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKwkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCV9hcmdtYXBfcGFyc2VfYW5jaG9yID0geworCQkncmVsYXRpdmVfdG8nIDogJ1JFTEEnLAorCX0KKworCWRlZiBwYXJzZV9hbmNob3Ioc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisJCSIiInBhcnNlIGFuY2hvcjogUmVzb2x2ZXMgdGhlIHJlbGF0aXZlIFVSTAorCQlSZXF1aXJlZCBhcmd1bWVudDogTWFpbiBVUkwKKwkJS2V5d29yZCBhcmd1bWVudCByZWxhdGl2ZV90bzogUmVsYXRpdmUgVVJMCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogUGFyc2VkICBVUkwKKwkJIiIiCisJCV9jb2RlID0gJ1dXVyEnCisJCV9zdWJjb2RlID0gJ1BSU0EnCisKKwkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfcGFyc2VfYW5jaG9yKQorCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKwkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisJX2FyZ21hcF9jYW5jZWxfcHJvZ3Jlc3MgPSB7CisJCSdpbl93aW5kb3cnIDogJ1dJTkQnLAorCX0KKworCWRlZiBjYW5jZWxfcHJvZ3Jlc3Moc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKwkJIiIiY2FuY2VsIHByb2dyZXNzOiBJbnRlcnJ1cHRzIHRoZSBkb3dubG9hZCBvZiB0aGUgZG9jdW1lbnQgaW4gdGhlIGdpdmVuIHdpbmRvdworCQlSZXF1aXJlZCBhcmd1bWVudDogcHJvZ3Jlc3MgSUQsIG9idGFpbmVkIGZyb20gdGhlIHByb2dyZXNzIGFwcAorCQlLZXl3b3JkIGFyZ3VtZW50IGluX3dpbmRvdzogd2luZG93IElEIG9mIHRoZSBwcm9ncmVzcyB0byBjYW5jZWwKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQkiIiIKKwkJX2NvZGUgPSAnV1dXIScKKwkJX3N1YmNvZGUgPSAnQ05DTCcKKworCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jYW5jZWxfcHJvZ3Jlc3MpCisJCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisJCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgZmluZF9VUkwoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisJCSIiImZpbmQgVVJMOiBJZiB0aGUgZmlsZSB3YXMgZG93bmxvYWRlZCBieSBOZXRzY2FwZSwgeW91IGNhbiBjYWxsIEZpbmRVUkwgdG8gZmluZCBvdXQgdGhlIFVSTCB1c2VkIHRvIGRvd25sb2FkIHRoZSBmaWxlLgorCQlSZXF1aXJlZCBhcmd1bWVudDogRmlsZSBzcGVjCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogVGhlIFVSTAorCQkiIiIKKwkJX2NvZGUgPSAnV1dXIScKKwkJX3N1YmNvZGUgPSAnRlVSTCcKKworCQlpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKwkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisJZGVmIHdlYkFjdGl2YXRlKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisJCSIiIndlYkFjdGl2YXRlOiBNYWtlcyBOZXRzY2FwZSB0aGUgZnJvbnRtb3N0IGFwcGxpY2F0aW9uLCBhbmQgc2VsZWN0cyBhIGdpdmVuIHdpbmRvdy4gVGhpcyBldmVudCBpcyBoZXJlIGZvciBzdWl0ZSBjb21wbGV0ZW5lc3MvIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkgb25seSwgeW91IHNob3VsZCB1c2Ugc3RhbmRhcmQgQXBwbGVFdmVudHMgaW5zdGVhZC4KKwkJUmVxdWlyZWQgYXJndW1lbnQ6IHdpbmRvdyB0byBicmluZyB0byBmcm9udAorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCSIiIgorCQlfY29kZSA9ICdXV1chJworCQlfc3ViY29kZSA9ICdBQ1RWJworCisJCWlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisJCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisJCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgbGlzdF93aW5kb3dzKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisJCSIiImxpc3Qgd2luZG93czogTGlzdHMgdGhlIElEcyBvZiBhbGwgdGhlIGh5cGVydGV4dCB3aW5kb3dzCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogTGlzdCBvZiB1bmlxdWUgSURzIG9mIGFsbCB0aGUgaHlwZXJ0ZXh0IHdpbmRvd3MKKwkJIiIiCisJCV9jb2RlID0gJ1dXVyEnCisJCV9zdWJjb2RlID0gJ0xTVFcnCisKKwkJaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKwkJaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKwkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBnZXRfd2luZG93X2luZm8oc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKwkJIiIiZ2V0IHdpbmRvdyBpbmZvOiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd2luZG93IGFzIGEgbGlzdC4gQ3VycmVudGx5IHRoZSBsaXN0IGNvbnRhaW5zIHRoZSB3aW5kb3cgdGl0bGUgYW5kIHRoZSBVUkwuIFlvdSBjYW4gZ2V0IHRoZSBzYW1lIGluZm9ybWF0aW9uIHVzaW5nIHN0YW5kYXJkIEFwcGxlIEV2ZW50IEdldFByb3BlcnR5LgorCQlSZXF1aXJlZCBhcmd1bWVudDogd2luZG93IElECisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogdW5kb2N1bWVudGVkLCB0eXBlY29kZSAnbGlzdCcKKwkJIiIiCisJCV9jb2RlID0gJ1dXVyEnCisJCV9zdWJjb2RlID0gJ1dORk8nCisKKwkJaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKwkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKwkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiByZWdpc3Rlcl9VUkxfZWNobyhzZWxmLCBfb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorCQkiIiJyZWdpc3RlciBVUkwgZWNobzogUmVnaXN0ZXJzIHRoZSCzZWNob7IgYXBwbGljYXRpb24uIEVhY2ggZG93bmxvYWQgZnJvbSBub3cgb24gd2lsbCBiZSBlY2hvZWQgdG8gdGhpcyBhcHBsaWNhdGlvbi4KKwkJUmVxdWlyZWQgYXJndW1lbnQ6IEFwcGxpY2F0aW9uIHNpZ25hdHVyZQorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCSIiIgorCQlfY29kZSA9ICdXV1chJworCQlfc3ViY29kZSA9ICdSR1VFJworCisJCWlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisJCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisJCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgdW5yZWdpc3Rlcl9VUkxfZWNobyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKwkJIiIidW5yZWdpc3RlciBVUkwgZWNobzogY2FuY2VscyBVUkwgZWNobworCQlSZXF1aXJlZCBhcmd1bWVudDogYXBwbGljYXRpb24gc2lnbmF0dXJlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJIiIiCisJCV9jb2RlID0gJ1dXVyEnCisJCV9zdWJjb2RlID0gJ1VOUlUnCisKKwkJaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKwkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKwkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCV9hcmdtYXBfcmVnaXN0ZXJfdmlld2VyID0geworCQknTUlNRV90eXBlJyA6ICdNSU1FJywKKwkJJ3dpdGhfZmlsZV90eXBlJyA6ICdGVFlQJywKKwl9CisKKwlkZWYgcmVnaXN0ZXJfdmlld2VyKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorCQkiIiJyZWdpc3RlciB2aWV3ZXI6IFJlZ2lzdGVycyBhbiBhcHBsaWNhdGlvbiBhcyBhIIxzcGVjaWFsuSB2aWV3ZXIgZm9yIHRoaXMgTUlNRSB0eXBlLiBUaGUgYXBwbGljYXRpb24gd2lsbCBiZSBsYXVuY2hlZCB3aXRoIFZpZXdEb2MgZXZlbnRzCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBBcHBsaWNhdGlvbiBzaWcKKwkJS2V5d29yZCBhcmd1bWVudCBNSU1FX3R5cGU6IE1JTUUgdHlwZSB2aWV3ZXIgaXMgcmVnaXN0ZXJpbmcgZm9yCisJCUtleXdvcmQgYXJndW1lbnQgd2l0aF9maWxlX3R5cGU6IE1hYyBmaWxlIHR5cGUgZm9yIHRoZSBkb3dubG9hZGVkIGZpbGVzCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogVFJVRSBpZiByZWdpc3RyYXRpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bAorCQkiIiIKKwkJX2NvZGUgPSAnV1dXIScKKwkJX3N1YmNvZGUgPSAnUkdWVycKKworCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9yZWdpc3Rlcl92aWV3ZXIpCisJCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisJCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKwlfYXJnbWFwX3VucmVnaXN0ZXJfdmlld2VyID0geworCQknTUlNRV90eXBlJyA6ICdNSU1FJywKKwl9CisKKwlkZWYgdW5yZWdpc3Rlcl92aWV3ZXIoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisJCSIiInVucmVnaXN0ZXIgdmlld2VyOiBSZXZlcnQgdG8gdGhlIG9sZCB3YXkgb2YgaGFuZGxpbmcgdGhpcyBNSU1FIHR5cGUKKwkJUmVxdWlyZWQgYXJndW1lbnQ6IEFwcGxpY2F0aW9uIHNpZworCQlLZXl3b3JkIGFyZ3VtZW50IE1JTUVfdHlwZTogTUlNRSB0eXBlIHRvIGJlIHVucmVnaXN0ZXJlZAorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IFRSVUUgaWYgdGhlIGV2ZW50IHdhcyBzdWNjZXNzZnVsCisJCSIiIgorCQlfY29kZSA9ICdXV1chJworCQlfc3ViY29kZSA9ICdVTlJWJworCisJCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3VucmVnaXN0ZXJfdmlld2VyKQorCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKwkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisJX2FyZ21hcF9yZWdpc3Rlcl9wcm90b2NvbCA9IHsKKwkJJ2Zvcl9wcm90b2NvbCcgOiAnUFJPVCcsCisJfQorCisJZGVmIHJlZ2lzdGVyX3Byb3RvY29sKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisJCSIiInJlZ2lzdGVyIHByb3RvY29sOiBSZWdpc3RlcnMgYXBwbGljYXRpb24gYXMgYSCzaGFuZGxlcrIgZm9yIHRoaXMgcHJvdG9jb2wgd2l0aCBhIGdpdmVuIHByZWZpeC4gVGhlIGhhbmRsZXIgd2lsbCByZWNlaXZlILNPcGVuVVJMsiwgb3IgaWYgdGhhdCBmYWlscywgs0dldFVSTLIgZXZlbnQuCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBBcHBsaWNhdGlvbiBzaWcKKwkJS2V5d29yZCBhcmd1bWVudCBmb3JfcHJvdG9jb2w6IHByb3RvY29sIHByZWZpeDogs2ZpbmdlcjqyLCCzZmlsZbIsCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogVFJVRSBpZiByZWdpc3RyYXRpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bAorCQkiIiIKKwkJX2NvZGUgPSAnV1dXIScKKwkJX3N1YmNvZGUgPSAnUkdQUicKKworCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9yZWdpc3Rlcl9wcm90b2NvbCkKKwkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKwkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCV9hcmdtYXBfdW5yZWdpc3Rlcl9wcm90b2NvbCA9IHsKKwkJJ2Zvcl9wcm90b2NvbCcgOiAnUFJPVCcsCisJfQorCisJZGVmIHVucmVnaXN0ZXJfcHJvdG9jb2woc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKwkJIiIidW5yZWdpc3RlciBwcm90b2NvbDogcmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2Ygs3JlZ2lzdGVyIHByb3RvY29ssgorCQlSZXF1aXJlZCBhcmd1bWVudDogQXBwbGljYXRpb24gc2lnLiAKKwkJS2V5d29yZCBhcmd1bWVudCBmb3JfcHJvdG9jb2w6IHByb3RvY29sIHByZWZpeC4gSWYgbm9uZSwgdW5yZWdpc3RlciBmb3IgYWxsIHByb3RvY29scworCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IFRSVUUgaWYgc3VjY2Vzc2Z1bAorCQkiIiIKKwkJX2NvZGUgPSAnV1dXIScKKwkJX3N1YmNvZGUgPSAnVU5SUCcKKworCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF91bnJlZ2lzdGVyX3Byb3RvY29sKQorCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKwkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisJX2FyZ21hcF9yZWdpc3Rlcl93aW5kb3dfY2xvc2UgPSB7CisJCSdmb3Jfd2luZG93JyA6ICdXSU5EJywKKwl9CisKKwlkZWYgcmVnaXN0ZXJfd2luZG93X2Nsb3NlKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisJCSIiInJlZ2lzdGVyIHdpbmRvdyBjbG9zZTogTmV0c2NhcGUgd2lsbCBub3RpZnkgcmVnaXN0ZXJlZCBhcHBsaWNhdGlvbiB3aGVuIHRoaXMgd2luZG93IGNsb3NlcworCQlSZXF1aXJlZCBhcmd1bWVudDogQXBwbGljYXRpb24gc2lnbmF0dXJlCisJCUtleXdvcmQgYXJndW1lbnQgZm9yX3dpbmRvdzogd2luZG93IElECisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogdHJ1ZSBpZiBzdWNjZXNzZnVsCisJCSIiIgorCQlfY29kZSA9ICdXV1chJworCQlfc3ViY29kZSA9ICdSR1dDJworCisJCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3JlZ2lzdGVyX3dpbmRvd19jbG9zZSkKKwkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKwkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCV9hcmdtYXBfdW5yZWdpc3Rlcl93aW5kb3dfY2xvc2UgPSB7CisJCSdmb3Jfd2luZG93JyA6ICdXSU5EJywKKwl9CisKKwlkZWYgdW5yZWdpc3Rlcl93aW5kb3dfY2xvc2Uoc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKwkJIiIidW5yZWdpc3RlciB3aW5kb3cgY2xvc2U6IFVuZG8gZm9yIHJlZ2lzdGVyIHdpbmRvdyBjbG9zZQorCQlSZXF1aXJlZCBhcmd1bWVudDogQXBwbGljYXRpb24gc2lnbmF0dXJlCisJCUtleXdvcmQgYXJndW1lbnQgZm9yX3dpbmRvdzogd2luZG93IElECisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogdHJ1ZSBpZiBzdWNjZXNzZnVsCisJCSIiIgorCQlfY29kZSA9ICdXV1chJworCQlfc3ViY29kZSA9ICdVTlJDJworCisJCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3VucmVnaXN0ZXJfd2luZG93X2Nsb3NlKQorCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKwkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9hZS9uc3JlbW90ZS5weSBiL01hYy9Nb2R1bGVzL2FlL25zcmVtb3RlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhY2UzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvTW9kdWxlcy9hZS9uc3JlbW90ZS5weQpAQCAtMCwwICsxLDc2IEBACisiIiJuc3JlbW90ZSAtIENvbnRyb2wgTmV0c2NhcGUgZnJvbSBweXRob24uCisKK0ludGVyZmFjZSBtb2RlbGxlZCBhZnRlciB1bml4LWludGVyZmFjZSBkb25lCitieSBoYXNzYW5AY3Muc3RhbmZvcmQuZWR1LgorCitKYWNrIEphbnNlbiwgQ1dJLCBKYW51YXJ5IDE5OTYuCisiIiIKKyMKKyMgTm90ZTogdGhpcyBtb2R1bGUgY3VycmVudGx5IHVzZXMgdGhlIGZ1bm55IFNweUdsYXNzIEFwcGxlRXZlbnRzLCBzaW5jZQorIyB0aGVzZSBzZWVtIHRvIGJlIHRoZSBvbmx5IHdheSB0byBnZXQgdGhlIGluZm8gZnJvbSBOZXRzY2FwZS4gSXQgd291bGQKKyMgYmUgbmljZXIgdG8gdXNlIHRoZSBtb3JlICJvYmplY3Qgb3JpZW50ZWQiIHN0YW5kYXJkIE9TQSBzdHVmZiwgd2hlbiBpdAorIyBpcyBpbXBsZW1lbnRlZCBpbiBOZXRzY2FwZS4KKyMKK2ltcG9ydCBhZGRwYWNrCitpbXBvcnQgc3lzCisKK2FkZHBhY2suYWRkcGFjaygnVG9vbHMnKQorYWRkcGFjay5hZGRwYWNrKCdiZ2VuJykKK2FkZHBhY2suYWRkcGFjaygnYWUnKQorCitpbXBvcnQgYWV0b29scworaW1wb3J0IFN0YW5kYXJkX1N1aXRlCitpbXBvcnQgV1dXX1N1aXRlCitpbXBvcnQgTWFjT1MKKworY2xhc3MgTmV0c2NhcGUoYWV0b29scy5UYWxrVG8sIFN0YW5kYXJkX1N1aXRlLlN0YW5kYXJkX1N1aXRlLCBXV1dfU3VpdGUuV1dXX1N1aXRlKToKKwlwYXNzCQorCQorU0lHTkFUVVJFPSdNT1NTJworCitFcnJvciA9ICduc3JlbW90ZS5FcnJvcicKKworX3RhbGtlciA9IE5vbmUKKworZGVmIF9pbml0KCk6CisJZ2xvYmFsIF90YWxrZXIKKwlpZiBfdGFsa2VyID09IE5vbmU6CisJCV90YWxrZXIgPSBOZXRzY2FwZShTSUdOQVRVUkUpCisKK2RlZiBsaXN0KGRweWluZm89IiIpOgorCV9pbml0KCkKKwlsaXN0ID0gX3RhbGtlci5saXN0X3dpbmRvd3MoKQorCXJldHVybiBtYXAobGFtYmRhIHg6ICh4LCAndmVyc2lvbiB1bmtub3duJyksIGxpc3QpCisJCitkZWYgZ2V0dXJsKHdpbmRvd2lkPTAsIGRweWluZm89IiIpOgorCV9pbml0KCkKKwlpZiB3aW5kb3dpZCA9PSAwOgorCQlpZHMgPSBfdGFsa2VyLmxpc3Rfd2luZG93cygpCisJCWlmIG5vdCBpZHM6CisJCQlyYWlzZSBFcnJvciwgJ05vIG5ldHNjYXBlIHdpbmRvd3Mgb3BlbicKKwkJd2luZG93aWQgPSBpZHNbMF0KKwlpbmZvID0gX3RhbGtlci5nZXRfd2luZG93X2luZm8od2luZG93aWQpCisJcmV0dXJuIGluZm8KKwkKK2RlZiBvcGVudXJsKHVybCwgd2luZG93aWQ9MCwgZHB5aW5mbz0iIik6CisJX2luaXQoKQorCWlmIHdpbmRvd2lkID09IDA6CisJCV90YWxrZXIuT3BlblVSTCh1cmwpCisJZWxzZToKKwkJX3RhbGtlci5PcGVuVVJMKHVybCwgdG9XaW5kb3c9d2luZG93aWQpCisJCQorZGVmIF90ZXN0KCk6CisJIiIiVGVzdCBwcm9ncmFtOiBPcGVuIHd3dy5weXRob24ub3JnIGluIGFsbCB3aW5kb3dzLCB0aGVuIHJldmVydCIiIgorCWltcG9ydCBzeXMKKwl3aW5kb3dzX2FuZF92ZXJzaW9ucyA9IGxpc3QoKQorCXdpbmRvd3NfYW5kX3VybHMgPSBtYXAobGFtYmRhIHg6ICh4WzBdLCBnZXR1cmwoeFswXSlbMF0pLCB3aW5kb3dzX2FuZF92ZXJzaW9ucykKKwlmb3IgaWQsIHZlcnNpb24gaW4gd2luZG93c19hbmRfdmVyc2lvbnM6CisJCW9wZW51cmwoJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy8nLCB3aW5kb3dpZD1pZCkKKwlwcmludCAnVHlwZSByZXR1cm4gdG8gcmV2ZXJ0IHRvIG9sZCBjb250ZW50cy0nCisJc3lzLnN0ZGluLnJlYWRsaW5lKCkKKwlmb3IgaWQsIHVybCBpbiB3aW5kb3dzX2FuZF91cmxzOgorCQlvcGVudXJsKHVybCwgaWQpCisJCQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKwlfdGVzdCgpCisJCg==